@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,32 @@
1
+ /*
2
+ According to apache license
3
+
4
+ This is fork of christocracy cordova-plugin-background-geolocation plugin
5
+ https://github.com/christocracy/cordova-plugin-background-geolocation
6
+
7
+ This is a new class
8
+ */
9
+
10
+ package com.marianhello.bgloc.provider;
11
+
12
+ import com.marianhello.bgloc.Config;
13
+
14
+ /**
15
+ * LocationProvider interface
16
+ */
17
+ public interface LocationProvider {
18
+
19
+ int CMD_SWITCH_MODE = 1;
20
+
21
+ int BACKGROUND_MODE = 0;
22
+ int FOREGROUND_MODE = 1;
23
+
24
+ void onCreate();
25
+ void onDestroy();
26
+ void onStart();
27
+ void onStop();
28
+ void onCommand(int commandId, int arg1);
29
+ void onConfigure(Config config);
30
+ void setDelegate(ProviderDelegate delegate);
31
+ boolean isStarted();
32
+ }
@@ -0,0 +1,47 @@
1
+ /*
2
+ According to apache license
3
+
4
+ This is fork of christocracy cordova-plugin-background-geolocation plugin
5
+ https://github.com/christocracy/cordova-plugin-background-geolocation
6
+
7
+ This is a new class
8
+ */
9
+
10
+ package com.marianhello.bgloc.provider;
11
+
12
+ import android.content.Context;
13
+
14
+ import com.marianhello.bgloc.Config;
15
+
16
+ import java.lang.IllegalArgumentException;
17
+
18
+ /**
19
+ * LocationProviderFactory
20
+ */
21
+ public class LocationProviderFactory {
22
+
23
+ private Context mContext;
24
+
25
+ public LocationProviderFactory(Context context) {
26
+ this.mContext = context;
27
+ };
28
+
29
+ public LocationProvider getInstance (Integer locationProvider) {
30
+ LocationProvider provider;
31
+ switch (locationProvider) {
32
+ case Config.DISTANCE_FILTER_PROVIDER:
33
+ provider = new DistanceFilterLocationProvider(mContext);
34
+ break;
35
+ case Config.ACTIVITY_PROVIDER:
36
+ provider = new ActivityRecognitionLocationProvider(mContext);
37
+ break;
38
+ case Config.RAW_PROVIDER:
39
+ provider = new RawLocationProvider(mContext);
40
+ break;
41
+ default:
42
+ throw new IllegalArgumentException("Provider not found");
43
+ }
44
+
45
+ return provider;
46
+ }
47
+ }
@@ -0,0 +1,12 @@
1
+ package com.marianhello.bgloc.provider;
2
+
3
+ import com.marianhello.bgloc.PluginException;
4
+ import com.marianhello.bgloc.data.BackgroundActivity;
5
+ import com.marianhello.bgloc.data.BackgroundLocation;
6
+
7
+ public interface ProviderDelegate {
8
+ void onLocation(BackgroundLocation location);
9
+ void onStationary(BackgroundLocation location);
10
+ void onActivity(BackgroundActivity activity);
11
+ void onError(PluginException error);
12
+ }
@@ -0,0 +1,175 @@
1
+ package com.marianhello.bgloc.provider;
2
+
3
+ import android.content.Context;
4
+ import android.location.Location;
5
+ import android.location.LocationListener;
6
+ import android.location.LocationManager;
7
+ import android.os.Bundle;
8
+
9
+ import com.marianhello.bgloc.Config;
10
+
11
+ import java.util.ArrayList;
12
+ import java.util.List;
13
+
14
+ public class RawLocationProvider extends AbstractLocationProvider implements LocationListener {
15
+ private LocationManager locationManager;
16
+ private boolean isStarted = false;
17
+ // v4.5.2: providers we actively subscribed to (so we can unsubscribe cleanly).
18
+ private final List<String> activeProviders = new ArrayList<>(2);
19
+
20
+ public RawLocationProvider(Context context) {
21
+ super(context);
22
+ PROVIDER_ID = Config.RAW_PROVIDER;
23
+ }
24
+
25
+ @Override
26
+ public void onCreate() {
27
+ super.onCreate();
28
+
29
+ locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
30
+ }
31
+
32
+ @Override
33
+ public void onStart() {
34
+ if (isStarted) {
35
+ return;
36
+ }
37
+ if (locationManager == null) {
38
+ logger.error("LocationManager is null");
39
+ return;
40
+ }
41
+ if (mConfig == null) {
42
+ logger.warn("RawLocationProvider started without config");
43
+ return;
44
+ }
45
+ // v4.5.2: honor desiredAccuracy and subscribe to all suitable providers
46
+ // simultaneously (GPS + Network when available). Previously RAW only
47
+ // used GPS-or-Network and ignored desiredAccuracy.
48
+ List<String> providers = pickProviders();
49
+ if (providers.isEmpty()) {
50
+ logger.warn("No location provider available (GPS and Network disabled)");
51
+ return;
52
+ }
53
+ activeProviders.clear();
54
+ for (String provider : providers) {
55
+ try {
56
+ logger.info("Requesting location updates from provider {}", provider);
57
+ locationManager.requestLocationUpdates(provider, mConfig.getInterval(), mConfig.getDistanceFilter(), this);
58
+ activeProviders.add(provider);
59
+ } catch (SecurityException e) {
60
+ logger.error("Security exception requesting {} updates: {}", provider, e.getMessage());
61
+ this.handleSecurityException(e);
62
+ } catch (IllegalArgumentException e) {
63
+ logger.warn("requestLocationUpdates({}) failed: {}", provider, e.getMessage());
64
+ }
65
+ }
66
+ isStarted = !activeProviders.isEmpty();
67
+ }
68
+
69
+ /**
70
+ * v4.5.2: choose providers based on desiredAccuracy.
71
+ * <ul>
72
+ * <li>&lt; 1000 m → include GPS when enabled (HIGH / BALANCED)</li>
73
+ * <li>≥ 10 m → include Network when enabled (covers indoor and quick fixes)</li>
74
+ * <li>≥ 1000 m → Network-only (LOW_POWER)</li>
75
+ * </ul>
76
+ * Falls back to whatever is enabled if the preferred set is empty.
77
+ */
78
+ private List<String> pickProviders() {
79
+ List<String> result = new ArrayList<>(2);
80
+ if (locationManager == null) return result;
81
+
82
+ Integer da = mConfig != null ? mConfig.getDesiredAccuracy() : null;
83
+ int desired = (da != null) ? da : 100; // default BALANCED
84
+
85
+ boolean wantGps = desired < 1000;
86
+ boolean wantNet = desired >= 10;
87
+
88
+ boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
89
+ boolean netEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
90
+
91
+ if (wantGps && gpsEnabled) result.add(LocationManager.GPS_PROVIDER);
92
+ if (wantNet && netEnabled) result.add(LocationManager.NETWORK_PROVIDER);
93
+
94
+ // Fallback: at least one of the available providers if our preferred set was empty.
95
+ if (result.isEmpty()) {
96
+ if (gpsEnabled) result.add(LocationManager.GPS_PROVIDER);
97
+ else if (netEnabled) result.add(LocationManager.NETWORK_PROVIDER);
98
+ }
99
+ return result;
100
+ }
101
+
102
+ /** Backwards-compatible single-provider picker used by onProviderDisabled to check fallback. */
103
+ private String pickProvider() {
104
+ List<String> ps = pickProviders();
105
+ return ps.isEmpty() ? null : ps.get(0);
106
+ }
107
+
108
+ @Override
109
+ public void onStop() {
110
+ if (!isStarted) {
111
+ return;
112
+ }
113
+ try {
114
+ // v4.5.2: removeUpdates(this) detaches us from every provider we
115
+ // subscribed to via the same LocationListener.
116
+ locationManager.removeUpdates(this);
117
+ } catch (SecurityException e) {
118
+ logger.error("Security exception: {}", e.getMessage());
119
+ this.handleSecurityException(e);
120
+ } finally {
121
+ activeProviders.clear();
122
+ isStarted = false;
123
+ }
124
+ }
125
+
126
+ @Override
127
+ public void onConfigure(Config config) {
128
+ super.onConfigure(config);
129
+ if (isStarted) {
130
+ onStop();
131
+ onStart();
132
+ }
133
+ }
134
+
135
+ @Override
136
+ public boolean isStarted() {
137
+ return isStarted;
138
+ }
139
+
140
+ @Override
141
+ public void onLocationChanged(Location location) {
142
+ logger.debug("Location change: {}", location.toString());
143
+
144
+ showDebugToast("acy:" + location.getAccuracy() + ",v:" + location.getSpeed());
145
+ handleLocation(location);
146
+ }
147
+
148
+ @Override
149
+ public void onStatusChanged(String provider, int status, Bundle bundle) {
150
+ logger.debug("Provider {} status changed: {}", provider, status);
151
+ }
152
+
153
+ @Override
154
+ public void onProviderEnabled(String provider) {
155
+ logger.debug("Provider {} was enabled", provider);
156
+ }
157
+
158
+ @Override
159
+ public void onProviderDisabled(String provider) {
160
+ logger.warn("Provider {} was disabled", provider);
161
+ // v4.5.2: emit SERVICE error when no fallback provider is available so
162
+ // the JS layer can re-prompt the user. Matches DISTANCE_FILTER provider
163
+ // behavior.
164
+ if (locationManager != null && pickProvider() == null) {
165
+ handleServiceError("Location provider '" + provider + "' disabled and no fallback available.");
166
+ }
167
+ }
168
+
169
+ @Override
170
+ public void onDestroy() {
171
+ logger.debug("Destroying RawLocationProvider");
172
+ this.onStop();
173
+ super.onDestroy();
174
+ }
175
+ }
@@ -0,0 +1,199 @@
1
+ package com.marianhello.bgloc.sensor;
2
+
3
+ import android.content.Context;
4
+ import android.hardware.Sensor;
5
+ import android.hardware.SensorEvent;
6
+ import android.hardware.SensorEventListener;
7
+ import android.hardware.SensorManager;
8
+ import android.os.Handler;
9
+ import android.os.Looper;
10
+ import android.os.PowerManager;
11
+
12
+ import com.marianhello.bgloc.data.BackgroundLocation;
13
+
14
+ /**
15
+ * v4.2 Phase 8 — Real sensor fusion detector.
16
+ *
17
+ * Samples linear acceleration (TYPE_LINEAR_ACCELERATION, gravity removed) and
18
+ * gyroscope (TYPE_GYROSCOPE) at SENSOR_DELAY_GAME (~50 Hz). Used to refine
19
+ * possibleCrash and to detect phoneUsageWhileDriving. Pure-Android, no JNI.
20
+ *
21
+ * Crash detection: |a| (m/s²) above {@code crashImpactG} g during a tripActive
22
+ * window emits {@link Listener#onPossibleCrash}. Combined with the GPS-derived
23
+ * heuristic in {@link com.marianhello.bgloc.driving.DrivingEventsDetector},
24
+ * this gives a far higher-confidence signal at low speeds (parking-lot impact)
25
+ * where GPS alone misses.
26
+ *
27
+ * phoneUsageWhileDriving: while {@code tripActive} is true, if the screen turns
28
+ * on and the user produces touch-shaped jitter on the device for a sustained
29
+ * window, fires {@link Listener#onPhoneUsageWhileDriving}. Conservative — designed
30
+ * to avoid false-positives from passenger usage by tying to {@code tripActive}.
31
+ */
32
+ public class SensorFusionDetector implements SensorEventListener {
33
+
34
+ public interface Listener {
35
+ /** Triggered when |a| exceeds crashImpactG while tripActive. */
36
+ void onSensorCrash(BackgroundLocation lastLocation, double impactG);
37
+ /** Screen on + sustained device interaction during tripActive. */
38
+ void onPhoneUsageWhileDriving(BackgroundLocation lastLocation);
39
+ }
40
+
41
+ public static class Config {
42
+ public boolean enabled = false;
43
+ /** Crash threshold in g. 1g = 9.81 m/s². Default 3g. */
44
+ public double crashImpactG = 3.0;
45
+ /** Cooldown between repeated crash detections. */
46
+ public long crashCooldownMs = 10_000;
47
+ /** Min sustained gyro+accel jitter window for phoneUsage. */
48
+ public long phoneUsageWindowMs = 4_000;
49
+ /** Cooldown between repeated phone-usage events. */
50
+ public long phoneUsageCooldownMs = 60_000;
51
+ }
52
+
53
+ private static final float G = 9.80665f;
54
+
55
+ private final Context appContext;
56
+ private final Listener listener;
57
+ private final SensorManager sensorManager;
58
+ private final Sensor linearAccel;
59
+ private final Sensor gyroscope;
60
+ private final PowerManager powerManager;
61
+ private final Handler handler;
62
+
63
+ private Config cfg = new Config();
64
+ private boolean started = false;
65
+ private boolean tripActive = false;
66
+ private BackgroundLocation lastLocation;
67
+
68
+ private long lastCrashAt = 0L;
69
+ private long lastPhoneUsageAt = 0L;
70
+
71
+ // phoneUsage state
72
+ private long jitterAboveSince = 0L;
73
+ private static final double JITTER_GYRO_RAD_S = 0.7; // ~40 deg/s
74
+ private static final double JITTER_ACCEL_MPS2 = 0.5; // small accel, hand movement
75
+
76
+ public SensorFusionDetector(Context context, Listener listener) {
77
+ this.appContext = context.getApplicationContext();
78
+ this.listener = listener;
79
+ this.sensorManager = (SensorManager) appContext.getSystemService(Context.SENSOR_SERVICE);
80
+ this.linearAccel = sensorManager != null ? sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION) : null;
81
+ this.gyroscope = sensorManager != null ? sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) : null;
82
+ this.powerManager = (PowerManager) appContext.getSystemService(Context.POWER_SERVICE);
83
+ this.handler = new Handler(Looper.getMainLooper());
84
+ }
85
+
86
+ public synchronized void setConfig(Config c) {
87
+ if (c != null) this.cfg = c;
88
+ }
89
+
90
+ public synchronized boolean isAvailable() {
91
+ return sensorManager != null && linearAccel != null;
92
+ }
93
+
94
+ /** Start sampling sensors. Idempotent. */
95
+ public synchronized void start() {
96
+ if (started || !cfg.enabled || sensorManager == null) return;
97
+ if (linearAccel != null) {
98
+ sensorManager.registerListener(this, linearAccel, SensorManager.SENSOR_DELAY_GAME, handler);
99
+ }
100
+ if (gyroscope != null) {
101
+ sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_GAME, handler);
102
+ }
103
+ started = true;
104
+ }
105
+
106
+ /** Stop sampling. Idempotent. */
107
+ public synchronized void stop() {
108
+ if (!started) return;
109
+ if (sensorManager != null) sensorManager.unregisterListener(this);
110
+ started = false;
111
+ jitterAboveSince = 0L;
112
+ }
113
+
114
+ /** Called by detector host whenever the GPS layer marks tripActive on/off. */
115
+ public synchronized void setTripActive(boolean active) {
116
+ this.tripActive = active;
117
+ if (!active) jitterAboveSince = 0L;
118
+ }
119
+
120
+ /** Last known location for event payload. Updated by host. */
121
+ public synchronized void setLastLocation(BackgroundLocation loc) {
122
+ this.lastLocation = loc;
123
+ }
124
+
125
+ @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { /* ignore */ }
126
+
127
+ @Override
128
+ public void onSensorChanged(SensorEvent event) {
129
+ Listener l;
130
+ Config c;
131
+ boolean tripActiveNow;
132
+ BackgroundLocation loc;
133
+ synchronized (this) {
134
+ l = this.listener;
135
+ c = this.cfg;
136
+ tripActiveNow = this.tripActive;
137
+ loc = this.lastLocation;
138
+ }
139
+ if (l == null || c == null || !c.enabled) return;
140
+
141
+ long now = System.currentTimeMillis();
142
+
143
+ if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
144
+ float ax = event.values[0], ay = event.values[1], az = event.values[2];
145
+ double mag = Math.sqrt(ax * ax + ay * ay + az * az);
146
+ double gMag = mag / G;
147
+
148
+ // Crash: high impact during a trip.
149
+ if (tripActiveNow && c.crashImpactG > 0 && gMag >= c.crashImpactG
150
+ && (now - lastCrashAt) >= c.crashCooldownMs) {
151
+ lastCrashAt = now;
152
+ l.onSensorCrash(loc, gMag);
153
+ }
154
+
155
+ // Phone usage signal: small accel jitter during trip + screen on.
156
+ evaluatePhoneUsage(now, mag, /*gyroMag*/ -1, c, l, tripActiveNow, loc);
157
+ } else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
158
+ float gx = event.values[0], gy = event.values[1], gz = event.values[2];
159
+ double gyroMag = Math.sqrt(gx * gx + gy * gy + gz * gz);
160
+ evaluatePhoneUsage(now, /*accelMag*/ -1, gyroMag, c, l, tripActiveNow, loc);
161
+ }
162
+ }
163
+
164
+ private void evaluatePhoneUsage(long now,
165
+ double accelMag,
166
+ double gyroMag,
167
+ Config c,
168
+ Listener l,
169
+ boolean tripActiveNow,
170
+ BackgroundLocation loc) {
171
+ if (!tripActiveNow) { jitterAboveSince = 0L; return; }
172
+ if (powerManager == null || !isScreenOn()) { jitterAboveSince = 0L; return; }
173
+
174
+ boolean above = (accelMag >= 0 && accelMag >= JITTER_ACCEL_MPS2)
175
+ || (gyroMag >= 0 && gyroMag >= JITTER_GYRO_RAD_S);
176
+ if (above) {
177
+ if (jitterAboveSince == 0L) jitterAboveSince = now;
178
+ if ((now - jitterAboveSince) >= c.phoneUsageWindowMs
179
+ && (now - lastPhoneUsageAt) >= c.phoneUsageCooldownMs) {
180
+ lastPhoneUsageAt = now;
181
+ jitterAboveSince = 0L;
182
+ l.onPhoneUsageWhileDriving(loc);
183
+ }
184
+ } else {
185
+ jitterAboveSince = 0L;
186
+ }
187
+ }
188
+
189
+ @SuppressWarnings("deprecation")
190
+ private boolean isScreenOn() {
191
+ if (powerManager == null) return false;
192
+ try {
193
+ // isInteractive added API 20; we target >= 21 elsewhere, but guard anyway.
194
+ return powerManager.isInteractive();
195
+ } catch (Throwable t) {
196
+ return powerManager.isScreenOn();
197
+ }
198
+ }
199
+ }
@@ -0,0 +1,16 @@
1
+ package com.marianhello.bgloc.service;
2
+
3
+ import com.marianhello.bgloc.Config;
4
+
5
+ public interface LocationService {
6
+ void start();
7
+ void startForegroundService();
8
+ void stop();
9
+ void startForeground();
10
+ void stopForeground();
11
+ void configure(Config config);
12
+ void registerHeadlessTask(String jsFunction);
13
+ void startHeadlessTask();
14
+ void stopHeadlessTask();
15
+ void executeProviderCommand(int command, int arg);
16
+ }