@josuelmm/capacitor-background-geolocation 1.0.0

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 (207) hide show
  1. package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE.md +32 -0
  4. package/Package.swift +45 -0
  5. package/README.md +402 -0
  6. package/android/build.gradle +79 -0
  7. package/android/proguard-rules.pro +1 -0
  8. package/android/src/main/AndroidManifest.xml +83 -0
  9. package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
  20. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
  21. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
  22. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
  23. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
  24. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
  25. package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
  26. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  27. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
  28. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  29. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
  30. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  31. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
  32. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  40. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  41. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
  42. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  43. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
  44. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  45. package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
  46. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
  47. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  48. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
  49. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
  50. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
  51. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
  52. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
  53. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
  54. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
  55. package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
  56. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  57. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  58. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  59. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  60. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  61. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  62. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  63. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  64. package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
  65. package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
  66. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
  67. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
  68. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
  69. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  70. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  71. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  72. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
  73. package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
  74. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  75. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
  76. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  77. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  78. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  79. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
  80. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  81. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  82. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  83. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
  84. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  85. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
  86. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  87. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
  88. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  89. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  90. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  91. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  92. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  93. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  94. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  95. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  96. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  97. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  98. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  99. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  100. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  101. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  102. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  103. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  104. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  105. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  107. package/android/src/main/res/values/strings.xml +15 -0
  108. package/android/src/main/res/xml/authenticator.xml +7 -0
  109. package/android/src/main/res/xml/syncadapter.xml +9 -0
  110. package/dist/esm/definitions.d.ts +1052 -0
  111. package/dist/esm/definitions.js +142 -0
  112. package/dist/esm/definitions.js.map +1 -0
  113. package/dist/esm/index.d.ts +8 -0
  114. package/dist/esm/index.js +23 -0
  115. package/dist/esm/index.js.map +1 -0
  116. package/dist/esm/web.d.ts +92 -0
  117. package/dist/esm/web.js +242 -0
  118. package/dist/esm/web.js.map +1 -0
  119. package/dist/plugin.cjs.js +415 -0
  120. package/dist/plugin.cjs.js.map +1 -0
  121. package/dist/plugin.js +418 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
  124. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
  125. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
  126. package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
  127. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  128. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  129. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  130. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  131. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  132. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  133. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  134. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  135. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  136. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  137. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  138. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  139. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  140. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  141. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  143. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  144. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  145. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  146. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  147. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  148. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
  149. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
  150. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
  151. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
  152. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
  153. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  154. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  155. package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
  156. package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
  157. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
  158. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
  159. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  160. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
  161. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  162. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
  163. package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
  164. package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
  165. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
  166. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
  167. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  168. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
  169. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  170. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  171. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  172. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
  173. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
  174. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  175. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  176. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
  177. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  178. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
  179. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  180. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  181. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
  182. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
  183. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  184. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  185. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
  186. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
  187. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
  188. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
  189. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
  190. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
  191. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  192. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  193. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
  194. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
  195. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  197. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  198. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  199. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  200. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  201. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  202. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  203. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  204. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  205. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  206. package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
  207. package/package.json +82 -0
