@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.
- package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
- package/LICENSE +17 -0
- package/NOTICE.md +32 -0
- package/Package.swift +45 -0
- package/README.md +402 -0
- package/android/build.gradle +79 -0
- package/android/proguard-rules.pro +1 -0
- package/android/src/main/AndroidManifest.xml +83 -0
- package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
- package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
- package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
- package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
- package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
- package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
- package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
- package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
- package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
- package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
- package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
- package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
- package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
- package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
- package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
- package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
- package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
- package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
- package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
- package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
- package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
- package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
- package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
- package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
- package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
- package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
- package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
- package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
- package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
- package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
- package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
- package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
- package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
- package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
- package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
- package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
- package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
- package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
- package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
- package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
- package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
- package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
- package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/values/strings.xml +15 -0
- package/android/src/main/res/xml/authenticator.xml +7 -0
- package/android/src/main/res/xml/syncadapter.xml +9 -0
- package/dist/esm/definitions.d.ts +1052 -0
- package/dist/esm/definitions.js +142 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +92 -0
- package/dist/esm/web.js +242 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +415 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +418 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
- package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
- package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
- package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
- package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
- package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
- package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
- package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
- package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
- package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
- package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
- package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
- package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
- package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
- package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
- package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
- package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
- package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
- package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
- package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
- package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
- package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
- package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
- package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
- package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
- package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
- package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
- package/package.json +82 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
package com.marianhello.bgloc;
|
|
2
|
+
|
|
3
|
+
import android.os.Build;
|
|
4
|
+
|
|
5
|
+
import org.json.JSONArray;
|
|
6
|
+
import org.json.JSONObject;
|
|
7
|
+
|
|
8
|
+
import java.io.BufferedInputStream;
|
|
9
|
+
import java.io.BufferedOutputStream;
|
|
10
|
+
import java.io.File;
|
|
11
|
+
import java.io.FileInputStream;
|
|
12
|
+
import java.io.IOException;
|
|
13
|
+
import java.io.InputStream;
|
|
14
|
+
import java.io.ByteArrayOutputStream;
|
|
15
|
+
import java.nio.charset.StandardCharsets;
|
|
16
|
+
import java.util.HashMap;
|
|
17
|
+
import java.util.Map;
|
|
18
|
+
import java.util.Iterator;
|
|
19
|
+
|
|
20
|
+
import org.json.JSONTokener;
|
|
21
|
+
|
|
22
|
+
import java.net.URL;
|
|
23
|
+
import java.net.HttpURLConnection;
|
|
24
|
+
import java.net.URLEncoder;
|
|
25
|
+
|
|
26
|
+
public class HttpPostService {
|
|
27
|
+
public static final int BUFFER_SIZE = 1024;
|
|
28
|
+
/** Timeout to establish connection (ms). Prevents sync notification from staying stuck. */
|
|
29
|
+
private static final int CONNECT_TIMEOUT_MS = 30_000;
|
|
30
|
+
/** Timeout to read response (ms). Prevents sync notification from staying stuck. */
|
|
31
|
+
private static final int READ_TIMEOUT_MS = 120_000;
|
|
32
|
+
|
|
33
|
+
private String mUrl;
|
|
34
|
+
private String mMethod = "POST";
|
|
35
|
+
private HttpURLConnection mHttpURLConnection;
|
|
36
|
+
|
|
37
|
+
public interface UploadingProgressListener {
|
|
38
|
+
void onProgress(int progress);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public HttpPostService(String url) {
|
|
42
|
+
mUrl = url;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public HttpPostService(String url, String method) {
|
|
46
|
+
mUrl = url;
|
|
47
|
+
mMethod = normalizeMethod(method);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public HttpPostService(final HttpURLConnection httpURLConnection) {
|
|
51
|
+
mHttpURLConnection = httpURLConnection;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public void setMethod(String method) {
|
|
55
|
+
mMethod = normalizeMethod(method);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private static String normalizeMethod(String method) {
|
|
59
|
+
if (method == null || method.isEmpty()) return "POST";
|
|
60
|
+
String m = method.trim().toUpperCase();
|
|
61
|
+
if (m.equals("POST") || m.equals("GET") || m.equals("PUT") || m.equals("PATCH")) return m;
|
|
62
|
+
return "POST";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Returns true when the HTTP method has no request body (GET). */
|
|
66
|
+
private boolean isBodyless() {
|
|
67
|
+
return "GET".equals(mMethod);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private HttpURLConnection openConnection() throws IOException {
|
|
71
|
+
if (mHttpURLConnection == null) {
|
|
72
|
+
mHttpURLConnection = (HttpURLConnection) new URL(mUrl).openConnection();
|
|
73
|
+
mHttpURLConnection.setConnectTimeout(CONNECT_TIMEOUT_MS);
|
|
74
|
+
mHttpURLConnection.setReadTimeout(READ_TIMEOUT_MS);
|
|
75
|
+
}
|
|
76
|
+
return mHttpURLConnection;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public int postJSON(JSONObject json, Map headers) throws IOException {
|
|
80
|
+
String jsonString = "null";
|
|
81
|
+
if (json != null) {
|
|
82
|
+
jsonString = json.toString();
|
|
83
|
+
}
|
|
84
|
+
return postJSONString(jsonString, headers);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public int postJSON(JSONArray json, Map headers) throws IOException {
|
|
88
|
+
String jsonString = "null";
|
|
89
|
+
if (json != null) {
|
|
90
|
+
if (json.length() == 1) {
|
|
91
|
+
JSONObject single = json.optJSONObject(0);
|
|
92
|
+
if (single != null) {
|
|
93
|
+
jsonString = single.toString();
|
|
94
|
+
} else {
|
|
95
|
+
jsonString = json.toString();
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
jsonString = json.toString();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return postJSONString(jsonString, headers);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public int postJSONString(String body, Map headers) throws IOException {
|
|
105
|
+
if (headers == null) {
|
|
106
|
+
headers = new HashMap();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
String contentType = null;
|
|
110
|
+
for (Object keyObj : headers.keySet()) {
|
|
111
|
+
String key = (String) keyObj;
|
|
112
|
+
if (key.equalsIgnoreCase("Content-Type")) {
|
|
113
|
+
contentType = (String) headers.get(key);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (contentType == null) {
|
|
118
|
+
contentType = "application/json";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
HttpURLConnection conn = this.openConnection();
|
|
122
|
+
conn.setRequestMethod(mMethod);
|
|
123
|
+
|
|
124
|
+
// Set headers (including Content-Type) up-front; needed for both bodyless and body requests.
|
|
125
|
+
if (!isBodyless()) {
|
|
126
|
+
conn.setRequestProperty("Content-Type", contentType);
|
|
127
|
+
}
|
|
128
|
+
Iterator<Map.Entry<String, String>> it = headers.entrySet().iterator();
|
|
129
|
+
while (it.hasNext()) {
|
|
130
|
+
Map.Entry<String, String> pair = it.next();
|
|
131
|
+
if (!pair.getKey().equalsIgnoreCase("Content-Type")) {
|
|
132
|
+
conn.setRequestProperty(pair.getKey(), pair.getValue());
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// GET: no body; data is expected to live in the URL (URL templating).
|
|
137
|
+
if (isBodyless()) {
|
|
138
|
+
conn.setDoOutput(false);
|
|
139
|
+
return conn.getResponseCode();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Prepare body according to Content-Type so header and body always match.
|
|
143
|
+
String finalBody = body;
|
|
144
|
+
if (contentType.equalsIgnoreCase("application/x-www-form-urlencoded")) {
|
|
145
|
+
try {
|
|
146
|
+
finalBody = jsonToUrlEncoded(body);
|
|
147
|
+
} catch (Exception e) {
|
|
148
|
+
finalBody = body;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Use byte length, not String.length(), so multi-byte UTF-8 characters
|
|
153
|
+
// (ñ, é, emoji, ...) match the Content-Length the server expects.
|
|
154
|
+
byte[] outputBytes = finalBody.getBytes(StandardCharsets.UTF_8);
|
|
155
|
+
conn.setDoOutput(true);
|
|
156
|
+
conn.setFixedLengthStreamingMode(outputBytes.length);
|
|
157
|
+
|
|
158
|
+
java.io.OutputStream os = null;
|
|
159
|
+
try {
|
|
160
|
+
os = conn.getOutputStream();
|
|
161
|
+
os.write(outputBytes);
|
|
162
|
+
} finally {
|
|
163
|
+
if (os != null) {
|
|
164
|
+
os.flush();
|
|
165
|
+
os.close();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return conn.getResponseCode();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private static String getContentTypeFromHeaders(Map headers) {
|
|
172
|
+
if (headers == null) return null;
|
|
173
|
+
for (Object keyObj : headers.keySet()) {
|
|
174
|
+
String key = (String) keyObj;
|
|
175
|
+
if (key != null && key.equalsIgnoreCase("Content-Type")) {
|
|
176
|
+
return (String) headers.get(key);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Converts JSON string (object or array) to application/x-www-form-urlencoded.
|
|
184
|
+
* Object: flat key=value&key2=value2. Array: single key "locations" with URL-encoded JSON array.
|
|
185
|
+
*/
|
|
186
|
+
private String jsonToUrlEncoded(String jsonString) throws Exception {
|
|
187
|
+
Object json = new JSONTokener(jsonString).nextValue();
|
|
188
|
+
if (json instanceof JSONArray) {
|
|
189
|
+
return "locations=" + URLEncoder.encode(jsonString, StandardCharsets.UTF_8.name());
|
|
190
|
+
}
|
|
191
|
+
JSONObject jsonObj = (JSONObject) json;
|
|
192
|
+
StringBuilder result = new StringBuilder();
|
|
193
|
+
Iterator<String> keys = jsonObj.keys();
|
|
194
|
+
while (keys.hasNext()) {
|
|
195
|
+
String key = keys.next();
|
|
196
|
+
String value = jsonObj.get(key).toString();
|
|
197
|
+
if (result.length() > 0) {
|
|
198
|
+
result.append("&");
|
|
199
|
+
}
|
|
200
|
+
result.append(URLEncoder.encode(key, StandardCharsets.UTF_8.name()));
|
|
201
|
+
result.append("=");
|
|
202
|
+
result.append(URLEncoder.encode(value, StandardCharsets.UTF_8.name()));
|
|
203
|
+
}
|
|
204
|
+
return result.toString();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
public int postJSONFile(File file, Map headers, UploadingProgressListener listener) throws IOException {
|
|
208
|
+
long fileSize = file.length();
|
|
209
|
+
return postJSONFile(new FileInputStream(file), fileSize, headers, listener);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public int postJSONFile(InputStream stream, Map headers, UploadingProgressListener listener) throws IOException {
|
|
213
|
+
return postJSONFile(stream, stream.available(), headers, listener);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
public int postJSONFile(InputStream stream, long streamSize, Map headers, UploadingProgressListener listener) throws IOException {
|
|
217
|
+
if (headers == null) {
|
|
218
|
+
headers = new HashMap();
|
|
219
|
+
}
|
|
220
|
+
String contentType = getContentTypeFromHeaders(headers);
|
|
221
|
+
if (contentType == null) {
|
|
222
|
+
contentType = "application/json";
|
|
223
|
+
}
|
|
224
|
+
final boolean isFormUrlEncoded = contentType.equalsIgnoreCase("application/x-www-form-urlencoded");
|
|
225
|
+
// Prepare body according to Content-Type (same as post to url): form body when form-urlencoded, else JSON
|
|
226
|
+
// Read full body so we can convert when needed
|
|
227
|
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
228
|
+
byte[] buffer = new byte[BUFFER_SIZE];
|
|
229
|
+
int bytesRead;
|
|
230
|
+
long progress = 0;
|
|
231
|
+
while ((bytesRead = stream.read(buffer)) != -1) {
|
|
232
|
+
baos.write(buffer, 0, bytesRead);
|
|
233
|
+
progress += bytesRead;
|
|
234
|
+
if (listener != null && streamSize > 0) {
|
|
235
|
+
int percentage = (int) ((progress * 100L) / streamSize);
|
|
236
|
+
listener.onProgress(percentage);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
stream.close();
|
|
240
|
+
byte[] bodyBytes = baos.toByteArray();
|
|
241
|
+
String jsonString = new String(bodyBytes, StandardCharsets.UTF_8);
|
|
242
|
+
|
|
243
|
+
// When form-urlencoded and body is a JSON array, send one POST per location (same flat
|
|
244
|
+
// format as real-time posting) so the same server endpoint accepts both.
|
|
245
|
+
if (isFormUrlEncoded) {
|
|
246
|
+
try {
|
|
247
|
+
Object parsed = new JSONTokener(jsonString).nextValue();
|
|
248
|
+
if (parsed instanceof JSONArray) {
|
|
249
|
+
JSONArray arr = (JSONArray) parsed;
|
|
250
|
+
int len = arr.length();
|
|
251
|
+
if (len == 0) {
|
|
252
|
+
if (listener != null) listener.onProgress(100);
|
|
253
|
+
return 200;
|
|
254
|
+
}
|
|
255
|
+
for (int i = 0; i < len; i++) {
|
|
256
|
+
JSONObject item = arr.getJSONObject(i);
|
|
257
|
+
HttpPostService perRequest = new HttpPostService(mUrl);
|
|
258
|
+
int code = perRequest.postJSON(item, headers);
|
|
259
|
+
if (listener != null && len > 0) {
|
|
260
|
+
listener.onProgress((i + 1) * 100 / len);
|
|
261
|
+
}
|
|
262
|
+
if (code < 200 || code >= 300) {
|
|
263
|
+
return code;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (listener != null) {
|
|
267
|
+
listener.onProgress(100);
|
|
268
|
+
}
|
|
269
|
+
return 200;
|
|
270
|
+
}
|
|
271
|
+
} catch (Exception e) {
|
|
272
|
+
// Fall through to single-POST with jsonToUrlEncoded (e.g. array wrap)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
byte[] outputBytes;
|
|
277
|
+
if (isFormUrlEncoded) {
|
|
278
|
+
try {
|
|
279
|
+
String formBody = jsonToUrlEncoded(jsonString);
|
|
280
|
+
outputBytes = formBody.getBytes(StandardCharsets.UTF_8);
|
|
281
|
+
} catch (Exception e) {
|
|
282
|
+
outputBytes = bodyBytes;
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
outputBytes = bodyBytes;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
HttpURLConnection conn = this.openConnection();
|
|
289
|
+
conn.setRequestMethod(mMethod);
|
|
290
|
+
if (isBodyless()) {
|
|
291
|
+
conn.setDoOutput(false);
|
|
292
|
+
// No headers loop / body for GET; we just consume the response.
|
|
293
|
+
Iterator<Map.Entry<String, String>> hit = headers.entrySet().iterator();
|
|
294
|
+
while (hit.hasNext()) {
|
|
295
|
+
Map.Entry<String, String> pair = hit.next();
|
|
296
|
+
if (!pair.getKey().equalsIgnoreCase("Content-Type")) {
|
|
297
|
+
conn.setRequestProperty(pair.getKey(), pair.getValue());
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (listener != null) listener.onProgress(100);
|
|
301
|
+
return conn.getResponseCode();
|
|
302
|
+
}
|
|
303
|
+
conn.setDoInput(false);
|
|
304
|
+
conn.setDoOutput(true);
|
|
305
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
|
306
|
+
conn.setFixedLengthStreamingMode(outputBytes.length);
|
|
307
|
+
} else {
|
|
308
|
+
conn.setChunkedStreamingMode(0);
|
|
309
|
+
}
|
|
310
|
+
conn.setRequestProperty("Content-Type", contentType);
|
|
311
|
+
Iterator<Map.Entry<String, String>> it = headers.entrySet().iterator();
|
|
312
|
+
while (it.hasNext()) {
|
|
313
|
+
Map.Entry<String, String> pair = it.next();
|
|
314
|
+
if (!pair.getKey().equalsIgnoreCase("Content-Type")) {
|
|
315
|
+
conn.setRequestProperty(pair.getKey(), pair.getValue());
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
BufferedOutputStream os = null;
|
|
320
|
+
try {
|
|
321
|
+
os = new BufferedOutputStream(conn.getOutputStream());
|
|
322
|
+
os.write(outputBytes);
|
|
323
|
+
if (listener != null) {
|
|
324
|
+
listener.onProgress(100);
|
|
325
|
+
}
|
|
326
|
+
} finally {
|
|
327
|
+
if (os != null) {
|
|
328
|
+
os.flush();
|
|
329
|
+
os.close();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return conn.getResponseCode();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
public static int postJSON(String url, JSONObject json, Map headers) throws IOException {
|
|
337
|
+
return postJSON(url, json, headers, "POST");
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
public static int postJSON(String url, JSONArray json, Map headers) throws IOException {
|
|
341
|
+
return postJSON(url, json, headers, "POST");
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
public static int postJSONFile(String url, File file, Map headers, UploadingProgressListener listener) throws IOException {
|
|
345
|
+
return postJSONFile(url, file, headers, listener, "POST");
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
public static int postJSON(String url, JSONObject json, Map headers, String method) throws IOException {
|
|
349
|
+
HttpPostService service = new HttpPostService(url, method);
|
|
350
|
+
return service.postJSON(json, headers);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
public static int postJSON(String url, JSONArray json, Map headers, String method) throws IOException {
|
|
354
|
+
HttpPostService service = new HttpPostService(url, method);
|
|
355
|
+
return service.postJSON(json, headers);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
public static int postJSONFile(String url, File file, Map headers, UploadingProgressListener listener, String method) throws IOException {
|
|
359
|
+
HttpPostService service = new HttpPostService(url, method);
|
|
360
|
+
return service.postJSONFile(file, headers, listener);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
package com.marianhello.bgloc;
|
|
2
|
+
|
|
3
|
+
import android.Manifest;
|
|
4
|
+
import android.annotation.SuppressLint;
|
|
5
|
+
import android.content.Context;
|
|
6
|
+
import android.location.Criteria;
|
|
7
|
+
import android.location.Location;
|
|
8
|
+
import android.location.LocationListener;
|
|
9
|
+
import android.os.Bundle;
|
|
10
|
+
import android.os.Looper;
|
|
11
|
+
|
|
12
|
+
import com.github.jparkie.promise.Promise;
|
|
13
|
+
import com.github.jparkie.promise.Promises;
|
|
14
|
+
import com.intentfilter.androidpermissions.PermissionManager;
|
|
15
|
+
import com.intentfilter.androidpermissions.models.DeniedPermissions;
|
|
16
|
+
|
|
17
|
+
import java.util.Arrays;
|
|
18
|
+
import java.util.concurrent.CountDownLatch;
|
|
19
|
+
import java.util.concurrent.TimeUnit;
|
|
20
|
+
import java.util.concurrent.TimeoutException;
|
|
21
|
+
|
|
22
|
+
public class LocationManager {
|
|
23
|
+
private Context mContext;
|
|
24
|
+
private static LocationManager mLocationManager;
|
|
25
|
+
|
|
26
|
+
public static final String[] PERMISSIONS = {
|
|
27
|
+
Manifest.permission.ACCESS_COARSE_LOCATION,
|
|
28
|
+
Manifest.permission.ACCESS_FINE_LOCATION
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
private LocationManager(Context context) {
|
|
32
|
+
mContext = context;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public class PermissionDeniedException extends Exception {}
|
|
36
|
+
|
|
37
|
+
public static LocationManager getInstance(Context context) {
|
|
38
|
+
if (mLocationManager == null) {
|
|
39
|
+
mLocationManager = new LocationManager(context.getApplicationContext());
|
|
40
|
+
}
|
|
41
|
+
return mLocationManager;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public Promise<Location> getCurrentLocation(final int timeout, final long maximumAge, final boolean enableHighAccuracy) {
|
|
45
|
+
final Promise<Location> promise = Promises.promise();
|
|
46
|
+
|
|
47
|
+
PermissionManager permissionManager = PermissionManager.getInstance(mContext);
|
|
48
|
+
permissionManager.checkPermissions(Arrays.asList(PERMISSIONS), new PermissionManager.PermissionRequestListener() {
|
|
49
|
+
@Override
|
|
50
|
+
public void onPermissionGranted() {
|
|
51
|
+
try {
|
|
52
|
+
Location currentLocation = getCurrentLocationNoCheck(timeout, maximumAge, enableHighAccuracy);
|
|
53
|
+
promise.set(currentLocation);
|
|
54
|
+
} catch (TimeoutException e) {
|
|
55
|
+
promise.setError(e);
|
|
56
|
+
} catch (InterruptedException e) {
|
|
57
|
+
Thread.currentThread().interrupt();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@Override
|
|
62
|
+
public void onPermissionDenied(DeniedPermissions deniedPermissions) {
|
|
63
|
+
promise.setError(new PermissionDeniedException());
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return promise;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get current location without permission checking
|
|
72
|
+
*
|
|
73
|
+
* @param timeout
|
|
74
|
+
* @param maximumAge
|
|
75
|
+
* @param enableHighAccuracy
|
|
76
|
+
* @return
|
|
77
|
+
* @throws InterruptedException
|
|
78
|
+
* @throws TimeoutException
|
|
79
|
+
*/
|
|
80
|
+
@SuppressLint("MissingPermission")
|
|
81
|
+
public Location getCurrentLocationNoCheck(int timeout, long maximumAge, boolean enableHighAccuracy) throws InterruptedException, TimeoutException {
|
|
82
|
+
final long minLocationTime = System.currentTimeMillis() - maximumAge;
|
|
83
|
+
final android.location.LocationManager locationManager = (android.location.LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
|
|
84
|
+
|
|
85
|
+
Location lastKnownGPSLocation = locationManager.getLastKnownLocation(android.location.LocationManager.GPS_PROVIDER);
|
|
86
|
+
if (lastKnownGPSLocation != null && lastKnownGPSLocation.getTime() >= minLocationTime) {
|
|
87
|
+
return lastKnownGPSLocation;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Location lastKnownNetworkLocation = locationManager.getLastKnownLocation(android.location.LocationManager.NETWORK_PROVIDER);
|
|
91
|
+
if (lastKnownNetworkLocation != null && lastKnownNetworkLocation.getTime() >= minLocationTime) {
|
|
92
|
+
return lastKnownNetworkLocation;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Criteria criteria = new Criteria();
|
|
96
|
+
criteria.setAccuracy(enableHighAccuracy ? Criteria.ACCURACY_FINE : Criteria.ACCURACY_COARSE);
|
|
97
|
+
|
|
98
|
+
CurrentLocationListener locationListener = new CurrentLocationListener();
|
|
99
|
+
locationManager.requestSingleUpdate(criteria, locationListener, Looper.getMainLooper());
|
|
100
|
+
|
|
101
|
+
if (!locationListener.mCountDownLatch.await(timeout, TimeUnit.MILLISECONDS)) {
|
|
102
|
+
locationManager.removeUpdates(locationListener);
|
|
103
|
+
throw new TimeoutException();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (locationListener.mLocation != null) {
|
|
107
|
+
return locationListener.mLocation;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static class CurrentLocationListener implements LocationListener {
|
|
114
|
+
Location mLocation = null;
|
|
115
|
+
final CountDownLatch mCountDownLatch = new CountDownLatch(1);
|
|
116
|
+
|
|
117
|
+
@Override
|
|
118
|
+
public void onLocationChanged(Location location) {
|
|
119
|
+
mLocation = location;
|
|
120
|
+
mCountDownLatch.countDown();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@Override
|
|
124
|
+
public void onStatusChanged(String s, int i, Bundle bundle) {
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
public void onProviderEnabled(String s) {
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Override
|
|
134
|
+
public void onProviderDisabled(String s) {
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
package com.marianhello.bgloc;
|
|
2
|
+
|
|
3
|
+
import com.marianhello.bgloc.data.BackgroundActivity;
|
|
4
|
+
import com.marianhello.bgloc.data.BackgroundLocation;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Created by finch on 27.11.2017.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
public interface PluginDelegate {
|
|
11
|
+
void onAuthorizationChanged(int authStatus);
|
|
12
|
+
void onLocationChanged(BackgroundLocation location);
|
|
13
|
+
void onStationaryChanged(BackgroundLocation location);
|
|
14
|
+
void onActivityChanged(BackgroundActivity activity);
|
|
15
|
+
void onServiceStatusChanged(int status);
|
|
16
|
+
void onAbortRequested();
|
|
17
|
+
void onHttpAuthorization();
|
|
18
|
+
void onError(PluginException error);
|
|
19
|
+
/** v3.5 Phase 4: sync queue events. Default no-op so existing implementations keep compiling. */
|
|
20
|
+
default void onSyncStart() {}
|
|
21
|
+
default void onSyncSuccess(int locationsSent) {}
|
|
22
|
+
default void onSyncError(int httpStatus, String message) {}
|
|
23
|
+
default void onSyncProgress(int progress) {}
|
|
24
|
+
default void onHeartbeat(BackgroundLocation location) {}
|
|
25
|
+
// v4.0 Phase 6: driver insights
|
|
26
|
+
default void onTripStart(BackgroundLocation location) {}
|
|
27
|
+
default void onTripEnd(BackgroundLocation location, double distance, long durationMs) {}
|
|
28
|
+
default void onMoving(BackgroundLocation location) {}
|
|
29
|
+
default void onStopped(BackgroundLocation location) {}
|
|
30
|
+
default void onSpeeding(BackgroundLocation location, double speedKmh, double limitKmh) {}
|
|
31
|
+
default void onProviderChange(String provider) {}
|
|
32
|
+
default void onSOS(BackgroundLocation location, org.json.JSONObject payload) {}
|
|
33
|
+
// v4.1 GPS-derived sensor-like events
|
|
34
|
+
default void onHardBrake(BackgroundLocation location, double decelMps2) {}
|
|
35
|
+
default void onRapidAcceleration(BackgroundLocation location, double accelMps2) {}
|
|
36
|
+
default void onSharpTurn(BackgroundLocation location, double degPerSec) {}
|
|
37
|
+
default void onPossibleCrash(BackgroundLocation location, double velocityDropKmh) {}
|
|
38
|
+
/** v4.2: same event, but enriched with the source ("gps" | "sensor") and impact value. */
|
|
39
|
+
default void onPossibleCrash(BackgroundLocation location, double value, String source) {
|
|
40
|
+
// Backward-compat default: forward to the legacy 2-arg overload.
|
|
41
|
+
onPossibleCrash(location, value);
|
|
42
|
+
}
|
|
43
|
+
/** v4.2 sensor fusion: emitted when device interaction is detected during an active trip. */
|
|
44
|
+
default void onPhoneUsageWhileDriving(BackgroundLocation location) {}
|
|
45
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package com.marianhello.bgloc;
|
|
2
|
+
|
|
3
|
+
import android.os.Bundle;
|
|
4
|
+
|
|
5
|
+
import org.json.JSONException;
|
|
6
|
+
import org.json.JSONObject;
|
|
7
|
+
|
|
8
|
+
public class PluginException extends Exception {
|
|
9
|
+
public static final int PERMISSION_DENIED_ERROR = 1000;
|
|
10
|
+
public static final int SETTINGS_ERROR = 1001;
|
|
11
|
+
public static final int CONFIGURE_ERROR = 1002;
|
|
12
|
+
public static final int SERVICE_ERROR = 1003;
|
|
13
|
+
public static final int JSON_ERROR = 1004;
|
|
14
|
+
|
|
15
|
+
private Integer code;
|
|
16
|
+
|
|
17
|
+
public PluginException(String message, Throwable cause, int code) {
|
|
18
|
+
super(message, cause);
|
|
19
|
+
this.code = code;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public PluginException(String message, int code) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.code = code;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public Integer getCode() {
|
|
28
|
+
return code;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public Bundle toBundle() {
|
|
32
|
+
Bundle bundle = new Bundle();
|
|
33
|
+
bundle.putInt("code", this.code);
|
|
34
|
+
bundle.putString("message", this.getMessage());
|
|
35
|
+
|
|
36
|
+
return bundle;
|
|
37
|
+
}
|
|
38
|
+
}
|