@josuelmm/cordova-background-geolocation 2.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/.npmignore +23 -0
  2. package/CHANGELOG.md +787 -0
  3. package/CONTRIBUTORS.md +15 -0
  4. package/HISTORY.md +734 -0
  5. package/LICENSE +191 -0
  6. package/README.md +125 -0
  7. package/RELEASE.MD +5 -0
  8. package/android/CDVBackgroundGeolocation/src/main/AndroidManifest.xml +23 -0
  9. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/CDVBackgroundGeolocation/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/CDVBackgroundGeolocation/src/main/java/com/marianhello/bgloc/cordova/ConfigMapper.java +148 -0
  20. package/android/CDVBackgroundGeolocation/src/main/java/com/marianhello/bgloc/cordova/PluginRegistry.java +25 -0
  21. package/android/CDVBackgroundGeolocation/src/main/java/com/marianhello/bgloc/cordova/headless/JsEvaluatorTaskRunner.java +53 -0
  22. package/android/CDVBackgroundGeolocation/src/main/java/com/tenforwardconsulting/bgloc/cordova/BackgroundGeolocationPlugin.java +603 -0
  23. package/android/CDVBackgroundGeolocation/src/main/res/values/strings.xml +4 -0
  24. package/android/CDVBackgroundGeolocation/src/test/java/com/marianhello/ConfigMapperTest.java +208 -0
  25. package/android/common/src/androidTest/java/com/marianhello/bgloc/BackgroundGeolocationFacadeTest.java +45 -0
  26. package/android/common/src/androidTest/java/com/marianhello/bgloc/BatchManagerTest.java +570 -0
  27. package/android/common/src/androidTest/java/com/marianhello/bgloc/ConfigTest.java +76 -0
  28. package/android/common/src/androidTest/java/com/marianhello/bgloc/ContentProviderLocationDAOTest.java +437 -0
  29. package/android/common/src/androidTest/java/com/marianhello/bgloc/DBLogReaderTest.java +95 -0
  30. package/android/common/src/androidTest/java/com/marianhello/bgloc/LocationContentProviderTest.java +159 -0
  31. package/android/common/src/androidTest/java/com/marianhello/bgloc/LocationServiceProxyTest.java +161 -0
  32. package/android/common/src/androidTest/java/com/marianhello/bgloc/LocationServiceTest.java +247 -0
  33. package/android/common/src/androidTest/java/com/marianhello/bgloc/SQLiteConfigurationDAOTest.java +200 -0
  34. package/android/common/src/androidTest/java/com/marianhello/bgloc/SQLiteLocationDAOTest.java +457 -0
  35. package/android/common/src/androidTest/java/com/marianhello/bgloc/SQLiteLocationDAOThreadTest.java +96 -0
  36. package/android/common/src/androidTest/java/com/marianhello/bgloc/SQLiteOpenHelperTest.java +225 -0
  37. package/android/common/src/androidTest/java/com/marianhello/bgloc/TestPluginDelegate.java +46 -0
  38. package/android/common/src/androidTest/java/com/marianhello/bgloc/TestResourceResolver.java +14 -0
  39. package/android/common/src/androidTest/java/com/marianhello/bgloc/provider/MockLocationProvider.java +50 -0
  40. package/android/common/src/androidTest/java/com/marianhello/bgloc/provider/TestLocationProviderFactory.java +17 -0
  41. package/android/common/src/androidTest/java/com/marianhello/bgloc/sqlite/SQLiteOpenHelper10.java +92 -0
  42. package/android/common/src/androidTest/java/com/marianhello/bgloc/test/LocationProviderTestCase.java +107 -0
  43. package/android/common/src/androidTest/java/com/marianhello/bgloc/test/TestConstants.java +5 -0
  44. package/android/common/src/main/AndroidManifest.xml +72 -0
  45. package/android/common/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +523 -0
  46. package/android/common/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +59 -0
  47. package/android/common/src/main/java/com/marianhello/bgloc/Config.java +652 -0
  48. package/android/common/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  49. package/android/common/src/main/java/com/marianhello/bgloc/HttpPostService.java +224 -0
  50. package/android/common/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  51. package/android/common/src/main/java/com/marianhello/bgloc/PluginDelegate.java +19 -0
  52. package/android/common/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  53. package/android/common/src/main/java/com/marianhello/bgloc/PostLocationTask.java +188 -0
  54. package/android/common/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  55. package/android/common/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  56. package/android/common/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  57. package/android/common/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  58. package/android/common/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +994 -0
  59. package/android/common/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  60. package/android/common/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  61. package/android/common/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  62. package/android/common/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +22 -0
  63. package/android/common/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  64. package/android/common/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +65 -0
  65. package/android/common/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  66. package/android/common/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +395 -0
  67. package/android/common/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  68. package/android/common/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +76 -0
  69. package/android/common/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +160 -0
  70. package/android/common/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +112 -0
  71. package/android/common/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +506 -0
  72. package/android/common/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +151 -0
  73. package/android/common/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  74. package/android/common/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  75. package/android/common/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  76. package/android/common/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  77. package/android/common/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  78. package/android/common/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  79. package/android/common/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  80. package/android/common/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  81. package/android/common/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +171 -0
  82. package/android/common/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +282 -0
  83. package/android/common/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +610 -0
  84. package/android/common/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  85. package/android/common/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  86. package/android/common/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  87. package/android/common/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +145 -0
  88. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  89. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +749 -0
  90. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  91. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  92. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  93. package/android/common/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +130 -0
  94. package/android/common/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  95. package/android/common/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  96. package/android/common/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  97. package/android/common/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +278 -0
  98. package/android/common/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  99. package/android/common/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +249 -0
  100. package/android/common/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  101. package/android/common/src/main/java/com/marianhello/logging/DBLogReader.java +203 -0
  102. package/android/common/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  103. package/android/common/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  104. package/android/common/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  105. package/android/common/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  106. package/android/common/src/main/java/com/marianhello/utils/Convert.java +56 -0
  107. package/android/common/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  108. package/android/common/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  109. package/android/common/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  110. package/android/common/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  111. package/android/common/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  112. package/android/common/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  113. package/android/common/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  114. package/android/common/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  115. package/android/common/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  116. package/android/common/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  117. package/android/common/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  118. package/android/common/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  119. package/android/common/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  120. package/android/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  121. package/android/common/src/main/res/values/strings.xml +4 -0
  122. package/android/common/src/main/res/xml/authenticator.xml +7 -0
  123. package/android/common/src/main/res/xml/syncadapter.xml +9 -0
  124. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/ArrayListLocationTemplateTest.java +82 -0
  125. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/BackgroundLocationTest.java +128 -0
  126. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/ConfigTest.java +191 -0
  127. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/DBLogReaderTest.java +37 -0
  128. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/HashMapLocationTemplateTest.java +216 -0
  129. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/HttpPostServiceTest.java +223 -0
  130. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/LocationTemplateFactoryTest.java +50 -0
  131. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/PostLocationTaskTest.java +180 -0
  132. package/android/common/src/test/java/com/marianhello/backgroundgeolocation/TestHelper.java +16 -0
  133. package/android/dependencies.gradle +13 -0
  134. package/ios/CDVBackgroundGeolocation/CDVBackgroundGeolocation.h +41 -0
  135. package/ios/CDVBackgroundGeolocation/CDVBackgroundGeolocation.m +526 -0
  136. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  137. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  138. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  139. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  140. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  141. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  143. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  144. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  145. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  146. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  147. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  148. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  149. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  150. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  151. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  152. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  153. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  154. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  155. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  156. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  157. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +202 -0
  158. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +60 -0
  159. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +638 -0
  160. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +34 -0
  161. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +185 -0
  162. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  163. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  164. package/ios/common/BackgroundGeolocation/MAURConfig.h +74 -0
  165. package/ios/common/BackgroundGeolocation/MAURConfig.m +485 -0
  166. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +49 -0
  167. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +51 -0
  168. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  169. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +514 -0
  170. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  171. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +97 -0
  172. package/ios/common/BackgroundGeolocation/MAURLocation.h +59 -0
  173. package/ios/common/BackgroundGeolocation/MAURLocation.m +349 -0
  174. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +34 -0
  175. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +35 -0
  176. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  177. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +287 -0
  178. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  179. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  180. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  181. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +40 -0
  182. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +250 -0
  183. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  184. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  185. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +129 -0
  186. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  187. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +278 -0
  188. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  189. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  190. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +38 -0
  191. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +380 -0
  192. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  193. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  194. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  195. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  197. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  198. package/ios/common/BackgroundGeolocation/SOMotionDetector/CHANGELOG.md +2 -0
  199. package/ios/common/BackgroundGeolocation/SOMotionDetector/LICENSE +21 -0
  200. package/ios/common/BackgroundGeolocation/SOMotionDetector/README.md +135 -0
  201. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.h +80 -0
  202. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.m +147 -0
  203. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.h +30 -0
  204. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.m +42 -0
  205. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.h +99 -0
  206. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.m +327 -0
  207. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.h +44 -0
  208. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.m +94 -0
  209. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  210. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  211. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  212. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  213. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  214. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  215. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  216. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  217. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  218. package/ios/common/BackgroundGeolocation.xcodeproj/project.pbxproj +760 -0
  219. package/ios/common/BackgroundGeolocationTests/Info.plist +24 -0
  220. package/ios/common/BackgroundGeolocationTests/MAURBackgroundLocationTest.m +185 -0
  221. package/ios/common/BackgroundGeolocationTests/MAURConfigTest.m +161 -0
  222. package/ios/common/BackgroundGeolocationTests/MAURGeolocationOpenHelperTest.m +102 -0
  223. package/ios/common/BackgroundGeolocationTests/MAURLocationTest.m +216 -0
  224. package/ios/common/BackgroundGeolocationTests/MAURLocationUploaderTest.m +55 -0
  225. package/ios/common/BackgroundGeolocationTests/MAURLogReaderTest.m +43 -0
  226. package/ios/common/BackgroundGeolocationTests/MAURSQLiteConfigurationDAOTest.m +102 -0
  227. package/ios/common/BackgroundGeolocationTests/MAURSQLiteHelperTest.m +41 -0
  228. package/ios/common/BackgroundGeolocationTests/MAURSQLiteLocationDAOTests.m +240 -0
  229. package/ios/common/BackgroundGeolocationTests/MAURSQLiteLocationDAOThreadTest.m +84 -0
  230. package/ios/common/BackgroundGeolocationTests/MAURSQLiteOpenHelperTest.m +144 -0
  231. package/ios/common/CONTRIBUTORS.md +10 -0
  232. package/ios/common/LICENSE +191 -0
  233. package/ios/common/README.md +7 -0
  234. package/ios/common/scripts/xcode-refactor.js +184 -0
  235. package/package.json +44 -0
  236. package/plugin.xml +355 -0
  237. package/www/BackgroundGeolocation.d.ts +910 -0
  238. package/www/BackgroundGeolocation.js +247 -0
  239. package/www/radio.js +177 -0
