react-native-nitro-background-geolocation 0.1.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/NitroBackgroundGeolocation.podspec +29 -0
- package/android/CMakeLists.txt +24 -0
- package/android/build.gradle +133 -0
- package/android/src/main/AndroidManifest.xml +65 -0
- package/android/src/main/cpp/cpp-adapter.cpp +11 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/ConfigMapper.kt +332 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/HeadlessTaskRegistry.kt +23 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/HeadlessTaskService.kt +66 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/NitroBackgroundGeolocation.kt +538 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/NitroBackgroundGeolocationPackage.kt +22 -0
- package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/ReactNativeHeadlessTaskRunner.kt +62 -0
- package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +542 -0
- package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +59 -0
- package/android/src/main/java/com/marianhello/bgloc/Config.java +652 -0
- package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +168 -0
- package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +19 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
- package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +186 -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 +994 -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 +22 -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 +65 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +395 -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 +76 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +160 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +112 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +506 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +151 -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 +61 -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/provider/AbstractLocationProvider.java +171 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +280 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +586 -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 +142 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +17 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +760 -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 +140 -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 +246 -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 +233 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
- package/android/src/main/java/com/marianhello/logging/DBLogReader.java +203 -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/values/strings.xml +6 -0
- package/android/src/main/res/xml/authenticator.xml +7 -0
- package/android/src/main/res/xml/syncadapter.xml +9 -0
- package/app.plugin.js +64 -0
- package/ios/NitroBackgroundGeolocation.swift +719 -0
- package/ios/NitroBackgroundGeolocationBootstrap.m +98 -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 +202 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +62 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +650 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +34 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +184 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.h +74 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.m +485 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +49 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +51 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +523 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +97 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.h +59 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.m +349 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.h +34 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.m +35 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.m +308 -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 +40 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +218 -0
- package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +129 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +278 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +38 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +380 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
- package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
- package/ios/common/BackgroundGeolocation/Reachability.m +474 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.h +80 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.m +147 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.h +30 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.m +42 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.h +99 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.m +327 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.h +44 -0
- package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.m +94 -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/lib/module/NitroBackgroundGeolocation.nitro.js +172 -0
- package/lib/module/NitroBackgroundGeolocation.nitro.js.map +1 -0
- package/lib/module/headless.js +72 -0
- package/lib/module/headless.js.map +1 -0
- package/lib/module/index.js +60 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NitroBackgroundGeolocation.nitro.d.ts +616 -0
- package/lib/typescript/src/NitroBackgroundGeolocation.nitro.d.ts.map +1 -0
- package/lib/typescript/src/headless.d.ts +40 -0
- package/lib/typescript/src/headless.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +8 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/nitro.json +23 -0
- package/nitrogen/generated/android/c++/JActivity.hpp +61 -0
- package/nitrogen/generated/android/c++/JAuthorizationStatus.hpp +61 -0
- package/nitrogen/generated/android/c++/JBackgroundGeolocationError.hpp +61 -0
- package/nitrogen/generated/android/c++/JConfigureOptions.hpp +179 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_Activity.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_AuthorizationStatus.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_BackgroundGeolocationError.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_Location.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_StationaryLocation.hpp +78 -0
- package/nitrogen/generated/android/c++/JHybridNitroBackgroundGeolocationSpec.cpp +530 -0
- package/nitrogen/generated/android/c++/JHybridNitroBackgroundGeolocationSpec.hpp +90 -0
- package/nitrogen/generated/android/c++/JLocation.hpp +105 -0
- package/nitrogen/generated/android/c++/JLocationAccuracy.hpp +64 -0
- package/nitrogen/generated/android/c++/JLocationOptions.hpp +65 -0
- package/nitrogen/generated/android/c++/JLocationProvider.hpp +61 -0
- package/nitrogen/generated/android/c++/JLogEntry.hpp +73 -0
- package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +67 -0
- package/nitrogen/generated/android/c++/JServiceStatus.hpp +66 -0
- package/nitrogen/generated/android/c++/JStationaryLocation.hpp +109 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AnyMap.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AnyMap.hpp +71 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_LocationAccuracy.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_LocationAccuracy.hpp +71 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_LocationProvider.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_LocationProvider.hpp +71 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.cpp +33 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.hpp +77 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Activity.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/AuthorizationStatus.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/BackgroundGeolocationError.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/ConfigureOptions.kt +182 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_Activity.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_AuthorizationStatus.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_BackgroundGeolocationError.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_Location.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_StationaryLocation.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/HybridNitroBackgroundGeolocationSpec.kt +218 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Location.kt +111 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationAccuracy.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationOptions.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationProvider.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LogEntry.kt +71 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/NativeLogLevel.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/ServiceStatus.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/StationaryLocation.kt +116 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_AnyMap.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Boolean.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Double.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_LocationAccuracy.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_LocationProvider.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Map_String__String_.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_String.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/nitrobackgroundgeolocationOnLoad.kt +35 -0
- package/nitrogen/generated/android/nitrobackgroundgeolocation+autolinking.cmake +88 -0
- package/nitrogen/generated/android/nitrobackgroundgeolocation+autolinking.gradle +27 -0
- package/nitrogen/generated/android/nitrobackgroundgeolocationOnLoad.cpp +66 -0
- package/nitrogen/generated/android/nitrobackgroundgeolocationOnLoad.hpp +34 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocation+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Bridge.cpp +129 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Bridge.hpp +911 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Umbrella.hpp +88 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocationAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroBackgroundGeolocationAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridNitroBackgroundGeolocationSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroBackgroundGeolocationSpecSwift.hpp +335 -0
- package/nitrogen/generated/ios/swift/Activity.swift +34 -0
- package/nitrogen/generated/ios/swift/AuthorizationStatus.swift +44 -0
- package/nitrogen/generated/ios/swift/BackgroundGeolocationError.swift +34 -0
- package/nitrogen/generated/ios/swift/ConfigureOptions.swift +1037 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_Activity.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_AuthorizationStatus.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_BackgroundGeolocationError.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_ConfigureOptions.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_Location.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_ServiceStatus.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_StationaryLocation.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_StationaryLocation_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_Location_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_LogEntry_.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridNitroBackgroundGeolocationSpec.swift +82 -0
- package/nitrogen/generated/ios/swift/HybridNitroBackgroundGeolocationSpec_cxx.swift +675 -0
- package/nitrogen/generated/ios/swift/Location.swift +89 -0
- package/nitrogen/generated/ios/swift/LocationAccuracy.swift +48 -0
- package/nitrogen/generated/ios/swift/LocationOptions.swift +78 -0
- package/nitrogen/generated/ios/swift/LocationProvider.swift +44 -0
- package/nitrogen/generated/ios/swift/LogEntry.swift +49 -0
- package/nitrogen/generated/ios/swift/NativeLogLevel.swift +52 -0
- package/nitrogen/generated/ios/swift/ServiceStatus.swift +39 -0
- package/nitrogen/generated/ios/swift/StationaryLocation.swift +94 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_AnyMap.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_LocationAccuracy.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_LocationProvider.swift +30 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +30 -0
- package/nitrogen/generated/shared/c++/Activity.hpp +87 -0
- package/nitrogen/generated/shared/c++/AuthorizationStatus.hpp +63 -0
- package/nitrogen/generated/shared/c++/BackgroundGeolocationError.hpp +87 -0
- package/nitrogen/generated/shared/c++/ConfigureOptions.hpp +197 -0
- package/nitrogen/generated/shared/c++/HybridNitroBackgroundGeolocationSpec.cpp +48 -0
- package/nitrogen/generated/shared/c++/HybridNitroBackgroundGeolocationSpec.hpp +121 -0
- package/nitrogen/generated/shared/c++/Location.hpp +131 -0
- package/nitrogen/generated/shared/c++/LocationAccuracy.hpp +69 -0
- package/nitrogen/generated/shared/c++/LocationOptions.hpp +91 -0
- package/nitrogen/generated/shared/c++/LocationProvider.hpp +63 -0
- package/nitrogen/generated/shared/c++/LogEntry.hpp +99 -0
- package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +65 -0
- package/nitrogen/generated/shared/c++/ServiceStatus.hpp +92 -0
- package/nitrogen/generated/shared/c++/StationaryLocation.hpp +135 -0
- package/package.json +112 -0
- package/react-native.config.js +10 -0
- package/src/NitroBackgroundGeolocation.nitro.ts +656 -0
- package/src/headless.ts +91 -0
- package/src/index.tsx +100 -0
package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
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
|
+
Differences to original version:
|
|
8
|
+
|
|
9
|
+
1. location is not persisted to db anymore, but broadcasted using intents instead
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
package com.marianhello.bgloc.provider;
|
|
13
|
+
|
|
14
|
+
import android.app.AlarmManager;
|
|
15
|
+
import android.app.PendingIntent;
|
|
16
|
+
import android.content.BroadcastReceiver;
|
|
17
|
+
import android.content.Context;
|
|
18
|
+
import android.content.Intent;
|
|
19
|
+
import android.content.IntentFilter;
|
|
20
|
+
import android.location.Criteria;
|
|
21
|
+
import android.location.Location;
|
|
22
|
+
import android.location.LocationListener;
|
|
23
|
+
import android.location.LocationManager;
|
|
24
|
+
import android.os.Build;
|
|
25
|
+
import android.os.Bundle;
|
|
26
|
+
|
|
27
|
+
import com.marianhello.bgloc.Config;
|
|
28
|
+
import com.marianhello.bgloc.provider.AbstractLocationProvider;
|
|
29
|
+
import com.marianhello.utils.ToneGenerator.Tone;
|
|
30
|
+
|
|
31
|
+
import java.util.List;
|
|
32
|
+
|
|
33
|
+
import static java.lang.Math.abs;
|
|
34
|
+
import static java.lang.Math.pow;
|
|
35
|
+
import static java.lang.Math.round;
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
public class DistanceFilterLocationProvider extends AbstractLocationProvider implements LocationListener {
|
|
39
|
+
|
|
40
|
+
private static final String TAG = DistanceFilterLocationProvider.class.getSimpleName();
|
|
41
|
+
private static final String P_NAME = "com.tenforwardconsulting.cordova.bgloc";
|
|
42
|
+
|
|
43
|
+
private static final String STATIONARY_REGION_ACTION = P_NAME + ".STATIONARY_REGION_ACTION";
|
|
44
|
+
private static final String STATIONARY_ALARM_ACTION = P_NAME + ".STATIONARY_ALARM_ACTION";
|
|
45
|
+
private static final String SINGLE_LOCATION_UPDATE_ACTION = P_NAME + ".SINGLE_LOCATION_UPDATE_ACTION";
|
|
46
|
+
private static final String STATIONARY_LOCATION_MONITOR_ACTION = P_NAME + ".STATIONARY_LOCATION_MONITOR_ACTION";
|
|
47
|
+
|
|
48
|
+
private static final long STATIONARY_TIMEOUT = 5 * 1000 * 60; // 5 minutes.
|
|
49
|
+
private static final long STATIONARY_LOCATION_POLLING_INTERVAL_LAZY = 3 * 1000 * 60; // 3 minutes.
|
|
50
|
+
private static final long STATIONARY_LOCATION_POLLING_INTERVAL_AGGRESSIVE = 1 * 1000 * 60; // 1 minute.
|
|
51
|
+
private static final int MAX_STATIONARY_ACQUISITION_ATTEMPTS = 5;
|
|
52
|
+
private static final int MAX_SPEED_ACQUISITION_ATTEMPTS = 3;
|
|
53
|
+
|
|
54
|
+
private Boolean isMoving = false;
|
|
55
|
+
private Boolean isAcquiringStationaryLocation = false;
|
|
56
|
+
private Boolean isAcquiringSpeed = false;
|
|
57
|
+
private Integer locationAcquisitionAttempts = 0;
|
|
58
|
+
|
|
59
|
+
private Location lastLocation;
|
|
60
|
+
private Location stationaryLocation;
|
|
61
|
+
private float stationaryRadius;
|
|
62
|
+
private PendingIntent stationaryAlarmPI;
|
|
63
|
+
private PendingIntent stationaryLocationPollingPI;
|
|
64
|
+
private long stationaryLocationPollingInterval;
|
|
65
|
+
private PendingIntent stationaryRegionPI;
|
|
66
|
+
private PendingIntent singleUpdatePI;
|
|
67
|
+
private Integer scaledDistanceFilter;
|
|
68
|
+
|
|
69
|
+
private Criteria criteria;
|
|
70
|
+
|
|
71
|
+
private LocationManager locationManager;
|
|
72
|
+
private AlarmManager alarmManager;
|
|
73
|
+
|
|
74
|
+
private boolean isStarted = false;
|
|
75
|
+
|
|
76
|
+
public DistanceFilterLocationProvider(Context context) {
|
|
77
|
+
super(context);
|
|
78
|
+
PROVIDER_ID = Config.DISTANCE_FILTER_PROVIDER;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Override
|
|
82
|
+
public void onCreate() {
|
|
83
|
+
super.onCreate();
|
|
84
|
+
|
|
85
|
+
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
|
|
86
|
+
alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
|
|
87
|
+
|
|
88
|
+
int zeroFlag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
|
|
89
|
+
? 0 | PendingIntent.FLAG_MUTABLE
|
|
90
|
+
: 0;
|
|
91
|
+
|
|
92
|
+
int cancelCurrentFlag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
|
|
93
|
+
? PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE
|
|
94
|
+
: PendingIntent.FLAG_CANCEL_CURRENT;
|
|
95
|
+
|
|
96
|
+
Intent stationaryAlarmIntent = new Intent(mContext, StationaryAlarmReceiver.class);
|
|
97
|
+
stationaryAlarmIntent.setAction(STATIONARY_ALARM_ACTION);
|
|
98
|
+
|
|
99
|
+
// Stop-detection PI
|
|
100
|
+
stationaryAlarmPI = PendingIntent.getBroadcast(mContext, 0, stationaryAlarmIntent, zeroFlag);
|
|
101
|
+
registerReceiver(stationaryAlarmReceiver, new IntentFilter(STATIONARY_ALARM_ACTION));
|
|
102
|
+
|
|
103
|
+
Intent stationaryRegionIntent = new Intent(mContext, StationaryRegionReceiver.class);
|
|
104
|
+
stationaryRegionIntent.setAction(STATIONARY_REGION_ACTION);
|
|
105
|
+
|
|
106
|
+
// Stationary region PI
|
|
107
|
+
stationaryRegionPI = PendingIntent.getBroadcast(mContext, 0, stationaryRegionIntent, cancelCurrentFlag);
|
|
108
|
+
registerReceiver(stationaryRegionReceiver, new IntentFilter(STATIONARY_REGION_ACTION));
|
|
109
|
+
|
|
110
|
+
Intent stationaryLocationMonitorIntent = new Intent(mContext, StationaryLocationMonitorReceiver.class);
|
|
111
|
+
stationaryLocationMonitorIntent.setAction(STATIONARY_LOCATION_MONITOR_ACTION);
|
|
112
|
+
|
|
113
|
+
// Stationary location monitor PI
|
|
114
|
+
stationaryLocationPollingPI = PendingIntent.getBroadcast(mContext, 0, stationaryLocationMonitorIntent, zeroFlag);
|
|
115
|
+
registerReceiver(stationaryLocationMonitorReceiver, new IntentFilter(STATIONARY_LOCATION_MONITOR_ACTION));
|
|
116
|
+
|
|
117
|
+
Intent singleLocationUpdateIntent = new Intent(mContext, SingleUpdateReceiver.class);
|
|
118
|
+
singleLocationUpdateIntent.setAction(SINGLE_LOCATION_UPDATE_ACTION);
|
|
119
|
+
|
|
120
|
+
// One-shot PI (TODO currently unused)
|
|
121
|
+
singleUpdatePI = PendingIntent.getBroadcast(mContext, 0, singleLocationUpdateIntent, cancelCurrentFlag);
|
|
122
|
+
registerReceiver(singleUpdateReceiver, new IntentFilter(SINGLE_LOCATION_UPDATE_ACTION));
|
|
123
|
+
|
|
124
|
+
// Location criteria
|
|
125
|
+
criteria = new Criteria();
|
|
126
|
+
criteria.setAltitudeRequired(false);
|
|
127
|
+
criteria.setBearingRequired(false);
|
|
128
|
+
criteria.setSpeedRequired(true);
|
|
129
|
+
criteria.setCostAllowed(true);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@Override
|
|
133
|
+
public void onStart() {
|
|
134
|
+
if (isStarted) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
logger.info("Start recording");
|
|
139
|
+
scaledDistanceFilter = mConfig.getDistanceFilter();
|
|
140
|
+
isStarted = true;
|
|
141
|
+
setPace(false);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@Override
|
|
145
|
+
public void onStop() {
|
|
146
|
+
if (!isStarted) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
locationManager.removeUpdates(this);
|
|
152
|
+
locationManager.removeProximityAlert(stationaryRegionPI);
|
|
153
|
+
} catch (SecurityException e) {
|
|
154
|
+
//noop
|
|
155
|
+
} finally {
|
|
156
|
+
isStarted = false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
@Override
|
|
161
|
+
public void onCommand(int commandId, int arg1) {
|
|
162
|
+
switch(commandId) {
|
|
163
|
+
case CMD_SWITCH_MODE:
|
|
164
|
+
setPace(arg1 == BACKGROUND_MODE ? false : true);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@Override
|
|
170
|
+
public void onConfigure(Config config) {
|
|
171
|
+
super.onConfigure(config);
|
|
172
|
+
if (isStarted) {
|
|
173
|
+
onStop();
|
|
174
|
+
onStart();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@Override
|
|
179
|
+
public boolean isStarted() {
|
|
180
|
+
return isStarted;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
*
|
|
185
|
+
* @param value set true to engage "aggressive", battery-consuming tracking, false for stationary-region tracking
|
|
186
|
+
*/
|
|
187
|
+
private void setPace(Boolean value) {
|
|
188
|
+
if (!isStarted) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
logger.info("Setting pace: {}", value);
|
|
193
|
+
|
|
194
|
+
Boolean wasMoving = isMoving;
|
|
195
|
+
isMoving = value;
|
|
196
|
+
isAcquiringStationaryLocation = false;
|
|
197
|
+
isAcquiringSpeed = false;
|
|
198
|
+
stationaryLocation = null;
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
locationManager.removeUpdates(this);
|
|
202
|
+
criteria.setAccuracy(Criteria.ACCURACY_FINE);
|
|
203
|
+
criteria.setHorizontalAccuracy(translateDesiredAccuracy(mConfig.getDesiredAccuracy()));
|
|
204
|
+
criteria.setPowerRequirement(Criteria.POWER_HIGH);
|
|
205
|
+
|
|
206
|
+
if (isMoving) {
|
|
207
|
+
// setPace can be called while moving, after distanceFilter has been recalculated. We don't want to re-acquire velocity in this case.
|
|
208
|
+
if (!wasMoving) {
|
|
209
|
+
isAcquiringSpeed = true;
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
isAcquiringStationaryLocation = true;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Temporarily turn on super-aggressive geolocation on all providers when acquiring velocity or stationary location.
|
|
216
|
+
if (isAcquiringSpeed || isAcquiringStationaryLocation) {
|
|
217
|
+
locationAcquisitionAttempts = 0;
|
|
218
|
+
// Turn on each provider aggressively for a short period of time
|
|
219
|
+
List<String> matchingProviders = locationManager.getAllProviders();
|
|
220
|
+
for (String provider: matchingProviders) {
|
|
221
|
+
if (provider != LocationManager.PASSIVE_PROVIDER) {
|
|
222
|
+
logger.info("Requesting location updates from provider {}", provider);
|
|
223
|
+
locationManager.requestLocationUpdates(provider, 0, 0, this);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
String provider = locationManager.getBestProvider(criteria, true);
|
|
228
|
+
if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER) &&
|
|
229
|
+
Build.VERSION.SDK_INT > 30) {
|
|
230
|
+
provider = LocationManager.GPS_PROVIDER;
|
|
231
|
+
}
|
|
232
|
+
logger.info("Requesting location updates from provider {}", provider);
|
|
233
|
+
locationManager.requestLocationUpdates(provider, mConfig.getInterval(), scaledDistanceFilter, this);
|
|
234
|
+
}
|
|
235
|
+
} catch (SecurityException e) {
|
|
236
|
+
logger.error("Security exception: {}", e.getMessage());
|
|
237
|
+
this.handleSecurityException(e);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Translates a number representing desired accuracy of Geolocation system from set [0, 10, 100, 1000].
|
|
243
|
+
* 0: most aggressive, most accurate, worst battery drain
|
|
244
|
+
* 1000: least aggressive, least accurate, best for battery.
|
|
245
|
+
*/
|
|
246
|
+
private Integer translateDesiredAccuracy(Integer accuracy) {
|
|
247
|
+
if (accuracy >= 1000) {
|
|
248
|
+
return Criteria.ACCURACY_LOW;
|
|
249
|
+
}
|
|
250
|
+
if (accuracy >= 100) {
|
|
251
|
+
return Criteria.ACCURACY_MEDIUM;
|
|
252
|
+
}
|
|
253
|
+
if (accuracy >= 10) {
|
|
254
|
+
return Criteria.ACCURACY_HIGH;
|
|
255
|
+
}
|
|
256
|
+
if (accuracy >= 0) {
|
|
257
|
+
return Criteria.ACCURACY_HIGH;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return Criteria.ACCURACY_MEDIUM;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Returns the most accurate and timely previously detected location.
|
|
265
|
+
* Where the last result is beyond the specified maximum distance or
|
|
266
|
+
* latency a one-off location update is returned via the {@link LocationListener}
|
|
267
|
+
* specified in {@link setChangedLocationListener}.
|
|
268
|
+
* @param minTime Minimum time required between location updates.
|
|
269
|
+
* @return The most accurate and / or timely previously detected location.
|
|
270
|
+
*/
|
|
271
|
+
public Location getLastBestLocation() {
|
|
272
|
+
Location bestResult = null;
|
|
273
|
+
String bestProvider = null;
|
|
274
|
+
float bestAccuracy = Float.MAX_VALUE;
|
|
275
|
+
long bestTime = Long.MIN_VALUE;
|
|
276
|
+
long minTime = System.currentTimeMillis() - mConfig.getInterval();
|
|
277
|
+
|
|
278
|
+
logger.info("Fetching last best location: radius={} minTime={}", mConfig.getStationaryRadius(), minTime);
|
|
279
|
+
|
|
280
|
+
try {
|
|
281
|
+
// Iterate through all the providers on the system, keeping
|
|
282
|
+
// note of the most accurate result within the acceptable time limit.
|
|
283
|
+
// If no result is found within maxTime, return the newest Location.
|
|
284
|
+
List<String> matchingProviders = locationManager.getAllProviders();
|
|
285
|
+
for (String provider: matchingProviders) {
|
|
286
|
+
Location location = locationManager.getLastKnownLocation(provider);
|
|
287
|
+
if (location != null) {
|
|
288
|
+
logger.debug("Test provider={} lat={} lon={} acy={} v={}m/s time={}", provider, location.getLatitude(), location.getLongitude(), location.getAccuracy(), location.getSpeed(), location.getTime());
|
|
289
|
+
float accuracy = location.getAccuracy();
|
|
290
|
+
long time = location.getTime();
|
|
291
|
+
if ((time > minTime && accuracy < bestAccuracy)) {
|
|
292
|
+
bestProvider = provider;
|
|
293
|
+
bestResult = location;
|
|
294
|
+
bestAccuracy = accuracy;
|
|
295
|
+
bestTime = time;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (bestResult != null) {
|
|
301
|
+
logger.debug("Best result found provider={} lat={} lon={} acy={} v={}m/s time={}", bestProvider, bestResult.getLatitude(), bestResult.getLongitude(), bestResult.getAccuracy(), bestResult.getSpeed(), bestResult.getTime());
|
|
302
|
+
}
|
|
303
|
+
} catch (SecurityException e) {
|
|
304
|
+
logger.error("Security exception: {}", e.getMessage());
|
|
305
|
+
this.handleSecurityException(e);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return bestResult;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
public void onLocationChanged(Location location) {
|
|
312
|
+
logger.debug("Location change: {} isMoving={}", location.toString(), isMoving);
|
|
313
|
+
|
|
314
|
+
if (!isMoving && !isAcquiringStationaryLocation && stationaryLocation==null) {
|
|
315
|
+
// Perhaps our GPS signal was interupted, re-acquire a stationaryLocation now.
|
|
316
|
+
setPace(false);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
showDebugToast( "mv:" + isMoving + ",acy:" + location.getAccuracy() + ",v:" + location.getSpeed() + ",df:" + scaledDistanceFilter);
|
|
320
|
+
|
|
321
|
+
if (isAcquiringStationaryLocation) {
|
|
322
|
+
if (stationaryLocation == null || stationaryLocation.getAccuracy() > location.getAccuracy()) {
|
|
323
|
+
stationaryLocation = location;
|
|
324
|
+
}
|
|
325
|
+
if (++locationAcquisitionAttempts == MAX_STATIONARY_ACQUISITION_ATTEMPTS) {
|
|
326
|
+
isAcquiringStationaryLocation = false;
|
|
327
|
+
startMonitoringStationaryRegion(stationaryLocation);
|
|
328
|
+
handleStationary(stationaryLocation, stationaryRadius);
|
|
329
|
+
return;
|
|
330
|
+
} else {
|
|
331
|
+
// Unacceptable stationary-location: bail-out and wait for another.
|
|
332
|
+
playDebugTone(Tone.BEEP);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
} else if (isAcquiringSpeed) {
|
|
336
|
+
if (++locationAcquisitionAttempts == MAX_SPEED_ACQUISITION_ATTEMPTS) {
|
|
337
|
+
// Got enough samples, assume we're confident in reported speed now. Play "woohoo" sound.
|
|
338
|
+
playDebugTone(Tone.DOODLY_DOO);
|
|
339
|
+
isAcquiringSpeed = false;
|
|
340
|
+
scaledDistanceFilter = calculateDistanceFilter(location.getSpeed());
|
|
341
|
+
setPace(true);
|
|
342
|
+
} else {
|
|
343
|
+
playDebugTone(Tone.BEEP);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
} else if (isMoving) {
|
|
347
|
+
playDebugTone(Tone.BEEP);
|
|
348
|
+
|
|
349
|
+
// Only reset stationaryAlarm when accurate speed is detected, prevents spurious locations from resetting when stopped.
|
|
350
|
+
if ( (location.getSpeed() >= 1) && (location.getAccuracy() <= mConfig.getStationaryRadius()) ) {
|
|
351
|
+
resetStationaryAlarm();
|
|
352
|
+
}
|
|
353
|
+
// Calculate latest distanceFilter, if it changed by 5 m/s, we'll reconfigure our pace.
|
|
354
|
+
Integer newDistanceFilter = calculateDistanceFilter(location.getSpeed());
|
|
355
|
+
if (newDistanceFilter != scaledDistanceFilter.intValue()) {
|
|
356
|
+
logger.info("Updating distanceFilter: new={} old={}", newDistanceFilter, scaledDistanceFilter);
|
|
357
|
+
scaledDistanceFilter = newDistanceFilter;
|
|
358
|
+
setPace(true);
|
|
359
|
+
}
|
|
360
|
+
if (lastLocation != null && location.distanceTo(lastLocation) < mConfig.getDistanceFilter()) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
} else if (stationaryLocation != null) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
// Go ahead and cache, push to server
|
|
367
|
+
lastLocation = location;
|
|
368
|
+
handleLocation(location);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
public void resetStationaryAlarm() {
|
|
372
|
+
alarmManager.cancel(stationaryAlarmPI);
|
|
373
|
+
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + STATIONARY_TIMEOUT, stationaryAlarmPI); // Millisec * Second * Minute
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private Integer calculateDistanceFilter(Float speed) {
|
|
377
|
+
Double newDistanceFilter = (double) mConfig.getDistanceFilter();
|
|
378
|
+
if (speed < 100) {
|
|
379
|
+
float roundedDistanceFilter = (round(speed / 5) * 5);
|
|
380
|
+
newDistanceFilter = pow(roundedDistanceFilter, 2) + (double) mConfig.getDistanceFilter();
|
|
381
|
+
}
|
|
382
|
+
return (newDistanceFilter.intValue() < 1000) ? newDistanceFilter.intValue() : 1000;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
private void startMonitoringStationaryRegion(Location location) {
|
|
386
|
+
try {
|
|
387
|
+
locationManager.removeUpdates(this);
|
|
388
|
+
|
|
389
|
+
float stationaryRadius = mConfig.getStationaryRadius();
|
|
390
|
+
float proximityRadius = (location.getAccuracy() < stationaryRadius) ? stationaryRadius : location.getAccuracy();
|
|
391
|
+
stationaryLocation = location;
|
|
392
|
+
|
|
393
|
+
logger.info("startMonitoringStationaryRegion: lat={} lon={} acy={}", location.getLatitude(), location.getLongitude(), proximityRadius);
|
|
394
|
+
|
|
395
|
+
// Here be the execution of the stationary region monitor
|
|
396
|
+
locationManager.addProximityAlert(
|
|
397
|
+
location.getLatitude(),
|
|
398
|
+
location.getLongitude(),
|
|
399
|
+
proximityRadius,
|
|
400
|
+
(long)-1,
|
|
401
|
+
stationaryRegionPI
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
this.stationaryRadius = proximityRadius;
|
|
405
|
+
|
|
406
|
+
startPollingStationaryLocation(STATIONARY_LOCATION_POLLING_INTERVAL_LAZY);
|
|
407
|
+
} catch (SecurityException e) {
|
|
408
|
+
logger.error("Security exception: {}", e.getMessage());
|
|
409
|
+
this.handleSecurityException(e);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* User has exit his stationary region! Initiate aggressive geolocation!
|
|
415
|
+
*/
|
|
416
|
+
public void onExitStationaryRegion(Location location) {
|
|
417
|
+
// Filter-out spurious region-exits: must have at least a little speed to move out of stationary-region
|
|
418
|
+
playDebugTone(Tone.BEEP_BEEP_BEEP);
|
|
419
|
+
|
|
420
|
+
logger.info("Exited stationary: lat={} long={} acy={}}'",
|
|
421
|
+
location.getLatitude(), location.getLongitude(), location.getAccuracy());
|
|
422
|
+
|
|
423
|
+
try {
|
|
424
|
+
// Cancel the periodic stationary location monitor alarm.
|
|
425
|
+
alarmManager.cancel(stationaryLocationPollingPI);
|
|
426
|
+
// Kill the current region-monitor we just walked out of.
|
|
427
|
+
locationManager.removeProximityAlert(stationaryRegionPI);
|
|
428
|
+
// Engage aggressive tracking.
|
|
429
|
+
this.setPace(true);
|
|
430
|
+
} catch (SecurityException e) {
|
|
431
|
+
logger.error("Security exception: {}", e.getMessage());
|
|
432
|
+
this.handleSecurityException(e);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
public void startPollingStationaryLocation(long interval) {
|
|
437
|
+
// proximity-alerts don't seem to work while suspended in latest Android 4.42 (works in 4.03). Have to use AlarmManager to sample
|
|
438
|
+
// location at regular intervals with a one-shot.
|
|
439
|
+
stationaryLocationPollingInterval = interval;
|
|
440
|
+
alarmManager.cancel(stationaryLocationPollingPI);
|
|
441
|
+
long start = System.currentTimeMillis() + (60 * 1000);
|
|
442
|
+
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, start, interval, stationaryLocationPollingPI);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
public void onPollStationaryLocation(Location location) {
|
|
446
|
+
float stationaryRadius = mConfig.getStationaryRadius();
|
|
447
|
+
if (isMoving) {
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
playDebugTone(Tone.BEEP);
|
|
451
|
+
|
|
452
|
+
float distance = 0.0f;
|
|
453
|
+
if (stationaryLocation != null) {
|
|
454
|
+
distance = abs(location.distanceTo(stationaryLocation) - stationaryLocation.getAccuracy() - location.getAccuracy());
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
showDebugToast("Stationary exit in " + (stationaryRadius-distance) + "m");
|
|
458
|
+
|
|
459
|
+
// TODO http://www.cse.buffalo.edu/~demirbas/publications/proximity.pdf
|
|
460
|
+
// determine if we're almost out of stationary-distance and increase monitoring-rate.
|
|
461
|
+
logger.info("Distance from stationary location: {}", distance);
|
|
462
|
+
if (distance > stationaryRadius) {
|
|
463
|
+
onExitStationaryRegion(location);
|
|
464
|
+
} else if (distance > 0) {
|
|
465
|
+
startPollingStationaryLocation(STATIONARY_LOCATION_POLLING_INTERVAL_AGGRESSIVE);
|
|
466
|
+
} else if (stationaryLocationPollingInterval != STATIONARY_LOCATION_POLLING_INTERVAL_LAZY) {
|
|
467
|
+
startPollingStationaryLocation(STATIONARY_LOCATION_POLLING_INTERVAL_LAZY);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Broadcast receiver for receiving a single-update from LocationManager.
|
|
473
|
+
*/
|
|
474
|
+
private class SingleUpdateReceiver extends BroadcastReceiver {
|
|
475
|
+
@Override
|
|
476
|
+
public void onReceive(Context context, Intent intent) {
|
|
477
|
+
String key = LocationManager.KEY_LOCATION_CHANGED;
|
|
478
|
+
Location location = (Location)intent.getExtras().get(key);
|
|
479
|
+
if (location != null) {
|
|
480
|
+
logger.debug("Single location update: " + location.toString());
|
|
481
|
+
onPollStationaryLocation(location);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
private BroadcastReceiver singleUpdateReceiver = new SingleUpdateReceiver();
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Broadcast receiver which detects a user has stopped for a long enough time to be determined as STOPPED
|
|
490
|
+
*/
|
|
491
|
+
private class StationaryAlarmReceiver extends BroadcastReceiver {
|
|
492
|
+
@Override
|
|
493
|
+
public void onReceive(Context context, Intent intent)
|
|
494
|
+
{
|
|
495
|
+
logger.info("stationaryAlarm fired");
|
|
496
|
+
setPace(false);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
private BroadcastReceiver stationaryAlarmReceiver = new StationaryAlarmReceiver();
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Broadcast receiver to handle stationaryMonitor alarm, fired at low frequency while monitoring stationary-region.
|
|
504
|
+
* This is required because latest Android proximity-alerts don't seem to operate while suspended. Regularly polling
|
|
505
|
+
* the location seems to trigger the proximity-alerts while suspended.
|
|
506
|
+
*/
|
|
507
|
+
private class StationaryLocationMonitorReceiver extends BroadcastReceiver {
|
|
508
|
+
@Override
|
|
509
|
+
public void onReceive(Context context, Intent intent)
|
|
510
|
+
{
|
|
511
|
+
logger.info("Stationary location monitor fired");
|
|
512
|
+
playDebugTone(Tone.DIALTONE);
|
|
513
|
+
|
|
514
|
+
criteria.setAccuracy(Criteria.ACCURACY_FINE);
|
|
515
|
+
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
|
|
516
|
+
criteria.setPowerRequirement(Criteria.POWER_HIGH);
|
|
517
|
+
|
|
518
|
+
try {
|
|
519
|
+
locationManager.requestSingleUpdate(criteria, singleUpdatePI);
|
|
520
|
+
} catch (SecurityException e) {
|
|
521
|
+
logger.error("Security exception: {}", e.getMessage());
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
private BroadcastReceiver stationaryLocationMonitorReceiver = new StationaryLocationMonitorReceiver();
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Broadcast receiver which detects a user has exit his circular stationary-region determined by the greater of stationaryLocation.getAccuracy() OR stationaryRadius
|
|
530
|
+
*/
|
|
531
|
+
private class StationaryRegionReceiver extends BroadcastReceiver {
|
|
532
|
+
@Override
|
|
533
|
+
public void onReceive(Context context, Intent intent) {
|
|
534
|
+
String key = LocationManager.KEY_PROXIMITY_ENTERING;
|
|
535
|
+
Boolean entering = intent.getBooleanExtra(key, false);
|
|
536
|
+
|
|
537
|
+
if (entering) {
|
|
538
|
+
logger.debug("Entering stationary region");
|
|
539
|
+
if (isMoving) {
|
|
540
|
+
setPace(false);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
logger.debug("Exiting stationary region");
|
|
545
|
+
// There MUST be a valid, recent location if this event-handler was called.
|
|
546
|
+
Location location = getLastBestLocation();
|
|
547
|
+
if (location != null) {
|
|
548
|
+
onExitStationaryRegion(location);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
private BroadcastReceiver stationaryRegionReceiver = new StationaryRegionReceiver();
|
|
555
|
+
|
|
556
|
+
public void onProviderDisabled(String provider) {
|
|
557
|
+
// TODO Auto-generated method stub
|
|
558
|
+
logger.debug("Provider {} was disabled", provider);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
public void onProviderEnabled(String provider) {
|
|
562
|
+
// TODO Auto-generated method stub
|
|
563
|
+
logger.debug("Provider {} was enabled", provider);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
public void onStatusChanged(String provider, int status, Bundle extras) {
|
|
567
|
+
// TODO Auto-generated method stub
|
|
568
|
+
logger.debug("Provider {} status changed: {}", provider, status);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
@Override
|
|
572
|
+
public void onDestroy() {
|
|
573
|
+
logger.info("Destroying DistanceFilterLocationProvider");
|
|
574
|
+
|
|
575
|
+
this.onStop();
|
|
576
|
+
alarmManager.cancel(stationaryAlarmPI);
|
|
577
|
+
alarmManager.cancel(stationaryLocationPollingPI);
|
|
578
|
+
|
|
579
|
+
unregisterReceiver(stationaryAlarmReceiver);
|
|
580
|
+
unregisterReceiver(singleUpdateReceiver);
|
|
581
|
+
unregisterReceiver(stationaryRegionReceiver);
|
|
582
|
+
unregisterReceiver(stationaryLocationMonitorReceiver);
|
|
583
|
+
|
|
584
|
+
super.onDestroy();
|
|
585
|
+
}
|
|
586
|
+
}
|
|
@@ -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
|
+
}
|