react-native-nitro-background-geolocation 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/NitroBackgroundGeolocation.podspec +29 -0
  2. package/android/CMakeLists.txt +24 -0
  3. package/android/build.gradle +133 -0
  4. package/android/src/main/AndroidManifest.xml +65 -0
  5. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/ConfigMapper.kt +332 -0
  7. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/HeadlessTaskRegistry.kt +23 -0
  8. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/HeadlessTaskService.kt +66 -0
  9. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/NitroBackgroundGeolocation.kt +538 -0
  10. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/NitroBackgroundGeolocationPackage.kt +22 -0
  11. package/android/src/main/java/com/margelo/nitro/nitrobackgroundgeolocation/ReactNativeHeadlessTaskRunner.kt +62 -0
  12. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +542 -0
  13. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +59 -0
  14. package/android/src/main/java/com/marianhello/bgloc/Config.java +652 -0
  15. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  16. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +168 -0
  17. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  18. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +19 -0
  19. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  20. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +186 -0
  21. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  22. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  23. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  24. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  25. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +994 -0
  26. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  27. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  28. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  29. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +22 -0
  30. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  31. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +65 -0
  32. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +395 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +76 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +160 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +112 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +506 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +151 -0
  40. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  41. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  42. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  43. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +61 -0
  44. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  45. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  46. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  47. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  48. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +171 -0
  49. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +280 -0
  50. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +586 -0
  51. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  52. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  53. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  54. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +142 -0
  55. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +17 -0
  56. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +760 -0
  57. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  58. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  59. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  60. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +140 -0
  61. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  62. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  63. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  64. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +246 -0
  65. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  66. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +233 -0
  67. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  68. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +203 -0
  69. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  70. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  71. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  72. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  73. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  74. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  75. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  76. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  77. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  78. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  79. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  80. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  81. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  82. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  83. package/android/src/main/res/values/strings.xml +6 -0
  84. package/android/src/main/res/xml/authenticator.xml +7 -0
  85. package/android/src/main/res/xml/syncadapter.xml +9 -0
  86. package/app.plugin.js +64 -0
  87. package/ios/NitroBackgroundGeolocation.swift +719 -0
  88. package/ios/NitroBackgroundGeolocationBootstrap.m +98 -0
  89. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  90. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  91. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  92. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  93. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  94. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  95. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  96. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  97. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  98. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  99. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  100. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  101. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  102. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  103. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  104. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  105. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  106. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  107. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  108. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  109. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  110. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +202 -0
  111. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +62 -0
  112. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +650 -0
  113. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +34 -0
  114. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +184 -0
  115. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  116. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  117. package/ios/common/BackgroundGeolocation/MAURConfig.h +74 -0
  118. package/ios/common/BackgroundGeolocation/MAURConfig.m +485 -0
  119. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +49 -0
  120. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +51 -0
  121. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  122. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +523 -0
  123. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  124. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +97 -0
  125. package/ios/common/BackgroundGeolocation/MAURLocation.h +59 -0
  126. package/ios/common/BackgroundGeolocation/MAURLocation.m +349 -0
  127. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +34 -0
  128. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +35 -0
  129. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  130. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +308 -0
  131. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  132. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  133. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  134. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +40 -0
  135. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +218 -0
  136. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  137. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  138. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +129 -0
  139. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  140. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +278 -0
  141. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  142. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  143. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +38 -0
  144. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +380 -0
  145. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  146. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  147. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  148. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  149. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  150. package/ios/common/BackgroundGeolocation/Reachability.m +474 -0
  151. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.h +80 -0
  152. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOLocationManager.m +147 -0
  153. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.h +30 -0
  154. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionActivity.m +42 -0
  155. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.h +99 -0
  156. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOMotionDetector.m +327 -0
  157. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.h +44 -0
  158. package/ios/common/BackgroundGeolocation/SOMotionDetector/SOStepDetector.m +94 -0
  159. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  160. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  161. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  162. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  163. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  164. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  165. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  166. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  167. package/lib/module/NitroBackgroundGeolocation.nitro.js +172 -0
  168. package/lib/module/NitroBackgroundGeolocation.nitro.js.map +1 -0
  169. package/lib/module/headless.js +72 -0
  170. package/lib/module/headless.js.map +1 -0
  171. package/lib/module/index.js +60 -0
  172. package/lib/module/index.js.map +1 -0
  173. package/lib/module/package.json +1 -0
  174. package/lib/typescript/package.json +1 -0
  175. package/lib/typescript/src/NitroBackgroundGeolocation.nitro.d.ts +616 -0
  176. package/lib/typescript/src/NitroBackgroundGeolocation.nitro.d.ts.map +1 -0
  177. package/lib/typescript/src/headless.d.ts +40 -0
  178. package/lib/typescript/src/headless.d.ts.map +1 -0
  179. package/lib/typescript/src/index.d.ts +8 -0
  180. package/lib/typescript/src/index.d.ts.map +1 -0
  181. package/nitro.json +23 -0
  182. package/nitrogen/generated/android/c++/JActivity.hpp +61 -0
  183. package/nitrogen/generated/android/c++/JAuthorizationStatus.hpp +61 -0
  184. package/nitrogen/generated/android/c++/JBackgroundGeolocationError.hpp +61 -0
  185. package/nitrogen/generated/android/c++/JConfigureOptions.hpp +179 -0
  186. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  187. package/nitrogen/generated/android/c++/JFunc_void_Activity.hpp +78 -0
  188. package/nitrogen/generated/android/c++/JFunc_void_AuthorizationStatus.hpp +77 -0
  189. package/nitrogen/generated/android/c++/JFunc_void_BackgroundGeolocationError.hpp +78 -0
  190. package/nitrogen/generated/android/c++/JFunc_void_Location.hpp +78 -0
  191. package/nitrogen/generated/android/c++/JFunc_void_StationaryLocation.hpp +78 -0
  192. package/nitrogen/generated/android/c++/JHybridNitroBackgroundGeolocationSpec.cpp +530 -0
  193. package/nitrogen/generated/android/c++/JHybridNitroBackgroundGeolocationSpec.hpp +90 -0
  194. package/nitrogen/generated/android/c++/JLocation.hpp +105 -0
  195. package/nitrogen/generated/android/c++/JLocationAccuracy.hpp +64 -0
  196. package/nitrogen/generated/android/c++/JLocationOptions.hpp +65 -0
  197. package/nitrogen/generated/android/c++/JLocationProvider.hpp +61 -0
  198. package/nitrogen/generated/android/c++/JLogEntry.hpp +73 -0
  199. package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +67 -0
  200. package/nitrogen/generated/android/c++/JServiceStatus.hpp +66 -0
  201. package/nitrogen/generated/android/c++/JStationaryLocation.hpp +109 -0
  202. package/nitrogen/generated/android/c++/JVariant_NullType_AnyMap.cpp +26 -0
  203. package/nitrogen/generated/android/c++/JVariant_NullType_AnyMap.hpp +71 -0
  204. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.cpp +26 -0
  205. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.hpp +69 -0
  206. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  207. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  208. package/nitrogen/generated/android/c++/JVariant_NullType_LocationAccuracy.cpp +26 -0
  209. package/nitrogen/generated/android/c++/JVariant_NullType_LocationAccuracy.hpp +71 -0
  210. package/nitrogen/generated/android/c++/JVariant_NullType_LocationProvider.cpp +26 -0
  211. package/nitrogen/generated/android/c++/JVariant_NullType_LocationProvider.hpp +71 -0
  212. package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.cpp +33 -0
  213. package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.hpp +77 -0
  214. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
  215. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
  216. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Activity.kt +56 -0
  217. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/AuthorizationStatus.kt +24 -0
  218. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/BackgroundGeolocationError.kt +56 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/ConfigureOptions.kt +182 -0
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void.kt +80 -0
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_Activity.kt +80 -0
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_AuthorizationStatus.kt +80 -0
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_BackgroundGeolocationError.kt +80 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_Location.kt +80 -0
  225. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Func_void_StationaryLocation.kt +80 -0
  226. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/HybridNitroBackgroundGeolocationSpec.kt +218 -0
  227. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Location.kt +111 -0
  228. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationAccuracy.kt +25 -0
  229. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationOptions.kt +61 -0
  230. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LocationProvider.kt +24 -0
  231. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/LogEntry.kt +71 -0
  232. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/NativeLogLevel.kt +26 -0
  233. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/ServiceStatus.kt +61 -0
  234. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/StationaryLocation.kt +116 -0
  235. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_AnyMap.kt +63 -0
  236. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Boolean.kt +62 -0
  237. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Double.kt +62 -0
  238. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_LocationAccuracy.kt +62 -0
  239. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_LocationProvider.kt +62 -0
  240. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_Map_String__String_.kt +62 -0
  241. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/Variant_NullType_String.kt +62 -0
  242. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrobackgroundgeolocation/nitrobackgroundgeolocationOnLoad.kt +35 -0
  243. package/nitrogen/generated/android/nitrobackgroundgeolocation+autolinking.cmake +88 -0
  244. package/nitrogen/generated/android/nitrobackgroundgeolocation+autolinking.gradle +27 -0
  245. package/nitrogen/generated/android/nitrobackgroundgeolocationOnLoad.cpp +66 -0
  246. package/nitrogen/generated/android/nitrobackgroundgeolocationOnLoad.hpp +34 -0
  247. package/nitrogen/generated/ios/NitroBackgroundGeolocation+autolinking.rb +62 -0
  248. package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Bridge.cpp +129 -0
  249. package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Bridge.hpp +911 -0
  250. package/nitrogen/generated/ios/NitroBackgroundGeolocation-Swift-Cxx-Umbrella.hpp +88 -0
  251. package/nitrogen/generated/ios/NitroBackgroundGeolocationAutolinking.mm +33 -0
  252. package/nitrogen/generated/ios/NitroBackgroundGeolocationAutolinking.swift +26 -0
  253. package/nitrogen/generated/ios/c++/HybridNitroBackgroundGeolocationSpecSwift.cpp +11 -0
  254. package/nitrogen/generated/ios/c++/HybridNitroBackgroundGeolocationSpecSwift.hpp +335 -0
  255. package/nitrogen/generated/ios/swift/Activity.swift +34 -0
  256. package/nitrogen/generated/ios/swift/AuthorizationStatus.swift +44 -0
  257. package/nitrogen/generated/ios/swift/BackgroundGeolocationError.swift +34 -0
  258. package/nitrogen/generated/ios/swift/ConfigureOptions.swift +1037 -0
  259. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  260. package/nitrogen/generated/ios/swift/Func_void_Activity.swift +46 -0
  261. package/nitrogen/generated/ios/swift/Func_void_AuthorizationStatus.swift +46 -0
  262. package/nitrogen/generated/ios/swift/Func_void_BackgroundGeolocationError.swift +46 -0
  263. package/nitrogen/generated/ios/swift/Func_void_ConfigureOptions.swift +46 -0
  264. package/nitrogen/generated/ios/swift/Func_void_Location.swift +46 -0
  265. package/nitrogen/generated/ios/swift/Func_void_ServiceStatus.swift +46 -0
  266. package/nitrogen/generated/ios/swift/Func_void_StationaryLocation.swift +46 -0
  267. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  268. package/nitrogen/generated/ios/swift/Func_void_std__optional_StationaryLocation_.swift +46 -0
  269. package/nitrogen/generated/ios/swift/Func_void_std__vector_Location_.swift +46 -0
  270. package/nitrogen/generated/ios/swift/Func_void_std__vector_LogEntry_.swift +46 -0
  271. package/nitrogen/generated/ios/swift/HybridNitroBackgroundGeolocationSpec.swift +82 -0
  272. package/nitrogen/generated/ios/swift/HybridNitroBackgroundGeolocationSpec_cxx.swift +675 -0
  273. package/nitrogen/generated/ios/swift/Location.swift +89 -0
  274. package/nitrogen/generated/ios/swift/LocationAccuracy.swift +48 -0
  275. package/nitrogen/generated/ios/swift/LocationOptions.swift +78 -0
  276. package/nitrogen/generated/ios/swift/LocationProvider.swift +44 -0
  277. package/nitrogen/generated/ios/swift/LogEntry.swift +49 -0
  278. package/nitrogen/generated/ios/swift/NativeLogLevel.swift +52 -0
  279. package/nitrogen/generated/ios/swift/ServiceStatus.swift +39 -0
  280. package/nitrogen/generated/ios/swift/StationaryLocation.swift +94 -0
  281. package/nitrogen/generated/ios/swift/Variant_NullType_AnyMap.swift +30 -0
  282. package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +30 -0
  283. package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +30 -0
  284. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +30 -0
  285. package/nitrogen/generated/ios/swift/Variant_NullType_LocationAccuracy.swift +30 -0
  286. package/nitrogen/generated/ios/swift/Variant_NullType_LocationProvider.swift +30 -0
  287. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +30 -0
  288. package/nitrogen/generated/shared/c++/Activity.hpp +87 -0
  289. package/nitrogen/generated/shared/c++/AuthorizationStatus.hpp +63 -0
  290. package/nitrogen/generated/shared/c++/BackgroundGeolocationError.hpp +87 -0
  291. package/nitrogen/generated/shared/c++/ConfigureOptions.hpp +197 -0
  292. package/nitrogen/generated/shared/c++/HybridNitroBackgroundGeolocationSpec.cpp +48 -0
  293. package/nitrogen/generated/shared/c++/HybridNitroBackgroundGeolocationSpec.hpp +121 -0
  294. package/nitrogen/generated/shared/c++/Location.hpp +131 -0
  295. package/nitrogen/generated/shared/c++/LocationAccuracy.hpp +69 -0
  296. package/nitrogen/generated/shared/c++/LocationOptions.hpp +91 -0
  297. package/nitrogen/generated/shared/c++/LocationProvider.hpp +63 -0
  298. package/nitrogen/generated/shared/c++/LogEntry.hpp +99 -0
  299. package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +65 -0
  300. package/nitrogen/generated/shared/c++/ServiceStatus.hpp +92 -0
  301. package/nitrogen/generated/shared/c++/StationaryLocation.hpp +135 -0
  302. package/package.json +112 -0
  303. package/react-native.config.js +10 -0
  304. package/src/NitroBackgroundGeolocation.nitro.ts +656 -0
  305. package/src/headless.ts +91 -0
  306. package/src/index.tsx +100 -0