@@ -0,0 +1,514 @@
1
+ //
2
+ // MAURDistanceFilterLocationProvider.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 14/09/2016.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import "MAURDistanceFilterLocationProvider.h"
10
+ #import "MAURLogging.h"
11
+
12
+ #define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
13
+ #define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
14
+ #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
15
+ #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
16
+ #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
17
+
18
+ #define LOCATION_DENIED "User denied use of location services."
19
+ #define LOCATION_RESTRICTED "Application's use of location services is restricted."
20
+ #define LOCATION_NOT_DETERMINED "User undecided on application's use of location services."
21
+
22
+ static NSString * const TAG = @"DistanceFilterLocationProvider";
23
+ static NSString * const Domain = @"com.marianhello";
24
+
25
+
26
+ enum {
27
+ maxLocationWaitTimeInSeconds = 15,
28
+ maxLocationAgeInSeconds = 30
29
+ };
30
+
31
+ @interface MAURDistanceFilterLocationProvider () <CLLocationManagerDelegate>
32
+ @end
33
+
34
+ @implementation MAURDistanceFilterLocationProvider {
35
+ BOOL isUpdatingLocation;
36
+ BOOL isAcquiringStationaryLocation;
37
+ BOOL isAcquiringSpeed;
38
+ BOOL isStarted;
39
+
40
+ CLCircularRegion *stationaryRegion;
41
+ NSDate *stationarySince;
42
+
43
+ MAUROperationalMode operationMode;
44
+ NSDate *aquireStartTime;
45
+
46
+ CLLocationManager *locationManager;
47
+
48
+ // configurable options
49
+ MAURConfig *_config;
50
+ }
51
+
52
+
53
+ - (instancetype) init
54
+ {
55
+ self = [super init];
56
+
57
+ if (self) {
58
+ isUpdatingLocation = NO;
59
+ isAcquiringStationaryLocation = NO;
60
+ isAcquiringSpeed = NO;
61
+ stationaryRegion = nil;
62
+ isStarted = NO;
63
+ }
64
+
65
+ return self;
66
+ }
67
+
68
+ - (void) onCreate {
69
+ locationManager = [[CLLocationManager alloc] init];
70
+
71
+ if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
72
+ DDLogDebug(@"%@ iOS9 detected", TAG);
73
+ locationManager.allowsBackgroundLocationUpdates = YES;
74
+ }
75
+
76
+ locationManager.delegate = self;
77
+ }
78
+
79
+ /**
80
+ * configure provider
81
+ * @param {Config} configuration
82
+ * @param {NSError} optional error
83
+ */
84
+ - (BOOL) onConfigure:(MAURConfig*)config error:(NSError * __autoreleasing *)outError
85
+ {
86
+ DDLogVerbose(@"%@ configure", TAG);
87
+ _config = config;
88
+
89
+ locationManager.pausesLocationUpdatesAutomatically = [_config pauseLocationUpdates];
90
+ locationManager.activityType = [_config decodeActivityType];
91
+ locationManager.distanceFilter = _config.distanceFilter.integerValue; // meters
92
+ locationManager.desiredAccuracy = [_config decodeDesiredAccuracy];
93
+
94
+ return YES;
95
+ }
96
+
97
+ /**
98
+ * Turn on background geolocation
99
+ */
100
+ - (BOOL) onStart:(NSError * __autoreleasing *)outError
101
+ {
102
+ DDLogInfo(@"%@ will start", TAG);
103
+
104
+ NSUInteger authStatus;
105
+
106
+ if ([CLLocationManager respondsToSelector:@selector(authorizationStatus)]) { // iOS 4.2+
107
+ authStatus = [CLLocationManager authorizationStatus];
108
+
109
+ if (authStatus == kCLAuthorizationStatusDenied) {
110
+ if (outError != NULL) {
111
+ NSDictionary *errorDictionary = @{
112
+ NSLocalizedDescriptionKey: NSLocalizedString(@LOCATION_DENIED, nil)
113
+ };
114
+
115
+ *outError = [NSError errorWithDomain:Domain code:MAURBGPermissionDenied userInfo:errorDictionary];
116
+ }
117
+
118
+ return NO;
119
+ }
120
+
121
+ if (authStatus == kCLAuthorizationStatusRestricted) {
122
+ if (outError != NULL) {
123
+ NSDictionary *errorDictionary = @{
124
+ NSLocalizedDescriptionKey: NSLocalizedString(@LOCATION_RESTRICTED, nil)
125
+ };
126
+ *outError = [NSError errorWithDomain:Domain code:MAURBGPermissionDenied userInfo:errorDictionary];
127
+ }
128
+
129
+ return NO;
130
+ }
131
+
132
+ #ifdef __IPHONE_8_0
133
+ // we do startUpdatingLocation even though we might not get permissions granted
134
+ // we can stop later on when recieved callback on user denial
135
+ // it's neccessary to start call startUpdatingLocation in iOS < 8.0 to show user prompt!
136
+
137
+ if (authStatus == kCLAuthorizationStatusNotDetermined) {
138
+ if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { //iOS 8.0+
139
+ DDLogVerbose(@"%@ requestAlwaysAuthorization", TAG);
140
+ [locationManager requestAlwaysAuthorization];
141
+ }
142
+ }
143
+ #endif
144
+ }
145
+
146
+ [self switchMode:MAURForegroundMode];
147
+
148
+ isStarted = YES;
149
+
150
+ return YES;
151
+ }
152
+
153
+ /**
154
+ * Turn it off
155
+ */
156
+ - (BOOL) onStop:(NSError * __autoreleasing *)outError
157
+ {
158
+ DDLogInfo(@"%@ stop", TAG);
159
+
160
+ [self stopUpdatingLocation];
161
+ [self stopMonitoringSignificantLocationChanges];
162
+ [self stopMonitoringForRegion];
163
+
164
+ isStarted = NO;
165
+
166
+ return YES;
167
+ }
168
+
169
+ - (void) onSwitchMode:(MAUROperationalMode)mode
170
+ {
171
+ [self switchMode:mode];
172
+ }
173
+
174
+ /**
175
+ * toggle between foreground and background operation mode
176
+ */
177
+ - (void) switchMode:(MAUROperationalMode)mode
178
+ {
179
+ DDLogInfo(@"%@ switchMode %lu", TAG, (unsigned long)mode);
180
+
181
+ operationMode = mode;
182
+
183
+ if (operationMode == MAURForegroundMode || !_config.saveBatteryOnBackground) {
184
+ isAcquiringSpeed = YES;
185
+ isAcquiringStationaryLocation = NO;
186
+ [self stopMonitoringForRegion];
187
+ [self stopMonitoringSignificantLocationChanges];
188
+ } else if (operationMode == MAURBackgroundMode) {
189
+ isAcquiringSpeed = NO;
190
+ isAcquiringStationaryLocation = YES;
191
+ [self startMonitoringSignificantLocationChanges];
192
+ }
193
+
194
+ aquireStartTime = [NSDate date];
195
+
196
+ // Crank up the GPS power temporarily to get a good fix on our current location
197
+ [self stopUpdatingLocation];
198
+ locationManager.distanceFilter = kCLDistanceFilterNone;
199
+ locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
200
+ [self startUpdatingLocation];
201
+ }
202
+
203
+ - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
204
+ {
205
+ DDLogDebug(@"%@ didUpdateLocations (operationMode: %lu)", TAG, (unsigned long)operationMode);
206
+
207
+ MAUROperationalMode actAsInMode = operationMode;
208
+
209
+ if (actAsInMode == MAURBackgroundMode) {
210
+ if ([_config saveBatteryOnBackground] == NO) actAsInMode = MAURForegroundMode;
211
+ }
212
+
213
+ if (actAsInMode == MAURForegroundMode) {
214
+ if (!isUpdatingLocation) [self startUpdatingLocation];
215
+ }
216
+
217
+ if (actAsInMode == MAURBackgroundMode) {
218
+ if (!isAcquiringStationaryLocation && !stationaryRegion) {
219
+ // Perhaps our GPS signal was interupted, re-acquire a stationaryLocation now.
220
+ [self switchMode:operationMode];
221
+ }
222
+ }
223
+
224
+
225
+ MAURLocation *bestLocation = nil;
226
+ for (CLLocation *location in locations) {
227
+ MAURLocation *bgloc = [MAURLocation fromCLLocation:location];
228
+
229
+ // test the age of the location measurement to determine if the measurement is cached
230
+ // in most cases you will not want to rely on cached measurements
231
+ DDLogDebug(@"Location age %f", [bgloc locationAge]);
232
+ if ([bgloc locationAge] > maxLocationAgeInSeconds || ![bgloc hasAccuracy] || ![bgloc hasTime]) {
233
+ continue;
234
+ }
235
+
236
+ if (bestLocation == nil) {
237
+ bestLocation = bgloc;
238
+ continue;
239
+ }
240
+
241
+ if ([bgloc isBetterLocation:bestLocation]) {
242
+ DDLogInfo(@"Better location found: %@", bgloc);
243
+ bestLocation = bgloc;
244
+ }
245
+ }
246
+
247
+ if (bestLocation == nil) {
248
+ return;
249
+ }
250
+
251
+ // test the measurement to see if it is more accurate than the previous measurement
252
+ if (isAcquiringStationaryLocation) {
253
+ DDLogDebug(@"%@ acquiring stationary location, accuracy: %@", TAG, bestLocation.accuracy);
254
+ if ([_config isDebugging]) {
255
+ AudioServicesPlaySystemSound (acquiringLocationSound);
256
+ }
257
+
258
+ if ([bestLocation.accuracy doubleValue] <= [_config.desiredAccuracy doubleValue]) {
259
+ DDLogDebug(@"%@ found most accurate stationary before timeout", TAG);
260
+ } else if (-[aquireStartTime timeIntervalSinceNow] < maxLocationWaitTimeInSeconds) {
261
+ // we still have time to aquire better location
262
+ return;
263
+ }
264
+
265
+ isAcquiringStationaryLocation = NO;
266
+ [self stopUpdatingLocation]; //saving power while monitoring region
267
+
268
+ MAURLocation *stationaryLocation = [bestLocation copy];
269
+ stationaryLocation.radius = _config.stationaryRadius;
270
+ stationaryLocation.time = stationarySince;
271
+ [self startMonitoringStationaryRegion:stationaryLocation];
272
+ // fire onStationary @event for Javascript.
273
+ [super.delegate onStationaryChanged:stationaryLocation];
274
+ } else if (isAcquiringSpeed) {
275
+ if ([_config isDebugging]) {
276
+ AudioServicesPlaySystemSound (acquiringLocationSound);
277
+ }
278
+
279
+ if ([bestLocation.accuracy doubleValue] <= [_config.desiredAccuracy doubleValue]) {
280
+ DDLogDebug(@"%@ found most accurate location before timeout", TAG);
281
+ } else if (-[aquireStartTime timeIntervalSinceNow] < maxLocationWaitTimeInSeconds) {
282
+ // we still have time to aquire better location
283
+ return;
284
+ }
285
+
286
+ if ([_config isDebugging]) {
287
+ [self notify:@"Aggressive monitoring engaged"];
288
+ }
289
+
290
+ // We should have a good sample for speed now, power down our GPS as configured by user.
291
+ isAcquiringSpeed = NO;
292
+ locationManager.desiredAccuracy = _config.desiredAccuracy.integerValue;
293
+ locationManager.distanceFilter = [self calculateDistanceFilter:[bestLocation.speed floatValue]];
294
+ [self startUpdatingLocation];
295
+
296
+ } else if (actAsInMode == MAURForegroundMode) {
297
+ // Adjust distanceFilter incrementally based upon current speed
298
+ float newDistanceFilter = [self calculateDistanceFilter:[bestLocation.speed floatValue]];
299
+ if (newDistanceFilter != locationManager.distanceFilter) {
300
+ DDLogInfo(@"%@ updated distanceFilter, new: %f, old: %f", TAG, newDistanceFilter, locationManager.distanceFilter);
301
+ locationManager.distanceFilter = newDistanceFilter;
302
+ [self startUpdatingLocation];
303
+ }
304
+ } else if ([self locationIsBeyondStationaryRegion:bestLocation]) {
305
+ if ([_config isDebugging]) {
306
+ [self notify:@"Manual stationary exit-detection"];
307
+ }
308
+ [self switchMode:operationMode];
309
+ }
310
+
311
+ [super.delegate onLocationChanged:bestLocation];
312
+ }
313
+
314
+ /**
315
+ * Called when user exits their stationary radius (ie: they walked ~50m away from their last recorded location.
316
+ *
317
+ */
318
+ - (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region
319
+ {
320
+ CLLocationDistance radius = [region radius];
321
+ CLLocationCoordinate2D coordinate = [region center];
322
+
323
+ DDLogDebug(@"%@ didExitRegion {%f,%f,%f}", TAG, coordinate.latitude, coordinate.longitude, radius);
324
+ if ([_config isDebugging]) {
325
+ AudioServicesPlaySystemSound (exitRegionSound);
326
+ [self notify:@"Exit stationary region"];
327
+ }
328
+ [self switchMode:operationMode];
329
+ }
330
+
331
+ - (void) locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
332
+ {
333
+ DDLogDebug(@"%@ location updates paused", TAG);
334
+ if ([_config isDebugging]) {
335
+ [self notify:@"Location updates paused"];
336
+ }
337
+ }
338
+
339
+ - (void) locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager
340
+ {
341
+ DDLogDebug(@"%@ location updates resumed", TAG);
342
+ if ([_config isDebugging]) {
343
+ [self notify:@"Location updates resumed b"];
344
+ }
345
+ }
346
+
347
+ - (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
348
+ {
349
+ DDLogError(@"%@ didFailWithError: %@", TAG, error);
350
+ if ([_config isDebugging]) {
351
+ AudioServicesPlaySystemSound (locationErrorSound);
352
+ [self notify:[NSString stringWithFormat:@"Location error: %@", error.localizedDescription]];
353
+ }
354
+
355
+ switch(error.code) {
356
+ case kCLErrorLocationUnknown:
357
+ case kCLErrorNetwork:
358
+ case kCLErrorRegionMonitoringDenied:
359
+ case kCLErrorRegionMonitoringSetupDelayed:
360
+ case kCLErrorRegionMonitoringResponseDelayed:
361
+ case kCLErrorGeocodeFoundNoResult:
362
+ case kCLErrorGeocodeFoundPartialResult:
363
+ case kCLErrorGeocodeCanceled:
364
+ break;
365
+ case kCLErrorDenied:
366
+ break;
367
+ }
368
+
369
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
370
+ NSDictionary *errorDictionary = @{
371
+ NSUnderlyingErrorKey : error
372
+ };
373
+ NSError *outError = [NSError errorWithDomain:Domain code:MAURBGServiceError userInfo:errorDictionary];
374
+
375
+ [self.delegate onError:outError];
376
+ }
377
+ }
378
+
379
+ - (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
380
+ {
381
+ DDLogInfo(@"LocationManager didChangeAuthorizationStatus %u", status);
382
+ if ([_config isDebugging]) {
383
+ [self notify:[NSString stringWithFormat:@"Authorization status changed %u", status]];
384
+ }
385
+
386
+ switch(status) {
387
+ case kCLAuthorizationStatusRestricted:
388
+ case kCLAuthorizationStatusDenied:
389
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onAuthorizationChanged:)]) {
390
+ [self.delegate onAuthorizationChanged:MAURLocationAuthorizationDenied];
391
+ }
392
+ break;
393
+ case kCLAuthorizationStatusAuthorizedAlways:
394
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onAuthorizationChanged:)]) {
395
+ [self.delegate onAuthorizationChanged:MAURLocationAuthorizationAlways];
396
+ }
397
+ break;
398
+ case kCLAuthorizationStatusAuthorizedWhenInUse:
399
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onAuthorizationChanged:)]) {
400
+ [self.delegate onAuthorizationChanged:MAURLocationAuthorizationForeground];
401
+ }
402
+ break;
403
+ default:
404
+ break;
405
+ }
406
+ }
407
+
408
+ - (void) stopUpdatingLocation
409
+ {
410
+ if (isUpdatingLocation) {
411
+ [locationManager stopUpdatingLocation];
412
+ isUpdatingLocation = NO;
413
+ }
414
+ }
415
+
416
+ - (void) startUpdatingLocation
417
+ {
418
+ if (!isUpdatingLocation) {
419
+ [locationManager startUpdatingLocation];
420
+ isUpdatingLocation = YES;
421
+ }
422
+ }
423
+
424
+ - (void) onTerminate
425
+ {
426
+ if (isStarted && !_config.stopOnTerminate) {
427
+ [locationManager startMonitoringSignificantLocationChanges];
428
+ }
429
+ }
430
+
431
+ - (void) startMonitoringSignificantLocationChanges
432
+ {
433
+ [locationManager startMonitoringSignificantLocationChanges];
434
+ }
435
+
436
+ - (void) stopMonitoringSignificantLocationChanges
437
+ {
438
+ [locationManager stopMonitoringSignificantLocationChanges];
439
+ }
440
+
441
+ /**
442
+ * Creates a new circle around user and region-monitors it for exit
443
+ */
444
+ - (void) startMonitoringStationaryRegion:(MAURLocation*)location {
445
+ CLLocationCoordinate2D coord = [location coordinate];
446
+ DDLogDebug(@"%@ startMonitoringStationaryRegion {%f,%f,%@}", TAG, coord.latitude, coord.longitude, _config.stationaryRadius);
447
+
448
+ if ([_config isDebugging]) {
449
+ AudioServicesPlaySystemSound (acquiredLocationSound);
450
+ [self notify:[NSString stringWithFormat:@"Monitoring region {%f,%f,%@}", location.coordinate.latitude, location.coordinate.longitude, _config.stationaryRadius]];
451
+ }
452
+
453
+ [self stopMonitoringForRegion];
454
+ stationaryRegion = [[CLCircularRegion alloc] initWithCenter: coord radius:_config.stationaryRadius.integerValue identifier:@"DistanceFilterProvider stationary region"];
455
+ stationaryRegion.notifyOnExit = YES;
456
+ [locationManager startMonitoringForRegion:stationaryRegion];
457
+ stationarySince = [NSDate date];
458
+ }
459
+
460
+ - (void) stopMonitoringForRegion
461
+ {
462
+ if (stationaryRegion != nil) {
463
+ [locationManager stopMonitoringForRegion:stationaryRegion];
464
+ stationaryRegion = nil;
465
+ stationarySince = nil;
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Calculates distanceFilter by rounding speed to nearest 5 and multiplying by 10. Clamped at 1km max.
471
+ */
472
+ - (float) calculateDistanceFilter:(float)speed
473
+ {
474
+ float newDistanceFilter = _config.distanceFilter.integerValue;
475
+ if (speed < 100) {
476
+ // (rounded-speed-to-nearest-5) / 2)^2
477
+ // eg 5.2 becomes (5/2)^2
478
+ newDistanceFilter = pow((5.0 * floorf(fabsf(speed) / 5.0 + 0.5f)), 2) + _config.distanceFilter.integerValue;
479
+ }
480
+ return (newDistanceFilter < 1000) ? newDistanceFilter : 1000;
481
+ }
482
+
483
+ /**
484
+ * Manual stationary location his-testing. This seems to help stationary-exit detection in some places where the automatic geo-fencing doesn't
485
+ */
486
+ - (BOOL) locationIsBeyondStationaryRegion:(MAURLocation*)location
487
+ {
488
+ CLLocationCoordinate2D regionCenter = [stationaryRegion center];
489
+ BOOL containsCoordinate = [stationaryRegion containsCoordinate:[location coordinate]];
490
+
491
+ DDLogVerbose(@"%@ location {%@,%@} region {%f,%f,%f} contains: %d",
492
+ TAG,
493
+ location.latitude, location.longitude, regionCenter.latitude, regionCenter.longitude,
494
+ [stationaryRegion radius], containsCoordinate);
495
+
496
+ return !containsCoordinate;
497
+ }
498
+
499
+ - (void) notify:(NSString*)message
500
+ {
501
+ [super notify:message];
502
+ }
503
+
504
+ - (void) onDestroy {
505
+ DDLogInfo(@"Destroying %@ ", TAG);
506
+ [self onStop:nil];
507
+ }
508
+
509
+ - (void) dealloc
510
+ {
511
+ // locationController.delegate = nil;
512
+ }
513
+
514
+ @end
@@ -0,0 +1,17 @@
1
+ //
2
+ // MAURGeolocationOpenHelper.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 27/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURGeolocationOpenHelper_h
10
+ #define MAURGeolocationOpenHelper_h
11
+
12
+ #import "MAURSQLiteOpenHelper.h"
13
+
14
+ @interface MAURGeolocationOpenHelper : MAURSQLiteOpenHelper
15
+ @end
16
+
17
+ #endif /* MAURGeolocationOpenHelper_h */
@@ -0,0 +1,97 @@
1
+ //
2
+ // MAURGeolocationOpenHelper.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 27/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+ #import "MAURGeolocationOpenHelper.h"
11
+ #import "MAURLocationContract.h"
12
+ #import "MAURConfigurationContract.h"
13
+
14
+ @implementation MAURGeolocationOpenHelper
15
+
16
+ static NSString *const kDatabaseName = @"cordova_bg_geolocation.db";
17
+ static NSInteger const kDatabaseVersion = 3;
18
+
19
+ - (instancetype)init
20
+ {
21
+ self = [super init:kDatabaseName version:kDatabaseVersion];
22
+ return self;
23
+ }
24
+
25
+ - (void) drop:(NSString*)table inDatabase:(FMDatabase*)database
26
+ {
27
+ NSString *sql = [NSString stringWithFormat: @"DROP TABLE IF EXISTS %@", table];
28
+ if (![database executeStatements:sql]) {
29
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
30
+ }
31
+ }
32
+
33
+ - (void) onCreate:(FMDatabaseQueue*)queue
34
+ {
35
+ [queue inDatabase:^(FMDatabase *database) {
36
+ // because of some legacy code we have to drop table
37
+ [self drop:@LC_TABLE_NAME inDatabase:database];
38
+
39
+ NSString *sql = [@[
40
+ [MAURLocationContract createTableSQL],
41
+ [MAURConfigurationContract createTableSQL],
42
+ @"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")"
43
+ ] componentsJoinedByString:@";"];
44
+ if (![database executeStatements:sql]) {
45
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
46
+ }
47
+ }];
48
+ }
49
+
50
+ - (void) onDowngrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
51
+ {
52
+ NSLog(@"Downgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
53
+
54
+ NSString *sql = [@[
55
+ @"DROP TABLE IF EXISTS " @LC_TABLE_NAME
56
+ ] componentsJoinedByString:@";"];
57
+
58
+ [queue inDatabase:^(FMDatabase *database) {
59
+ if (![database executeStatements:sql]) {
60
+ NSLog(@"Db downgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
61
+ } else {
62
+ [self onCreate:queue];
63
+ }
64
+ }];
65
+ }
66
+
67
+ - (void) onUpgrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
68
+ {
69
+ NSLog(@"Upgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
70
+ NSMutableArray *sql = [[NSMutableArray alloc] init];
71
+
72
+ switch (oldVersion) {
73
+ case 1:
74
+ [sql addObjectsFromArray: @[
75
+ @"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_RECORDED_AT @" INTEGER",
76
+ @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_RECORDED_AT @" =" @LC_COLUMN_NAME_TIME,
77
+ @"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")",
78
+ @"DROP INDEX IF EXISTS time_idx"
79
+ ]];
80
+ case 2:
81
+ [sql addObjectsFromArray: @[
82
+ [MAURConfigurationContract createTableSQL]
83
+ ]];
84
+ break; // break only for previous db version (cascade statements)
85
+ default:
86
+ return;
87
+ }
88
+
89
+ [queue inDatabase:^(FMDatabase *database) {
90
+ NSString *stmt = [sql componentsJoinedByString:@";"];
91
+ if (![database executeStatements:stmt]) {
92
+ NSLog(@"Db upgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
93
+ }
94
+ }];
95
+ }
96
+
97
+ @end
@@ -0,0 +1,59 @@
1
+ //
2
+ // MAURLocation.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 10/06/16.
6
+ //
7
+
8
+ #ifndef MAURLocation_h
9
+ #define MAURLocation_h
10
+
11
+ #import <Foundation/Foundation.h>
12
+ #import <CoreLocation/CoreLocation.h>
13
+
14
+ @class MAURLocation;
15
+
16
+ typedef MAURLocation * _Nullable (^ MAURLocationTransform)(MAURLocation * _Nonnull location);
17
+
18
+ typedef NS_ENUM(NSInteger, MAURLocationStatus) {
19
+ MAURLocationDeleted = 0,
20
+ MAURLocationPostPending = 1,
21
+ MAURLocationSyncPending = 2,
22
+ };
23
+
24
+ @interface MAURLocation : NSObject <NSCopying>
25
+
26
+ @property (nonatomic, retain) NSNumber *locationId;
27
+ @property (nonatomic, retain) NSDate *time;
28
+ @property (nonatomic, retain) NSNumber *accuracy;
29
+ @property (nonatomic, retain) NSNumber *altitudeAccuracy;
30
+ @property (nonatomic, retain) NSNumber *speed;
31
+ @property (nonatomic, retain) NSNumber *heading;
32
+ @property (nonatomic, retain) NSNumber *altitude;
33
+ @property (nonatomic, retain) NSNumber *latitude;
34
+ @property (nonatomic, retain) NSNumber *longitude;
35
+ @property (nonatomic, retain) NSString *provider;
36
+ @property (nonatomic, retain) NSNumber *locationProvider;
37
+ @property (nonatomic, retain) NSNumber *radius; //only for stationary locations
38
+ @property (nonatomic) BOOL isValid;
39
+ @property (nonatomic, retain) NSDate *recordedAt;
40
+
41
+ + (instancetype) fromCLLocation:(CLLocation*)location;
42
+ + (NSTimeInterval) locationAge:(CLLocation*)location;
43
+ + (NSMutableDictionary*) toDictionary:(CLLocation*)location;
44
+ - (NSTimeInterval) locationAge;
45
+ - (NSDictionary*) toDictionary;
46
+ - (NSDictionary*) toDictionaryWithId;
47
+ - (id) toResultFromTemplate:(id)locationTemplate;
48
+ - (CLLocationCoordinate2D) coordinate;
49
+ - (BOOL) hasAccuracy;
50
+ - (BOOL) hasTime;
51
+ - (double) distanceFromLocation:(MAURLocation*)location;
52
+ - (BOOL) isBetterLocation:(MAURLocation*)location;
53
+ - (BOOL) isBeyond:(MAURLocation*)location radius:(NSInteger)radius;
54
+ - (id) copyWithZone: (NSZone *)zone;
55
+ - (id) getValueForKey:(id)key;
56
+
57
+ @end
58
+
59
+ #endif /* MAURLocation_h */