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
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
package com.marianhello.bgloc.sync;
|
|
2
|
+
|
|
3
|
+
import android.content.ContentProviderOperation;
|
|
4
|
+
import android.content.ContentResolver;
|
|
5
|
+
import android.content.ContentValues;
|
|
6
|
+
import android.content.Context;
|
|
7
|
+
import android.database.Cursor;
|
|
8
|
+
import android.database.sqlite.SQLiteDatabase;
|
|
9
|
+
import android.net.Uri;
|
|
10
|
+
import android.text.TextUtils;
|
|
11
|
+
import android.util.JsonWriter;
|
|
12
|
+
|
|
13
|
+
import com.marianhello.bgloc.ResourceResolver;
|
|
14
|
+
import com.marianhello.bgloc.data.AbstractLocationTemplate;
|
|
15
|
+
import com.marianhello.bgloc.data.ArrayListLocationTemplate;
|
|
16
|
+
import com.marianhello.bgloc.data.BackgroundLocation;
|
|
17
|
+
import com.marianhello.bgloc.data.HashMapLocationTemplate;
|
|
18
|
+
import com.marianhello.bgloc.data.LocationTemplate;
|
|
19
|
+
import com.marianhello.bgloc.data.LocationTemplateFactory;
|
|
20
|
+
import com.marianhello.bgloc.data.provider.LocationContentProvider;
|
|
21
|
+
import com.marianhello.bgloc.data.sqlite.SQLiteLocationContract;
|
|
22
|
+
import com.marianhello.bgloc.data.sqlite.SQLiteLocationContract.LocationEntry;
|
|
23
|
+
import com.marianhello.bgloc.data.sqlite.SQLiteOpenHelper;
|
|
24
|
+
import com.marianhello.logging.LoggerManager;
|
|
25
|
+
|
|
26
|
+
import org.json.JSONException;
|
|
27
|
+
import org.json.JSONObject;
|
|
28
|
+
|
|
29
|
+
import java.io.File;
|
|
30
|
+
import java.io.FileOutputStream;
|
|
31
|
+
import java.io.IOException;
|
|
32
|
+
import java.io.OutputStreamWriter;
|
|
33
|
+
import java.io.UnsupportedEncodingException;
|
|
34
|
+
import java.util.ArrayList;
|
|
35
|
+
import java.util.Iterator;
|
|
36
|
+
import java.util.List;
|
|
37
|
+
import java.util.Map;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Created by finch on 20/07/16.
|
|
41
|
+
*/
|
|
42
|
+
public class BatchManager {
|
|
43
|
+
private Context context;
|
|
44
|
+
private org.slf4j.Logger logger;
|
|
45
|
+
|
|
46
|
+
public BatchManager(Context context) {
|
|
47
|
+
logger = LoggerManager.getLogger(BatchManager.class);
|
|
48
|
+
this.context = context;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private Uri getLocationContentUri() {
|
|
52
|
+
ResourceResolver resourceResolver = ResourceResolver.newInstance(context);
|
|
53
|
+
String authority = resourceResolver.getAuthority();
|
|
54
|
+
return LocationContentProvider.getContentUri(authority);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private File createBatchFromTemplate(Long batchStartMillis, Integer syncThreshold, LocationTemplate template) throws IOException {
|
|
58
|
+
logger.info("Creating batch {}", batchStartMillis);
|
|
59
|
+
|
|
60
|
+
ContentResolver resolver = context.getContentResolver();
|
|
61
|
+
Uri contentUri = getLocationContentUri();
|
|
62
|
+
|
|
63
|
+
String whereClause = TextUtils.join("", new String[]{
|
|
64
|
+
LocationEntry.COLUMN_NAME_STATUS + " = ? AND ( ",
|
|
65
|
+
LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " IS NULL OR ",
|
|
66
|
+
LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " < ? )",
|
|
67
|
+
});
|
|
68
|
+
String[] whereArgs = {
|
|
69
|
+
String.valueOf(BackgroundLocation.SYNC_PENDING),
|
|
70
|
+
String.valueOf(batchStartMillis)
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
Cursor cursor = null;
|
|
74
|
+
LocationWriter writer = null;
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
cursor = resolver.query(
|
|
78
|
+
contentUri,
|
|
79
|
+
null,
|
|
80
|
+
whereClause,
|
|
81
|
+
whereArgs,
|
|
82
|
+
LocationEntry.COLUMN_NAME_TIME + " ASC"
|
|
83
|
+
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
if (cursor.getCount() < syncThreshold) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
File file = File.createTempFile("locations", ".json");
|
|
91
|
+
FileOutputStream fs = new FileOutputStream(file);
|
|
92
|
+
writer = new LocationWriter(fs, template);
|
|
93
|
+
|
|
94
|
+
writer.beginArray();
|
|
95
|
+
while (cursor.moveToNext()) {
|
|
96
|
+
BackgroundLocation location = BackgroundLocation.fromCursor(cursor);
|
|
97
|
+
writer.write(location);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
writer.endArray();
|
|
101
|
+
writer.close();
|
|
102
|
+
fs.close();
|
|
103
|
+
|
|
104
|
+
// set batchStartMillis for all synced locations
|
|
105
|
+
ContentValues values = new ContentValues();
|
|
106
|
+
values.put(LocationEntry.COLUMN_NAME_BATCH_START_MILLIS, batchStartMillis);
|
|
107
|
+
resolver.update(contentUri, values, whereClause, whereArgs);
|
|
108
|
+
|
|
109
|
+
logger.info("Batch file: {} created successfully", file.getName());
|
|
110
|
+
|
|
111
|
+
return file;
|
|
112
|
+
} finally {
|
|
113
|
+
if (cursor != null) {
|
|
114
|
+
cursor.close();
|
|
115
|
+
}
|
|
116
|
+
if (writer != null) {
|
|
117
|
+
writer.close();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public File createBatch(Long batchStartMillis, Integer syncThreshold, LocationTemplate template) throws IOException {
|
|
123
|
+
LocationTemplate tpl;
|
|
124
|
+
if (template != null) {
|
|
125
|
+
tpl = template;
|
|
126
|
+
} else {
|
|
127
|
+
tpl = LocationTemplateFactory.getDefault();
|
|
128
|
+
}
|
|
129
|
+
return createBatchFromTemplate(batchStartMillis, syncThreshold, tpl);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public File createBatch(Long batchStartMillis, Integer syncThreshold) throws IOException {
|
|
133
|
+
return createBatch(batchStartMillis, syncThreshold, null);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
public void setBatchCompleted(Long batchId) {
|
|
138
|
+
ContentResolver resolver = context.getApplicationContext().getContentResolver();
|
|
139
|
+
Uri contentUri = getLocationContentUri();
|
|
140
|
+
|
|
141
|
+
String whereClause = LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " = ?";
|
|
142
|
+
String[] whereArgs = { String.valueOf(batchId) };
|
|
143
|
+
|
|
144
|
+
ContentValues values = new ContentValues();
|
|
145
|
+
values.put(LocationEntry.COLUMN_NAME_STATUS, BackgroundLocation.DELETED);
|
|
146
|
+
resolver.update(contentUri, values, whereClause, whereArgs);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private static class LocationTemplateWriter {
|
|
150
|
+
private BackgroundLocation location;
|
|
151
|
+
private JsonWriter writer;
|
|
152
|
+
|
|
153
|
+
public LocationTemplateWriter(JsonWriter writer, BackgroundLocation location) {
|
|
154
|
+
this.writer = writer;
|
|
155
|
+
this.location = location;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private void writeValue(Object value) throws IOException {
|
|
159
|
+
if (value instanceof String ) {
|
|
160
|
+
writer.value((String) value);
|
|
161
|
+
} else if (value instanceof Map) {
|
|
162
|
+
writeMap((Map) value);
|
|
163
|
+
} else if (value instanceof List) {
|
|
164
|
+
writeList((List) value);
|
|
165
|
+
} else if (Integer.class.isInstance(value)) {
|
|
166
|
+
writer.value((Integer) value);
|
|
167
|
+
} else if (Double.class.isInstance(value)) {
|
|
168
|
+
writer.value((Double) value);
|
|
169
|
+
} else if (Float.class.isInstance(value)) {
|
|
170
|
+
writer.value((Float) value);
|
|
171
|
+
} else if (Long.class.isInstance(value)) {
|
|
172
|
+
writer.value((Long) value);
|
|
173
|
+
} else if (Boolean.class.isInstance(value)) {
|
|
174
|
+
writer.value((Boolean) value);
|
|
175
|
+
} else if (value == JSONObject.NULL) {
|
|
176
|
+
writer.nullValue();
|
|
177
|
+
} else {
|
|
178
|
+
writer.value(String.valueOf(value));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public void writeMap(Map values) throws IOException {
|
|
183
|
+
writer.beginObject();
|
|
184
|
+
Iterator<?> it = values.entrySet().iterator();
|
|
185
|
+
while (it.hasNext()) {
|
|
186
|
+
Map.Entry<String, Object> pair = (Map.Entry) it.next();
|
|
187
|
+
String key = pair.getKey();
|
|
188
|
+
Object value = pair.getValue();
|
|
189
|
+
Object locationValue = null;
|
|
190
|
+
if (value instanceof String) {
|
|
191
|
+
locationValue = location.getValueForKey((String)value);
|
|
192
|
+
}
|
|
193
|
+
writer.name(key);
|
|
194
|
+
writeValue(locationValue != null ? locationValue : value);
|
|
195
|
+
}
|
|
196
|
+
writer.endObject();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public void writeList(List values) throws IOException {
|
|
200
|
+
writer.beginArray();
|
|
201
|
+
Iterator<?> it = values.iterator();
|
|
202
|
+
while (it.hasNext()) {
|
|
203
|
+
Object value = it.next();
|
|
204
|
+
Object locationValue = null;
|
|
205
|
+
if (value instanceof String) {
|
|
206
|
+
locationValue = location.getValueForKey((String) value);
|
|
207
|
+
}
|
|
208
|
+
writeValue(locationValue != null ? locationValue : value);
|
|
209
|
+
}
|
|
210
|
+
writer.endArray();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
private static class LocationWriter {
|
|
215
|
+
private JsonWriter writer = null;
|
|
216
|
+
private LocationTemplate template;
|
|
217
|
+
|
|
218
|
+
public LocationWriter(FileOutputStream fos, LocationTemplate template) throws IOException {
|
|
219
|
+
writer = new JsonWriter(new OutputStreamWriter(fos, "UTF-8"));
|
|
220
|
+
this.template = template;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public void beginArray() throws IOException {
|
|
224
|
+
writer.beginArray();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
public void endArray() throws IOException {
|
|
228
|
+
writer.endArray();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public void close() throws IOException {
|
|
232
|
+
writer.close();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public void write(BackgroundLocation location) throws IOException {
|
|
236
|
+
LocationTemplateWriter writer = new LocationTemplateWriter(this.writer, location);
|
|
237
|
+
if (template instanceof HashMapLocationTemplate) {
|
|
238
|
+
HashMapLocationTemplate hashTemplate = (HashMapLocationTemplate) template;
|
|
239
|
+
writer.writeMap(hashTemplate.toMap());
|
|
240
|
+
} else if (template instanceof ArrayListLocationTemplate) {
|
|
241
|
+
ArrayListLocationTemplate listTemplate = (ArrayListLocationTemplate) template;
|
|
242
|
+
writer.writeList(listTemplate.toList());
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
package com.marianhello.bgloc.sync;
|
|
2
|
+
|
|
3
|
+
import android.app.Notification;
|
|
4
|
+
import android.app.NotificationChannel;
|
|
5
|
+
import android.app.NotificationManager;
|
|
6
|
+
import android.app.PendingIntent;
|
|
7
|
+
import android.content.Context;
|
|
8
|
+
import android.content.Intent;
|
|
9
|
+
import android.graphics.BitmapFactory;
|
|
10
|
+
import android.graphics.Color;
|
|
11
|
+
import android.os.Build;
|
|
12
|
+
import androidx.annotation.RequiresApi;
|
|
13
|
+
import androidx.core.app.NotificationCompat;
|
|
14
|
+
|
|
15
|
+
import com.marianhello.bgloc.ResourceResolver;
|
|
16
|
+
import com.marianhello.logging.LoggerManager;
|
|
17
|
+
|
|
18
|
+
public class NotificationHelper {
|
|
19
|
+
public static final String SERVICE_CHANNEL_ID = "bglocservice";
|
|
20
|
+
// https://github.com/nishkarsh/android-permissions/blob/master/src/main/java/com/intentfilter/androidpermissions/services/NotificationService.java#L15
|
|
21
|
+
public static final String ANDROID_PERMISSIONS_CHANNEL_ID = "android-permissions";
|
|
22
|
+
|
|
23
|
+
public static final String SYNC_CHANNEL_ID = "syncservice";
|
|
24
|
+
public static final String SYNC_CHANNEL_NAME = "Sync Service";
|
|
25
|
+
public static final String SYNC_CHANNEL_DESCRIPTION = "Shows sync progress";
|
|
26
|
+
|
|
27
|
+
public static class NotificationFactory {
|
|
28
|
+
private Context mContext;
|
|
29
|
+
private ResourceResolver mResolver;
|
|
30
|
+
|
|
31
|
+
private org.slf4j.Logger logger;
|
|
32
|
+
|
|
33
|
+
public NotificationFactory(Context context) {
|
|
34
|
+
mContext = context;
|
|
35
|
+
mResolver = ResourceResolver.newInstance(context);
|
|
36
|
+
logger = LoggerManager.getLogger(NotificationFactory.class);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private Integer parseNotificationIconColor(String color) {
|
|
40
|
+
int iconColor = 0;
|
|
41
|
+
if (color != null) {
|
|
42
|
+
try {
|
|
43
|
+
iconColor = Color.parseColor(color);
|
|
44
|
+
} catch (IllegalArgumentException e) {
|
|
45
|
+
logger.error("Couldn't parse color from android options");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return iconColor;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public Notification getNotification(String title, String text, String largeIcon, String smallIcon, String color) {
|
|
52
|
+
Context appContext = mContext.getApplicationContext();
|
|
53
|
+
|
|
54
|
+
// Build a Notification required for running service in foreground.
|
|
55
|
+
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, NotificationHelper.SERVICE_CHANNEL_ID);
|
|
56
|
+
|
|
57
|
+
builder.setContentTitle(title);
|
|
58
|
+
builder.setContentText(text);
|
|
59
|
+
builder.setOngoing(true);
|
|
60
|
+
if (smallIcon != null && !smallIcon.isEmpty()) {
|
|
61
|
+
builder.setSmallIcon(mResolver.getDrawable(smallIcon));
|
|
62
|
+
} else {
|
|
63
|
+
builder.setSmallIcon(android.R.drawable.ic_menu_mylocation);
|
|
64
|
+
}
|
|
65
|
+
if (largeIcon != null && !largeIcon.isEmpty()) {
|
|
66
|
+
int largeIconId = mResolver.getDrawable(largeIcon);
|
|
67
|
+
if (largeIconId == 0) {
|
|
68
|
+
logger.warn("The resource " + largeIcon + " was not found in the drawable folder. Please include it when building the app.");
|
|
69
|
+
}
|
|
70
|
+
builder.setLargeIcon(BitmapFactory.decodeResource(appContext.getResources(), largeIconId));
|
|
71
|
+
}
|
|
72
|
+
if (color != null && !color.isEmpty()) {
|
|
73
|
+
builder.setColor(this.parseNotificationIconColor(color));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Add an onclick handler to the notification
|
|
77
|
+
String packageName = appContext.getPackageName();
|
|
78
|
+
Intent launchIntent = appContext.getPackageManager().getLaunchIntentForPackage(packageName);
|
|
79
|
+
if (launchIntent != null) {
|
|
80
|
+
// NOTICE: testing apps might not have registered launch intent
|
|
81
|
+
launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
82
|
+
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
|
|
83
|
+
? PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE
|
|
84
|
+
: PendingIntent.FLAG_CANCEL_CURRENT;
|
|
85
|
+
PendingIntent contentIntent = PendingIntent.getActivity(appContext, 0, launchIntent, flags);
|
|
86
|
+
builder.setContentIntent(contentIntent);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
Notification notification = builder.build();
|
|
90
|
+
notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_NO_CLEAR;
|
|
91
|
+
|
|
92
|
+
return notification;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public static void registerAllChannels(Context context) {
|
|
97
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
98
|
+
String appName = ResourceResolver.newInstance(context).getString(("app_name"));
|
|
99
|
+
// Create the NotificationChannel, but only on API 26+ because
|
|
100
|
+
// the NotificationChannel class is new and not in the support library
|
|
101
|
+
android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
102
|
+
notificationManager.createNotificationChannel(createServiceChannel(appName));
|
|
103
|
+
notificationManager.createNotificationChannel(createSyncChannel());
|
|
104
|
+
notificationManager.createNotificationChannel(createAndroidPermissionsChannel(appName));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public static void registerServiceChannel(Context context) {
|
|
109
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
110
|
+
String appName = ResourceResolver.newInstance(context).getString(("app_name"));
|
|
111
|
+
// Create the NotificationChannel, but only on API 26+ because
|
|
112
|
+
// the NotificationChannel class is new and not in the support library
|
|
113
|
+
android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
114
|
+
notificationManager.createNotificationChannel(createServiceChannel(appName));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public static void registerSyncChannel(Context context) {
|
|
119
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
120
|
+
// Create the NotificationChannel, but only on API 26+ because
|
|
121
|
+
// the NotificationChannel class is new and not in the support library
|
|
122
|
+
android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
123
|
+
notificationManager.createNotificationChannel(createSyncChannel());
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@RequiresApi(api = Build.VERSION_CODES.O)
|
|
128
|
+
public static NotificationChannel createServiceChannel(CharSequence name) {
|
|
129
|
+
NotificationChannel channel = new NotificationChannel(SERVICE_CHANNEL_ID, name, android.app.NotificationManager.IMPORTANCE_LOW);
|
|
130
|
+
channel.enableVibration(false);
|
|
131
|
+
return channel;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@RequiresApi(api = Build.VERSION_CODES.O)
|
|
135
|
+
public static NotificationChannel createSyncChannel(){
|
|
136
|
+
NotificationChannel channel = new NotificationChannel(SYNC_CHANNEL_ID, SYNC_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
|
|
137
|
+
channel.setDescription(SYNC_CHANNEL_DESCRIPTION);
|
|
138
|
+
channel.enableVibration(false);
|
|
139
|
+
return channel;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@RequiresApi(api = Build.VERSION_CODES.O)
|
|
143
|
+
public static NotificationChannel createAndroidPermissionsChannel(CharSequence name ){
|
|
144
|
+
NotificationChannel channel = new NotificationChannel(ANDROID_PERMISSIONS_CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);
|
|
145
|
+
channel.enableVibration(false);
|
|
146
|
+
return channel;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
package com.marianhello.bgloc.sync;
|
|
2
|
+
|
|
3
|
+
import android.accounts.Account;
|
|
4
|
+
import android.app.NotificationManager;
|
|
5
|
+
import android.content.AbstractThreadedSyncAdapter;
|
|
6
|
+
import android.content.ContentProviderClient;
|
|
7
|
+
import android.content.ContentResolver;
|
|
8
|
+
import android.content.Context;
|
|
9
|
+
import android.content.Intent;
|
|
10
|
+
import android.content.SyncResult;
|
|
11
|
+
import android.os.Bundle;
|
|
12
|
+
import android.os.Handler;
|
|
13
|
+
import android.os.Looper;
|
|
14
|
+
import androidx.core.app.NotificationCompat;
|
|
15
|
+
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
16
|
+
|
|
17
|
+
import com.marianhello.bgloc.Config;
|
|
18
|
+
import com.marianhello.bgloc.HttpPostService;
|
|
19
|
+
import com.marianhello.bgloc.data.ConfigurationDAO;
|
|
20
|
+
import com.marianhello.bgloc.data.DAOFactory;
|
|
21
|
+
import com.marianhello.bgloc.service.LocationServiceImpl;
|
|
22
|
+
import com.marianhello.logging.LoggerManager;
|
|
23
|
+
|
|
24
|
+
import org.json.JSONException;
|
|
25
|
+
|
|
26
|
+
import java.io.File;
|
|
27
|
+
import java.io.IOException;
|
|
28
|
+
import java.util.HashMap;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Handle the transfer of data between a server and an
|
|
32
|
+
* app, using the Android sync adapter framework.
|
|
33
|
+
*/
|
|
34
|
+
public class SyncAdapter extends AbstractThreadedSyncAdapter implements HttpPostService.UploadingProgressListener {
|
|
35
|
+
|
|
36
|
+
private static final int NOTIFICATION_ID = 666;
|
|
37
|
+
|
|
38
|
+
ContentResolver contentResolver;
|
|
39
|
+
private ConfigurationDAO configDAO;
|
|
40
|
+
private NotificationManager notificationManager;
|
|
41
|
+
private BatchManager batchManager;
|
|
42
|
+
private boolean notificationsEnabled = true;
|
|
43
|
+
|
|
44
|
+
private org.slf4j.Logger logger;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Set up the sync adapter
|
|
48
|
+
*/
|
|
49
|
+
public SyncAdapter(Context context, boolean autoInitialize) {
|
|
50
|
+
this(context, autoInitialize, false);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Set up the sync adapter. This form of the
|
|
56
|
+
* constructor maintains compatibility with Android 3.0
|
|
57
|
+
* and later platform versions
|
|
58
|
+
*/
|
|
59
|
+
public SyncAdapter(
|
|
60
|
+
Context context,
|
|
61
|
+
boolean autoInitialize,
|
|
62
|
+
boolean allowParallelSyncs) {
|
|
63
|
+
|
|
64
|
+
super(context, autoInitialize);
|
|
65
|
+
logger = LoggerManager.getLogger(SyncAdapter.class);
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* If your app uses a content resolver, get an instance of it
|
|
69
|
+
* from the incoming Context
|
|
70
|
+
*/
|
|
71
|
+
contentResolver = context.getContentResolver();
|
|
72
|
+
configDAO = DAOFactory.createConfigurationDAO(context);
|
|
73
|
+
batchManager = new BatchManager(this.getContext());
|
|
74
|
+
notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
|
75
|
+
|
|
76
|
+
NotificationHelper.registerSyncChannel(context);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Specify the code you want to run in the sync adapter. The entire
|
|
81
|
+
* sync adapter runs in a background thread, so you don't have to set
|
|
82
|
+
* up your own background processing.
|
|
83
|
+
*/
|
|
84
|
+
@Override
|
|
85
|
+
public void onPerformSync(
|
|
86
|
+
Account account,
|
|
87
|
+
Bundle extras,
|
|
88
|
+
String authority,
|
|
89
|
+
ContentProviderClient provider,
|
|
90
|
+
SyncResult syncResult) {
|
|
91
|
+
|
|
92
|
+
Config config = null;
|
|
93
|
+
try {
|
|
94
|
+
config = configDAO.retrieveConfiguration();
|
|
95
|
+
} catch (JSONException e) {
|
|
96
|
+
logger.error("Error retrieving config: {}", e.getMessage());
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (config == null || !config.hasValidSyncUrl()) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
//noinspection ConstantConditions
|
|
104
|
+
notificationsEnabled = !config.hasNotificationsEnabled() || config.getNotificationsEnabled();
|
|
105
|
+
|
|
106
|
+
Long batchStartMillis = System.currentTimeMillis();
|
|
107
|
+
boolean isForced = extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL);
|
|
108
|
+
int syncThreshold = isForced ? 0 : config.getSyncThreshold();
|
|
109
|
+
logger.debug("Sync request isForced: {}, batchId: {}, config: {}", isForced, batchStartMillis, config.toString());
|
|
110
|
+
|
|
111
|
+
File file = null;
|
|
112
|
+
try {
|
|
113
|
+
file = batchManager.createBatch(batchStartMillis, syncThreshold, config.getTemplate());
|
|
114
|
+
} catch (IOException e) {
|
|
115
|
+
logger.error("Failed to create batch: {}", e.getMessage());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (file == null) {
|
|
119
|
+
logger.info("Nothing to sync");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
logger.info("Syncing startAt: {}", batchStartMillis);
|
|
124
|
+
String url = config.getSyncUrl();
|
|
125
|
+
HashMap<String, String> httpHeaders = new HashMap<String, String>();
|
|
126
|
+
httpHeaders.putAll(config.getHttpHeaders());
|
|
127
|
+
httpHeaders.put("x-batch-id", String.valueOf(batchStartMillis));
|
|
128
|
+
|
|
129
|
+
if (uploadLocations(file, url, httpHeaders)) {
|
|
130
|
+
logger.info("Batch sync successful");
|
|
131
|
+
batchManager.setBatchCompleted(batchStartMillis);
|
|
132
|
+
if (file.delete()) {
|
|
133
|
+
logger.info("Batch file has been deleted: {}", file.getAbsolutePath());
|
|
134
|
+
} else {
|
|
135
|
+
logger.warn("Batch file has not been deleted: {}", file.getAbsolutePath());
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
logger.warn("Batch sync failed due server error");
|
|
139
|
+
syncResult.stats.numIoExceptions++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private boolean uploadLocations(File file, String url, HashMap httpHeaders) {
|
|
144
|
+
NotificationCompat.Builder builder = null;
|
|
145
|
+
|
|
146
|
+
if (notificationsEnabled) {
|
|
147
|
+
builder = new NotificationCompat.Builder(getContext(), NotificationHelper.SYNC_CHANNEL_ID);
|
|
148
|
+
builder.setOngoing(true);
|
|
149
|
+
builder.setContentTitle("Syncing locations");
|
|
150
|
+
builder.setContentText("Sync in progress");
|
|
151
|
+
builder.setSmallIcon(android.R.drawable.ic_dialog_info);
|
|
152
|
+
notificationManager.notify(NOTIFICATION_ID, builder.build());
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
int responseCode = HttpPostService.postJSONFile(url, file, httpHeaders, this);
|
|
157
|
+
|
|
158
|
+
// All 2xx statuses are okay
|
|
159
|
+
boolean isStatusOkay = responseCode >= 200 && responseCode < 300;
|
|
160
|
+
|
|
161
|
+
if (responseCode == 285) {
|
|
162
|
+
// Okay, but we don't need to continue sending these
|
|
163
|
+
|
|
164
|
+
logger.debug("Location was sent to the server, and received an \"HTTP 285 Updates Not Required\"");
|
|
165
|
+
|
|
166
|
+
Bundle bundle = new Bundle();
|
|
167
|
+
bundle.putInt("action", LocationServiceImpl.MSG_ON_ABORT_REQUESTED);
|
|
168
|
+
broadcastMessage(bundle);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (responseCode == 401) {
|
|
172
|
+
Bundle bundle = new Bundle();
|
|
173
|
+
bundle.putInt("action", LocationServiceImpl.MSG_ON_HTTP_AUTHORIZATION);
|
|
174
|
+
broadcastMessage(bundle);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (builder != null) {
|
|
178
|
+
if (isStatusOkay) {
|
|
179
|
+
builder.setContentText("Sync completed");
|
|
180
|
+
} else {
|
|
181
|
+
builder.setContentText("Sync failed due server error");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return isStatusOkay;
|
|
186
|
+
} catch (IOException e) {
|
|
187
|
+
logger.warn("Error uploading locations: {}", e.getMessage());
|
|
188
|
+
|
|
189
|
+
if (builder != null)
|
|
190
|
+
builder.setContentText("Sync failed: " + e.getMessage());
|
|
191
|
+
} finally {
|
|
192
|
+
logger.info("Syncing endAt: {}", System.currentTimeMillis());
|
|
193
|
+
|
|
194
|
+
if (builder != null) {
|
|
195
|
+
builder.setOngoing(false);
|
|
196
|
+
builder.setProgress(0, 0, false);
|
|
197
|
+
builder.setAutoCancel(true);
|
|
198
|
+
notificationManager.notify(NOTIFICATION_ID, builder.build());
|
|
199
|
+
|
|
200
|
+
Handler h = new Handler(Looper.getMainLooper());
|
|
201
|
+
long delayInMilliseconds = 5000;
|
|
202
|
+
h.postDelayed(new Runnable() {
|
|
203
|
+
public void run() {
|
|
204
|
+
logger.info("Notification cancelledAt: {}", System.currentTimeMillis());
|
|
205
|
+
notificationManager.cancel(NOTIFICATION_ID);
|
|
206
|
+
}
|
|
207
|
+
}, delayInMilliseconds);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public void onProgress(int progress) {
|
|
215
|
+
logger.debug("Syncing progress: {} updatedAt: {}", progress, System.currentTimeMillis());
|
|
216
|
+
|
|
217
|
+
if (notificationsEnabled) {
|
|
218
|
+
NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), NotificationHelper.SYNC_CHANNEL_ID);
|
|
219
|
+
builder.setOngoing(true);
|
|
220
|
+
builder.setContentTitle("Syncing locations");
|
|
221
|
+
builder.setContentText("Sync in progress");
|
|
222
|
+
builder.setSmallIcon(android.R.drawable.ic_dialog_info);
|
|
223
|
+
builder.setProgress(100, progress, false);
|
|
224
|
+
notificationManager.notify(NOTIFICATION_ID, builder.build());
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
private void broadcastMessage(Bundle bundle) {
|
|
229
|
+
Intent intent = new Intent(LocationServiceImpl.ACTION_BROADCAST);
|
|
230
|
+
intent.putExtras(bundle);
|
|
231
|
+
LocalBroadcastManager.getInstance(getContext().getApplicationContext()).sendBroadcast(intent);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
package com.marianhello.bgloc.sync;
|
|
2
|
+
|
|
3
|
+
import android.accounts.Account;
|
|
4
|
+
import android.app.Service;
|
|
5
|
+
import android.content.ContentResolver;
|
|
6
|
+
import android.content.Intent;
|
|
7
|
+
import android.os.Bundle;
|
|
8
|
+
import android.os.IBinder;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Define a Service that returns an IBinder for the
|
|
12
|
+
* sync adapter class, allowing the sync adapter framework to call
|
|
13
|
+
* onPerformSync().
|
|
14
|
+
*/
|
|
15
|
+
public class SyncService extends Service {
|
|
16
|
+
// Storage for an instance of the sync adapter
|
|
17
|
+
private static SyncAdapter sSyncAdapter = null;
|
|
18
|
+
// Object to use as a thread-safe lock
|
|
19
|
+
private static final Object sSyncAdapterLock = new Object();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Instantiate the sync adapter object.
|
|
23
|
+
*/
|
|
24
|
+
@Override
|
|
25
|
+
public void onCreate() {
|
|
26
|
+
/*
|
|
27
|
+
* Create the sync adapter as a singleton.
|
|
28
|
+
* Set the sync adapter as syncable
|
|
29
|
+
* Disallow parallel syncs
|
|
30
|
+
*/
|
|
31
|
+
synchronized (sSyncAdapterLock) {
|
|
32
|
+
if (sSyncAdapter == null) {
|
|
33
|
+
sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Return an object that allows the system to invoke
|
|
40
|
+
* the sync adapter.
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
43
|
+
@Override
|
|
44
|
+
public IBinder onBind(Intent intent) {
|
|
45
|
+
/*
|
|
46
|
+
* Get the object that allows external processes
|
|
47
|
+
* to call onPerformSync(). The object is created
|
|
48
|
+
* in the base class code when the SyncAdapter
|
|
49
|
+
* constructors call super()
|
|
50
|
+
*/
|
|
51
|
+
return sSyncAdapter.getSyncAdapterBinder();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public static void sync(Account account, String authority, boolean manual) {
|
|
55
|
+
// Pass the settings flags by inserting them in a bundle
|
|
56
|
+
Bundle settingsBundle = new Bundle();
|
|
57
|
+
settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, manual);
|
|
58
|
+
settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, manual);
|
|
59
|
+
settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
|
|
60
|
+
settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* Request the sync for the default account, authority, and
|
|
64
|
+
* manual sync settings
|
|
65
|
+
*/
|
|
66
|
+
ContentResolver.requestSync(account, authority, settingsBundle);
|
|
67
|
+
}
|
|
68
|
+
}
|