@josuelmm/capacitor-background-geolocation 1.0.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 (207) hide show
  1. package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE.md +32 -0
  4. package/Package.swift +45 -0
  5. package/README.md +402 -0
  6. package/android/build.gradle +79 -0
  7. package/android/proguard-rules.pro +1 -0
  8. package/android/src/main/AndroidManifest.xml +83 -0
  9. package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
  20. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
  21. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
  22. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
  23. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
  24. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
  25. package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
  26. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  27. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
  28. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  29. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
  30. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  31. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
  32. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  40. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  41. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
  42. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  43. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
  44. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  45. package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
  46. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
  47. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  48. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
  49. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
  50. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
  51. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
  52. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
  53. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
  54. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
  55. package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
  56. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  57. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  58. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  59. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  60. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  61. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  62. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  63. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  64. package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
  65. package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
  66. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
  67. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
  68. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
  69. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  70. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  71. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  72. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
  73. package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
  74. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  75. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
  76. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  77. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  78. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  79. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
  80. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  81. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  82. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  83. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
  84. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  85. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
  86. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  87. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
  88. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  89. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  90. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  91. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  92. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  93. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  94. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  95. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  96. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  97. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  98. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  99. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  100. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  101. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  102. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  103. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  104. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  105. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  107. package/android/src/main/res/values/strings.xml +15 -0
  108. package/android/src/main/res/xml/authenticator.xml +7 -0
  109. package/android/src/main/res/xml/syncadapter.xml +9 -0
  110. package/dist/esm/definitions.d.ts +1052 -0
  111. package/dist/esm/definitions.js +142 -0
  112. package/dist/esm/definitions.js.map +1 -0
  113. package/dist/esm/index.d.ts +8 -0
  114. package/dist/esm/index.js +23 -0
  115. package/dist/esm/index.js.map +1 -0
  116. package/dist/esm/web.d.ts +92 -0
  117. package/dist/esm/web.js +242 -0
  118. package/dist/esm/web.js.map +1 -0
  119. package/dist/plugin.cjs.js +415 -0
  120. package/dist/plugin.cjs.js.map +1 -0
  121. package/dist/plugin.js +418 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
  124. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
  125. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
  126. package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
  127. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  128. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  129. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  130. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  131. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  132. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  133. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  134. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  135. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  136. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  137. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  138. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  139. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  140. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  141. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  143. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  144. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  145. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  146. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  147. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  148. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
  149. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
  150. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
  151. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
  152. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
  153. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  154. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  155. package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
  156. package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
  157. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
  158. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
  159. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  160. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
  161. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  162. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
  163. package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
  164. package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
  165. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
  166. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
  167. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  168. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
  169. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  170. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  171. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  172. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
  173. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
  174. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  175. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  176. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
  177. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  178. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
  179. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  180. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  181. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
  182. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
  183. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  184. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  185. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
  186. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
  187. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
  188. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
  189. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
  190. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
  191. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  192. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  193. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
  194. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
  195. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  197. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  198. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  199. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  200. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  201. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  202. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  203. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  204. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  205. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  206. package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
  207. package/package.json +82 -0