@@ -0,0 +1,124 @@
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
+ #import "MAURSessionLocationContract.h"
14
+
15
+ @implementation MAURGeolocationOpenHelper
16
+
17
+ static NSString *const kDatabaseName = @"cordova_bg_geolocation.db";
18
+ // v4.5.0: bumped to 7 to add events_json + battery_level + is_charging on locations,
19
+ // and config_json on configuration (paridad con Android v22).
20
+ static NSInteger const kDatabaseVersion = 7;
21
+
22
+ - (instancetype)init
23
+ {
24
+ self = [super init:kDatabaseName version:kDatabaseVersion];
25
+ return self;
26
+ }
27
+
28
+ - (void) drop:(NSString*)table inDatabase:(FMDatabase*)database
29
+ {
30
+ NSString *sql = [NSString stringWithFormat: @"DROP TABLE IF EXISTS %@", table];
31
+ if (![database executeStatements:sql]) {
32
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
33
+ }
34
+ }
35
+
36
+ - (void) onCreate:(FMDatabaseQueue*)queue
37
+ {
38
+ [queue inDatabase:^(FMDatabase *database) {
39
+ // because of some legacy code we have to drop table
40
+ [self drop:@LC_TABLE_NAME inDatabase:database];
41
+
42
+ NSString *sql = [@[
43
+ [MAURLocationContract createTableSQL],
44
+ [MAURConfigurationContract createTableSQL],
45
+ @"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")",
46
+ [MAURSessionLocationContract createTableSQL],
47
+ @"CREATE INDEX session_recorded_at_idx ON " @LSC_TABLE_NAME @" (" @LSC_COLUMN_NAME_RECORDED_AT @")"
48
+ ] componentsJoinedByString:@";"];
49
+ if (![database executeStatements:sql]) {
50
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
51
+ }
52
+ }];
53
+ }
54
+
55
+ - (void) onDowngrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
56
+ {
57
+ NSLog(@"Downgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
58
+
59
+ NSString *sql = [@[
60
+ @"DROP TABLE IF EXISTS " @LC_TABLE_NAME,
61
+ @"DROP TABLE IF EXISTS " @LSC_TABLE_NAME
62
+ ] componentsJoinedByString:@";"];
63
+
64
+ [queue inDatabase:^(FMDatabase *database) {
65
+ if (![database executeStatements:sql]) {
66
+ NSLog(@"Db downgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
67
+ } else {
68
+ [self onCreate:queue];
69
+ }
70
+ }];
71
+ }
72
+
73
+ - (void) onUpgrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
74
+ {
75
+ NSLog(@"Upgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
76
+ NSMutableArray *sql = [[NSMutableArray alloc] init];
77
+
78
+ switch (oldVersion) {
79
+ case 1:
80
+ [sql addObjectsFromArray: @[
81
+ @"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_RECORDED_AT @" INTEGER",
82
+ @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_RECORDED_AT @" =" @LC_COLUMN_NAME_TIME,
83
+ @"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")",
84
+ @"DROP INDEX IF EXISTS time_idx"
85
+ ]];
86
+ case 2:
87
+ [sql addObjectsFromArray: @[
88
+ [MAURConfigurationContract createTableSQL]
89
+ ]];
90
+ case 3:
91
+ [sql addObjectsFromArray: @[
92
+ [NSString stringWithFormat:@"ALTER TABLE %s ADD COLUMN %s INTEGER", CC_TABLE_NAME, CC_COLUMN_NAME_SYNC_ENABLED]
93
+ ]];
94
+ case 4:
95
+ [sql addObjectsFromArray: @[
96
+ [MAURSessionLocationContract createTableSQL],
97
+ [NSString stringWithFormat:@"CREATE INDEX session_recorded_at_idx ON %@ (%@)", @LSC_TABLE_NAME, @LSC_COLUMN_NAME_RECORDED_AT]
98
+ ]];
99
+ case 5:
100
+ // v4.5.0: persist driving events / battery / charging on locations.
101
+ [sql addObjectsFromArray: @[
102
+ @"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_EVENTS_JSON @" TEXT",
103
+ @"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_BATTERY_LEVEL @" INTEGER",
104
+ @"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_IS_CHARGING @" INTEGER"
105
+ ]];
106
+ case 6:
107
+ // v4.5.0: full config persisted as JSON blob (paridad con Android config_json).
108
+ [sql addObjectsFromArray: @[
109
+ [NSString stringWithFormat:@"ALTER TABLE %s ADD COLUMN %s TEXT", CC_TABLE_NAME, CC_COLUMN_NAME_CONFIG_JSON]
110
+ ]];
111
+ break; // break only for previous db version (cascade statements)
112
+ default:
113
+ return;
114
+ }
115
+
116
+ [queue inDatabase:^(FMDatabase *database) {
117
+ NSString *stmt = [sql componentsJoinedByString:@";"];
118
+ if (![database executeStatements:stmt]) {
119
+ NSLog(@"Db upgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
120
+ }
121
+ }];
122
+ }
123
+
124
+ @end
@@ -0,0 +1,73 @@
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
+ /** True if location was simulated by software (e.g. Simulator). iOS 15+. */
41
+ @property (nonatomic, retain) NSNumber *simulated;
42
+ /**
43
+ * v4.3 — Driving events anexados a este fix.
44
+ * v4.5: persiste en SQLite (events_json TEXT) — sobrevive a la cola de sync.
45
+ * Cada elemento es un NSDictionary con al menos { "type": NSString, "time": NSNumber }.
46
+ */
47
+ @property (nonatomic, retain) NSMutableArray *drivingEvents;
48
+ /** v4.4 — Battery percentage (0-100) at the time of this fix.
49
+ * v4.5: persisted in SQLite (battery_level INTEGER). */
50
+ @property (nonatomic, retain) NSNumber *batteryLevel;
51
+ /** v4.4 — Whether the device is charging at the time of this fix.
52
+ * v4.5: persisted in SQLite (is_charging INTEGER). */
53
+ @property (nonatomic, retain) NSNumber *isCharging;
54
+
55
+ + (instancetype) fromCLLocation:(CLLocation*)location;
56
+ + (NSTimeInterval) locationAge:(CLLocation*)location;
57
+ + (NSMutableDictionary*) toDictionary:(CLLocation*)location;
58
+ - (NSTimeInterval) locationAge;
59
+ - (NSDictionary*) toDictionary;
60
+ - (NSDictionary*) toDictionaryWithId;
61
+ - (id) toResultFromTemplate:(id)locationTemplate;
62
+ - (CLLocationCoordinate2D) coordinate;
63
+ - (BOOL) hasAccuracy;
64
+ - (BOOL) hasTime;
65
+ - (double) distanceFromLocation:(MAURLocation*)location;
66
+ - (BOOL) isBetterLocation:(MAURLocation*)location;
67
+ - (BOOL) isBeyond:(MAURLocation*)location radius:(NSInteger)radius;
68
+ - (id) copyWithZone: (NSZone *)zone;
69
+ - (id) getValueForKey:(id)key;
70
+
71
+ @end
72
+
73
+ #endif /* MAURLocation_h */
@@ -0,0 +1,392 @@
1
+ //
2
+ // MAURLocation.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 10/06/16.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+ #import <CoreLocation/CoreLocation.h>
10
+ #import "MAURLocation.h"
11
+
12
+ enum {
13
+ TWO_MINUTES = 120,
14
+ MAX_SECONDS_FROM_NOW = 86400
15
+ };
16
+
17
+ @interface MAURLocationMapper : NSObject
18
+ - (NSDictionary*) withDictionary:(NSDictionary*)values;
19
+ - (NSArray*) withArray:(NSArray*)values;
20
+ + (instancetype) map:(MAURLocation*)location;
21
+ @end
22
+
23
+ // v4.5.1 — _location was previously a file-scope global. With real-time post (background queue)
24
+ // and background sync (NSURLSession queue) running concurrently, the second [+map:] invocation
25
+ // overwrote _location while the first mapper was mid-serialize, producing mixed location fields
26
+ // at the backend. Now per-instance ivar.
27
+ @implementation MAURLocationMapper {
28
+ MAURLocation *_location;
29
+ }
30
+
31
+ - (id) mapValue:(id)value
32
+ {
33
+ if ([value isKindOfClass:[NSString class]]) {
34
+ id locationValue = [_location getValueForKey:value];
35
+ // v4.5.1 — for placeholder keys ("@time", "@events", "@battery", ...), if the location
36
+ // has no value, return NSNull instead of leaking the literal "@events" string to the
37
+ // backend. For non-placeholder static strings (e.g. a `deviceId` literal in postTemplate)
38
+ // keep the previous behaviour and return the string as-is.
39
+ if ([value hasPrefix:@"@"]) {
40
+ return locationValue != nil ? locationValue : [NSNull null];
41
+ }
42
+ return locationValue != nil ? locationValue : value;
43
+ } else if ([value isKindOfClass:[NSDictionary class]]) {
44
+ return [self withDictionary:value];
45
+ } else if ([value isKindOfClass:[NSArray class]]) {
46
+ return [self withArray:value];
47
+ }
48
+
49
+ return value;
50
+ }
51
+
52
+ - (NSDictionary*) withDictionary:(NSDictionary*)values
53
+ {
54
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:values.count];
55
+
56
+ for (id key in values) {
57
+ id value = [values objectForKey:key];
58
+ [dict setObject:[self mapValue:value] forKey:key];
59
+ }
60
+
61
+ return dict;
62
+ }
63
+
64
+ - (NSArray*) withArray:(NSArray*)values
65
+ {
66
+ NSMutableArray *locationArray = [[NSMutableArray alloc] initWithCapacity:values.count];
67
+
68
+ for (id value in values) {
69
+ [locationArray addObject:[self mapValue:value]];
70
+ }
71
+
72
+ return locationArray;
73
+ }
74
+
75
+ + (instancetype) map:(MAURLocation*)location
76
+ {
77
+ MAURLocationMapper *instance = [[MAURLocationMapper alloc] init];
78
+ instance->_location = location;
79
+ return instance;
80
+ }
81
+ @end
82
+
83
+
84
+ @implementation MAURLocation
85
+
86
+ @synthesize locationId, time, accuracy, altitudeAccuracy, speed, heading, altitude, latitude, longitude, provider, locationProvider, radius, isValid, recordedAt, simulated, drivingEvents, batteryLevel, isCharging;
87
+
88
+ + (instancetype) fromCLLocation:(CLLocation*)location;
89
+ {
90
+ MAURLocation *instance = [[MAURLocation alloc] init];
91
+
92
+ instance.time = location.timestamp;
93
+ instance.accuracy = [NSNumber numberWithDouble:location.horizontalAccuracy];
94
+ instance.altitudeAccuracy = [NSNumber numberWithDouble:location.verticalAccuracy];
95
+ instance.speed = [NSNumber numberWithDouble:location.speed];
96
+ instance.heading = [NSNumber numberWithDouble:location.course]; // will be deprecated
97
+ instance.altitude = [NSNumber numberWithDouble:location.altitude];
98
+ instance.latitude = [NSNumber numberWithDouble:location.coordinate.latitude];
99
+ instance.longitude = [NSNumber numberWithDouble:location.coordinate.longitude];
100
+
101
+ if (@available(iOS 15.0, *)) {
102
+ if (location.sourceInformation != nil && location.sourceInformation.isSimulatedBySoftware) {
103
+ instance.simulated = @YES;
104
+ } else {
105
+ instance.simulated = @NO;
106
+ }
107
+ }
108
+
109
+ return instance;
110
+ }
111
+
112
+ + (NSTimeInterval) locationAge:(CLLocation*)location
113
+ {
114
+ return -[location.timestamp timeIntervalSinceNow];
115
+ }
116
+
117
+ + (NSDictionary*) toDictionary:(CLLocation*)location;
118
+ {
119
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
120
+
121
+ NSNumber* timestamp = [NSNumber numberWithDouble:([location.timestamp timeIntervalSince1970] * 1000)];
122
+ [dict setObject:timestamp forKey:@"time"];
123
+ [dict setObject:[NSNumber numberWithDouble:location.horizontalAccuracy] forKey:@"accuracy"];
124
+ [dict setObject:[NSNumber numberWithDouble:location.verticalAccuracy] forKey:@"altitudeAccuracy"];
125
+ [dict setObject:[NSNumber numberWithDouble:location.speed] forKey:@"speed"];
126
+ [dict setObject:[NSNumber numberWithDouble:location.course] forKey:@"heading"];
127
+ [dict setObject:[NSNumber numberWithDouble:location.course] forKey:@"bearing"];
128
+ [dict setObject:[NSNumber numberWithDouble:location.altitude] forKey:@"altitude"];
129
+ [dict setObject:[NSNumber numberWithDouble:location.coordinate.latitude] forKey:@"latitude"];
130
+ [dict setObject:[NSNumber numberWithDouble:location.coordinate.longitude] forKey:@"longitude"];
131
+
132
+ return dict;
133
+ }
134
+
135
+ - (instancetype) init
136
+ {
137
+ self = [super init];
138
+ if (self != nil) {
139
+ [self commonInit];
140
+ }
141
+
142
+ return self;
143
+ }
144
+
145
+ - (void) commonInit
146
+ {
147
+ isValid = true;
148
+ }
149
+
150
+ /*
151
+ * Age of location measured from now in seconds
152
+ *
153
+ */
154
+ - (NSTimeInterval) locationAge
155
+ {
156
+ return -[time timeIntervalSinceNow];
157
+ }
158
+
159
+ - (NSDictionary*) toDictionaryWithId
160
+ {
161
+ NSMutableDictionary *dict = (NSMutableDictionary*)[self toDictionary];
162
+
163
+ // locationId is solely for internal purposes like deleteLocation method!!!
164
+ if (locationId != nil) [dict setObject:locationId forKey:@"id"];
165
+
166
+ return dict;
167
+ }
168
+
169
+ - (NSMutableDictionary*) toDictionary
170
+ {
171
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:13];
172
+
173
+ if (time != nil) [dict setObject:[NSNumber numberWithDouble:([time timeIntervalSince1970] * 1000)] forKey:@"time"];
174
+ if (accuracy != nil) [dict setObject:accuracy forKey:@"accuracy"];
175
+ if (altitudeAccuracy != nil) [dict setObject:altitudeAccuracy forKey:@"altitudeAccuracy"];
176
+ if (speed != nil) [dict setObject:speed forKey:@"speed"];
177
+ if (heading != nil) [dict setObject:heading forKey:@"heading"]; // @deprecated
178
+ if (heading != nil) [dict setObject:heading forKey:@"bearing"];
179
+ if (altitude != nil) [dict setObject:altitude forKey:@"altitude"];
180
+ if (latitude != nil) [dict setObject:latitude forKey:@"latitude"];
181
+ if (longitude != nil) [dict setObject:longitude forKey:@"longitude"];
182
+ if (provider != nil) [dict setObject:provider forKey:@"provider"];
183
+ if (locationProvider != nil) [dict setObject:locationProvider forKey:@"locationProvider"];
184
+ if (radius != nil) [dict setObject:radius forKey:@"radius"];
185
+ if (recordedAt != nil) [dict setObject:[NSNumber numberWithDouble:([recordedAt timeIntervalSince1970] * 1000)] forKey:@"recordedAt"];
186
+ if (simulated != nil) [dict setObject:simulated forKey:@"simulated"];
187
+ // v4.3 — driving events anexados a este fix
188
+ if (drivingEvents != nil && [drivingEvents count] > 0) [dict setObject:drivingEvents forKey:@"events"];
189
+ // v4.4 — battery snapshot
190
+ if (batteryLevel != nil) [dict setObject:batteryLevel forKey:@"battery"];
191
+ if (isCharging != nil) [dict setObject:isCharging forKey:@"isCharging"];
192
+
193
+ return dict;
194
+ }
195
+
196
+ - (id) getValueForKey:(id)key
197
+ {
198
+ if (key == nil || ![key isKindOfClass:[NSString class]]) {
199
+ return nil;
200
+ }
201
+
202
+ if ([key isEqualToString:@"@id"]) {
203
+ return locationId;
204
+ }
205
+ if ([key isEqualToString:@"@time"]) {
206
+ return [NSNumber numberWithDouble:([time timeIntervalSince1970] * 1000)];
207
+ }
208
+ if ([key isEqualToString:@"@accuracy"]) {
209
+ return accuracy;
210
+ }
211
+ if ([key isEqualToString:@"@altitudeAccuracy"]) {
212
+ return altitudeAccuracy;
213
+ }
214
+ if ([key isEqualToString:@"@speed"]) {
215
+ return speed;
216
+ }
217
+ if ([key isEqualToString:@"@heading"]) {
218
+ return heading;
219
+ }
220
+ if ([key isEqualToString:@"@bearing"]) {
221
+ return heading;
222
+ }
223
+ if ([key isEqualToString:@"@altitude"]) {
224
+ return altitude;
225
+ }
226
+ if ([key isEqualToString:@"@latitude"]) {
227
+ return latitude;
228
+ }
229
+ if ([key isEqualToString:@"@longitude"]) {
230
+ return longitude;
231
+ }
232
+ if ([key isEqualToString:@"@provider"]) {
233
+ return provider;
234
+ }
235
+ if ([key isEqualToString:@"@locationProvider"]) {
236
+ return locationProvider;
237
+ }
238
+ if ([key isEqualToString:@"@radius"]) {
239
+ return radius;
240
+ }
241
+ if ([key isEqualToString:@"@recordedAt"]) {
242
+ return [NSNumber numberWithDouble:([recordedAt timeIntervalSince1970] * 1000)];
243
+ }
244
+ if ([key isEqualToString:@"@simulated"]) {
245
+ return simulated;
246
+ }
247
+ // v4.3 — driving events array (nil when no events on this fix; mapper drops nil keys).
248
+ if ([key isEqualToString:@"@events"]) {
249
+ return (drivingEvents != nil && [drivingEvents count] > 0) ? drivingEvents : nil;
250
+ }
251
+ // v4.4 — battery snapshot
252
+ if ([key isEqualToString:@"@battery"]) return batteryLevel;
253
+ if ([key isEqualToString:@"@isCharging"]) return isCharging;
254
+
255
+ return nil;
256
+ }
257
+
258
+ - (id) toResultFromTemplate:(id)locationTemplate
259
+ {
260
+ if ([locationTemplate isKindOfClass:[NSArray class]]) {
261
+ MAURLocationMapper *mapper = [MAURLocationMapper map:self];
262
+ return [mapper withArray:locationTemplate];
263
+ } else if ([locationTemplate isKindOfClass:[NSDictionary class]]) {
264
+ MAURLocationMapper *mapper = [MAURLocationMapper map:self];
265
+ return [mapper withDictionary:locationTemplate];
266
+ }
267
+
268
+ return [self toDictionary];
269
+ }
270
+
271
+ - (CLLocationCoordinate2D) coordinate
272
+ {
273
+ CLLocationCoordinate2D coordinate;
274
+ coordinate.latitude = [latitude doubleValue];
275
+ coordinate.longitude = [longitude doubleValue];
276
+ return coordinate;
277
+ }
278
+
279
+ - (double) distanceFromLocation:(MAURLocation*)location
280
+ {
281
+ const float EarthRadius = 6378137.0f;
282
+ double a_lat = [self.latitude doubleValue];
283
+ double a_lon = [self.longitude doubleValue];
284
+ double b_lat = [location.latitude doubleValue];
285
+ double b_lon = [location.longitude doubleValue];
286
+ double dtheta = (a_lat - b_lat) * (M_PI / 180.0);
287
+ double dlambda = (a_lon - b_lon) * (M_PI / 180.0);
288
+ double mean_t = (a_lat + b_lat) * (M_PI / 180.0) / 2.0;
289
+ double cos_meant = cosf(mean_t);
290
+
291
+ return sqrtf((EarthRadius * EarthRadius) * (dtheta * dtheta + cos_meant * cos_meant * dlambda * dlambda));
292
+ }
293
+
294
+ /**
295
+ * Determines whether instance is better then Location reading
296
+ * @param location The new Location that you want to evaluate
297
+ * Note: code taken from https://developer.android.com/guide/topics/location/strategies.html
298
+ */
299
+ - (BOOL) isBetterLocation:(MAURLocation*)location
300
+ {
301
+ if (location == nil) {
302
+ // A instance location is always better than no location
303
+ return NO;
304
+ }
305
+
306
+ // Check whether the new location fix is newer or older
307
+ NSTimeInterval timeDelta = [self.time timeIntervalSinceDate:location.time];
308
+ BOOL isSignificantlyNewer = timeDelta > TWO_MINUTES;
309
+ BOOL isSignificantlyOlder = timeDelta < -TWO_MINUTES;
310
+ BOOL isNewer = timeDelta > 0;
311
+
312
+ // If it's been more than two minutes since the current location, use the new location
313
+ // because the user has likely moved
314
+ if (isSignificantlyNewer) {
315
+ return YES;
316
+ // If the new location is more than two minutes older, it must be worse
317
+ } else if (isSignificantlyOlder) {
318
+ return NO;
319
+ }
320
+
321
+ // Check whether the new location fix is more or less accurate
322
+ NSInteger accuracyDelta = [self.accuracy integerValue] - [location.accuracy integerValue];
323
+ BOOL isLessAccurate = accuracyDelta > 0;
324
+ BOOL isMoreAccurate = accuracyDelta < 0;
325
+ BOOL isSignificantlyLessAccurate = accuracyDelta > 200;
326
+
327
+ // Check if the old and new location are from the same provider
328
+ BOOL isFromSameProvider = YES; //TODO: check
329
+
330
+ // Determine location quality using a combination of timeliness and accuracy
331
+ if (isMoreAccurate) {
332
+ return YES;
333
+ } else if (isNewer && !isLessAccurate) {
334
+ return YES;
335
+ } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
336
+ return YES;
337
+ }
338
+
339
+ return NO;
340
+ }
341
+
342
+ - (BOOL) isBeyond:(MAURLocation*)location radius:(NSInteger)definedRadius
343
+ {
344
+ double pointDistance = [self distanceFromLocation:location];
345
+ return (pointDistance - [self.accuracy doubleValue] - [location.accuracy doubleValue]) > definedRadius;
346
+ }
347
+
348
+ - (BOOL) hasAccuracy
349
+ {
350
+ if (accuracy == nil || accuracy < 0) return NO;
351
+ return YES;
352
+ }
353
+
354
+ - (BOOL) hasTime
355
+ {
356
+ if (time != nil && [time timeIntervalSinceNow] > MAX_SECONDS_FROM_NOW) return NO;
357
+ return YES;
358
+ }
359
+
360
+ - (NSString *) description
361
+ {
362
+ return [NSString stringWithFormat:@"Location: id=%@ time=%@ lat=%@ lon=%@ accu=%@ aaccu=%@ speed=%@ bear=%@ alt=%@", locationId, time, latitude, longitude, accuracy, altitudeAccuracy, speed, heading, altitude];
363
+ }
364
+
365
+ -(id) copyWithZone: (NSZone *) zone
366
+ {
367
+ MAURLocation *copy = [[[self class] allocWithZone: zone] init];
368
+ if (copy) {
369
+ copy.time = time;
370
+ copy.accuracy = accuracy;
371
+ copy.altitudeAccuracy = altitudeAccuracy;
372
+ copy.speed = speed;
373
+ copy.heading = heading;
374
+ copy.altitude = altitude;
375
+ copy.latitude = latitude;
376
+ copy.longitude = longitude;
377
+ copy.provider = provider;
378
+ copy.locationProvider = locationProvider;
379
+ copy.radius = radius;
380
+ copy.isValid = isValid;
381
+ copy.simulated = simulated;
382
+ // v4.3: copy driving events array reference (transient; mutating one affects the other,
383
+ // but in practice the original is discarded right after the copy is posted).
384
+ copy.drivingEvents = drivingEvents != nil ? [drivingEvents mutableCopy] : nil;
385
+ copy.batteryLevel = batteryLevel;
386
+ copy.isCharging = isCharging;
387
+ }
388
+
389
+ return copy;
390
+ }
391
+
392
+ @end
@@ -0,0 +1,38 @@
1
+ //
2
+ // MAURLocationContract.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 23/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURLocationContract_h
10
+ #define MAURLocationContract_h
11
+
12
+ #define LC_TABLE_NAME "location"
13
+ #define LC_COLUMN_NAME_ID "id"
14
+ #define LC_COLUMN_NAME_NULLABLE "NULLHACK"
15
+ #define LC_COLUMN_NAME_TIME "time"
16
+ #define LC_COLUMN_NAME_ACCURACY "accuracy"
17
+ #define LC_COLUMN_NAME_SPEED "speed"
18
+ #define LC_COLUMN_NAME_BEARING "bearing"
19
+ #define LC_COLUMN_NAME_ALTITUDE "altitude"
20
+ #define LC_COLUMN_NAME_LATITUDE "latitude"
21
+ #define LC_COLUMN_NAME_LONGITUDE "longitude"
22
+ #define LC_COLUMN_NAME_PROVIDER "provider"
23
+ #define LC_COLUMN_NAME_LOCATION_PROVIDER "service_provider"
24
+ #define LC_COLUMN_NAME_STATUS "valid"
25
+ #define LC_COLUMN_NAME_RECORDED_AT "recorded_at"
26
+ // v4.5 — survive sync queue
27
+ #define LC_COLUMN_NAME_EVENTS_JSON "events_json"
28
+ #define LC_COLUMN_NAME_BATTERY_LEVEL "battery_level"
29
+ #define LC_COLUMN_NAME_IS_CHARGING "is_charging"
30
+
31
+ @interface MAURLocationContract : NSObject
32
+
33
+ + (NSString*) createTableSQL;
34
+
35
+ @end
36
+
37
+
38
+ #endif /* MAURLocationContract_h */
@@ -0,0 +1,39 @@
1
+ //
2
+ // MAURLocationContract.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 23/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+ #import "MAURSQLiteHelper.h"
11
+ #import "MAURLocationContract.h"
12
+
13
+ @implementation MAURLocationContract
14
+
15
+ + (NSString*) createTableSQL
16
+ {
17
+ NSArray *columns = @[
18
+ @{ @"name": @LC_COLUMN_NAME_ID, @"type": [SQLPrimaryKeyAutoIncColumnType sqlColumnWithType: kInteger]},
19
+ @{ @"name": @LC_COLUMN_NAME_TIME, @"type": [SQLColumnType sqlColumnWithType: kReal]},
20
+ @{ @"name": @LC_COLUMN_NAME_ACCURACY, @"type": [SQLColumnType sqlColumnWithType: kReal]},
21
+ @{ @"name": @LC_COLUMN_NAME_SPEED, @"type": [SQLColumnType sqlColumnWithType: kReal]},
22
+ @{ @"name": @LC_COLUMN_NAME_BEARING, @"type": [SQLColumnType sqlColumnWithType: kReal]},
23
+ @{ @"name": @LC_COLUMN_NAME_ALTITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
24
+ @{ @"name": @LC_COLUMN_NAME_LATITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
25
+ @{ @"name": @LC_COLUMN_NAME_LONGITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
26
+ @{ @"name": @LC_COLUMN_NAME_PROVIDER, @"type": [SQLColumnType sqlColumnWithType: kText]},
27
+ @{ @"name": @LC_COLUMN_NAME_LOCATION_PROVIDER, @"type": [SQLColumnType sqlColumnWithType: kText]},
28
+ @{ @"name": @LC_COLUMN_NAME_STATUS, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
29
+ @{ @"name": @LC_COLUMN_NAME_RECORDED_AT, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
30
+ // v4.5 — survive sync queue
31
+ @{ @"name": @LC_COLUMN_NAME_EVENTS_JSON, @"type": [SQLColumnType sqlColumnWithType: kText]},
32
+ @{ @"name": @LC_COLUMN_NAME_BATTERY_LEVEL, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
33
+ @{ @"name": @LC_COLUMN_NAME_IS_CHARGING, @"type": [SQLColumnType sqlColumnWithType: kInteger]}
34
+ ];
35
+
36
+ return [MAURSQLiteHelper createTableSqlStatement:@LC_TABLE_NAME columns:columns];
37
+ }
38
+
39
+ @end