@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,23 @@
1
+ //
2
+ // MAURActivity.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 13/12/2017.
6
+ // Copyright © 2017 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURActivity_h
10
+ #define MAURActivity_h
11
+
12
+ #import <Foundation/Foundation.h>
13
+
14
+ @interface MAURActivity : NSObject <NSCopying>
15
+
16
+ @property NSNumber *confidence;
17
+ @property NSString *type;
18
+
19
+ - (NSDictionary*) toDictionary;
20
+
21
+ @end
22
+
23
+ #endif /* MAURActivity_h */
@@ -0,0 +1,52 @@
1
+ //
2
+ // MAURActivity.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 13/12/2017.
6
+ // Copyright © 2017 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import "MAURActivity.h"
10
+
11
+ @implementation MAURActivity
12
+
13
+ @synthesize type, confidence;
14
+
15
+ - (instancetype) init
16
+ {
17
+ self = [super init];
18
+ if (self != nil) {
19
+ confidence = [NSNumber numberWithInt:0];
20
+ }
21
+
22
+ return self;
23
+ }
24
+
25
+ - (NSDictionary*) toDictionary
26
+ {
27
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
28
+
29
+ if (confidence != nil) [dict setObject:confidence forKey:@"confidence"];
30
+ if (type != nil) [dict setObject:type forKey:@"type"];
31
+
32
+ return dict;
33
+ }
34
+
35
+ - (NSString *) description
36
+ {
37
+ return [NSString stringWithFormat:@"Activity: confidence=%@ type=%@", confidence, type];
38
+
39
+ }
40
+
41
+ -(id) copyWithZone: (NSZone *) zone
42
+ {
43
+ MAURActivity *copy = [[[self class] allocWithZone: zone] init];
44
+ if (copy) {
45
+ copy.confidence = confidence;
46
+ copy.type = type;
47
+ }
48
+
49
+ return copy;
50
+ }
51
+
52
+ @end
@@ -0,0 +1,18 @@
1
+ //
2
+ // MAURActivityLocationProvider.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 14/09/2016.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURActivityLocationProvider_h
10
+ #define MAURActivityLocationProvider_h
11
+
12
+ #import "MAURAbstractLocationProvider.h"
13
+
14
+ @interface MAURActivityLocationProvider : MAURAbstractLocationProvider<MAURLocationProvider>
15
+
16
+ @end
17
+
18
+ #endif /* MAURActivityLocationProvider_h */
@@ -0,0 +1,340 @@
1
+ //
2
+ // MAURActivityLocationProvider.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 14/09/2016.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+ // v4.5.2 — refactored to use CoreMotion's CMMotionActivityManager directly.
9
+ // The SOMotionDetector dependency (sources + plugin.xml entries) was removed
10
+ // in this version.
11
+ //
12
+
13
+ #import <Foundation/Foundation.h>
14
+ #import <CoreMotion/CoreMotion.h>
15
+ #import "MAURActivityLocationProvider.h"
16
+ #import "MAURActivity.h"
17
+ #import "MAURLocationManager.h"
18
+ #import "MAURLogging.h"
19
+
20
+ static NSString * const TAG = @"ActivityLocationProvider";
21
+ static NSString * const Domain = @"com.marianhello";
22
+
23
+ // Local motion-type enum (replaces the legacy SOMotionType used previously).
24
+ typedef NS_ENUM(NSUInteger, MAURMotionType) {
25
+ MAURMotionTypeUnknown = 0,
26
+ MAURMotionTypeNotMoving,
27
+ MAURMotionTypeWalking,
28
+ MAURMotionTypeRunning,
29
+ MAURMotionTypeAutomotive,
30
+ MAURMotionTypeCycling
31
+ };
32
+
33
+ @implementation MAURActivityLocationProvider {
34
+ BOOL isStarted;
35
+ BOOL isTracking;
36
+ BOOL motionAvailable;
37
+ BOOL motionPermissionErrorEmitted;
38
+ MAURMotionType lastMotionType;
39
+
40
+ MAURLocationManager *locationManager;
41
+ CMMotionActivityManager *activityManager;
42
+ NSOperationQueue *activityQueue;
43
+
44
+ // v4.5.2: cache of active config so motion callbacks can read
45
+ // activityConfidenceThreshold without re-fetching.
46
+ MAURConfig *currentConfig;
47
+ }
48
+
49
+ - (instancetype) init
50
+ {
51
+ self = [super init];
52
+
53
+ if (self) {
54
+ isStarted = NO;
55
+ isTracking = NO;
56
+ motionAvailable = NO;
57
+ motionPermissionErrorEmitted = NO;
58
+ lastMotionType = MAURMotionTypeUnknown;
59
+ }
60
+
61
+ return self;
62
+ }
63
+
64
+ - (void) onCreate {
65
+ locationManager = [MAURLocationManager sharedInstance];
66
+ locationManager.delegate = self;
67
+
68
+ // v4.5.2 — CoreMotion direct. Without CMMotionActivityManager support the
69
+ // provider cannot drive STILL/ACTIVE transitions; emit a clear error so the
70
+ // host app knows to fall back to DISTANCE_FILTER or RAW.
71
+ motionAvailable = [CMMotionActivityManager isActivityAvailable];
72
+ if (!motionAvailable) {
73
+ DDLogError(@"%@ CMMotionActivityManager unavailable on this device; ACTIVITY_PROVIDER will be inert.", TAG);
74
+ NSError *err = [NSError errorWithDomain:Domain
75
+ code:MAURBGServiceError
76
+ userInfo:@{ NSLocalizedDescriptionKey: @"CMMotionActivityManager unavailable on this device." }];
77
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
78
+ [self.delegate onError:err];
79
+ }
80
+ return;
81
+ }
82
+
83
+ activityManager = [[CMMotionActivityManager alloc] init];
84
+ activityQueue = [[NSOperationQueue alloc] init];
85
+ activityQueue.name = @"MAURActivityRecognitionQueue";
86
+ activityQueue.maxConcurrentOperationCount = 1;
87
+ }
88
+
89
+ - (BOOL) onConfigure:(MAURConfig*)config error:(NSError * __autoreleasing *)outError
90
+ {
91
+ DDLogVerbose(@"%@ configure", TAG);
92
+
93
+ currentConfig = config;
94
+
95
+ locationManager.pausesLocationUpdatesAutomatically = [config pauseLocationUpdates];
96
+ locationManager.activityType = [config decodeActivityType];
97
+ locationManager.distanceFilter = config.distanceFilter.integerValue; // meters
98
+ locationManager.desiredAccuracy = [config decodeDesiredAccuracy];
99
+
100
+ return YES;
101
+ }
102
+
103
+ - (BOOL) onStart:(NSError * __autoreleasing *)outError
104
+ {
105
+ DDLogInfo(@"%@ will start", TAG);
106
+
107
+ if (isStarted) {
108
+ return YES;
109
+ }
110
+
111
+ if (!motionAvailable || activityManager == nil) {
112
+ // No motion service: degrade gracefully — keep emitting raw location
113
+ // changes via the manager, but the STILL/ACTIVE state machine is off.
114
+ [self startTracking];
115
+ isStarted = YES;
116
+ return YES;
117
+ }
118
+
119
+ // iOS 11+: surface motion-permission denial up-front so the host app can
120
+ // re-prompt. Older iOS versions deliver permission errors via the handler.
121
+ if (@available(iOS 11.0, *)) {
122
+ CMAuthorizationStatus authStatus = [CMMotionActivityManager authorizationStatus];
123
+ if (authStatus == CMAuthorizationStatusDenied || authStatus == CMAuthorizationStatusRestricted) {
124
+ if (!motionPermissionErrorEmitted) {
125
+ NSError *err = [NSError errorWithDomain:Domain
126
+ code:MAURBGServiceError
127
+ userInfo:@{ NSLocalizedDescriptionKey: @"Motion & Fitness permission denied; ACTIVITY_PROVIDER cannot detect STILL/ACTIVE." }];
128
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
129
+ [self.delegate onError:err];
130
+ }
131
+ motionPermissionErrorEmitted = YES;
132
+ }
133
+ // Still start raw tracking so locations flow.
134
+ [self startTracking];
135
+ isStarted = YES;
136
+ return YES;
137
+ }
138
+ }
139
+
140
+ __weak typeof(self) weakSelf = self;
141
+ [activityManager startActivityUpdatesToQueue:activityQueue
142
+ withHandler:^(CMMotionActivity * _Nullable activity) {
143
+ typeof(self) strongSelf = weakSelf;
144
+ if (strongSelf == nil || activity == nil) return;
145
+ [strongSelf handleActivityUpdate:activity];
146
+ }];
147
+
148
+ // v4.5.2 — start tracking immediately. Without this, if the user opens the
149
+ // app while already still, CoreMotion fires STILL first and `handleActivityUpdate`
150
+ // never calls startTracking (its rule is "ACTIVE → start"), so no fix is ever
151
+ // produced and the initial stationary is never emitted. Mirrors the legacy
152
+ // SOMotionDetector behavior. If CoreMotion subsequently confirms STILL, the
153
+ // first incoming fix will trigger `onStationaryChanged` + `stopTracking`, so
154
+ // battery cost stays bounded.
155
+ [self startTracking];
156
+
157
+ isStarted = YES;
158
+ return YES;
159
+ }
160
+
161
+ - (BOOL) onStop:(NSError * __autoreleasing *)outError
162
+ {
163
+ DDLogInfo(@"%@ will stop", TAG);
164
+
165
+ if (!isStarted) {
166
+ return YES;
167
+ }
168
+
169
+ if (activityManager != nil) {
170
+ [activityManager stopActivityUpdates];
171
+ }
172
+ [self stopTracking];
173
+ isStarted = NO;
174
+
175
+ return YES;
176
+ }
177
+
178
+ #pragma mark - CMMotionActivity → MAURActivity bridge
179
+
180
+ - (void) handleActivityUpdate:(CMMotionActivity *)activity
181
+ {
182
+ // CMMotionActivityConfidence: Low=0, Medium=1, High=2 → normalize to 0-100
183
+ // so activityConfidenceThreshold means the same thing as on Android.
184
+ int confidence;
185
+ switch (activity.confidence) {
186
+ case CMMotionActivityConfidenceLow: confidence = 20; break;
187
+ case CMMotionActivityConfidenceMedium: confidence = 40; break;
188
+ case CMMotionActivityConfidenceHigh: confidence = 80; break;
189
+ default: confidence = 0; break;
190
+ }
191
+
192
+ NSNumber *thresholdN = currentConfig.activityConfidenceThreshold;
193
+ if (thresholdN != nil && confidence < thresholdN.intValue) {
194
+ DDLogDebug(@"%@ ignoring low-confidence activity confidence=%d threshold=%@", TAG, confidence, thresholdN);
195
+ return;
196
+ }
197
+
198
+ MAURMotionType motionType;
199
+ NSString *typeStr;
200
+ if (activity.automotive) {
201
+ motionType = MAURMotionTypeAutomotive;
202
+ typeStr = @"IN_VEHICLE";
203
+ } else if (activity.cycling) {
204
+ motionType = MAURMotionTypeCycling;
205
+ typeStr = @"ON_BICYCLE";
206
+ } else if (activity.running) {
207
+ motionType = MAURMotionTypeRunning;
208
+ typeStr = @"RUNNING";
209
+ } else if (activity.walking) {
210
+ motionType = MAURMotionTypeWalking;
211
+ typeStr = @"WALKING";
212
+ } else if (activity.stationary) {
213
+ motionType = MAURMotionTypeNotMoving;
214
+ typeStr = @"STILL";
215
+ } else {
216
+ // CoreMotion fired "unknown" or no specific motion flag set. Do NOT
217
+ // collapse this to NotMoving — under uncertainty we keep the current
218
+ // tracking state (legacy behavior was to stop on UNKNOWN, which paused
219
+ // GPS unexpectedly during low-confidence motion gaps).
220
+ motionType = MAURMotionTypeUnknown;
221
+ typeStr = @"UNKNOWN";
222
+ }
223
+
224
+ // Hop to main queue: location manager + delegate are main-thread-affine.
225
+ dispatch_async(dispatch_get_main_queue(), ^{
226
+ // UNKNOWN must not perturb the state machine: no emit, no lastMotionType
227
+ // mutation, no tracking change. Otherwise a sequence STILL → UNKNOWN
228
+ // would lose the STILL state and the next fix would be delivered as a
229
+ // regular location instead of stationary.
230
+ if (motionType == MAURMotionTypeUnknown) {
231
+ DDLogDebug(@"%@ ignoring UNKNOWN activity (state preserved, confidence=%d)", TAG, confidence);
232
+ return;
233
+ }
234
+
235
+ BOOL changed = (motionType != self->lastMotionType);
236
+ self->lastMotionType = motionType;
237
+
238
+ if (changed) {
239
+ DDLogDebug(@"%@ activityTypeChanged: %@ confidence=%d", TAG, typeStr, confidence);
240
+ MAURActivity *act = [[MAURActivity alloc] init];
241
+ act.type = typeStr;
242
+ act.confidence = [NSNumber numberWithInt:confidence];
243
+ if (super.delegate && [super.delegate respondsToSelector:@selector(onActivityChanged:)]) {
244
+ [super.delegate onActivityChanged:act];
245
+ }
246
+ }
247
+
248
+ // Tracking control:
249
+ // - ACTIVE motion (walking, running, automotive, cycling) → ensure tracking is on.
250
+ // - STILL → leave tracking running; it will be stopped after the next fix (legacy).
251
+ if (motionType != MAURMotionTypeNotMoving) {
252
+ [self startTracking];
253
+ }
254
+ });
255
+ }
256
+
257
+ #pragma mark - Location plumbing
258
+
259
+ - (void) startTracking
260
+ {
261
+ if (isTracking) {
262
+ return;
263
+ }
264
+
265
+ NSError *error = nil;
266
+ if ([locationManager start:&error]) {
267
+ isTracking = YES;
268
+ } else {
269
+ if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
270
+ [self.delegate onError:error];
271
+ }
272
+ }
273
+ }
274
+
275
+ - (void) stopTracking
276
+ {
277
+ if (isTracking) {
278
+ [locationManager stop:nil];
279
+ isTracking = NO;
280
+ }
281
+ }
282
+
283
+ - (void) onSwitchMode:(MAUROperationalMode)mode
284
+ {
285
+ /* do nothing */
286
+ }
287
+
288
+ - (void) onAuthorizationChanged:(MAURLocationAuthorizationStatus)authStatus
289
+ {
290
+ [self.delegate onAuthorizationChanged:authStatus];
291
+ }
292
+
293
+ - (void) onLocationsChanged:(NSArray*)locations
294
+ {
295
+ // v4.5.2: while NotMoving we only emit the stationary fix; the previous
296
+ // code fell through and also delivered each location as onLocationChanged,
297
+ // which produced phantom "moving" rows during a STILL window.
298
+ if (lastMotionType == MAURMotionTypeNotMoving) {
299
+ [self stopTracking];
300
+ [self.delegate onStationaryChanged:[MAURLocation fromCLLocation:[locations lastObject]]];
301
+ return;
302
+ }
303
+
304
+ for (CLLocation *location in locations) {
305
+ MAURLocation *bgloc = [MAURLocation fromCLLocation:location];
306
+ [self.delegate onLocationChanged:bgloc];
307
+ }
308
+ }
309
+
310
+ - (void) onError:(NSError*)error
311
+ {
312
+ [self.delegate onError:error];
313
+ }
314
+
315
+ - (void) onPause:(CLLocationManager*)manager
316
+ {
317
+ [self.delegate onLocationPause];
318
+ }
319
+
320
+ - (void) onResume:(CLLocationManager*)manager
321
+ {
322
+ [self.delegate onLocationResume];
323
+ }
324
+
325
+ - (void) onDestroy {
326
+ DDLogInfo(@"Destroying %@ ", TAG);
327
+ [self onStop:nil];
328
+
329
+ // v4.5.2: MAURLocationManager is a singleton shared with the other providers
330
+ // (RAW, DISTANCE). Release the delegate slot so a subsequent provider swap
331
+ // does not leave this destroyed instance as the active delegate.
332
+ if (locationManager != nil && locationManager.delegate == self) {
333
+ locationManager.delegate = nil;
334
+ }
335
+
336
+ activityManager = nil;
337
+ activityQueue = nil;
338
+ }
339
+
340
+ @end
@@ -0,0 +1,88 @@
1
+ //
2
+ // MAURBackgroundGeolocationFacade.h
3
+ //
4
+ // Created by Marian Hello on 04/06/16.
5
+ // Version 2.0.0
6
+ //
7
+ // According to apache license
8
+ //
9
+ // This is class is using code from christocracy cordova-plugin-background-geolocation plugin
10
+ // https://github.com/christocracy/cordova-plugin-background-geolocation
11
+
12
+ #ifndef MAURBackgroundGeolocationFacade_h
13
+ #define MAURBackgroundGeolocationFacade_h
14
+
15
+ #import "MAURProviderDelegate.h"
16
+ #import "MAURLocation.h"
17
+ #import "MAURConfig.h"
18
+
19
+ // v3.5 Phase 4: heartbeat notification. userInfo[@"location"] is the latest MAURLocation
20
+ // (may be absent if no fix has been received yet).
21
+ extern NSString * _Nonnull const MAURHeartbeatNotification;
22
+
23
+ // v4.0 Phase 6: driver-insight notifications. userInfo carries `location` and event-specific keys.
24
+ extern NSString * _Nonnull const MAURTripStartNotification;
25
+ extern NSString * _Nonnull const MAURTripEndNotification; // userInfo: location, distance, durationMs
26
+ extern NSString * _Nonnull const MAURMovingNotification;
27
+ extern NSString * _Nonnull const MAURStoppedNotification;
28
+ extern NSString * _Nonnull const MAURSpeedingNotification; // userInfo: location, speedKmh, limitKmh
29
+ extern NSString * _Nonnull const MAURProviderChangeNotification;// userInfo: provider
30
+ extern NSString * _Nonnull const MAURSOSNotification; // userInfo: location, payload (NSDictionary)
31
+ // v4.1 GPS-derived sensor-like events. userInfo: location, value (double)
32
+ extern NSString * _Nonnull const MAURHardBrakeNotification;
33
+ extern NSString * _Nonnull const MAURRapidAccelerationNotification;
34
+ extern NSString * _Nonnull const MAURSharpTurnNotification;
35
+ extern NSString * _Nonnull const MAURPossibleCrashNotification;
36
+ // v4.2 sensor fusion events. userInfo: location, source ("gps"|"sensor"), value (double)
37
+ extern NSString * _Nonnull const MAURPhoneUsageWhileDrivingNotification;
38
+
39
+ @interface MAURBackgroundGeolocationFacade : NSObject
40
+
41
+ @property (weak, nonatomic) id<MAURProviderDelegate> delegate;
42
+
43
+ - (BOOL) configure:(MAURConfig*)config error:(NSError * __autoreleasing *)outError;
44
+ - (BOOL) start:(NSError * __autoreleasing *)outError;
45
+ - (BOOL) stop:(NSError * __autoreleasing *)outError;
46
+ - (BOOL) locationServicesEnabled;
47
+ - (MAURLocationAuthorizationStatus) authorizationStatus;
48
+ - (BOOL) isStarted;
49
+ - (void) showAppSettings;
50
+ - (void) showLocationSettings;
51
+ - (void) switchMode:(MAUROperationalMode)mode;
52
+ - (MAURLocation*)getStationaryLocation;
53
+ - (NSArray<MAURLocation*>*) getLocations;
54
+ - (NSArray<MAURLocation*>*) getValidLocations;
55
+ - (NSArray<MAURLocation*>*) getValidLocationsAndDelete;
56
+ - (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError;
57
+ - (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError;
58
+ - (MAURLocation*)getCurrentLocation:(int)timeout maximumAge:(long)maximumAge
59
+ enableHighAccuracy:(BOOL)enableHighAccuracy
60
+ error:(NSError * __autoreleasing *)outError;
61
+ - (MAURConfig*) getConfig;
62
+ - (NSArray*) getLogEntries:(NSInteger)limit;
63
+ - (NSArray*) getLogEntries:(NSInteger)limit fromLogEntryId:(NSInteger)entryId minLogLevelFromString:(NSString *)minLogLevel;
64
+ /** v4.0 Phase 6 — Trigger an SOS event with the latest known location and a user payload. */
65
+ - (void) triggerSOS:(NSDictionary * _Nullable)payload;
66
+ - (void) forceSync;
67
+ - (void) clearSync;
68
+ - (NSInteger) getPendingSyncCount;
69
+ - (void) startSession;
70
+ - (NSArray<MAURLocation*>*) getSessionLocations;
71
+ - (void) clearSession;
72
+ - (NSInteger) getSessionLocationsCount;
73
+ - (void) onAppTerminate;
74
+
75
+
76
+ /**
77
+ * Sets a transform for each coordinate about to be committed (sent or saved for later sync).
78
+ * You can use this for modifying the coordinates in any way.
79
+ *
80
+ * If the transform returns <code>nil</code>, it will prevent the location from being committed.
81
+ * @param transform - the transform block
82
+ */
83
+ + (void) setLocationTransform:(MAURLocationTransform _Nullable)transform;
84
+ + (MAURLocationTransform _Nullable) locationTransform;
85
+
86
+ @end
87
+
88
+ #endif /* MAURBackgroundGeolocationFacade_h */