@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,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>< 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
|
+
}
|