@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.
- package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
- package/LICENSE +17 -0
- package/NOTICE.md +32 -0
- package/Package.swift +45 -0
- package/README.md +402 -0
- package/android/build.gradle +79 -0
- package/android/proguard-rules.pro +1 -0
- package/android/src/main/AndroidManifest.xml +83 -0
- package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
- package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
- package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
- package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
- package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
- package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
- package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
- package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
- package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
- package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
- package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
- package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
- package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
- package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
- package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
- package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
- package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
- package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
- package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
- package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
- package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
- package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
- package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
- package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
- package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
- package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
- package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
- package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/values/strings.xml +15 -0
- package/android/src/main/res/xml/authenticator.xml +7 -0
- package/android/src/main/res/xml/syncadapter.xml +9 -0
- package/dist/esm/definitions.d.ts +1052 -0
- package/dist/esm/definitions.js +142 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +92 -0
- package/dist/esm/web.js +242 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +415 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +418 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
- package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
- package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
- package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
- package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
- package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
- package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
- package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
- package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
- 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
|
+
}
|