@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,214 @@
1
+ package com.marianhello.bgloc.oem;
2
+
3
+ import android.app.Activity;
4
+ import android.content.ComponentName;
5
+ import android.content.Context;
6
+ import android.content.Intent;
7
+ import android.net.Uri;
8
+ import android.os.Build;
9
+ import android.os.PowerManager;
10
+ import android.provider.Settings;
11
+
12
+ import org.json.JSONArray;
13
+ import org.json.JSONException;
14
+ import org.json.JSONObject;
15
+
16
+ /**
17
+ * v3.6 Phase 5: Battery / OEM helpers.
18
+ *
19
+ * Standard Android Doze whitelist:
20
+ * - {@link #isIgnoringBatteryOptimizations(Context)}
21
+ * - {@link #requestIgnoreBatteryOptimizations(Activity)}
22
+ * - {@link #openBatterySettings(Activity)}
23
+ *
24
+ * OEM-specific "auto-start" / "background activity" screens (Xiaomi MIUI, Huawei
25
+ * EMUI, Oppo ColorOS, Vivo FunTouch, Samsung One UI). These cannot be granted
26
+ * programmatically — the user must toggle them in Settings.
27
+ */
28
+ public final class BatteryOemHelper {
29
+
30
+ private BatteryOemHelper() { /* no instances */ }
31
+
32
+ public static boolean isIgnoringBatteryOptimizations(Context ctx) {
33
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true;
34
+ try {
35
+ PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
36
+ return pm != null && pm.isIgnoringBatteryOptimizations(ctx.getPackageName());
37
+ } catch (Exception e) {
38
+ return false;
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Opens the system battery-optimisation prompt for the app.
44
+ * Does not throw; logs and silently returns if the system dialog is missing.
45
+ */
46
+ public static void requestIgnoreBatteryOptimizations(Activity activity) {
47
+ if (activity == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;
48
+ try {
49
+ Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
50
+ intent.setData(Uri.parse("package:" + activity.getPackageName()));
51
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
52
+ activity.startActivity(intent);
53
+ } catch (Exception ignored) {
54
+ openBatterySettings(activity);
55
+ }
56
+ }
57
+
58
+ public static void openBatterySettings(Activity activity) {
59
+ if (activity == null) return;
60
+ // Try the per-app battery usage screen first; fall back to app-info.
61
+ try {
62
+ Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
63
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
64
+ activity.startActivity(intent);
65
+ } catch (Exception e) {
66
+ try {
67
+ Intent fallback = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
68
+ fallback.setData(Uri.parse("package:" + activity.getPackageName()));
69
+ fallback.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
70
+ activity.startActivity(fallback);
71
+ } catch (Exception ignored) {}
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Open the OEM-specific "auto-start" / "background activity" screen.
77
+ * Returns a JSON object describing what was opened so the JS layer can show
78
+ * appropriate copy: { opened, manufacturer, screen }.
79
+ */
80
+ public static JSONObject openAutoStartSettings(Activity activity) throws JSONException {
81
+ JSONObject out = new JSONObject();
82
+ String manufacturer = Build.MANUFACTURER != null ? Build.MANUFACTURER.toLowerCase() : "";
83
+ out.put("manufacturer", manufacturer);
84
+ out.put("opened", false);
85
+ out.put("screen", "");
86
+
87
+ if (activity == null) return out;
88
+
89
+ ComponentName component = autoStartComponent(manufacturer);
90
+ if (component != null) {
91
+ try {
92
+ Intent intent = new Intent();
93
+ intent.setComponent(component);
94
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
95
+ activity.startActivity(intent);
96
+ out.put("opened", true);
97
+ out.put("screen", component.flattenToShortString());
98
+ return out;
99
+ } catch (Exception ignored) { /* fall through to app-info */ }
100
+ }
101
+
102
+ // Fallback: standard application details page so the user can toggle background restrictions.
103
+ try {
104
+ Intent fallback = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
105
+ fallback.setData(Uri.parse("package:" + activity.getPackageName()));
106
+ fallback.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
107
+ activity.startActivity(fallback);
108
+ out.put("opened", true);
109
+ out.put("screen", "android.settings.APPLICATION_DETAILS_SETTINGS");
110
+ } catch (Exception ignored) {}
111
+ return out;
112
+ }
113
+
114
+ /** Known OEM auto-start screen components. Verified against AOSP / OEM forks; may vary by ROM. */
115
+ private static ComponentName autoStartComponent(String manufacturer) {
116
+ if (manufacturer == null) return null;
117
+ if (manufacturer.contains("xiaomi") || manufacturer.contains("redmi") || manufacturer.contains("poco")) {
118
+ return new ComponentName("com.miui.securitycenter",
119
+ "com.miui.permcenter.autostart.AutoStartManagementActivity");
120
+ }
121
+ if (manufacturer.contains("huawei") || manufacturer.contains("honor")) {
122
+ return new ComponentName("com.huawei.systemmanager",
123
+ "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity");
124
+ }
125
+ if (manufacturer.contains("oppo")) {
126
+ return new ComponentName("com.coloros.safecenter",
127
+ "com.coloros.safecenter.permission.startup.StartupAppListActivity");
128
+ }
129
+ if (manufacturer.contains("vivo")) {
130
+ return new ComponentName("com.vivo.permissionmanager",
131
+ "com.vivo.permissionmanager.activity.BgStartUpManagerActivity");
132
+ }
133
+ if (manufacturer.contains("samsung")) {
134
+ // Samsung does not expose a stable component for "Sleeping apps"; return null and
135
+ // let the caller fall back to app-info, where the user can disable battery optimisation.
136
+ return null;
137
+ }
138
+ if (manufacturer.contains("oneplus")) {
139
+ return new ComponentName("com.oneplus.security",
140
+ "com.oneplus.security.chainlaunch.view.ChainLaunchAppListActivity");
141
+ }
142
+ if (manufacturer.contains("asus")) {
143
+ return new ComponentName("com.asus.mobilemanager",
144
+ "com.asus.mobilemanager.entry.FunctionActivity");
145
+ }
146
+ return null;
147
+ }
148
+
149
+ /**
150
+ * Returns OEM-specific guidance steps. The caller renders them as a help screen.
151
+ */
152
+ public static JSONObject getManufacturerHelp() throws JSONException {
153
+ JSONObject out = new JSONObject();
154
+ String m = Build.MANUFACTURER != null ? Build.MANUFACTURER.toLowerCase() : "";
155
+ out.put("manufacturer", m);
156
+ out.put("steps", new JSONArray(stepsFor(m)));
157
+ return out;
158
+ }
159
+
160
+ private static String[] stepsFor(String manufacturer) {
161
+ if (manufacturer.contains("xiaomi") || manufacturer.contains("redmi") || manufacturer.contains("poco")) {
162
+ return new String[] {
163
+ "Settings → Apps → Manage apps → [your app] → Autostart → enable.",
164
+ "Settings → Apps → Manage apps → [your app] → Battery saver → No restrictions.",
165
+ "Settings → Apps → Manage apps → [your app] → Other permissions → Display pop-up windows while running in the background → Allow.",
166
+ "Lock the app in Recents (drag it down to keep it in memory)."
167
+ };
168
+ }
169
+ if (manufacturer.contains("huawei") || manufacturer.contains("honor")) {
170
+ return new String[] {
171
+ "Settings → Apps → [your app] → Battery → App launch → switch off Manage automatically and enable Auto-launch + Run in background.",
172
+ "Settings → Battery → App launch → [your app] → manage manually."
173
+ };
174
+ }
175
+ if (manufacturer.contains("oppo")) {
176
+ return new String[] {
177
+ "Settings → Battery → Power Consumption Protection → [your app] → Allow.",
178
+ "Settings → Apps → App management → [your app] → Permissions → Auto-start → Allow.",
179
+ "Settings → Privacy permissions → Startup manager → [your app] → enable."
180
+ };
181
+ }
182
+ if (manufacturer.contains("vivo")) {
183
+ return new String[] {
184
+ "Settings → Battery → High background power consumption → [your app] → Allow.",
185
+ "Settings → More settings → Permission management → Auto-start → [your app] → enable."
186
+ };
187
+ }
188
+ if (manufacturer.contains("samsung")) {
189
+ return new String[] {
190
+ "Settings → Apps → [your app] → Battery → Unrestricted.",
191
+ "Settings → Battery and device care → Battery → Background usage limits → Sleeping apps → make sure [your app] is NOT listed.",
192
+ "Settings → Battery and device care → Battery → Background usage limits → Never sleeping apps → add [your app]."
193
+ };
194
+ }
195
+ if (manufacturer.contains("oneplus")) {
196
+ return new String[] {
197
+ "Settings → Battery → Battery optimisation → [your app] → Don't optimise.",
198
+ "Settings → Apps → [your app] → Battery → Background activity → Allow."
199
+ };
200
+ }
201
+ if (manufacturer.contains("asus")) {
202
+ return new String[] {
203
+ "Settings → Apps → [your app] → Battery → Battery saver → Off.",
204
+ "Mobile Manager → Auto-start manager → [your app] → enable."
205
+ };
206
+ }
207
+ // Generic Android.
208
+ return new String[] {
209
+ "Settings → Apps → [your app] → Battery → Unrestricted.",
210
+ "Settings → Apps → [your app] → Permissions → Location → Allow all the time.",
211
+ "Disable battery optimisation for [your app] in Settings → Battery."
212
+ };
213
+ }
214
+ }
@@ -0,0 +1,218 @@
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.BroadcastReceiver;
13
+ import android.content.Context;
14
+ import android.content.Intent;
15
+ import android.content.IntentFilter;
16
+ import android.location.Location;
17
+ import android.media.AudioManager;
18
+ import android.provider.Settings;
19
+ import android.widget.Toast;
20
+
21
+ import com.google.android.gms.location.DetectedActivity;
22
+ import com.marianhello.bgloc.Config;
23
+ import com.marianhello.bgloc.PluginException;
24
+ import com.marianhello.bgloc.data.BackgroundActivity;
25
+ import com.marianhello.bgloc.data.BackgroundLocation;
26
+ import com.marianhello.logging.LoggerManager;
27
+ import com.marianhello.utils.ToneGenerator;
28
+ import com.marianhello.utils.ToneGenerator.Tone;
29
+
30
+ /**
31
+ * AbstractLocationProvider
32
+ */
33
+ public abstract class AbstractLocationProvider implements LocationProvider {
34
+
35
+ protected Integer PROVIDER_ID;
36
+ protected Config mConfig;
37
+ protected Context mContext;
38
+
39
+ protected ToneGenerator toneGenerator;
40
+ protected org.slf4j.Logger logger;
41
+
42
+ private ProviderDelegate mDelegate;
43
+
44
+ protected AbstractLocationProvider(Context context) {
45
+ mContext = context;
46
+ logger = LoggerManager.getLogger(getClass());
47
+ logger.info("Creating {}", getClass().getSimpleName());
48
+ }
49
+
50
+ @Override
51
+ public void onCreate() {
52
+ toneGenerator = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
53
+ }
54
+
55
+ @Override
56
+ public void onDestroy() {
57
+ toneGenerator.release();
58
+ toneGenerator = null;
59
+ }
60
+
61
+ @Override
62
+ public void onConfigure(Config config) {
63
+ mConfig = config;
64
+ }
65
+
66
+ @Override
67
+ public void onCommand(int commandId, int arg1) {
68
+ // override in child class
69
+ }
70
+
71
+ public void setDelegate(ProviderDelegate delegate) {
72
+ mDelegate = delegate;
73
+ }
74
+
75
+ /**
76
+ * Register broadcast reciever
77
+ * @param receiver
78
+ */
79
+ protected Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter) {
80
+ return mContext.registerReceiver(receiver, filter);
81
+ }
82
+
83
+ /**
84
+ * Unregister broadcast reciever
85
+ * @param receiver
86
+ */
87
+ protected void unregisterReceiver (BroadcastReceiver receiver) {
88
+ mContext.unregisterReceiver(receiver);
89
+ }
90
+
91
+ /**
92
+ * v4.5.2: drop fixes whose horizontal accuracy is worse than the configured
93
+ * maxAcceptedAccuracy threshold. Returns true when the location must be
94
+ * discarded.
95
+ */
96
+ private boolean exceedsMaxAcceptedAccuracy(Location location) {
97
+ if (location == null || mConfig == null) return false;
98
+ Float max = mConfig.getMaxAcceptedAccuracy();
99
+ if (max == null || max <= 0) return false;
100
+ if (!location.hasAccuracy()) return false;
101
+ if (location.getAccuracy() > max) {
102
+ logger.debug("Dropping fix: accuracy={} exceeds maxAcceptedAccuracy={}", location.getAccuracy(), max);
103
+ return true;
104
+ }
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Handle location as recorder by provider
110
+ * @param location
111
+ */
112
+ protected void handleLocation (Location location) {
113
+ if (exceedsMaxAcceptedAccuracy(location)) return;
114
+ playDebugTone(Tone.BEEP);
115
+ if (mDelegate != null) {
116
+ BackgroundLocation bgLocation = new BackgroundLocation(PROVIDER_ID, location);
117
+ bgLocation.setMockLocationsEnabled(hasMockLocationsEnabled());
118
+ mDelegate.onLocation(bgLocation);
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Handle stationary location with radius
124
+ *
125
+ * @param location
126
+ * @param radius radius of stationary region
127
+ */
128
+ protected void handleStationary (Location location, float radius) {
129
+ if (exceedsMaxAcceptedAccuracy(location)) return;
130
+ playDebugTone(Tone.LONG_BEEP);
131
+ if (mDelegate != null) {
132
+ BackgroundLocation bgLocation = new BackgroundLocation(PROVIDER_ID, location);
133
+ bgLocation.setRadius(radius);
134
+ bgLocation.setMockLocationsEnabled(hasMockLocationsEnabled());
135
+ mDelegate.onStationary(bgLocation);
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Handle stationary location without radius
141
+ *
142
+ * @param location
143
+ */
144
+ protected void handleStationary (Location location) {
145
+ if (exceedsMaxAcceptedAccuracy(location)) return;
146
+ playDebugTone(Tone.LONG_BEEP);
147
+ if (mDelegate != null) {
148
+ BackgroundLocation bgLocation = new BackgroundLocation(PROVIDER_ID, location);
149
+ bgLocation.setMockLocationsEnabled(hasMockLocationsEnabled());
150
+ mDelegate.onStationary(bgLocation);
151
+ }
152
+ }
153
+
154
+ protected void handleActivity(DetectedActivity activity) {
155
+ if (mDelegate != null) {
156
+ mDelegate.onActivity(new BackgroundActivity(PROVIDER_ID, activity));
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Handle security exception
162
+ * @param exception
163
+ */
164
+ protected void handleSecurityException (SecurityException exception) {
165
+ PluginException error = new PluginException(exception.getMessage(), PluginException.PERMISSION_DENIED_ERROR);
166
+ if (mDelegate != null) {
167
+ mDelegate.onError(error);
168
+ }
169
+ }
170
+
171
+ /**
172
+ * v4.5.2: emit a permission-denied error to the delegate (used when a runtime
173
+ * permission such as ACTIVITY_RECOGNITION is missing on Android 10+).
174
+ */
175
+ protected void handlePermissionDenied(String message) {
176
+ if (mDelegate != null) {
177
+ mDelegate.onError(new PluginException(message, PluginException.PERMISSION_DENIED_ERROR));
178
+ }
179
+ }
180
+
181
+ /**
182
+ * v4.5.2: emit a service-level error to the delegate (used when Google Play
183
+ * Services is missing/outdated or the OS location service is disabled).
184
+ */
185
+ protected void handleServiceError(String message) {
186
+ if (mDelegate != null) {
187
+ mDelegate.onError(new PluginException(message, PluginException.SERVICE_ERROR));
188
+ }
189
+ }
190
+
191
+ protected void showDebugToast (String text) {
192
+ if (mConfig.isDebugging()) {
193
+ Toast.makeText(mContext, text, Toast.LENGTH_LONG).show();
194
+ }
195
+ }
196
+
197
+ public Boolean hasMockLocationsEnabled() {
198
+ // v4.5.2: Settings.Secure.getString may return null (key absent on the
199
+ // device's settings provider). The previous code crashed with NPE because
200
+ // it called .equals("1") on the returned value. Invert the comparison so
201
+ // null safely yields false.
202
+ String value = Settings.Secure.getString(
203
+ mContext.getContentResolver(),
204
+ android.provider.Settings.Secure.ALLOW_MOCK_LOCATION);
205
+ return "1".equals(value);
206
+ }
207
+
208
+ /**
209
+ * Plays debug sound
210
+ * @param name toneGenerator
211
+ */
212
+ protected void playDebugTone (int name) {
213
+ if (toneGenerator == null || !mConfig.isDebugging()) return;
214
+
215
+ int duration = 1000;
216
+ toneGenerator.startTone(name, duration);
217
+ }
218
+ }