react-native-background-geolocation 4.3.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/.github/stale.yml +41 -0
- package/CHANGELOG.md +1131 -0
- package/LICENSE +22 -0
- package/README.md +292 -0
- package/RNBackgroundGeolocation.podspec +27 -0
- package/android/.idea/compiler.xml +22 -0
- package/android/.idea/copyright/profiles_settings.xml +3 -0
- package/android/.idea/encodings.xml +6 -0
- package/android/.idea/gradle.xml +12 -0
- package/android/.idea/misc.xml +4 -0
- package/android/.idea/modules.xml +8 -0
- package/android/.idea/runConfigurations.xml +12 -0
- package/android/RNBackgroundGeolocation.iml +119 -0
- package/android/android.iml +20 -0
- package/android/app.gradle +22 -0
- package/android/build.gradle +62 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar +0 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.md5 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha1 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha256 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha512 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom +9 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.md5 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha1 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha256 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha512 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager/maven-metadata.xml +14 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar +0 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.md5 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha1 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha256 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha512 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom +9 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.md5 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha1 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha256 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha512 +1 -0
- package/android/libs/com/transistorsoft/tslocationmanager-reverse/maven-metadata.xml +14 -0
- package/android/proguard-rules.pro +30 -0
- package/android/react-native-background-geolocation-android.iml +229 -0
- package/android/src/main/AndroidManifest.xml +6 -0
- package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/HeadlessTask.java +171 -0
- package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/RNBackgroundGeolocation.java +33 -0
- package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/RNBackgroundGeolocationModule.java +1261 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/ios/RNBackgroundGeolocation/RNBackgroundGeolocation.h +22 -0
- package/ios/RNBackgroundGeolocation/RNBackgroundGeolocation.m +754 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/Info.plist +57 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/LocationManager.h +55 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/LogQuery.h +13 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSCallback.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSConfig.h +304 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSLocation.h +101 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSReachability.h +106 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Info.plist +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Modules/module.modulemap +6 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/TSLocationManager +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/LocationManager.h +55 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/LogQuery.h +13 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSCallback.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSConfig.h +304 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSLocation.h +101 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSReachability.h +106 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Info.plist +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Modules/module.modulemap +6 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/TSLocationManager +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeDirectory +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeRequirements +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeRequirements-1 +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeResources +612 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeSignature +0 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/LocationManager.h +55 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/LogQuery.h +13 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSCallback.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSConfig.h +304 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSLocation.h +101 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSReachability.h +106 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Modules/module.modulemap +6 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Resources/Info.plist +50 -0
- package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/TSLocationManager +0 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/project.pbxproj +341 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcshareddata/RNBackgroundGeolocation.xccheckout +41 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcuserdata/chris.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/Build.xcscheme +80 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/RNBackgroundGeolocation.xcscheme +113 -0
- package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/ios/RNBackgroundGeolocationTests/Info.plist +24 -0
- package/package.json +54 -0
- package/react-native.config.js +20 -0
- package/scripts/cp-declarations +53 -0
- package/scripts/declare-module +3 -0
- package/scripts/docs-index.html +4 -0
- package/scripts/generate-docs +23 -0
- package/scripts/postlink.js +146 -0
- package/scripts/postunlink.js +128 -0
- package/scripts/tsconfig.json +21 -0
- package/scripts/xcode-helpers.js +171 -0
- package/src/DeviceSettings.js +52 -0
- package/src/Events.js +17 -0
- package/src/Logger.js +90 -0
- package/src/NativeModule.js +528 -0
- package/src/TransistorAuthorizationToken.js +73 -0
- package/src/declarations/BackgroundGeolocation.d.ts +1601 -0
- package/src/declarations/interfaces/Authorization.d.ts +156 -0
- package/src/declarations/interfaces/AuthorizationEvent.d.ts +30 -0
- package/src/declarations/interfaces/Config.d.ts +2437 -0
- package/src/declarations/interfaces/ConnectivityChangeEvent.d.ts +18 -0
- package/src/declarations/interfaces/CurrentPositionRequest.d.ts +45 -0
- package/src/declarations/interfaces/DeviceInfo.d.ts +33 -0
- package/src/declarations/interfaces/DeviceSettings.d.ts +223 -0
- package/src/declarations/interfaces/Geofence.d.ts +255 -0
- package/src/declarations/interfaces/GeofenceEvent.d.ts +30 -0
- package/src/declarations/interfaces/GeofencesChangeEvent.d.ts +22 -0
- package/src/declarations/interfaces/HeartbeatEvent.d.ts +20 -0
- package/src/declarations/interfaces/HttpEvent.d.ts +313 -0
- package/src/declarations/interfaces/Location.d.ts +216 -0
- package/src/declarations/interfaces/LocationAuthorizationAlert.d.ts +41 -0
- package/src/declarations/interfaces/Logger.d.ts +359 -0
- package/src/declarations/interfaces/MotionActivityEvent.d.ts +31 -0
- package/src/declarations/interfaces/MotionChangeEvent.d.ts +15 -0
- package/src/declarations/interfaces/Notification.d.ts +484 -0
- package/src/declarations/interfaces/PermissionRationale.d.ts +31 -0
- package/src/declarations/interfaces/ProviderChangeEvent.d.ts +74 -0
- package/src/declarations/interfaces/SQLQuery.d.ts +60 -0
- package/src/declarations/interfaces/Sensors.d.ts +31 -0
- package/src/declarations/interfaces/State.d.ts +51 -0
- package/src/declarations/interfaces/TransistorAuthorizationToken.d.ts +63 -0
- package/src/declarations/interfaces/WatchPositionRequest.d.ts +45 -0
- package/src/declarations/types.d.ts +170 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +822 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
package com.transistorsoft.rnbackgroundgeolocation;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.os.Handler;
|
|
5
|
+
import android.os.Looper;
|
|
6
|
+
|
|
7
|
+
import com.facebook.react.ReactApplication;
|
|
8
|
+
import com.facebook.react.ReactInstanceManager;
|
|
9
|
+
import com.facebook.react.bridge.ReactContext;
|
|
10
|
+
import com.facebook.react.bridge.UiThreadUtil;
|
|
11
|
+
import com.facebook.react.bridge.WritableMap;
|
|
12
|
+
import com.facebook.react.bridge.WritableNativeMap;
|
|
13
|
+
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
|
|
14
|
+
import com.facebook.react.jstasks.HeadlessJsTaskContext;
|
|
15
|
+
import com.facebook.react.jstasks.HeadlessJsTaskEventListener;
|
|
16
|
+
|
|
17
|
+
import org.greenrobot.eventbus.Subscribe;
|
|
18
|
+
|
|
19
|
+
import com.transistorsoft.locationmanager.adapter.BackgroundGeolocation;
|
|
20
|
+
import com.transistorsoft.locationmanager.event.HeadlessEvent;
|
|
21
|
+
import com.transistorsoft.locationmanager.logger.TSLog;
|
|
22
|
+
|
|
23
|
+
import org.greenrobot.eventbus.ThreadMode;
|
|
24
|
+
import org.json.JSONException;
|
|
25
|
+
import org.json.JSONObject;
|
|
26
|
+
|
|
27
|
+
import java.util.ArrayList;
|
|
28
|
+
import java.util.List;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Created by chris on 2018-01-23.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
public class HeadlessTask {
|
|
35
|
+
private static String HEADLESS_TASK_NAME = "BackgroundGeolocation";
|
|
36
|
+
// Hard-coded time-limit for headless-tasks is 30000 @todo configurable?
|
|
37
|
+
private static int TASK_TIMEOUT = 30000;
|
|
38
|
+
|
|
39
|
+
private final List<Integer> mTasks = new ArrayList<>();
|
|
40
|
+
|
|
41
|
+
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
42
|
+
public void onHeadlessEvent(HeadlessEvent event) {
|
|
43
|
+
String name = event.getName();
|
|
44
|
+
TSLog.logger.debug("\uD83D\uDC80 event: " + name);
|
|
45
|
+
|
|
46
|
+
WritableMap clientEvent = new WritableNativeMap();
|
|
47
|
+
JSONObject params = null;
|
|
48
|
+
clientEvent.putString("name", name);
|
|
49
|
+
|
|
50
|
+
if (name.equals(BackgroundGeolocation.EVENT_TERMINATE)) {
|
|
51
|
+
params = event.getTerminateEvent();
|
|
52
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_LOCATION)) {
|
|
53
|
+
params = event.getLocationEvent().toJson();
|
|
54
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_MOTIONCHANGE)) {
|
|
55
|
+
params = event.getMotionChangeEvent().toJson();
|
|
56
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_HTTP)) {
|
|
57
|
+
params = event.getHttpEvent().toJson();
|
|
58
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_PROVIDERCHANGE)) {
|
|
59
|
+
params = event.getProviderChangeEvent().toJson();
|
|
60
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_ACTIVITYCHANGE)) {
|
|
61
|
+
params = event.getActivityChangeEvent().toJson();
|
|
62
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_SCHEDULE)) {
|
|
63
|
+
params = event.getScheduleEvent();
|
|
64
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_BOOT)) {
|
|
65
|
+
params = event.getBootEvent();
|
|
66
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_GEOFENCE)) {
|
|
67
|
+
params = event.getGeofenceEvent().toJson();
|
|
68
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_GEOFENCESCHANGE)) {
|
|
69
|
+
params = event.getGeofencesChangeEvent().toJson();
|
|
70
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_HEARTBEAT)) {
|
|
71
|
+
params = event.getHeartbeatEvent().toJson();
|
|
72
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_POWERSAVECHANGE)) {
|
|
73
|
+
clientEvent.putBoolean("params", event.getPowerSaveChangeEvent().isPowerSaveMode());
|
|
74
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_CONNECTIVITYCHANGE)) {
|
|
75
|
+
params = event.getConnectivityChangeEvent().toJson();
|
|
76
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_ENABLEDCHANGE)) {
|
|
77
|
+
clientEvent.putBoolean("params", event.getEnabledChangeEvent());
|
|
78
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_NOTIFICATIONACTION)) {
|
|
79
|
+
clientEvent.putString("params", event.getNotificationEvent());
|
|
80
|
+
} else if (name.equals(BackgroundGeolocation.EVENT_AUTHORIZATION)) {
|
|
81
|
+
params = event.getAuthorizationEvent().toJson();
|
|
82
|
+
} else {
|
|
83
|
+
TSLog.logger.warn(TSLog.warn("Unknown Headless Event: " + name));
|
|
84
|
+
clientEvent.putString("error", "Unknown event: " + name);
|
|
85
|
+
clientEvent.putNull("params");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (params != null) {
|
|
89
|
+
try {
|
|
90
|
+
clientEvent.putMap("params", RNBackgroundGeolocationModule.jsonToMap(params));
|
|
91
|
+
} catch (JSONException e) {
|
|
92
|
+
clientEvent.putNull("params");
|
|
93
|
+
clientEvent.putString("error", e.getMessage());
|
|
94
|
+
TSLog.logger.error(TSLog.error(e.getMessage()));
|
|
95
|
+
e.printStackTrace();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
HeadlessJsTaskConfig config = new HeadlessJsTaskConfig(HEADLESS_TASK_NAME, clientEvent, TASK_TIMEOUT);
|
|
100
|
+
try {
|
|
101
|
+
startTask(event.getContext(), config);
|
|
102
|
+
} catch (AssertionError e) {
|
|
103
|
+
TSLog.logger.warn(TSLog.warn("Failed invoke HeadlessTask " + name + ". Task ignored." + e.getMessage()));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Start a task. This method handles starting a new React instance if required.
|
|
109
|
+
*
|
|
110
|
+
* Has to be called on the UI thread.
|
|
111
|
+
*
|
|
112
|
+
* @param taskConfig describes what task to start and the parameters to pass to it
|
|
113
|
+
*/
|
|
114
|
+
private void startTask(Context context, final HeadlessJsTaskConfig taskConfig) throws AssertionError {
|
|
115
|
+
ReactApplication reactApplication = ((ReactApplication) context);
|
|
116
|
+
|
|
117
|
+
UiThreadUtil.assertOnUiThread();
|
|
118
|
+
final ReactInstanceManager reactInstanceManager = reactApplication.getReactNativeHost().getReactInstanceManager();
|
|
119
|
+
|
|
120
|
+
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
|
|
121
|
+
if (reactContext == null) {
|
|
122
|
+
reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
|
|
123
|
+
@Override public void onReactContextInitialized(final ReactContext reactContext) {
|
|
124
|
+
// Hack to fix unknown problem executing asynchronous BackgroundTask when ReactContext is created *first time*. Fixed by adding short delay before #invokeStartTask
|
|
125
|
+
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
|
126
|
+
@Override
|
|
127
|
+
public void run() {
|
|
128
|
+
invoke(reactContext, taskConfig);
|
|
129
|
+
}
|
|
130
|
+
}, 500);
|
|
131
|
+
reactInstanceManager.removeReactInstanceEventListener(this);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (!reactInstanceManager.hasStartedCreatingInitialContext()) {
|
|
135
|
+
reactInstanceManager.createReactContextInBackground();
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
invoke(reactContext, taskConfig);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private void invoke(ReactContext reactContext, final HeadlessJsTaskConfig taskConfig) {
|
|
143
|
+
final HeadlessJsTaskContext headlessJsTaskContext = HeadlessJsTaskContext.getInstance(reactContext);
|
|
144
|
+
|
|
145
|
+
synchronized(mTasks) {
|
|
146
|
+
if (mTasks.isEmpty()) {
|
|
147
|
+
headlessJsTaskContext.addTaskEventListener(new HeadlessJsTaskEventListener() {
|
|
148
|
+
@Override public void onHeadlessJsTaskStart(int taskId) {
|
|
149
|
+
TSLog.logger.debug("taskId: " + taskId);
|
|
150
|
+
}
|
|
151
|
+
@Override public void onHeadlessJsTaskFinish(int taskId) {
|
|
152
|
+
TSLog.logger.debug("taskId: " + taskId);
|
|
153
|
+
synchronized (mTasks) {
|
|
154
|
+
if (!mTasks.isEmpty()) {
|
|
155
|
+
mTasks.remove(0);
|
|
156
|
+
}
|
|
157
|
+
if (mTasks.isEmpty()) {
|
|
158
|
+
headlessJsTaskContext.removeTaskEventListener(this);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
mTasks.add(headlessJsTaskContext.startTask(taskConfig));
|
|
166
|
+
} catch (IllegalStateException e) {
|
|
167
|
+
TSLog.logger.error(TSLog.error(e.getMessage()));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
package com.transistorsoft.rnbackgroundgeolocation;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.Collections;
|
|
5
|
+
import java.util.List;
|
|
6
|
+
|
|
7
|
+
import com.facebook.react.ReactPackage;
|
|
8
|
+
import com.facebook.react.bridge.NativeModule;
|
|
9
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
10
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
11
|
+
import com.facebook.react.bridge.JavaScriptModule;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Created by chris on 2015-10-30.
|
|
15
|
+
*/
|
|
16
|
+
public class RNBackgroundGeolocation implements ReactPackage {
|
|
17
|
+
@Override public List<NativeModule> createNativeModules (ReactApplicationContext reactContext) {
|
|
18
|
+
List<NativeModule> modules = new ArrayList<>();
|
|
19
|
+
modules.add(new RNBackgroundGeolocationModule(reactContext));
|
|
20
|
+
return modules;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Depreciated RN 0.47
|
|
24
|
+
//@Override
|
|
25
|
+
public List<Class<? extends JavaScriptModule>> createJSModules() {
|
|
26
|
+
return Collections.emptyList();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@Override
|
|
30
|
+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
|
31
|
+
return Collections.emptyList();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,1261 @@
|
|
|
1
|
+
package com.transistorsoft.rnbackgroundgeolocation;
|
|
2
|
+
|
|
3
|
+
import android.Manifest;
|
|
4
|
+
import android.app.Activity;
|
|
5
|
+
import android.content.Context;
|
|
6
|
+
import android.content.Intent;
|
|
7
|
+
import android.util.Log;
|
|
8
|
+
import android.os.Build;
|
|
9
|
+
|
|
10
|
+
import com.facebook.react.bridge.ActivityEventListener;
|
|
11
|
+
import com.facebook.react.bridge.Callback;
|
|
12
|
+
import com.facebook.react.bridge.LifecycleEventListener;
|
|
13
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
14
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
15
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
16
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
17
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
18
|
+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
19
|
+
import com.facebook.react.bridge.ReadableType;
|
|
20
|
+
import com.facebook.react.bridge.WritableArray;
|
|
21
|
+
import com.facebook.react.bridge.WritableMap;
|
|
22
|
+
import com.facebook.react.bridge.WritableNativeArray;
|
|
23
|
+
import com.facebook.react.bridge.WritableNativeMap;
|
|
24
|
+
import com.facebook.react.modules.core.RCTNativeAppEventEmitter;
|
|
25
|
+
|
|
26
|
+
import org.json.JSONArray;
|
|
27
|
+
import org.json.JSONException;
|
|
28
|
+
import org.json.JSONObject;
|
|
29
|
+
|
|
30
|
+
import com.google.android.gms.common.GoogleApiAvailability;
|
|
31
|
+
|
|
32
|
+
import com.transistorsoft.locationmanager.adapter.BackgroundGeolocation;
|
|
33
|
+
import com.transistorsoft.locationmanager.adapter.TSConfig;
|
|
34
|
+
import com.transistorsoft.locationmanager.adapter.callback.*;
|
|
35
|
+
import com.transistorsoft.locationmanager.config.TransistorAuthorizationToken;
|
|
36
|
+
import com.transistorsoft.locationmanager.config.TSAuthorization;
|
|
37
|
+
import com.transistorsoft.locationmanager.data.LocationModel;
|
|
38
|
+
import com.transistorsoft.locationmanager.data.SQLQuery;
|
|
39
|
+
import com.transistorsoft.locationmanager.device.DeviceInfo;
|
|
40
|
+
import com.transistorsoft.locationmanager.event.ActivityChangeEvent;
|
|
41
|
+
import com.transistorsoft.locationmanager.event.AuthorizationEvent;
|
|
42
|
+
import com.transistorsoft.locationmanager.event.ConnectivityChangeEvent;
|
|
43
|
+
import com.transistorsoft.locationmanager.event.GeofenceEvent;
|
|
44
|
+
import com.transistorsoft.locationmanager.event.GeofencesChangeEvent;
|
|
45
|
+
import com.transistorsoft.locationmanager.event.HeartbeatEvent;
|
|
46
|
+
import com.transistorsoft.locationmanager.event.LocationProviderChangeEvent;
|
|
47
|
+
import com.transistorsoft.locationmanager.geofence.TSGeofence;
|
|
48
|
+
import com.transistorsoft.locationmanager.http.HttpResponse;
|
|
49
|
+
import com.transistorsoft.locationmanager.http.HttpService;
|
|
50
|
+
import com.transistorsoft.locationmanager.location.TSCurrentPositionRequest;
|
|
51
|
+
import com.transistorsoft.locationmanager.location.TSLocation;
|
|
52
|
+
import com.transistorsoft.locationmanager.location.TSWatchPositionRequest;
|
|
53
|
+
import com.transistorsoft.locationmanager.scheduler.TSScheduleManager;
|
|
54
|
+
import com.transistorsoft.locationmanager.scheduler.ScheduleEvent;
|
|
55
|
+
import com.transistorsoft.locationmanager.event.TerminateEvent;
|
|
56
|
+
import com.transistorsoft.locationmanager.util.Sensors;
|
|
57
|
+
import com.transistorsoft.locationmanager.logger.TSLog;
|
|
58
|
+
import com.transistorsoft.locationmanager.device.DeviceSettingsRequest;
|
|
59
|
+
|
|
60
|
+
import java.util.ArrayList;
|
|
61
|
+
import java.util.HashMap;
|
|
62
|
+
import java.util.Iterator;
|
|
63
|
+
import java.util.List;
|
|
64
|
+
import java.util.Map;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Created by chris on 2015-10-30.
|
|
68
|
+
*/
|
|
69
|
+
public class RNBackgroundGeolocationModule extends ReactContextBaseJavaModule implements ActivityEventListener, LifecycleEventListener {
|
|
70
|
+
|
|
71
|
+
private static final String TAG = "TSLocationManager";
|
|
72
|
+
private static final String JOB_SERVICE_CLASS = "HeadlessTask";
|
|
73
|
+
|
|
74
|
+
public static final String ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
|
|
75
|
+
public static final String ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
|
|
76
|
+
|
|
77
|
+
public static final int REQUEST_ACTION_START = 1;
|
|
78
|
+
public static final int REQUEST_ACTION_GET_CURRENT_POSITION = 2;
|
|
79
|
+
public static final int REQUEST_ACTION_START_GEOFENCES = 3;
|
|
80
|
+
|
|
81
|
+
private static final String EVENT_WATCHPOSITION = "watchposition";
|
|
82
|
+
|
|
83
|
+
private boolean mInitialized = false;
|
|
84
|
+
private boolean mReady = false;
|
|
85
|
+
|
|
86
|
+
// Map of event listener-counts
|
|
87
|
+
private final HashMap<String, Integer> mListeners = new HashMap<>();
|
|
88
|
+
private List<String> mEvents = new ArrayList<>();
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
public RNBackgroundGeolocationModule(ReactApplicationContext reactContext) {
|
|
92
|
+
super(reactContext);
|
|
93
|
+
|
|
94
|
+
TSConfig config = TSConfig.getInstance(getReactApplicationContext());
|
|
95
|
+
config.useCLLocationAccuracy(true);
|
|
96
|
+
|
|
97
|
+
config.updateWithBuilder()
|
|
98
|
+
.setHeadlessJobService(getClass().getPackage().getName() + "." + JOB_SERVICE_CLASS)
|
|
99
|
+
.commit();
|
|
100
|
+
|
|
101
|
+
// These are the only events which can be subscribed to.
|
|
102
|
+
mEvents.add(BackgroundGeolocation.EVENT_LOCATION);
|
|
103
|
+
mEvents.add(BackgroundGeolocation.EVENT_MOTIONCHANGE);
|
|
104
|
+
mEvents.add(BackgroundGeolocation.EVENT_ACTIVITYCHANGE);
|
|
105
|
+
mEvents.add(BackgroundGeolocation.EVENT_PROVIDERCHANGE);
|
|
106
|
+
mEvents.add(BackgroundGeolocation.EVENT_GEOFENCESCHANGE);
|
|
107
|
+
mEvents.add(BackgroundGeolocation.EVENT_GEOFENCE);
|
|
108
|
+
mEvents.add(BackgroundGeolocation.EVENT_HEARTBEAT);
|
|
109
|
+
mEvents.add(BackgroundGeolocation.EVENT_HTTP);
|
|
110
|
+
mEvents.add(BackgroundGeolocation.EVENT_SCHEDULE);
|
|
111
|
+
mEvents.add(BackgroundGeolocation.EVENT_POWERSAVECHANGE);
|
|
112
|
+
mEvents.add(BackgroundGeolocation.EVENT_CONNECTIVITYCHANGE);
|
|
113
|
+
mEvents.add(BackgroundGeolocation.EVENT_ENABLEDCHANGE);
|
|
114
|
+
mEvents.add(BackgroundGeolocation.EVENT_NOTIFICATIONACTION);
|
|
115
|
+
mEvents.add(TSAuthorization.NAME);
|
|
116
|
+
|
|
117
|
+
reactContext.addLifecycleEventListener(this);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@Override
|
|
121
|
+
public void initialize() {
|
|
122
|
+
// do nothing
|
|
123
|
+
}
|
|
124
|
+
@Override
|
|
125
|
+
public String getName() {
|
|
126
|
+
return "RNBackgroundGeolocation";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* location event callback
|
|
132
|
+
*/
|
|
133
|
+
private class LocationCallback implements TSLocationCallback {
|
|
134
|
+
@Override public void onLocation(TSLocation location) {
|
|
135
|
+
try {
|
|
136
|
+
sendEvent(BackgroundGeolocation.EVENT_LOCATION, jsonToMap(location.toJson()));
|
|
137
|
+
} catch (JSONException e) {
|
|
138
|
+
e.printStackTrace();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
@Override public void onError(Integer error) {
|
|
142
|
+
onLocationError(error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* motionchange event callback
|
|
148
|
+
*/
|
|
149
|
+
private class MotionChangeCallback implements TSLocationCallback {
|
|
150
|
+
@Override public void onLocation(TSLocation location) {
|
|
151
|
+
WritableMap params = new WritableNativeMap();
|
|
152
|
+
params.putBoolean("isMoving", location.getIsMoving());
|
|
153
|
+
try {
|
|
154
|
+
params.putMap("location", jsonToMap(location.toJson()));
|
|
155
|
+
sendEvent(BackgroundGeolocation.EVENT_MOTIONCHANGE, params);
|
|
156
|
+
} catch (JSONException e) {
|
|
157
|
+
e.printStackTrace();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
@Override public void onError(Integer error) {
|
|
161
|
+
onLocationError(error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* activitychange event callback
|
|
167
|
+
*/
|
|
168
|
+
private class ActivityChangeCallback implements TSActivityChangeCallback {
|
|
169
|
+
@Override public void onActivityChange(ActivityChangeEvent event) {
|
|
170
|
+
try {
|
|
171
|
+
sendEvent(BackgroundGeolocation.EVENT_ACTIVITYCHANGE, jsonToMap(event.toJson()));
|
|
172
|
+
} catch (JSONException e) {
|
|
173
|
+
e.printStackTrace();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* providerchange event callback
|
|
180
|
+
*/
|
|
181
|
+
private class LocationProviderChangeCallback implements TSLocationProviderChangeCallback {
|
|
182
|
+
@Override public void onLocationProviderChange(LocationProviderChangeEvent event) {
|
|
183
|
+
WritableMap params = new WritableNativeMap();
|
|
184
|
+
params.putBoolean("network", event.isNetworkEnabled());
|
|
185
|
+
params.putBoolean("gps", event.isGPSEnabled());
|
|
186
|
+
params.putBoolean("enabled", event.isEnabled());
|
|
187
|
+
params.putInt("accuracyAuthorization", event.getAccuracyAuthorization());
|
|
188
|
+
params.putInt("status", event.getStatus());
|
|
189
|
+
sendEvent(BackgroundGeolocation.EVENT_PROVIDERCHANGE, params);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* connectivitychange event callback
|
|
195
|
+
*/
|
|
196
|
+
private class ConnectivityChangeCallback implements TSConnectivityChangeCallback {
|
|
197
|
+
@Override public void onConnectivityChange(ConnectivityChangeEvent event) {
|
|
198
|
+
WritableMap params = new WritableNativeMap();
|
|
199
|
+
params.putBoolean("connected", event.hasConnection());
|
|
200
|
+
sendEvent(BackgroundGeolocation.EVENT_CONNECTIVITYCHANGE, params);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* enabledchange event callback
|
|
205
|
+
*/
|
|
206
|
+
private class EnabledChangeCallback implements TSEnabledChangeCallback {
|
|
207
|
+
@Override public void onEnabledChange(boolean enabled) {
|
|
208
|
+
sendEvent(BackgroundGeolocation.EVENT_ENABLEDCHANGE, enabled);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* notificationaction event callback
|
|
213
|
+
*/
|
|
214
|
+
private class NotificationActionCallback implements TSNotificationActionCallback {
|
|
215
|
+
@Override public void onClick(String buttonId) {
|
|
216
|
+
sendEvent(BackgroundGeolocation.EVENT_NOTIFICATIONACTION, buttonId);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* geofenceschange event callback
|
|
221
|
+
*/
|
|
222
|
+
private class GeofencesChangeCallback implements TSGeofencesChangeCallback {
|
|
223
|
+
@Override public void onGeofencesChange(GeofencesChangeEvent event) {
|
|
224
|
+
try {
|
|
225
|
+
// TODO
|
|
226
|
+
WritableMap params = new WritableNativeMap();
|
|
227
|
+
WritableArray on = new WritableNativeArray();
|
|
228
|
+
WritableArray off = new WritableNativeArray();
|
|
229
|
+
sendEvent(BackgroundGeolocation.EVENT_GEOFENCESCHANGE, jsonToMap(event.toJson()));
|
|
230
|
+
} catch (JSONException e) {
|
|
231
|
+
e.printStackTrace();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* geofence event callback
|
|
238
|
+
*/
|
|
239
|
+
private class GeofenceCallback implements TSGeofenceCallback {
|
|
240
|
+
@Override public void onGeofence(GeofenceEvent event) {
|
|
241
|
+
try {
|
|
242
|
+
sendEvent(BackgroundGeolocation.EVENT_GEOFENCE, jsonToMap(event.toJson()));
|
|
243
|
+
} catch (JSONException e) {
|
|
244
|
+
e.printStackTrace();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* heartbeat event callback
|
|
251
|
+
*/
|
|
252
|
+
private class HeartbeatCallback implements TSHeartbeatCallback {
|
|
253
|
+
@Override public void onHeartbeat(HeartbeatEvent event) {
|
|
254
|
+
try {
|
|
255
|
+
sendEvent(BackgroundGeolocation.EVENT_HEARTBEAT, jsonToMap(event.toJson()));
|
|
256
|
+
} catch (JSONException e) {
|
|
257
|
+
e.printStackTrace();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* http event callback
|
|
264
|
+
*/
|
|
265
|
+
private class HttpResponseCallback implements TSHttpResponseCallback {
|
|
266
|
+
@Override public void onHttpResponse(HttpResponse response) {
|
|
267
|
+
WritableMap params = new WritableNativeMap();
|
|
268
|
+
params.putBoolean("success", response.isSuccess());
|
|
269
|
+
params.putInt("status", response.status);
|
|
270
|
+
params.putString("responseText", response.responseText);
|
|
271
|
+
sendEvent(BackgroundGeolocation.EVENT_HTTP, params);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* schedule event callback
|
|
277
|
+
*/
|
|
278
|
+
private class ScheduleCallback implements TSScheduleCallback {
|
|
279
|
+
@Override public void onSchedule(ScheduleEvent event) {
|
|
280
|
+
try {
|
|
281
|
+
sendEvent(BackgroundGeolocation.EVENT_SCHEDULE, jsonToMap(event.getState()));
|
|
282
|
+
} catch (JSONException e) {
|
|
283
|
+
e.printStackTrace();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* powersavechange event callback
|
|
290
|
+
*/
|
|
291
|
+
private class PowerSaveChangeCallack implements TSPowerSaveChangeCallback {
|
|
292
|
+
@Override public void onPowerSaveChange(Boolean isPowerSaveMode) {
|
|
293
|
+
sendEvent(BackgroundGeolocation.EVENT_POWERSAVECHANGE, isPowerSaveMode);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* authorization event callback
|
|
299
|
+
*/
|
|
300
|
+
private class AuthorizationCallback implements TSAuthorizationCallback {
|
|
301
|
+
@Override public void onResponse(AuthorizationEvent event) {
|
|
302
|
+
try {
|
|
303
|
+
sendEvent(TSAuthorization.NAME, jsonToMap(event.toJson()));
|
|
304
|
+
} catch (JSONException e) {
|
|
305
|
+
TSLog.logger.error(TSLog.error(e.getMessage()), e);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
@Override
|
|
310
|
+
public void onHostResume() {
|
|
311
|
+
if (!mInitialized) {
|
|
312
|
+
initializeLocationManager();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
@Override
|
|
316
|
+
public void onHostPause() {
|
|
317
|
+
Context context = getReactApplicationContext();
|
|
318
|
+
TSConfig config = TSConfig.getInstance(context);
|
|
319
|
+
if (config.getEnabled()) {
|
|
320
|
+
TSScheduleManager.getInstance(context).oneShot(TerminateEvent.ACTION, 10000);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
@Override
|
|
324
|
+
public void onHostDestroy() {
|
|
325
|
+
mInitialized = false;
|
|
326
|
+
removeAllListeners();
|
|
327
|
+
getAdapter().onActivityDestroy();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
@Override
|
|
331
|
+
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
|
|
332
|
+
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@Override
|
|
336
|
+
public void onNewIntent(Intent intent) {
|
|
337
|
+
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
@ReactMethod
|
|
341
|
+
public void registerPlugin(String name) {
|
|
342
|
+
// Do nothing. This is for iOS only.
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
@ReactMethod
|
|
346
|
+
public void ready(ReadableMap params, final Callback success, final Callback failure) {
|
|
347
|
+
TSConfig config = TSConfig.getInstance(getReactApplicationContext());
|
|
348
|
+
|
|
349
|
+
if (mReady) {
|
|
350
|
+
TSLog.logger.warn(TSLog.warn("#ready already called. Redirecting to #setConfig"));
|
|
351
|
+
setConfig(params, success, failure);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
mReady = true;
|
|
355
|
+
if (config.isFirstBoot()) {
|
|
356
|
+
config.updateWithJSONObject(mapToJson(setHeadlessJobService(params)));
|
|
357
|
+
} else {
|
|
358
|
+
boolean reset = true;
|
|
359
|
+
if (params.hasKey("reset")) {
|
|
360
|
+
reset = params.getBoolean("reset");
|
|
361
|
+
}
|
|
362
|
+
if (reset) {
|
|
363
|
+
config.reset();
|
|
364
|
+
config.updateWithJSONObject(mapToJson(setHeadlessJobService(params)));
|
|
365
|
+
} else if (params.hasKey(TSAuthorization.NAME)) {
|
|
366
|
+
ReadableMap readableMap = params.getMap(TSAuthorization.NAME);
|
|
367
|
+
if (readableMap != null) {
|
|
368
|
+
Map<String, Object> options = readableMap.toHashMap();
|
|
369
|
+
// Have to be careful with expires: ReadadbleMap#toHashMap converts it to Double.
|
|
370
|
+
options.put(TSAuthorization.FIELD_EXPIRES, readableMap.getInt(TSAuthorization.FIELD_EXPIRES));
|
|
371
|
+
|
|
372
|
+
config.updateWithBuilder()
|
|
373
|
+
.setAuthorization(new TSAuthorization(options))
|
|
374
|
+
.commit();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
getAdapter().ready(new TSCallback() {
|
|
379
|
+
@Override public void onSuccess() { success.invoke(getState()); }
|
|
380
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@ReactMethod
|
|
385
|
+
public void configure(ReadableMap params, final Callback success, final Callback failure){
|
|
386
|
+
final TSConfig config = TSConfig.getInstance(getReactApplicationContext());
|
|
387
|
+
config.reset();
|
|
388
|
+
config.updateWithJSONObject(mapToJson(setHeadlessJobService(params)));
|
|
389
|
+
|
|
390
|
+
getAdapter().ready(new TSCallback() {
|
|
391
|
+
@Override public void onSuccess() { success.invoke(getState()); }
|
|
392
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
@ReactMethod
|
|
397
|
+
public void setConfig(ReadableMap params, final Callback success, final Callback failure) {
|
|
398
|
+
TSConfig config = TSConfig.getInstance(getReactApplicationContext());
|
|
399
|
+
config.updateWithJSONObject(mapToJson(params));
|
|
400
|
+
success.invoke(getState());
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
@ReactMethod
|
|
404
|
+
public void reset(ReadableMap defaultConfig, final Callback success, final Callback failure) {
|
|
405
|
+
TSConfig config = TSConfig.getInstance(getReactApplicationContext());
|
|
406
|
+
config.reset();
|
|
407
|
+
config.updateWithJSONObject(mapToJson(setHeadlessJobService(defaultConfig)));
|
|
408
|
+
success.invoke(getState());
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
@ReactMethod
|
|
412
|
+
public void start(final Callback success, final Callback failure) {
|
|
413
|
+
getAdapter().start(new TSCallback() {
|
|
414
|
+
@Override public void onSuccess() { success.invoke(getState()); }
|
|
415
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
@ReactMethod
|
|
420
|
+
public void startSchedule(Callback success, Callback failure) {
|
|
421
|
+
if (getAdapter().startSchedule()) {
|
|
422
|
+
success.invoke(getState());
|
|
423
|
+
} else {
|
|
424
|
+
failure.invoke("Failed to start schedule. Did you configure a #schedule?");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
@ReactMethod
|
|
429
|
+
public void stopSchedule(Callback success, Callback failure) {
|
|
430
|
+
getAdapter().stopSchedule();
|
|
431
|
+
success.invoke(getState());
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
@ReactMethod
|
|
435
|
+
public void startGeofences(final Callback success, final Callback failure) {
|
|
436
|
+
getAdapter().startGeofences(new TSCallback() {
|
|
437
|
+
@Override public void onSuccess() { success.invoke(getState()); }
|
|
438
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
@ReactMethod
|
|
443
|
+
public void stop(final Callback success, final Callback failure) {
|
|
444
|
+
getAdapter().stop(new TSCallback() {
|
|
445
|
+
@Override public void onSuccess() { success.invoke(getState()); }
|
|
446
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
@ReactMethod
|
|
451
|
+
public void changePace(Boolean moving, final Callback success, final Callback failure) {
|
|
452
|
+
getAdapter().changePace(moving, new TSCallback() {
|
|
453
|
+
@Override public void onSuccess() { success.invoke(); }
|
|
454
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
@ReactMethod
|
|
459
|
+
public void getState(Callback success, final Callback failure) {
|
|
460
|
+
success.invoke(getState());
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
@ReactMethod
|
|
464
|
+
public void getLocations(final Callback success, final Callback failure) {
|
|
465
|
+
getAdapter().getLocations(new TSGetLocationsCallback() {
|
|
466
|
+
@Override public void onSuccess(List<LocationModel> records) {
|
|
467
|
+
try {
|
|
468
|
+
JSONArray data = new JSONArray();
|
|
469
|
+
for (LocationModel location : records) {
|
|
470
|
+
data.put(location.json);
|
|
471
|
+
}
|
|
472
|
+
success.invoke(convertJsonToArray(data));
|
|
473
|
+
} catch (JSONException e) {
|
|
474
|
+
e.printStackTrace();
|
|
475
|
+
failure.invoke(e.getMessage());
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
@Override public void onFailure(Integer error) { failure.invoke(error); }
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
@ReactMethod
|
|
483
|
+
public void getCount(final Callback success, final Callback failure) {
|
|
484
|
+
success.invoke(getAdapter().getCount());
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
@ReactMethod
|
|
488
|
+
public void insertLocation(ReadableMap params, final Callback success, final Callback failure) {
|
|
489
|
+
getAdapter().insertLocation(mapToJson(params), new TSInsertLocationCallback() {
|
|
490
|
+
@Override public void onSuccess(String uuid) {
|
|
491
|
+
success.invoke(uuid);
|
|
492
|
+
}
|
|
493
|
+
@Override public void onFailure(String error) {
|
|
494
|
+
failure.invoke(error);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// @deprecated -> #destroyLocations
|
|
500
|
+
@ReactMethod
|
|
501
|
+
public void clearDatabase(Callback success, Callback failure) {
|
|
502
|
+
destroyLocations(success, failure);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
@ReactMethod
|
|
506
|
+
public void destroyLocations(final Callback success, final Callback failure) {
|
|
507
|
+
getAdapter().destroyLocations(new TSCallback() {
|
|
508
|
+
@Override public void onSuccess() { success.invoke(); }
|
|
509
|
+
@Override public void onFailure(String error) {
|
|
510
|
+
failure.invoke(error);
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
@ReactMethod
|
|
516
|
+
public void destroyLocation(String uuid, final Callback success, final Callback failure) {
|
|
517
|
+
getAdapter().destroyLocation(uuid, new TSCallback() {
|
|
518
|
+
@Override public void onSuccess() { success.invoke(); }
|
|
519
|
+
@Override public void onFailure(String error) {
|
|
520
|
+
failure.invoke(error);
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
@ReactMethod
|
|
526
|
+
public void destroyLog(final Callback success, final Callback failure) {
|
|
527
|
+
getAdapter().destroyLog(new TSCallback() {
|
|
528
|
+
@Override public void onSuccess() {
|
|
529
|
+
success.invoke(true);
|
|
530
|
+
}
|
|
531
|
+
@Override public void onFailure(String error) {
|
|
532
|
+
failure.invoke(error);
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
@ReactMethod
|
|
538
|
+
public void sync(final Callback success, final Callback failure) {
|
|
539
|
+
getAdapter().sync(new TSSyncCallback() {
|
|
540
|
+
@Override public void onSuccess(List<LocationModel> records) {
|
|
541
|
+
try {
|
|
542
|
+
JSONArray data = new JSONArray();
|
|
543
|
+
for (LocationModel location : records) {
|
|
544
|
+
data.put(location.json);
|
|
545
|
+
}
|
|
546
|
+
success.invoke(convertJsonToArray(data));
|
|
547
|
+
} catch (JSONException e) {
|
|
548
|
+
failure.invoke(e.getMessage());
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
@Override public void onFailure(String error) {
|
|
552
|
+
failure.invoke(error);
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
@ReactMethod
|
|
558
|
+
public void getCurrentPosition(ReadableMap options, final Callback success, final Callback failure) {
|
|
559
|
+
TSCurrentPositionRequest.Builder builder = new TSCurrentPositionRequest.Builder(getReactApplicationContext());
|
|
560
|
+
|
|
561
|
+
builder.setCallback(new TSLocationCallback() {
|
|
562
|
+
@Override public void onLocation(TSLocation tsLocation) {
|
|
563
|
+
try {
|
|
564
|
+
success.invoke(jsonToMap(tsLocation.toJson()));
|
|
565
|
+
} catch (JSONException e) {
|
|
566
|
+
failure.invoke(e.getMessage());
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
@Override public void onError(Integer errorCode) {
|
|
570
|
+
failure.invoke(errorCode);
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
if (options.hasKey("samples")) { builder.setSamples(options.getInt("samples")); }
|
|
575
|
+
if (options.hasKey("extras")) { builder.setExtras(mapToJson(options.getMap("extras"))); }
|
|
576
|
+
if (options.hasKey("persist")) { builder.setPersist(options.getBoolean("persist")); }
|
|
577
|
+
if (options.hasKey("timeout")) { builder.setTimeout(options.getInt("timeout")); }
|
|
578
|
+
if (options.hasKey("maximumAge")) { builder.setMaximumAge((long) options.getInt("maximumAge")); }
|
|
579
|
+
if (options.hasKey("desiredAccuracy")) { builder.setDesiredAccuracy(options.getInt("desiredAccuracy")); }
|
|
580
|
+
|
|
581
|
+
getAdapter().getCurrentPosition(builder.build());
|
|
582
|
+
}
|
|
583
|
+
@ReactMethod
|
|
584
|
+
public void watchPosition(ReadableMap options, final Callback success, final Callback failure) {
|
|
585
|
+
TSWatchPositionRequest.Builder builder = new TSWatchPositionRequest.Builder(getReactApplicationContext());
|
|
586
|
+
|
|
587
|
+
builder.setCallback(new TSLocationCallback() {
|
|
588
|
+
@Override public void onLocation(TSLocation tsLocation) {
|
|
589
|
+
try {
|
|
590
|
+
sendEvent(EVENT_WATCHPOSITION, jsonToMap(tsLocation.toJson()));
|
|
591
|
+
} catch (JSONException e) {
|
|
592
|
+
e.printStackTrace();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
@Override public void onError(Integer error) {
|
|
596
|
+
failure.invoke(error);
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
if (options.hasKey("interval")) { builder.setInterval((long) options.getInt("interval")); }
|
|
601
|
+
if (options.hasKey("extras")) { builder.setExtras(mapToJson(options.getMap("extras"))); }
|
|
602
|
+
if (options.hasKey("persist")) { builder.setPersist(options.getBoolean("persist")); }
|
|
603
|
+
if (options.hasKey("desiredAccuracy")) { builder.setDesiredAccuracy(options.getInt("desiredAccuracy")); }
|
|
604
|
+
|
|
605
|
+
getAdapter().watchPosition(builder.build());
|
|
606
|
+
success.invoke();
|
|
607
|
+
}
|
|
608
|
+
@ReactMethod
|
|
609
|
+
public void stopWatchPosition(final Callback success, final Callback failure) {
|
|
610
|
+
getAdapter().stopWatchPosition(new TSCallback() {
|
|
611
|
+
@Override public void onSuccess() {
|
|
612
|
+
success.invoke();
|
|
613
|
+
}
|
|
614
|
+
@Override public void onFailure(String error) {
|
|
615
|
+
failure.invoke(error);
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
@ReactMethod
|
|
620
|
+
public void getOdometer(Callback success, Callback failure) {
|
|
621
|
+
success.invoke(getAdapter().getOdometer());
|
|
622
|
+
}
|
|
623
|
+
@ReactMethod
|
|
624
|
+
public void setOdometer(Float value, final Callback success, final Callback failure) {
|
|
625
|
+
getAdapter().setOdometer(value, new TSLocationCallback() {
|
|
626
|
+
@Override public void onLocation(TSLocation location) {
|
|
627
|
+
try {
|
|
628
|
+
success.invoke(jsonToMap(location.toJson()));
|
|
629
|
+
} catch (JSONException e) {
|
|
630
|
+
failure.invoke(e.getMessage());
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
@Override public void onError(Integer errorCode) {
|
|
634
|
+
failure.invoke((Integer) errorCode);
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
@ReactMethod
|
|
639
|
+
public void addGeofence(ReadableMap options, final Callback success, final Callback failure) {
|
|
640
|
+
try {
|
|
641
|
+
getAdapter().addGeofence(buildGeofence(options), new TSCallback() {
|
|
642
|
+
@Override public void onSuccess() { success.invoke(); }
|
|
643
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
644
|
+
});
|
|
645
|
+
} catch (TSGeofence.Exception e) {
|
|
646
|
+
failure.invoke(e.getMessage());
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
@ReactMethod
|
|
651
|
+
public void addGeofences(ReadableArray data, final Callback success, final Callback failure) {
|
|
652
|
+
List<TSGeofence> geofences = new ArrayList<TSGeofence>();
|
|
653
|
+
for (int n=0;n<data.size();n++) {
|
|
654
|
+
try {
|
|
655
|
+
geofences.add(buildGeofence(data.getMap(n)));
|
|
656
|
+
} catch (TSGeofence.Exception e) {
|
|
657
|
+
failure.invoke(e.getMessage());
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
getAdapter().addGeofences(geofences, new TSCallback() {
|
|
663
|
+
@Override public void onSuccess() {
|
|
664
|
+
success.invoke();
|
|
665
|
+
}
|
|
666
|
+
@Override public void onFailure(String error) {
|
|
667
|
+
failure.invoke(error);
|
|
668
|
+
}
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
private TSGeofence buildGeofence(ReadableMap config) throws TSGeofence.Exception {
|
|
673
|
+
TSGeofence.Builder builder = new TSGeofence.Builder();
|
|
674
|
+
if (config.hasKey("identifier")) { builder.setIdentifier(config.getString("identifier")); }
|
|
675
|
+
if (config.hasKey("latitude")) { builder.setLatitude(config.getDouble("latitude")); }
|
|
676
|
+
if (config.hasKey("longitude")) { builder.setLongitude(config.getDouble("longitude")); }
|
|
677
|
+
if (config.hasKey("radius")) { builder.setRadius((float) config.getDouble("radius")); }
|
|
678
|
+
if (config.hasKey("notifyOnEntry")) { builder.setNotifyOnEntry(config.getBoolean("notifyOnEntry")); }
|
|
679
|
+
if (config.hasKey("notifyOnExit")) { builder.setNotifyOnExit(config.getBoolean("notifyOnExit")); }
|
|
680
|
+
if (config.hasKey("notifyOnDwell")) { builder.setNotifyOnDwell(config.getBoolean("notifyOnDwell")); }
|
|
681
|
+
if (config.hasKey("loiteringDelay")) { builder.setLoiteringDelay(config.getInt("loiteringDelay")); }
|
|
682
|
+
if (config.hasKey("extras")) { builder.setExtras(mapToJson(config.getMap("extras"))); }
|
|
683
|
+
|
|
684
|
+
return builder.build();
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
@ReactMethod
|
|
688
|
+
public void removeGeofence(String identifier, final Callback success, final Callback failure) {
|
|
689
|
+
getAdapter().removeGeofence(identifier, new TSCallback() {
|
|
690
|
+
@Override public void onSuccess() {
|
|
691
|
+
success.invoke();
|
|
692
|
+
}
|
|
693
|
+
@Override public void onFailure(String error) {
|
|
694
|
+
failure.invoke(error);
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
@ReactMethod
|
|
700
|
+
public void removeGeofences(final Callback success, final Callback failure) {
|
|
701
|
+
// TODO allow JS api to delete a list-of-geofences.
|
|
702
|
+
// TODO accept WritableArray geofences from Client js API, allowing to remove a set of geofences
|
|
703
|
+
List<String> identifiers = new ArrayList<>();
|
|
704
|
+
getAdapter().removeGeofences(identifiers, new TSCallback() {
|
|
705
|
+
@Override public void onSuccess() {
|
|
706
|
+
success.invoke();
|
|
707
|
+
}
|
|
708
|
+
@Override public void onFailure(String error) {
|
|
709
|
+
failure.invoke(error);
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
@ReactMethod
|
|
715
|
+
public void getGeofences(final Callback success, final Callback failure) {
|
|
716
|
+
getAdapter().getGeofences(new TSGetGeofencesCallback() {
|
|
717
|
+
@Override public void onSuccess(List<TSGeofence> geofences) {
|
|
718
|
+
try {
|
|
719
|
+
WritableArray rs = new WritableNativeArray();
|
|
720
|
+
for (TSGeofence geofence : geofences) {
|
|
721
|
+
WritableMap data = new WritableNativeMap();
|
|
722
|
+
data.putString("identifier", geofence.getIdentifier());
|
|
723
|
+
data.putDouble("latitude", geofence.getLatitude());
|
|
724
|
+
data.putDouble("longitude", geofence.getLongitude());
|
|
725
|
+
data.putDouble("radius", geofence.getRadius());
|
|
726
|
+
data.putBoolean("notifyOnEntry", geofence.getNotifyOnEntry());
|
|
727
|
+
data.putBoolean("notifyOnExit", geofence.getNotifyOnExit());
|
|
728
|
+
data.putBoolean("notifyOnDwell", geofence.getNotifyOnDwell());
|
|
729
|
+
data.putInt("loiteringDelay", geofence.getLoiteringDelay());
|
|
730
|
+
if (geofence.getExtras() != null) {
|
|
731
|
+
data.putMap("extras", jsonToMap(geofence.getExtras()));
|
|
732
|
+
}
|
|
733
|
+
rs.pushMap(data);
|
|
734
|
+
}
|
|
735
|
+
success.invoke(rs);
|
|
736
|
+
} catch (JSONException e) {
|
|
737
|
+
e.printStackTrace();
|
|
738
|
+
failure.invoke(e.getMessage());
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
@ReactMethod
|
|
746
|
+
public void getGeofence(String identifier, final Callback success, final Callback failure) {
|
|
747
|
+
getAdapter().getGeofence(identifier, new TSGetGeofenceCallback() {
|
|
748
|
+
@Override public void onSuccess(TSGeofence geofence) {
|
|
749
|
+
try {
|
|
750
|
+
WritableMap data = new WritableNativeMap();
|
|
751
|
+
data.putString("identifier", geofence.getIdentifier());
|
|
752
|
+
data.putDouble("latitude", geofence.getLatitude());
|
|
753
|
+
data.putDouble("longitude", geofence.getLongitude());
|
|
754
|
+
data.putDouble("radius", geofence.getRadius());
|
|
755
|
+
data.putBoolean("notifyOnEntry", geofence.getNotifyOnEntry());
|
|
756
|
+
data.putBoolean("notifyOnExit", geofence.getNotifyOnExit());
|
|
757
|
+
data.putBoolean("notifyOnDwell", geofence.getNotifyOnDwell());
|
|
758
|
+
data.putInt("loiteringDelay", geofence.getLoiteringDelay());
|
|
759
|
+
if (geofence.getExtras() != null) {
|
|
760
|
+
data.putMap("extras", jsonToMap(geofence.getExtras()));
|
|
761
|
+
}
|
|
762
|
+
success.invoke(data);
|
|
763
|
+
} catch (JSONException e) {
|
|
764
|
+
e.printStackTrace();
|
|
765
|
+
failure.invoke(e.getMessage());
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
@Override public void onFailure(String error) { failure.invoke(error); }
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
@ReactMethod
|
|
773
|
+
public void geofenceExists(String identifier, final Callback callback) {
|
|
774
|
+
getAdapter().geofenceExists(identifier, new TSGeofenceExistsCallback() {
|
|
775
|
+
@Override public void onResult(boolean exists) {
|
|
776
|
+
callback.invoke(exists);
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
// TODO Rename #beginBackgroundTask -> #startBackgroundTask
|
|
782
|
+
@ReactMethod
|
|
783
|
+
public void beginBackgroundTask(final Callback success, Callback failure) {
|
|
784
|
+
getAdapter().startBackgroundTask(new TSBackgroundTaskCallback() {
|
|
785
|
+
@Override public void onStart(int taskId) {
|
|
786
|
+
success.invoke(taskId);
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// TODO Rename #finish -> #stopBackgroundTask
|
|
792
|
+
@ReactMethod
|
|
793
|
+
public void finish(int taskId, Callback success, Callback failure) {
|
|
794
|
+
getAdapter().stopBackgroundTask(taskId);
|
|
795
|
+
success.invoke(taskId);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
@ReactMethod
|
|
799
|
+
public void getTransistorToken(String orgname, String username, String url, final Callback success, final Callback failure) {
|
|
800
|
+
|
|
801
|
+
TransistorAuthorizationToken.findOrCreate(getReactApplicationContext(), orgname, username, url, new TransistorAuthorizationToken.Callback() {
|
|
802
|
+
@Override public void onSuccess(TransistorAuthorizationToken token) {
|
|
803
|
+
try {
|
|
804
|
+
success.invoke(jsonToMap(token.toJson()));
|
|
805
|
+
} catch (JSONException e) {
|
|
806
|
+
failure.invoke(e.getMessage());
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
@Override public void onFailure(String error) {
|
|
810
|
+
WritableMap params = new WritableNativeMap();
|
|
811
|
+
params.putString("status", error);
|
|
812
|
+
params.putString("message", error);
|
|
813
|
+
failure.invoke(params);
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
@ReactMethod
|
|
819
|
+
public void destroyTransistorToken(String url, final Callback success, final Callback failure) {
|
|
820
|
+
TransistorAuthorizationToken.destroyTokenForUrl(getReactApplicationContext(), url, new TSCallback() {
|
|
821
|
+
@Override public void onSuccess() {
|
|
822
|
+
success.invoke(true);
|
|
823
|
+
}
|
|
824
|
+
@Override public void onFailure(String error) {
|
|
825
|
+
failure.invoke(error);
|
|
826
|
+
}
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
@ReactMethod
|
|
831
|
+
public void playSound(String soundId) {
|
|
832
|
+
getAdapter().startTone(soundId);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
@ReactMethod
|
|
836
|
+
public void getLog(ReadableMap params, final Callback success, final Callback failure) {
|
|
837
|
+
SQLQuery query = parseSQLQuery(params);
|
|
838
|
+
|
|
839
|
+
TSLog.getLog(query, new TSGetLogCallback() {
|
|
840
|
+
@Override public void onSuccess(String log) {
|
|
841
|
+
success.invoke(log);
|
|
842
|
+
}
|
|
843
|
+
@Override public void onFailure(String error) {
|
|
844
|
+
failure.invoke(error);
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
@ReactMethod
|
|
850
|
+
public void emailLog(String email, ReadableMap params, final Callback success, final Callback failure) {
|
|
851
|
+
SQLQuery query = parseSQLQuery(params);
|
|
852
|
+
|
|
853
|
+
TSLog.emailLog(getCurrentActivity(), email, query, new TSEmailLogCallback() {
|
|
854
|
+
@Override public void onSuccess() {
|
|
855
|
+
success.invoke();
|
|
856
|
+
}
|
|
857
|
+
@Override public void onFailure(String error) {
|
|
858
|
+
failure.invoke(error);
|
|
859
|
+
}
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
@ReactMethod
|
|
864
|
+
public void uploadLog(String url, ReadableMap params, final Callback success, final Callback failure) {
|
|
865
|
+
SQLQuery query = parseSQLQuery(params);
|
|
866
|
+
|
|
867
|
+
TSLog.uploadLog(getReactApplicationContext(), url, query, new TSCallback() {
|
|
868
|
+
@Override public void onSuccess() {
|
|
869
|
+
success.invoke();
|
|
870
|
+
}
|
|
871
|
+
@Override public void onFailure(String error) {
|
|
872
|
+
failure.invoke(error);
|
|
873
|
+
}
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
@ReactMethod
|
|
878
|
+
public void log(String level, String message) throws JSONException {
|
|
879
|
+
TSLog.log(level, message);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
private SQLQuery parseSQLQuery(ReadableMap params) {
|
|
883
|
+
SQLQuery query = SQLQuery.create();
|
|
884
|
+
if (params.hasKey("start")) {
|
|
885
|
+
Double start = params.getDouble("start");
|
|
886
|
+
query.setStart(start.longValue());
|
|
887
|
+
}
|
|
888
|
+
if (params.hasKey("end")) {
|
|
889
|
+
Double end = params.getDouble("end");
|
|
890
|
+
query.setEnd(end.longValue());
|
|
891
|
+
}
|
|
892
|
+
if (params.hasKey("order")) {
|
|
893
|
+
query.setOrder(params.getInt("order"));
|
|
894
|
+
}
|
|
895
|
+
if (params.hasKey("limit")) {
|
|
896
|
+
query.setLimit(params.getInt("limit"));
|
|
897
|
+
}
|
|
898
|
+
return query;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
@ReactMethod
|
|
902
|
+
public void getSensors(Callback success, Callback error) {
|
|
903
|
+
Sensors sensors = Sensors.getInstance(getReactApplicationContext());
|
|
904
|
+
WritableMap params = new WritableNativeMap();
|
|
905
|
+
params.putString("platform", "android");
|
|
906
|
+
params.putBoolean("accelerometer", sensors.hasAccelerometer());
|
|
907
|
+
params.putBoolean("magnetometer", sensors.hasMagnetometer());
|
|
908
|
+
params.putBoolean("gyroscope", sensors.hasGyroscope());
|
|
909
|
+
params.putBoolean("significant_motion", sensors.hasSignificantMotion());
|
|
910
|
+
success.invoke(params);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
@ReactMethod
|
|
914
|
+
public void getDeviceInfo(Callback success, Callback error) {
|
|
915
|
+
DeviceInfo deviceInfo = DeviceInfo.getInstance(getReactApplicationContext());
|
|
916
|
+
|
|
917
|
+
WritableMap params = new WritableNativeMap();
|
|
918
|
+
params.putString("manufacturer", deviceInfo.getManufacturer());
|
|
919
|
+
params.putString("model", deviceInfo.getModel());
|
|
920
|
+
params.putString("version", deviceInfo.getVersion());
|
|
921
|
+
params.putString("platform", deviceInfo.getPlatform());
|
|
922
|
+
params.putString("framework", "react-native");
|
|
923
|
+
success.invoke(params);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
@ReactMethod
|
|
927
|
+
public void isPowerSaveMode(Callback success, Callback error) {
|
|
928
|
+
success.invoke(getAdapter().isPowerSaveMode());
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
@ReactMethod
|
|
932
|
+
public void isIgnoringBatteryOptimizations(Callback success, Callback failure) {
|
|
933
|
+
boolean isIgnoring = getAdapter().isIgnoringBatteryOptimizations();
|
|
934
|
+
success.invoke(isIgnoring);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
@ReactMethod
|
|
938
|
+
public void requestSettings(ReadableMap args, Callback success, Callback failure) throws JSONException {
|
|
939
|
+
String action = args.getString("action");
|
|
940
|
+
DeviceSettingsRequest request = getAdapter().requestSettings(action);
|
|
941
|
+
|
|
942
|
+
if (request != null) {
|
|
943
|
+
success.invoke(jsonToMap(request.toJson()));
|
|
944
|
+
} else {
|
|
945
|
+
failure.invoke("Failed to find " + action + " screen for device " + Build.MANUFACTURER + " " + Build.MODEL + "@" + Build.VERSION.RELEASE);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
@ReactMethod
|
|
950
|
+
public void showSettings(ReadableMap args, Callback success, Callback failure) {
|
|
951
|
+
String action = args.getString("action");
|
|
952
|
+
boolean didShow = getAdapter().showSettings(action);
|
|
953
|
+
if (didShow) {
|
|
954
|
+
success.invoke();
|
|
955
|
+
} else {
|
|
956
|
+
failure.invoke("Failed to find " + action + " screen for device " + Build.MANUFACTURER + " " + Build.MODEL + "@" + Build.VERSION.RELEASE);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
@ReactMethod
|
|
961
|
+
public void getProviderState(Callback success, Callback error) {
|
|
962
|
+
try {
|
|
963
|
+
success.invoke(jsonToMap(getAdapter().getProviderState().toJson()));
|
|
964
|
+
} catch (JSONException e) {
|
|
965
|
+
error.invoke(e.getMessage());
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
@ReactMethod
|
|
970
|
+
public void requestPermission(final Callback success, final Callback error) {
|
|
971
|
+
getAdapter().requestPermission(new TSRequestPermissionCallback() {
|
|
972
|
+
@Override public void onSuccess(int status) {
|
|
973
|
+
success.invoke(status);
|
|
974
|
+
}
|
|
975
|
+
@Override public void onFailure(int status) {
|
|
976
|
+
success.invoke(status);
|
|
977
|
+
}
|
|
978
|
+
});
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
@ReactMethod
|
|
982
|
+
public void requestTemporaryFullAccuracy(String purpose, final Callback success, final Callback failure) {
|
|
983
|
+
getAdapter().requestTemporaryFullAccuracy(purpose, new TSRequestPermissionCallback() {
|
|
984
|
+
@Override public void onSuccess(int accuracyAuthorization) {
|
|
985
|
+
success.invoke(accuracyAuthorization);
|
|
986
|
+
}
|
|
987
|
+
@Override public void onFailure(int accuracyAuthorization) {
|
|
988
|
+
success.invoke(accuracyAuthorization);
|
|
989
|
+
}
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
@ReactMethod
|
|
994
|
+
public void addEventListener(String event) {
|
|
995
|
+
|
|
996
|
+
if (!mEvents.contains(event)) {
|
|
997
|
+
TSLog.logger.warn(TSLog.warn("[RNBackgroundGeolocation addListener] Unknown event: " + event));
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
BackgroundGeolocation adapter = getAdapter();
|
|
1001
|
+
Integer count;
|
|
1002
|
+
|
|
1003
|
+
synchronized(mListeners) {
|
|
1004
|
+
if (mListeners.containsKey(event)) {
|
|
1005
|
+
count = mListeners.get(event);
|
|
1006
|
+
count++;
|
|
1007
|
+
mListeners.put(event, count);
|
|
1008
|
+
} else {
|
|
1009
|
+
count = 1;
|
|
1010
|
+
mListeners.put(event, count);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
if (count == 1) {
|
|
1014
|
+
if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_LOCATION)) {
|
|
1015
|
+
adapter.onLocation(new LocationCallback());
|
|
1016
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_MOTIONCHANGE)) {
|
|
1017
|
+
adapter.onMotionChange(new MotionChangeCallback());
|
|
1018
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_ACTIVITYCHANGE)) {
|
|
1019
|
+
adapter.onActivityChange(new ActivityChangeCallback());
|
|
1020
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_PROVIDERCHANGE)) {
|
|
1021
|
+
adapter.onLocationProviderChange(new LocationProviderChangeCallback());
|
|
1022
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_GEOFENCESCHANGE)) {
|
|
1023
|
+
adapter.onGeofencesChange(new GeofencesChangeCallback());
|
|
1024
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_GEOFENCE)) {
|
|
1025
|
+
adapter.onGeofence(new GeofenceCallback());
|
|
1026
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_HEARTBEAT)) {
|
|
1027
|
+
adapter.onHeartbeat(new HeartbeatCallback());
|
|
1028
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_HTTP)) {
|
|
1029
|
+
adapter.onHttp(new HttpResponseCallback());
|
|
1030
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_SCHEDULE)) {
|
|
1031
|
+
adapter.onSchedule(new ScheduleCallback());
|
|
1032
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_POWERSAVECHANGE)) {
|
|
1033
|
+
adapter.onPowerSaveChange(new PowerSaveChangeCallack());
|
|
1034
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_CONNECTIVITYCHANGE)) {
|
|
1035
|
+
adapter.onConnectivityChange(new ConnectivityChangeCallback());
|
|
1036
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_ENABLEDCHANGE)) {
|
|
1037
|
+
adapter.onEnabledChange(new EnabledChangeCallback());
|
|
1038
|
+
} else if (event.equalsIgnoreCase(BackgroundGeolocation.EVENT_NOTIFICATIONACTION)) {
|
|
1039
|
+
adapter.onNotificationAction(new NotificationActionCallback());
|
|
1040
|
+
} else if (event.equalsIgnoreCase(TSAuthorization.NAME)) {
|
|
1041
|
+
HttpService.getInstance(getReactApplicationContext()).onAuthorization(new AuthorizationCallback());
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
@ReactMethod
|
|
1047
|
+
public void removeListener(String event) {
|
|
1048
|
+
Integer count;
|
|
1049
|
+
|
|
1050
|
+
synchronized (mListeners) {
|
|
1051
|
+
if (mListeners.containsKey(event)) {
|
|
1052
|
+
count = mListeners.get(event);
|
|
1053
|
+
count--;
|
|
1054
|
+
if (count > 0) {
|
|
1055
|
+
mListeners.put(event, count);
|
|
1056
|
+
} else {
|
|
1057
|
+
getAdapter().removeListeners(event);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
@ReactMethod
|
|
1064
|
+
public void removeAllListeners(Callback success, Callback failure) {
|
|
1065
|
+
removeAllListeners();
|
|
1066
|
+
success.invoke();
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
private void removeAllListeners() {
|
|
1070
|
+
synchronized (mListeners) {
|
|
1071
|
+
mListeners.clear();
|
|
1072
|
+
}
|
|
1073
|
+
getAdapter().removeListeners();
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
private void onLocationError(Integer code) {
|
|
1077
|
+
WritableMap params = new WritableNativeMap();
|
|
1078
|
+
params.putInt("error", code);
|
|
1079
|
+
sendEvent(BackgroundGeolocation.EVENT_LOCATION, params);
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
private void handlePlayServicesConnectError(Integer errorCode) {
|
|
1083
|
+
Activity activity = getCurrentActivity();
|
|
1084
|
+
if (activity == null) {
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
1087
|
+
GoogleApiAvailability.getInstance().getErrorDialog(getCurrentActivity(), errorCode, 1001).show();
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
private void sendEvent(String eventName, WritableMap params) {
|
|
1091
|
+
getReactApplicationContext().getJSModule(RCTNativeAppEventEmitter.class).emit(eventName, params);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
private void sendEvent(String eventName, String result) {
|
|
1095
|
+
getReactApplicationContext().getJSModule(RCTNativeAppEventEmitter.class).emit(eventName, result);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
private void sendEvent(String eventName, Boolean result) {
|
|
1099
|
+
getReactApplicationContext().getJSModule(RCTNativeAppEventEmitter.class).emit(eventName, result);
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
public static WritableMap jsonToMap(JSONObject jsonObject) throws JSONException {
|
|
1103
|
+
WritableMap map = new WritableNativeMap();
|
|
1104
|
+
if (jsonObject == null) {
|
|
1105
|
+
return map;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
Iterator<String> iterator = jsonObject.keys();
|
|
1109
|
+
while (iterator.hasNext()) {
|
|
1110
|
+
String key = iterator.next();
|
|
1111
|
+
Object value = jsonObject.get(key);
|
|
1112
|
+
if (value instanceof JSONObject) {
|
|
1113
|
+
map.putMap(key, jsonToMap((JSONObject) value));
|
|
1114
|
+
} else if (value instanceof JSONArray) {
|
|
1115
|
+
map.putArray(key, convertJsonToArray((JSONArray) value));
|
|
1116
|
+
} else if (value instanceof Boolean) {
|
|
1117
|
+
map.putBoolean(key, (Boolean) value);
|
|
1118
|
+
} else if (value instanceof Integer) {
|
|
1119
|
+
map.putInt(key, (Integer) value);
|
|
1120
|
+
} else if (value instanceof Long) {
|
|
1121
|
+
map.putDouble(key, ((Long) value).doubleValue());
|
|
1122
|
+
} else if (value instanceof Double) {
|
|
1123
|
+
map.putDouble(key, (Double) value);
|
|
1124
|
+
} else if (value instanceof Float) {
|
|
1125
|
+
map.putDouble(key, ((Float) value).doubleValue());
|
|
1126
|
+
} else if (value instanceof String) {
|
|
1127
|
+
map.putString(key, (String) value);
|
|
1128
|
+
} else {
|
|
1129
|
+
map.putString(key, value.toString());
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
return map;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
public static WritableArray convertJsonToArray(JSONArray jsonArray) throws JSONException {
|
|
1136
|
+
WritableArray array = new WritableNativeArray();
|
|
1137
|
+
|
|
1138
|
+
for (int i = 0; i < jsonArray.length(); i++) {
|
|
1139
|
+
Object value = jsonArray.get(i);
|
|
1140
|
+
if (value instanceof JSONObject) {
|
|
1141
|
+
array.pushMap(jsonToMap((JSONObject) value));
|
|
1142
|
+
} else if (value instanceof JSONArray) {
|
|
1143
|
+
array.pushArray(convertJsonToArray((JSONArray) value));
|
|
1144
|
+
} else if (value instanceof Boolean) {
|
|
1145
|
+
array.pushBoolean((Boolean) value);
|
|
1146
|
+
} else if (value instanceof Integer) {
|
|
1147
|
+
array.pushInt((Integer) value);
|
|
1148
|
+
} else if (value instanceof Double) {
|
|
1149
|
+
array.pushDouble((Double) value);
|
|
1150
|
+
} else if (value instanceof String) {
|
|
1151
|
+
array.pushString((String) value);
|
|
1152
|
+
} else {
|
|
1153
|
+
array.pushString(value.toString());
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
return array;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
public static JSONObject mapToJson(ReadableMap map) {
|
|
1160
|
+
ReadableMapKeySetIterator iterator = map.keySetIterator();
|
|
1161
|
+
JSONObject json = new JSONObject();
|
|
1162
|
+
|
|
1163
|
+
try {
|
|
1164
|
+
while (iterator.hasNextKey()) {
|
|
1165
|
+
String key = iterator.nextKey();
|
|
1166
|
+
switch (map.getType(key)) {
|
|
1167
|
+
case String:
|
|
1168
|
+
json.put(key, map.getString(key));
|
|
1169
|
+
break;
|
|
1170
|
+
case Boolean:
|
|
1171
|
+
json.put(key, map.getBoolean(key));
|
|
1172
|
+
break;
|
|
1173
|
+
case Number:
|
|
1174
|
+
json.put(key, map.getDouble(key));
|
|
1175
|
+
break;
|
|
1176
|
+
case Map:
|
|
1177
|
+
json.put(key, mapToJson(map.getMap(key)));
|
|
1178
|
+
break;
|
|
1179
|
+
case Array:
|
|
1180
|
+
json.put(key, arrayToJson(map.getArray(key)));
|
|
1181
|
+
break;
|
|
1182
|
+
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
} catch (JSONException e) {
|
|
1186
|
+
e.printStackTrace();
|
|
1187
|
+
}
|
|
1188
|
+
return json;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
public static JSONArray arrayToJson(ReadableArray readableArray) throws JSONException {
|
|
1192
|
+
JSONArray jsonArray = new JSONArray();
|
|
1193
|
+
for(int i=0; i < readableArray.size(); i++) {
|
|
1194
|
+
ReadableType valueType = readableArray.getType(i);
|
|
1195
|
+
switch (valueType){
|
|
1196
|
+
case Null:
|
|
1197
|
+
jsonArray.put(JSONObject.NULL);
|
|
1198
|
+
break;
|
|
1199
|
+
case Boolean:
|
|
1200
|
+
jsonArray.put(readableArray.getBoolean(i));
|
|
1201
|
+
break;
|
|
1202
|
+
case Number:
|
|
1203
|
+
jsonArray.put(readableArray.getDouble(i));
|
|
1204
|
+
break;
|
|
1205
|
+
case String:
|
|
1206
|
+
jsonArray.put(readableArray.getString(i));
|
|
1207
|
+
break;
|
|
1208
|
+
case Map:
|
|
1209
|
+
jsonArray.put(mapToJson(readableArray.getMap(i)));
|
|
1210
|
+
break;
|
|
1211
|
+
case Array:
|
|
1212
|
+
jsonArray.put(arrayToJson(readableArray.getArray(i)));
|
|
1213
|
+
break;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
return jsonArray;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
private void initializeLocationManager() {
|
|
1220
|
+
Activity activity = getCurrentActivity();
|
|
1221
|
+
if (activity == null) {
|
|
1222
|
+
return;
|
|
1223
|
+
}
|
|
1224
|
+
BackgroundGeolocation adapter = getAdapter();
|
|
1225
|
+
adapter.setActivity(activity);
|
|
1226
|
+
// Handle play-services connect errors.
|
|
1227
|
+
adapter.onPlayServicesConnectError((new TSPlayServicesConnectErrorCallback() {
|
|
1228
|
+
@Override
|
|
1229
|
+
public void onPlayServicesConnectError(int errorCode) {
|
|
1230
|
+
handlePlayServicesConnectError(errorCode);
|
|
1231
|
+
}
|
|
1232
|
+
}));
|
|
1233
|
+
mInitialized = true;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
private ReadableMap setHeadlessJobService(ReadableMap config) {
|
|
1237
|
+
WritableMap myConfig = new WritableNativeMap();
|
|
1238
|
+
myConfig.merge(config);
|
|
1239
|
+
myConfig.putString("headlessJobService", getClass().getPackage().getName() + "." + JOB_SERVICE_CLASS);
|
|
1240
|
+
return myConfig;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
private WritableMap getState() {
|
|
1244
|
+
try {
|
|
1245
|
+
return jsonToMap(TSConfig.getInstance(getReactApplicationContext()).toJson());
|
|
1246
|
+
} catch (JSONException e) {
|
|
1247
|
+
e.printStackTrace();
|
|
1248
|
+
return null;
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
private BackgroundGeolocation getAdapter() {
|
|
1253
|
+
return BackgroundGeolocation.getInstance(getReactApplicationContext());
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
@Override
|
|
1257
|
+
public void onCatalystInstanceDestroy() {
|
|
1258
|
+
mInitialized = false;
|
|
1259
|
+
removeAllListeners();
|
|
1260
|
+
}
|
|
1261
|
+
}
|