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.
Files changed (214) hide show
  1. package/.github/stale.yml +41 -0
  2. package/CHANGELOG.md +1131 -0
  3. package/LICENSE +22 -0
  4. package/README.md +292 -0
  5. package/RNBackgroundGeolocation.podspec +27 -0
  6. package/android/.idea/compiler.xml +22 -0
  7. package/android/.idea/copyright/profiles_settings.xml +3 -0
  8. package/android/.idea/encodings.xml +6 -0
  9. package/android/.idea/gradle.xml +12 -0
  10. package/android/.idea/misc.xml +4 -0
  11. package/android/.idea/modules.xml +8 -0
  12. package/android/.idea/runConfigurations.xml +12 -0
  13. package/android/RNBackgroundGeolocation.iml +119 -0
  14. package/android/android.iml +20 -0
  15. package/android/app.gradle +22 -0
  16. package/android/build.gradle +62 -0
  17. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar +0 -0
  18. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.md5 +1 -0
  19. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha1 +1 -0
  20. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha256 +1 -0
  21. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.aar.sha512 +1 -0
  22. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom +9 -0
  23. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.md5 +1 -0
  24. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha1 +1 -0
  25. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha256 +1 -0
  26. package/android/libs/com/transistorsoft/tslocationmanager/3.1.33/tslocationmanager-3.1.33.pom.sha512 +1 -0
  27. package/android/libs/com/transistorsoft/tslocationmanager/maven-metadata.xml +14 -0
  28. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar +0 -0
  29. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.md5 +1 -0
  30. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha1 +1 -0
  31. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha256 +1 -0
  32. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.aar.sha512 +1 -0
  33. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom +9 -0
  34. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.md5 +1 -0
  35. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha1 +1 -0
  36. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha256 +1 -0
  37. package/android/libs/com/transistorsoft/tslocationmanager-reverse/3.1.33/tslocationmanager-reverse-3.1.33.pom.sha512 +1 -0
  38. package/android/libs/com/transistorsoft/tslocationmanager-reverse/maven-metadata.xml +14 -0
  39. package/android/proguard-rules.pro +30 -0
  40. package/android/react-native-background-geolocation-android.iml +229 -0
  41. package/android/src/main/AndroidManifest.xml +6 -0
  42. package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/HeadlessTask.java +171 -0
  43. package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/RNBackgroundGeolocation.java +33 -0
  44. package/android/src/main/java/com/transistorsoft/rnbackgroundgeolocation/RNBackgroundGeolocationModule.java +1261 -0
  45. package/android/src/main/res/values/strings.xml +3 -0
  46. package/ios/RNBackgroundGeolocation/RNBackgroundGeolocation.h +22 -0
  47. package/ios/RNBackgroundGeolocation/RNBackgroundGeolocation.m +754 -0
  48. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/Info.plist +57 -0
  49. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
  50. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
  51. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
  52. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
  53. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/LocationManager.h +55 -0
  54. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/LogQuery.h +13 -0
  55. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
  56. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
  57. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
  58. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
  59. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
  60. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSCallback.h +18 -0
  61. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSConfig.h +304 -0
  62. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
  63. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
  64. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
  65. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
  66. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
  67. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
  68. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
  69. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
  70. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
  71. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
  72. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
  73. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSLocation.h +101 -0
  74. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
  75. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
  76. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
  77. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSReachability.h +106 -0
  78. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
  79. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
  80. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
  81. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
  82. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Info.plist +0 -0
  83. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/Modules/module.modulemap +6 -0
  84. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_armv7/TSLocationManager.framework/TSLocationManager +0 -0
  85. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
  86. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
  87. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
  88. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
  89. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/LocationManager.h +55 -0
  90. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/LogQuery.h +13 -0
  91. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
  92. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
  93. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
  94. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
  95. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
  96. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSCallback.h +18 -0
  97. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSConfig.h +304 -0
  98. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
  99. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
  100. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
  101. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
  102. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
  103. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
  104. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
  105. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
  106. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
  107. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
  108. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
  109. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSLocation.h +101 -0
  110. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
  111. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
  112. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
  113. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSReachability.h +106 -0
  114. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
  115. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
  116. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
  117. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
  118. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Info.plist +0 -0
  119. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/Modules/module.modulemap +6 -0
  120. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/TSLocationManager +0 -0
  121. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeDirectory +0 -0
  122. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeRequirements +0 -0
  123. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeRequirements-1 +0 -0
  124. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeResources +612 -0
  125. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_i386_x86_64-simulator/TSLocationManager.framework/_CodeSignature/CodeSignature +0 -0
  126. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/AtomicBoolean.h +18 -0
  127. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/ConfigModule.h +21 -0
  128. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/HttpRequest.h +21 -0
  129. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/HttpResponse.h +29 -0
  130. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/LocationManager.h +55 -0
  131. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/LogQuery.h +13 -0
  132. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/SOMotionDetector.h +140 -0
  133. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/SQLQuery.h +34 -0
  134. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSActivityChangeEvent.h +16 -0
  135. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSAuthorization.h +37 -0
  136. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSAuthorizationEvent.h +17 -0
  137. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSCallback.h +18 -0
  138. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSConfig.h +304 -0
  139. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSConnectivityChangeEvent.h +17 -0
  140. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSCurrentPositionRequest.h +43 -0
  141. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSDeviceInfo.h +24 -0
  142. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSEnabledChangeEvent.h +15 -0
  143. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofence.h +50 -0
  144. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofenceEvent.h +60 -0
  145. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofenceManager.h +50 -0
  146. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSGeofencesChangeEvent.h +17 -0
  147. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHeartbeatEvent.h +18 -0
  148. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHttpEvent.h +19 -0
  149. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSHttpService.h +58 -0
  150. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSLocation.h +101 -0
  151. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSLocationManager.h +312 -0
  152. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSPowerSaveChangeEvent.h +14 -0
  153. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSProviderChangeEvent.h +20 -0
  154. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSReachability.h +106 -0
  155. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSSchedule.h +40 -0
  156. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSScheduleEvent.h +18 -0
  157. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TSWatchPositionRequest.h +41 -0
  158. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Headers/TransistorAuthorizationToken.h +31 -0
  159. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Modules/module.modulemap +6 -0
  160. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/Resources/Info.plist +50 -0
  161. package/ios/RNBackgroundGeolocation/TSLocationManager.xcframework/ios-arm64_x86_64-maccatalyst/TSLocationManager.framework/TSLocationManager +0 -0
  162. package/ios/RNBackgroundGeolocation.xcodeproj/project.pbxproj +341 -0
  163. package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  164. package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  165. package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcshareddata/RNBackgroundGeolocation.xccheckout +41 -0
  166. package/ios/RNBackgroundGeolocation.xcodeproj/project.xcworkspace/xcuserdata/chris.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  167. package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/Build.xcscheme +80 -0
  168. package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/RNBackgroundGeolocation.xcscheme +113 -0
  169. package/ios/RNBackgroundGeolocation.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  170. package/ios/RNBackgroundGeolocationTests/Info.plist +24 -0
  171. package/package.json +54 -0
  172. package/react-native.config.js +20 -0
  173. package/scripts/cp-declarations +53 -0
  174. package/scripts/declare-module +3 -0
  175. package/scripts/docs-index.html +4 -0
  176. package/scripts/generate-docs +23 -0
  177. package/scripts/postlink.js +146 -0
  178. package/scripts/postunlink.js +128 -0
  179. package/scripts/tsconfig.json +21 -0
  180. package/scripts/xcode-helpers.js +171 -0
  181. package/src/DeviceSettings.js +52 -0
  182. package/src/Events.js +17 -0
  183. package/src/Logger.js +90 -0
  184. package/src/NativeModule.js +528 -0
  185. package/src/TransistorAuthorizationToken.js +73 -0
  186. package/src/declarations/BackgroundGeolocation.d.ts +1601 -0
  187. package/src/declarations/interfaces/Authorization.d.ts +156 -0
  188. package/src/declarations/interfaces/AuthorizationEvent.d.ts +30 -0
  189. package/src/declarations/interfaces/Config.d.ts +2437 -0
  190. package/src/declarations/interfaces/ConnectivityChangeEvent.d.ts +18 -0
  191. package/src/declarations/interfaces/CurrentPositionRequest.d.ts +45 -0
  192. package/src/declarations/interfaces/DeviceInfo.d.ts +33 -0
  193. package/src/declarations/interfaces/DeviceSettings.d.ts +223 -0
  194. package/src/declarations/interfaces/Geofence.d.ts +255 -0
  195. package/src/declarations/interfaces/GeofenceEvent.d.ts +30 -0
  196. package/src/declarations/interfaces/GeofencesChangeEvent.d.ts +22 -0
  197. package/src/declarations/interfaces/HeartbeatEvent.d.ts +20 -0
  198. package/src/declarations/interfaces/HttpEvent.d.ts +313 -0
  199. package/src/declarations/interfaces/Location.d.ts +216 -0
  200. package/src/declarations/interfaces/LocationAuthorizationAlert.d.ts +41 -0
  201. package/src/declarations/interfaces/Logger.d.ts +359 -0
  202. package/src/declarations/interfaces/MotionActivityEvent.d.ts +31 -0
  203. package/src/declarations/interfaces/MotionChangeEvent.d.ts +15 -0
  204. package/src/declarations/interfaces/Notification.d.ts +484 -0
  205. package/src/declarations/interfaces/PermissionRationale.d.ts +31 -0
  206. package/src/declarations/interfaces/ProviderChangeEvent.d.ts +74 -0
  207. package/src/declarations/interfaces/SQLQuery.d.ts +60 -0
  208. package/src/declarations/interfaces/Sensors.d.ts +31 -0
  209. package/src/declarations/interfaces/State.d.ts +51 -0
  210. package/src/declarations/interfaces/TransistorAuthorizationToken.d.ts +63 -0
  211. package/src/declarations/interfaces/WatchPositionRequest.d.ts +45 -0
  212. package/src/declarations/types.d.ts +170 -0
  213. package/src/index.d.ts +1 -0
  214. package/src/index.js +822 -0
@@ -0,0 +1,6 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="com.transistorsoft.rnbackgroundgeolocation">
3
+
4
+ <application android:label="@string/app_name"></application>
5
+
6
+ </manifest>
@@ -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
+ }