@@ -0,0 +1,83 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!--
3
+ SPDX-License-Identifier: Apache-2.0
4
+ Copyright (c) 2026 JosueLMM
5
+
6
+ Mirrors the Cordova `android/common/src/main/AndroidManifest.xml` from the
7
+ upstream plugin (`com.marianhello.bgloc`) so the copied native core works
8
+ unchanged. ACCESS_BACKGROUND_LOCATION is intentionally NOT declared here;
9
+ consumer apps that want the "Allow all the time" tier must opt in by
10
+ declaring it in their own AndroidManifest.
11
+ -->
12
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
13
+ xmlns:tools="http://schemas.android.com/tools">
14
+
15
+ <uses-feature android:name="android.hardware.location" android:required="false" />
16
+
17
+ <uses-permission android:name="android.permission.INTERNET" />
18
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
19
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
20
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
21
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
22
+ <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
23
+ <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
24
+ <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
25
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
26
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
27
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
28
+ <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
29
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
30
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
31
+ <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
32
+
33
+ <application>
34
+ <!-- Foreground location service (the core implementation). -->
35
+ <service
36
+ android:name="com.marianhello.bgloc.service.LocationServiceImpl"
37
+ android:enabled="true"
38
+ android:exported="false"
39
+ android:foregroundServiceType="location" />
40
+
41
+ <!-- SyncAdapter (runs in its own :sync process to honor Android's sync framework). -->
42
+ <service
43
+ android:name="com.marianhello.bgloc.sync.SyncService"
44
+ android:exported="true"
45
+ android:process=":sync">
46
+ <intent-filter>
47
+ <action android:name="android.content.SyncAdapter" />
48
+ </intent-filter>
49
+ <meta-data
50
+ android:name="android.content.SyncAdapter"
51
+ android:resource="@xml/syncadapter" />
52
+ </service>
53
+
54
+ <!-- Account authenticator stub required by the sync framework. -->
55
+ <service
56
+ android:name="com.marianhello.bgloc.sync.AuthenticatorService"
57
+ android:exported="false">
58
+ <intent-filter>
59
+ <action android:name="android.accounts.AccountAuthenticator" />
60
+ </intent-filter>
61
+ <meta-data
62
+ android:name="android.accounts.AccountAuthenticator"
63
+ android:resource="@xml/authenticator" />
64
+ </service>
65
+
66
+ <!-- Local content provider backing the location queue. -->
67
+ <provider
68
+ android:name="com.marianhello.bgloc.data.provider.LocationContentProvider"
69
+ android:authorities="@string/plugin_bgloc_content_authority"
70
+ android:exported="false"
71
+ android:syncable="true" />
72
+
73
+ <!-- Restart the service after device reboot when `startOnBoot` is enabled. -->
74
+ <receiver
75
+ android:name="com.marianhello.bgloc.BootCompletedReceiver"
76
+ android:enabled="true"
77
+ android:exported="true">
78
+ <intent-filter>
79
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
80
+ </intent-filter>
81
+ </receiver>
82
+ </application>
83
+ </manifest>
@@ -0,0 +1,18 @@
1
+ package com.evgenii.jsevaluator;
2
+
3
+ import android.os.Handler;
4
+
5
+ import com.evgenii.jsevaluator.interfaces.HandlerWrapperInterface;
6
+
7
+ public class HandlerWrapper implements HandlerWrapperInterface {
8
+ private final Handler mHandler;
9
+
10
+ public HandlerWrapper() {
11
+ mHandler = new Handler();
12
+ }
13
+
14
+ @Override
15
+ public void post(Runnable r) {
16
+ mHandler.post(r);
17
+ }
18
+ }
@@ -0,0 +1,22 @@
1
+ package com.evgenii.jsevaluator;
2
+
3
+ import android.webkit.JavascriptInterface;
4
+
5
+ import com.evgenii.jsevaluator.interfaces.CallJavaResultInterface;
6
+
7
+ /**
8
+ * Passed in addJavascriptInterface of WebView to allow web views's JS execute
9
+ * Java code
10
+ */
11
+ public class JavaScriptInterface {
12
+ private final CallJavaResultInterface mCallJavaResultInterface;
13
+
14
+ public JavaScriptInterface(CallJavaResultInterface callJavaResult) {
15
+ mCallJavaResultInterface = callJavaResult;
16
+ }
17
+
18
+ @JavascriptInterface
19
+ public void returnResultToJava(String value) {
20
+ mCallJavaResultInterface.jsCallFinished(value);
21
+ }
22
+ }
@@ -0,0 +1,133 @@
1
+ package com.evgenii.jsevaluator;
2
+
3
+ import android.content.Context;
4
+ import androidx.annotation.VisibleForTesting;
5
+ import android.webkit.WebView;
6
+
7
+ import com.evgenii.jsevaluator.interfaces.CallJavaResultInterface;
8
+ import com.evgenii.jsevaluator.interfaces.HandlerWrapperInterface;
9
+ import com.evgenii.jsevaluator.interfaces.JsCallback;
10
+ import com.evgenii.jsevaluator.interfaces.JsEvaluatorInterface;
11
+ import com.evgenii.jsevaluator.interfaces.WebViewWrapperInterface;
12
+
13
+ import java.util.concurrent.atomic.AtomicReference;
14
+
15
+ public class JsEvaluator implements CallJavaResultInterface, JsEvaluatorInterface {
16
+ public final static String JS_NAMESPACE = "evgeniiJsEvaluator";
17
+ private final static String JS_ERROR_PREFIX = "evgeniiJsEvaluatorException";
18
+
19
+ public static String escapeCarriageReturn(String str) {
20
+ return str.replace("\r", "\\r");
21
+ }
22
+
23
+ public static String escapeClosingScript(String str) {
24
+ return str.replace("</", "<\\/");
25
+ }
26
+
27
+ public static String escapeNewLines(String str) {
28
+ return str.replace("\n", "\\n");
29
+ }
30
+
31
+ public static String escapeSingleQuotes(String str) {
32
+ return str.replace("'", "\\'");
33
+ }
34
+
35
+ public static String escapeSlash(String str) {
36
+ return str.replace("\\", "\\\\");
37
+ }
38
+
39
+ public static String getJsForEval(String jsCode) {
40
+ jsCode = escapeSlash(jsCode);
41
+ jsCode = escapeSingleQuotes(jsCode);
42
+ jsCode = escapeClosingScript(jsCode);
43
+ jsCode = escapeNewLines(jsCode);
44
+ jsCode = escapeCarriageReturn(jsCode);
45
+
46
+ return String.format("%s.returnResultToJava(eval('try{%s}catch(e){\"%s\"+e}'));",
47
+ JS_NAMESPACE, jsCode, JS_ERROR_PREFIX);
48
+ }
49
+
50
+ protected WebViewWrapperInterface mWebViewWrapper;
51
+
52
+ private final Context mContext;
53
+
54
+ private AtomicReference<JsCallback> callback = new AtomicReference<JsCallback>(null);
55
+
56
+ private HandlerWrapperInterface mHandler = new HandlerWrapper();
57
+
58
+ public JsEvaluator(Context context) {
59
+ mContext = context;
60
+ }
61
+
62
+ @Override
63
+ public void callFunction(String jsCode, JsCallback resultCallback, String name, Object... args) {
64
+ jsCode += "; " + JsFunctionCallFormatter.toString(name, args);
65
+ evaluate(jsCode, resultCallback);
66
+ }
67
+
68
+ @Override
69
+ public void evaluate(String jsCode) {
70
+ evaluate(jsCode, null);
71
+ }
72
+
73
+ @Override
74
+ public void evaluate(String jsCode, JsCallback resultCallback) {
75
+ final String js = JsEvaluator.getJsForEval(jsCode);
76
+ this.callback.set(resultCallback);
77
+ getWebViewWrapper().loadJavaScript(js);
78
+ }
79
+
80
+ // Destroys the web view in order to free the memory.
81
+ // The web view can not be accessed after is has been destroyed.
82
+ // To check open the page in Chrome: chrome://inspect/#devices
83
+ public void destroy() {
84
+ getWebViewWrapper().destroy();
85
+ }
86
+
87
+ // Returns the WebView object
88
+ public WebView getWebView() {
89
+ return getWebViewWrapper().getWebView();
90
+ }
91
+
92
+ public WebViewWrapperInterface getWebViewWrapper() {
93
+ if (mWebViewWrapper == null) {
94
+ mWebViewWrapper = new WebViewWrapper(mContext, this);
95
+ }
96
+ return mWebViewWrapper;
97
+ }
98
+
99
+ @Override
100
+ public void jsCallFinished(final String value) {
101
+ final JsCallback callbackLocal = callback.getAndSet(null);
102
+ if (callbackLocal == null) {
103
+ return;
104
+ }
105
+
106
+ mHandler.post(new Runnable() {
107
+ @Override
108
+ public void run() {
109
+ if(value!=null && value.startsWith(JS_ERROR_PREFIX)) {
110
+ callbackLocal.onError(value.substring(JS_ERROR_PREFIX.length()));
111
+ } else {
112
+ callbackLocal.onResult(value);
113
+ }
114
+ }
115
+ });
116
+ }
117
+
118
+ @VisibleForTesting
119
+ public void setHandler(HandlerWrapperInterface handlerWrapperInterface) {
120
+ mHandler = handlerWrapperInterface;
121
+ }
122
+
123
+ @VisibleForTesting
124
+ public void setWebViewWrapper(WebViewWrapperInterface webViewWrapper) {
125
+ mWebViewWrapper = webViewWrapper;
126
+ }
127
+
128
+ @VisibleForTesting
129
+ public JsCallback getCallback() {
130
+ return callback.get();
131
+ }
132
+
133
+ }
@@ -0,0 +1,37 @@
1
+ package com.evgenii.jsevaluator;
2
+
3
+ public class JsFunctionCallFormatter {
4
+ public static String paramToString(Object param) {
5
+ String str = "";
6
+ if (param instanceof String) {
7
+ str = (String) param;
8
+ str = str.replace("\\", "\\\\");
9
+ str = str.replace("\"", "\\\"");
10
+ str = str.replace("\n", "\\n");
11
+ str = String.format("\"%s\"", str);
12
+ } else {
13
+ try {
14
+ @SuppressWarnings("unused")
15
+ final double d = Double.parseDouble(param.toString());
16
+ str = param.toString();
17
+ } catch (final NumberFormatException nfe) {
18
+ }
19
+ }
20
+
21
+ return str;
22
+ }
23
+
24
+ public static String toString(String functionName, Object... args) {
25
+ final StringBuilder paramsStr = new StringBuilder();
26
+
27
+ for (final Object param : args) {
28
+ if (paramsStr.length() > 0) {
29
+ paramsStr.append(", ");
30
+ }
31
+
32
+ paramsStr.append(paramToString(param));
33
+ }
34
+
35
+ return String.format("%s(%s)", functionName, paramsStr);
36
+ }
37
+ }
@@ -0,0 +1,71 @@
1
+ package com.evgenii.jsevaluator;
2
+
3
+ import java.io.UnsupportedEncodingException;
4
+
5
+ import android.annotation.SuppressLint;
6
+ import android.content.Context;
7
+ import android.os.Build;
8
+ import android.util.Base64;
9
+ import android.webkit.WebSettings;
10
+ import android.webkit.WebView;
11
+
12
+ import com.evgenii.jsevaluator.interfaces.CallJavaResultInterface;
13
+ import com.evgenii.jsevaluator.interfaces.WebViewWrapperInterface;
14
+
15
+ @SuppressLint("SetJavaScriptEnabled")
16
+ public class WebViewWrapper implements WebViewWrapperInterface {
17
+ protected WebView mWebView;
18
+
19
+ public WebViewWrapper(Context context, CallJavaResultInterface callJavaResult) {
20
+ mWebView = new WebView(context);
21
+
22
+ // web view will not draw anything - turn on optimizations
23
+ mWebView.setWillNotDraw(true);
24
+
25
+ final WebSettings webSettings = mWebView.getSettings();
26
+ webSettings.setJavaScriptEnabled(true);
27
+ webSettings.setDefaultTextEncodingName("utf-8");
28
+ final JavaScriptInterface jsInterface = new JavaScriptInterface(callJavaResult);
29
+ mWebView.addJavascriptInterface(jsInterface, JsEvaluator.JS_NAMESPACE);
30
+ }
31
+
32
+ @Override
33
+ public void loadJavaScript(String javascript) {
34
+ byte[] data;
35
+ try {
36
+ javascript = "<script>" + javascript + "</script>";
37
+ data = javascript.getBytes("UTF-8");
38
+ final String base64 = Base64.encodeToString(data, Base64.DEFAULT);
39
+ mWebView.loadUrl("data:text/html;charset=utf-8;base64," + base64);
40
+ } catch (final UnsupportedEncodingException e) {
41
+ e.printStackTrace();
42
+ }
43
+ }
44
+
45
+ // Destroys the web view in order to free the memory
46
+ // The web view can not be accessed after is has been destroyed
47
+ // To check open the page in Chrome: chrome://inspect/#devices
48
+ public void destroy() {
49
+ if(mWebView != null) {
50
+ mWebView.removeJavascriptInterface(JsEvaluator.JS_NAMESPACE);
51
+ mWebView.loadUrl("about:blank");
52
+ mWebView.stopLoading();
53
+
54
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
55
+ mWebView.freeMemory();
56
+ }
57
+
58
+ mWebView.clearHistory();
59
+ mWebView.removeAllViews();
60
+ mWebView.destroyDrawingCache();
61
+ mWebView.destroy();
62
+
63
+ mWebView = null;
64
+ }
65
+ }
66
+
67
+ // Returns the WebView object
68
+ public WebView getWebView() {
69
+ return mWebView;
70
+ }
71
+ }
@@ -0,0 +1,8 @@
1
+ package com.evgenii.jsevaluator.interfaces;
2
+
3
+ /**
4
+ * Used in JavaScriptInterface to interact with JsRunner
5
+ */
6
+ public interface CallJavaResultInterface {
7
+ public void jsCallFinished(String value);
8
+ }
@@ -0,0 +1,5 @@
1
+ package com.evgenii.jsevaluator.interfaces;
2
+
3
+ public interface HandlerWrapperInterface {
4
+ public void post(Runnable r);
5
+ }
@@ -0,0 +1,10 @@
1
+ package com.evgenii.jsevaluator.interfaces;
2
+
3
+ /**
4
+ * Interface for passing code that will be executed after the JS has finished
5
+ */
6
+
7
+ public interface JsCallback {
8
+ public abstract void onResult(String value);
9
+ public abstract void onError(String errorMessage);
10
+ }
@@ -0,0 +1,18 @@
1
+ package com.evgenii.jsevaluator.interfaces;
2
+
3
+ import android.webkit.WebView;
4
+
5
+ public interface JsEvaluatorInterface {
6
+ public void callFunction(String jsCode, JsCallback resultCallback, String name, Object... args);
7
+
8
+ public void evaluate(String jsCode);
9
+
10
+ public void evaluate(String jsCode, JsCallback resultCallback);
11
+
12
+ // Destroys the web view in order to free the memory.
13
+ // The web view can not be accessed after is has been destroyed.
14
+ public void destroy();
15
+
16
+ // Returns the WebView object
17
+ public WebView getWebView();
18
+ }
@@ -0,0 +1,14 @@
1
+ package com.evgenii.jsevaluator.interfaces;
2
+
3
+ import android.webkit.WebView;
4
+
5
+ public interface WebViewWrapperInterface {
6
+ public void loadJavaScript(String javascript);
7
+
8
+ // Destroys the web view in order to free the memory.
9
+ // The web view can not be accessed after is has been destroyed.
10
+ public void destroy();
11
+
12
+ // Returns the WebView object
13
+ public WebView getWebView();
14
+ }