@@ -0,0 +1,246 @@
1
+ package com.marianhello.bgloc.sync;
2
+
3
+ import android.content.ContentProviderOperation;
4
+ import android.content.ContentResolver;
5
+ import android.content.ContentValues;
6
+ import android.content.Context;
7
+ import android.database.Cursor;
8
+ import android.database.sqlite.SQLiteDatabase;
9
+ import android.net.Uri;
10
+ import android.text.TextUtils;
11
+ import android.util.JsonWriter;
12
+
13
+ import com.marianhello.bgloc.ResourceResolver;
14
+ import com.marianhello.bgloc.data.AbstractLocationTemplate;
15
+ import com.marianhello.bgloc.data.ArrayListLocationTemplate;
16
+ import com.marianhello.bgloc.data.BackgroundLocation;
17
+ import com.marianhello.bgloc.data.HashMapLocationTemplate;
18
+ import com.marianhello.bgloc.data.LocationTemplate;
19
+ import com.marianhello.bgloc.data.LocationTemplateFactory;
20
+ import com.marianhello.bgloc.data.provider.LocationContentProvider;
21
+ import com.marianhello.bgloc.data.sqlite.SQLiteLocationContract;
22
+ import com.marianhello.bgloc.data.sqlite.SQLiteLocationContract.LocationEntry;
23
+ import com.marianhello.bgloc.data.sqlite.SQLiteOpenHelper;
24
+ import com.marianhello.logging.LoggerManager;
25
+
26
+ import org.json.JSONException;
27
+ import org.json.JSONObject;
28
+
29
+ import java.io.File;
30
+ import java.io.FileOutputStream;
31
+ import java.io.IOException;
32
+ import java.io.OutputStreamWriter;
33
+ import java.io.UnsupportedEncodingException;
34
+ import java.util.ArrayList;
35
+ import java.util.Iterator;
36
+ import java.util.List;
37
+ import java.util.Map;
38
+
39
+ /**
40
+ * Created by finch on 20/07/16.
41
+ */
42
+ public class BatchManager {
43
+ private Context context;
44
+ private org.slf4j.Logger logger;
45
+
46
+ public BatchManager(Context context) {
47
+ logger = LoggerManager.getLogger(BatchManager.class);
48
+ this.context = context;
49
+ }
50
+
51
+ private Uri getLocationContentUri() {
52
+ ResourceResolver resourceResolver = ResourceResolver.newInstance(context);
53
+ String authority = resourceResolver.getAuthority();
54
+ return LocationContentProvider.getContentUri(authority);
55
+ }
56
+
57
+ private File createBatchFromTemplate(Long batchStartMillis, Integer syncThreshold, LocationTemplate template) throws IOException {
58
+ logger.info("Creating batch {}", batchStartMillis);
59
+
60
+ ContentResolver resolver = context.getContentResolver();
61
+ Uri contentUri = getLocationContentUri();
62
+
63
+ String whereClause = TextUtils.join("", new String[]{
64
+ LocationEntry.COLUMN_NAME_STATUS + " = ? AND ( ",
65
+ LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " IS NULL OR ",
66
+ LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " < ? )",
67
+ });
68
+ String[] whereArgs = {
69
+ String.valueOf(BackgroundLocation.SYNC_PENDING),
70
+ String.valueOf(batchStartMillis)
71
+ };
72
+
73
+ Cursor cursor = null;
74
+ LocationWriter writer = null;
75
+
76
+ try {
77
+ cursor = resolver.query(
78
+ contentUri,
79
+ null,
80
+ whereClause,
81
+ whereArgs,
82
+ LocationEntry.COLUMN_NAME_TIME + " ASC"
83
+
84
+ );
85
+
86
+ if (cursor.getCount() < syncThreshold) {
87
+ return null;
88
+ }
89
+
90
+ File file = File.createTempFile("locations", ".json");
91
+ FileOutputStream fs = new FileOutputStream(file);
92
+ writer = new LocationWriter(fs, template);
93
+
94
+ writer.beginArray();
95
+ while (cursor.moveToNext()) {
96
+ BackgroundLocation location = BackgroundLocation.fromCursor(cursor);
97
+ writer.write(location);
98
+ }
99
+
100
+ writer.endArray();
101
+ writer.close();
102
+ fs.close();
103
+
104
+ // set batchStartMillis for all synced locations
105
+ ContentValues values = new ContentValues();
106
+ values.put(LocationEntry.COLUMN_NAME_BATCH_START_MILLIS, batchStartMillis);
107
+ resolver.update(contentUri, values, whereClause, whereArgs);
108
+
109
+ logger.info("Batch file: {} created successfully", file.getName());
110
+
111
+ return file;
112
+ } finally {
113
+ if (cursor != null) {
114
+ cursor.close();
115
+ }
116
+ if (writer != null) {
117
+ writer.close();
118
+ }
119
+ }
120
+ }
121
+
122
+ public File createBatch(Long batchStartMillis, Integer syncThreshold, LocationTemplate template) throws IOException {
123
+ LocationTemplate tpl;
124
+ if (template != null) {
125
+ tpl = template;
126
+ } else {
127
+ tpl = LocationTemplateFactory.getDefault();
128
+ }
129
+ return createBatchFromTemplate(batchStartMillis, syncThreshold, tpl);
130
+ }
131
+
132
+ public File createBatch(Long batchStartMillis, Integer syncThreshold) throws IOException {
133
+ return createBatch(batchStartMillis, syncThreshold, null);
134
+ }
135
+
136
+
137
+ public void setBatchCompleted(Long batchId) {
138
+ ContentResolver resolver = context.getApplicationContext().getContentResolver();
139
+ Uri contentUri = getLocationContentUri();
140
+
141
+ String whereClause = LocationEntry.COLUMN_NAME_BATCH_START_MILLIS + " = ?";
142
+ String[] whereArgs = { String.valueOf(batchId) };
143
+
144
+ ContentValues values = new ContentValues();
145
+ values.put(LocationEntry.COLUMN_NAME_STATUS, BackgroundLocation.DELETED);
146
+ resolver.update(contentUri, values, whereClause, whereArgs);
147
+ }
148
+
149
+ private static class LocationTemplateWriter {
150
+ private BackgroundLocation location;
151
+ private JsonWriter writer;
152
+
153
+ public LocationTemplateWriter(JsonWriter writer, BackgroundLocation location) {
154
+ this.writer = writer;
155
+ this.location = location;
156
+ }
157
+
158
+ private void writeValue(Object value) throws IOException {
159
+ if (value instanceof String ) {
160
+ writer.value((String) value);
161
+ } else if (value instanceof Map) {
162
+ writeMap((Map) value);
163
+ } else if (value instanceof List) {
164
+ writeList((List) value);
165
+ } else if (Integer.class.isInstance(value)) {
166
+ writer.value((Integer) value);
167
+ } else if (Double.class.isInstance(value)) {
168
+ writer.value((Double) value);
169
+ } else if (Float.class.isInstance(value)) {
170
+ writer.value((Float) value);
171
+ } else if (Long.class.isInstance(value)) {
172
+ writer.value((Long) value);
173
+ } else if (Boolean.class.isInstance(value)) {
174
+ writer.value((Boolean) value);
175
+ } else if (value == JSONObject.NULL) {
176
+ writer.nullValue();
177
+ } else {
178
+ writer.value(String.valueOf(value));
179
+ }
180
+ }
181
+
182
+ public void writeMap(Map values) throws IOException {
183
+ writer.beginObject();
184
+ Iterator<?> it = values.entrySet().iterator();
185
+ while (it.hasNext()) {
186
+ Map.Entry<String, Object> pair = (Map.Entry) it.next();
187
+ String key = pair.getKey();
188
+ Object value = pair.getValue();
189
+ Object locationValue = null;
190
+ if (value instanceof String) {
191
+ locationValue = location.getValueForKey((String)value);
192
+ }
193
+ writer.name(key);
194
+ writeValue(locationValue != null ? locationValue : value);
195
+ }
196
+ writer.endObject();
197
+ }
198
+
199
+ public void writeList(List values) throws IOException {
200
+ writer.beginArray();
201
+ Iterator<?> it = values.iterator();
202
+ while (it.hasNext()) {
203
+ Object value = it.next();
204
+ Object locationValue = null;
205
+ if (value instanceof String) {
206
+ locationValue = location.getValueForKey((String) value);
207
+ }
208
+ writeValue(locationValue != null ? locationValue : value);
209
+ }
210
+ writer.endArray();
211
+ }
212
+ }
213
+
214
+ private static class LocationWriter {
215
+ private JsonWriter writer = null;
216
+ private LocationTemplate template;
217
+
218
+ public LocationWriter(FileOutputStream fos, LocationTemplate template) throws IOException {
219
+ writer = new JsonWriter(new OutputStreamWriter(fos, "UTF-8"));
220
+ this.template = template;
221
+ }
222
+
223
+ public void beginArray() throws IOException {
224
+ writer.beginArray();
225
+ }
226
+
227
+ public void endArray() throws IOException {
228
+ writer.endArray();
229
+ }
230
+
231
+ public void close() throws IOException {
232
+ writer.close();
233
+ }
234
+
235
+ public void write(BackgroundLocation location) throws IOException {
236
+ LocationTemplateWriter writer = new LocationTemplateWriter(this.writer, location);
237
+ if (template instanceof HashMapLocationTemplate) {
238
+ HashMapLocationTemplate hashTemplate = (HashMapLocationTemplate) template;
239
+ writer.writeMap(hashTemplate.toMap());
240
+ } else if (template instanceof ArrayListLocationTemplate) {
241
+ ArrayListLocationTemplate listTemplate = (ArrayListLocationTemplate) template;
242
+ writer.writeList(listTemplate.toList());
243
+ }
244
+ }
245
+ }
246
+ }
@@ -0,0 +1,148 @@
1
+ package com.marianhello.bgloc.sync;
2
+
3
+ import android.app.Notification;
4
+ import android.app.NotificationChannel;
5
+ import android.app.NotificationManager;
6
+ import android.app.PendingIntent;
7
+ import android.content.Context;
8
+ import android.content.Intent;
9
+ import android.graphics.BitmapFactory;
10
+ import android.graphics.Color;
11
+ import android.os.Build;
12
+ import androidx.annotation.RequiresApi;
13
+ import androidx.core.app.NotificationCompat;
14
+
15
+ import com.marianhello.bgloc.ResourceResolver;
16
+ import com.marianhello.logging.LoggerManager;
17
+
18
+ public class NotificationHelper {
19
+ public static final String SERVICE_CHANNEL_ID = "bglocservice";
20
+ // https://github.com/nishkarsh/android-permissions/blob/master/src/main/java/com/intentfilter/androidpermissions/services/NotificationService.java#L15
21
+ public static final String ANDROID_PERMISSIONS_CHANNEL_ID = "android-permissions";
22
+
23
+ public static final String SYNC_CHANNEL_ID = "syncservice";
24
+ public static final String SYNC_CHANNEL_NAME = "Sync Service";
25
+ public static final String SYNC_CHANNEL_DESCRIPTION = "Shows sync progress";
26
+
27
+ public static class NotificationFactory {
28
+ private Context mContext;
29
+ private ResourceResolver mResolver;
30
+
31
+ private org.slf4j.Logger logger;
32
+
33
+ public NotificationFactory(Context context) {
34
+ mContext = context;
35
+ mResolver = ResourceResolver.newInstance(context);
36
+ logger = LoggerManager.getLogger(NotificationFactory.class);
37
+ }
38
+
39
+ private Integer parseNotificationIconColor(String color) {
40
+ int iconColor = 0;
41
+ if (color != null) {
42
+ try {
43
+ iconColor = Color.parseColor(color);
44
+ } catch (IllegalArgumentException e) {
45
+ logger.error("Couldn't parse color from android options");
46
+ }
47
+ }
48
+ return iconColor;
49
+ }
50
+
51
+ public Notification getNotification(String title, String text, String largeIcon, String smallIcon, String color) {
52
+ Context appContext = mContext.getApplicationContext();
53
+
54
+ // Build a Notification required for running service in foreground.
55
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, NotificationHelper.SERVICE_CHANNEL_ID);
56
+
57
+ builder.setContentTitle(title);
58
+ builder.setContentText(text);
59
+ builder.setOngoing(true);
60
+ if (smallIcon != null && !smallIcon.isEmpty()) {
61
+ builder.setSmallIcon(mResolver.getDrawable(smallIcon));
62
+ } else {
63
+ builder.setSmallIcon(android.R.drawable.ic_menu_mylocation);
64
+ }
65
+ if (largeIcon != null && !largeIcon.isEmpty()) {
66
+ int largeIconId = mResolver.getDrawable(largeIcon);
67
+ if (largeIconId == 0) {
68
+ logger.warn("The resource " + largeIcon + " was not found in the drawable folder. Please include it when building the app.");
69
+ }
70
+ builder.setLargeIcon(BitmapFactory.decodeResource(appContext.getResources(), largeIconId));
71
+ }
72
+ if (color != null && !color.isEmpty()) {
73
+ builder.setColor(this.parseNotificationIconColor(color));
74
+ }
75
+
76
+ // Add an onclick handler to the notification
77
+ String packageName = appContext.getPackageName();
78
+ Intent launchIntent = appContext.getPackageManager().getLaunchIntentForPackage(packageName);
79
+ if (launchIntent != null) {
80
+ // NOTICE: testing apps might not have registered launch intent
81
+ launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
82
+ int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
83
+ ? PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE
84
+ : PendingIntent.FLAG_CANCEL_CURRENT;
85
+ PendingIntent contentIntent = PendingIntent.getActivity(appContext, 0, launchIntent, flags);
86
+ builder.setContentIntent(contentIntent);
87
+ }
88
+
89
+ Notification notification = builder.build();
90
+ notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_NO_CLEAR;
91
+
92
+ return notification;
93
+ }
94
+ }
95
+
96
+ public static void registerAllChannels(Context context) {
97
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
98
+ String appName = ResourceResolver.newInstance(context).getString(("app_name"));
99
+ // Create the NotificationChannel, but only on API 26+ because
100
+ // the NotificationChannel class is new and not in the support library
101
+ android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
102
+ notificationManager.createNotificationChannel(createServiceChannel(appName));
103
+ notificationManager.createNotificationChannel(createSyncChannel());
104
+ notificationManager.createNotificationChannel(createAndroidPermissionsChannel(appName));
105
+ }
106
+ }
107
+
108
+ public static void registerServiceChannel(Context context) {
109
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
110
+ String appName = ResourceResolver.newInstance(context).getString(("app_name"));
111
+ // Create the NotificationChannel, but only on API 26+ because
112
+ // the NotificationChannel class is new and not in the support library
113
+ android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
114
+ notificationManager.createNotificationChannel(createServiceChannel(appName));
115
+ }
116
+ }
117
+
118
+ public static void registerSyncChannel(Context context) {
119
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
120
+ // Create the NotificationChannel, but only on API 26+ because
121
+ // the NotificationChannel class is new and not in the support library
122
+ android.app.NotificationManager notificationManager = (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
123
+ notificationManager.createNotificationChannel(createSyncChannel());
124
+ }
125
+ }
126
+
127
+ @RequiresApi(api = Build.VERSION_CODES.O)
128
+ public static NotificationChannel createServiceChannel(CharSequence name) {
129
+ NotificationChannel channel = new NotificationChannel(SERVICE_CHANNEL_ID, name, android.app.NotificationManager.IMPORTANCE_LOW);
130
+ channel.enableVibration(false);
131
+ return channel;
132
+ }
133
+
134
+ @RequiresApi(api = Build.VERSION_CODES.O)
135
+ public static NotificationChannel createSyncChannel(){
136
+ NotificationChannel channel = new NotificationChannel(SYNC_CHANNEL_ID, SYNC_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
137
+ channel.setDescription(SYNC_CHANNEL_DESCRIPTION);
138
+ channel.enableVibration(false);
139
+ return channel;
140
+ }
141
+
142
+ @RequiresApi(api = Build.VERSION_CODES.O)
143
+ public static NotificationChannel createAndroidPermissionsChannel(CharSequence name ){
144
+ NotificationChannel channel = new NotificationChannel(ANDROID_PERMISSIONS_CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);
145
+ channel.enableVibration(false);
146
+ return channel;
147
+ }
148
+ }
@@ -0,0 +1,233 @@
1
+ package com.marianhello.bgloc.sync;
2
+
3
+ import android.accounts.Account;
4
+ import android.app.NotificationManager;
5
+ import android.content.AbstractThreadedSyncAdapter;
6
+ import android.content.ContentProviderClient;
7
+ import android.content.ContentResolver;
8
+ import android.content.Context;
9
+ import android.content.Intent;
10
+ import android.content.SyncResult;
11
+ import android.os.Bundle;
12
+ import android.os.Handler;
13
+ import android.os.Looper;
14
+ import androidx.core.app.NotificationCompat;
15
+ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
16
+
17
+ import com.marianhello.bgloc.Config;
18
+ import com.marianhello.bgloc.HttpPostService;
19
+ import com.marianhello.bgloc.data.ConfigurationDAO;
20
+ import com.marianhello.bgloc.data.DAOFactory;
21
+ import com.marianhello.bgloc.service.LocationServiceImpl;
22
+ import com.marianhello.logging.LoggerManager;
23
+
24
+ import org.json.JSONException;
25
+
26
+ import java.io.File;
27
+ import java.io.IOException;
28
+ import java.util.HashMap;
29
+
30
+ /**
31
+ * Handle the transfer of data between a server and an
32
+ * app, using the Android sync adapter framework.
33
+ */
34
+ public class SyncAdapter extends AbstractThreadedSyncAdapter implements HttpPostService.UploadingProgressListener {
35
+
36
+ private static final int NOTIFICATION_ID = 666;
37
+
38
+ ContentResolver contentResolver;
39
+ private ConfigurationDAO configDAO;
40
+ private NotificationManager notificationManager;
41
+ private BatchManager batchManager;
42
+ private boolean notificationsEnabled = true;
43
+
44
+ private org.slf4j.Logger logger;
45
+
46
+ /**
47
+ * Set up the sync adapter
48
+ */
49
+ public SyncAdapter(Context context, boolean autoInitialize) {
50
+ this(context, autoInitialize, false);
51
+ }
52
+
53
+
54
+ /**
55
+ * Set up the sync adapter. This form of the
56
+ * constructor maintains compatibility with Android 3.0
57
+ * and later platform versions
58
+ */
59
+ public SyncAdapter(
60
+ Context context,
61
+ boolean autoInitialize,
62
+ boolean allowParallelSyncs) {
63
+
64
+ super(context, autoInitialize);
65
+ logger = LoggerManager.getLogger(SyncAdapter.class);
66
+
67
+ /*
68
+ * If your app uses a content resolver, get an instance of it
69
+ * from the incoming Context
70
+ */
71
+ contentResolver = context.getContentResolver();
72
+ configDAO = DAOFactory.createConfigurationDAO(context);
73
+ batchManager = new BatchManager(this.getContext());
74
+ notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
75
+
76
+ NotificationHelper.registerSyncChannel(context);
77
+ }
78
+
79
+ /*
80
+ * Specify the code you want to run in the sync adapter. The entire
81
+ * sync adapter runs in a background thread, so you don't have to set
82
+ * up your own background processing.
83
+ */
84
+ @Override
85
+ public void onPerformSync(
86
+ Account account,
87
+ Bundle extras,
88
+ String authority,
89
+ ContentProviderClient provider,
90
+ SyncResult syncResult) {
91
+
92
+ Config config = null;
93
+ try {
94
+ config = configDAO.retrieveConfiguration();
95
+ } catch (JSONException e) {
96
+ logger.error("Error retrieving config: {}", e.getMessage());
97
+ }
98
+
99
+ if (config == null || !config.hasValidSyncUrl()) {
100
+ return;
101
+ }
102
+
103
+ //noinspection ConstantConditions
104
+ notificationsEnabled = !config.hasNotificationsEnabled() || config.getNotificationsEnabled();
105
+
106
+ Long batchStartMillis = System.currentTimeMillis();
107
+ boolean isForced = extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL);
108
+ int syncThreshold = isForced ? 0 : config.getSyncThreshold();
109
+ logger.debug("Sync request isForced: {}, batchId: {}, config: {}", isForced, batchStartMillis, config.toString());
110
+
111
+ File file = null;
112
+ try {
113
+ file = batchManager.createBatch(batchStartMillis, syncThreshold, config.getTemplate());
114
+ } catch (IOException e) {
115
+ logger.error("Failed to create batch: {}", e.getMessage());
116
+ }
117
+
118
+ if (file == null) {
119
+ logger.info("Nothing to sync");
120
+ return;
121
+ }
122
+
123
+ logger.info("Syncing startAt: {}", batchStartMillis);
124
+ String url = config.getSyncUrl();
125
+ HashMap<String, String> httpHeaders = new HashMap<String, String>();
126
+ httpHeaders.putAll(config.getHttpHeaders());
127
+ httpHeaders.put("x-batch-id", String.valueOf(batchStartMillis));
128
+
129
+ if (uploadLocations(file, url, httpHeaders)) {
130
+ logger.info("Batch sync successful");
131
+ batchManager.setBatchCompleted(batchStartMillis);
132
+ if (file.delete()) {
133
+ logger.info("Batch file has been deleted: {}", file.getAbsolutePath());
134
+ } else {
135
+ logger.warn("Batch file has not been deleted: {}", file.getAbsolutePath());
136
+ }
137
+ } else {
138
+ logger.warn("Batch sync failed due server error");
139
+ syncResult.stats.numIoExceptions++;
140
+ }
141
+ }
142
+
143
+ private boolean uploadLocations(File file, String url, HashMap httpHeaders) {
144
+ NotificationCompat.Builder builder = null;
145
+
146
+ if (notificationsEnabled) {
147
+ builder = new NotificationCompat.Builder(getContext(), NotificationHelper.SYNC_CHANNEL_ID);
148
+ builder.setOngoing(true);
149
+ builder.setContentTitle("Syncing locations");
150
+ builder.setContentText("Sync in progress");
151
+ builder.setSmallIcon(android.R.drawable.ic_dialog_info);
152
+ notificationManager.notify(NOTIFICATION_ID, builder.build());
153
+ }
154
+
155
+ try {
156
+ int responseCode = HttpPostService.postJSONFile(url, file, httpHeaders, this);
157
+
158
+ // All 2xx statuses are okay
159
+ boolean isStatusOkay = responseCode >= 200 && responseCode < 300;
160
+
161
+ if (responseCode == 285) {
162
+ // Okay, but we don't need to continue sending these
163
+
164
+ logger.debug("Location was sent to the server, and received an \"HTTP 285 Updates Not Required\"");
165
+
166
+ Bundle bundle = new Bundle();
167
+ bundle.putInt("action", LocationServiceImpl.MSG_ON_ABORT_REQUESTED);
168
+ broadcastMessage(bundle);
169
+ }
170
+
171
+ if (responseCode == 401) {
172
+ Bundle bundle = new Bundle();
173
+ bundle.putInt("action", LocationServiceImpl.MSG_ON_HTTP_AUTHORIZATION);
174
+ broadcastMessage(bundle);
175
+ }
176
+
177
+ if (builder != null) {
178
+ if (isStatusOkay) {
179
+ builder.setContentText("Sync completed");
180
+ } else {
181
+ builder.setContentText("Sync failed due server error");
182
+ }
183
+ }
184
+
185
+ return isStatusOkay;
186
+ } catch (IOException e) {
187
+ logger.warn("Error uploading locations: {}", e.getMessage());
188
+
189
+ if (builder != null)
190
+ builder.setContentText("Sync failed: " + e.getMessage());
191
+ } finally {
192
+ logger.info("Syncing endAt: {}", System.currentTimeMillis());
193
+
194
+ if (builder != null) {
195
+ builder.setOngoing(false);
196
+ builder.setProgress(0, 0, false);
197
+ builder.setAutoCancel(true);
198
+ notificationManager.notify(NOTIFICATION_ID, builder.build());
199
+
200
+ Handler h = new Handler(Looper.getMainLooper());
201
+ long delayInMilliseconds = 5000;
202
+ h.postDelayed(new Runnable() {
203
+ public void run() {
204
+ logger.info("Notification cancelledAt: {}", System.currentTimeMillis());
205
+ notificationManager.cancel(NOTIFICATION_ID);
206
+ }
207
+ }, delayInMilliseconds);
208
+ }
209
+ }
210
+
211
+ return false;
212
+ }
213
+
214
+ public void onProgress(int progress) {
215
+ logger.debug("Syncing progress: {} updatedAt: {}", progress, System.currentTimeMillis());
216
+
217
+ if (notificationsEnabled) {
218
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), NotificationHelper.SYNC_CHANNEL_ID);
219
+ builder.setOngoing(true);
220
+ builder.setContentTitle("Syncing locations");
221
+ builder.setContentText("Sync in progress");
222
+ builder.setSmallIcon(android.R.drawable.ic_dialog_info);
223
+ builder.setProgress(100, progress, false);
224
+ notificationManager.notify(NOTIFICATION_ID, builder.build());
225
+ }
226
+ }
227
+
228
+ private void broadcastMessage(Bundle bundle) {
229
+ Intent intent = new Intent(LocationServiceImpl.ACTION_BROADCAST);
230
+ intent.putExtras(bundle);
231
+ LocalBroadcastManager.getInstance(getContext().getApplicationContext()).sendBroadcast(intent);
232
+ }
233
+ }
@@ -0,0 +1,68 @@
1
+ package com.marianhello.bgloc.sync;
2
+
3
+ import android.accounts.Account;
4
+ import android.app.Service;
5
+ import android.content.ContentResolver;
6
+ import android.content.Intent;
7
+ import android.os.Bundle;
8
+ import android.os.IBinder;
9
+
10
+ /**
11
+ * Define a Service that returns an IBinder for the
12
+ * sync adapter class, allowing the sync adapter framework to call
13
+ * onPerformSync().
14
+ */
15
+ public class SyncService extends Service {
16
+ // Storage for an instance of the sync adapter
17
+ private static SyncAdapter sSyncAdapter = null;
18
+ // Object to use as a thread-safe lock
19
+ private static final Object sSyncAdapterLock = new Object();
20
+
21
+ /**
22
+ * Instantiate the sync adapter object.
23
+ */
24
+ @Override
25
+ public void onCreate() {
26
+ /*
27
+ * Create the sync adapter as a singleton.
28
+ * Set the sync adapter as syncable
29
+ * Disallow parallel syncs
30
+ */
31
+ synchronized (sSyncAdapterLock) {
32
+ if (sSyncAdapter == null) {
33
+ sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
34
+ }
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Return an object that allows the system to invoke
40
+ * the sync adapter.
41
+ *
42
+ */
43
+ @Override
44
+ public IBinder onBind(Intent intent) {
45
+ /*
46
+ * Get the object that allows external processes
47
+ * to call onPerformSync(). The object is created
48
+ * in the base class code when the SyncAdapter
49
+ * constructors call super()
50
+ */
51
+ return sSyncAdapter.getSyncAdapterBinder();
52
+ }
53
+
54
+ public static void sync(Account account, String authority, boolean manual) {
55
+ // Pass the settings flags by inserting them in a bundle
56
+ Bundle settingsBundle = new Bundle();
57
+ settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, manual);
58
+ settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, manual);
59
+ settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
60
+ settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
61
+
62
+ /*
63
+ * Request the sync for the default account, authority, and
64
+ * manual sync settings
65
+ */
66
+ ContentResolver.requestSync(account, authority, settingsBundle);
67
+ }
68
+ }