@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,124 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURGeolocationOpenHelper.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 27/06/16.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
#import "MAURGeolocationOpenHelper.h"
|
|
11
|
+
#import "MAURLocationContract.h"
|
|
12
|
+
#import "MAURConfigurationContract.h"
|
|
13
|
+
#import "MAURSessionLocationContract.h"
|
|
14
|
+
|
|
15
|
+
@implementation MAURGeolocationOpenHelper
|
|
16
|
+
|
|
17
|
+
static NSString *const kDatabaseName = @"cordova_bg_geolocation.db";
|
|
18
|
+
// v4.5.0: bumped to 7 to add events_json + battery_level + is_charging on locations,
|
|
19
|
+
// and config_json on configuration (paridad con Android v22).
|
|
20
|
+
static NSInteger const kDatabaseVersion = 7;
|
|
21
|
+
|
|
22
|
+
- (instancetype)init
|
|
23
|
+
{
|
|
24
|
+
self = [super init:kDatabaseName version:kDatabaseVersion];
|
|
25
|
+
return self;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
- (void) drop:(NSString*)table inDatabase:(FMDatabase*)database
|
|
29
|
+
{
|
|
30
|
+
NSString *sql = [NSString stringWithFormat: @"DROP TABLE IF EXISTS %@", table];
|
|
31
|
+
if (![database executeStatements:sql]) {
|
|
32
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
- (void) onCreate:(FMDatabaseQueue*)queue
|
|
37
|
+
{
|
|
38
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
39
|
+
// because of some legacy code we have to drop table
|
|
40
|
+
[self drop:@LC_TABLE_NAME inDatabase:database];
|
|
41
|
+
|
|
42
|
+
NSString *sql = [@[
|
|
43
|
+
[MAURLocationContract createTableSQL],
|
|
44
|
+
[MAURConfigurationContract createTableSQL],
|
|
45
|
+
@"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")",
|
|
46
|
+
[MAURSessionLocationContract createTableSQL],
|
|
47
|
+
@"CREATE INDEX session_recorded_at_idx ON " @LSC_TABLE_NAME @" (" @LSC_COLUMN_NAME_RECORDED_AT @")"
|
|
48
|
+
] componentsJoinedByString:@";"];
|
|
49
|
+
if (![database executeStatements:sql]) {
|
|
50
|
+
NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
|
|
51
|
+
}
|
|
52
|
+
}];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (void) onDowngrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
|
|
56
|
+
{
|
|
57
|
+
NSLog(@"Downgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
|
|
58
|
+
|
|
59
|
+
NSString *sql = [@[
|
|
60
|
+
@"DROP TABLE IF EXISTS " @LC_TABLE_NAME,
|
|
61
|
+
@"DROP TABLE IF EXISTS " @LSC_TABLE_NAME
|
|
62
|
+
] componentsJoinedByString:@";"];
|
|
63
|
+
|
|
64
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
65
|
+
if (![database executeStatements:sql]) {
|
|
66
|
+
NSLog(@"Db downgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
|
|
67
|
+
} else {
|
|
68
|
+
[self onCreate:queue];
|
|
69
|
+
}
|
|
70
|
+
}];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
- (void) onUpgrade:(FMDatabaseQueue*)queue fromVersion:(NSInteger)oldVersion toVersion:(NSInteger)newVersion
|
|
74
|
+
{
|
|
75
|
+
NSLog(@"Upgrading geolocation db oldVersion: %ld, newVersion: %ld", oldVersion, newVersion);
|
|
76
|
+
NSMutableArray *sql = [[NSMutableArray alloc] init];
|
|
77
|
+
|
|
78
|
+
switch (oldVersion) {
|
|
79
|
+
case 1:
|
|
80
|
+
[sql addObjectsFromArray: @[
|
|
81
|
+
@"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_RECORDED_AT @" INTEGER",
|
|
82
|
+
@"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_RECORDED_AT @" =" @LC_COLUMN_NAME_TIME,
|
|
83
|
+
@"CREATE INDEX recorded_at_idx ON " @LC_TABLE_NAME @" (" @LC_COLUMN_NAME_RECORDED_AT @")",
|
|
84
|
+
@"DROP INDEX IF EXISTS time_idx"
|
|
85
|
+
]];
|
|
86
|
+
case 2:
|
|
87
|
+
[sql addObjectsFromArray: @[
|
|
88
|
+
[MAURConfigurationContract createTableSQL]
|
|
89
|
+
]];
|
|
90
|
+
case 3:
|
|
91
|
+
[sql addObjectsFromArray: @[
|
|
92
|
+
[NSString stringWithFormat:@"ALTER TABLE %s ADD COLUMN %s INTEGER", CC_TABLE_NAME, CC_COLUMN_NAME_SYNC_ENABLED]
|
|
93
|
+
]];
|
|
94
|
+
case 4:
|
|
95
|
+
[sql addObjectsFromArray: @[
|
|
96
|
+
[MAURSessionLocationContract createTableSQL],
|
|
97
|
+
[NSString stringWithFormat:@"CREATE INDEX session_recorded_at_idx ON %@ (%@)", @LSC_TABLE_NAME, @LSC_COLUMN_NAME_RECORDED_AT]
|
|
98
|
+
]];
|
|
99
|
+
case 5:
|
|
100
|
+
// v4.5.0: persist driving events / battery / charging on locations.
|
|
101
|
+
[sql addObjectsFromArray: @[
|
|
102
|
+
@"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_EVENTS_JSON @" TEXT",
|
|
103
|
+
@"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_BATTERY_LEVEL @" INTEGER",
|
|
104
|
+
@"ALTER TABLE " @LC_TABLE_NAME @" ADD COLUMN " @LC_COLUMN_NAME_IS_CHARGING @" INTEGER"
|
|
105
|
+
]];
|
|
106
|
+
case 6:
|
|
107
|
+
// v4.5.0: full config persisted as JSON blob (paridad con Android config_json).
|
|
108
|
+
[sql addObjectsFromArray: @[
|
|
109
|
+
[NSString stringWithFormat:@"ALTER TABLE %s ADD COLUMN %s TEXT", CC_TABLE_NAME, CC_COLUMN_NAME_CONFIG_JSON]
|
|
110
|
+
]];
|
|
111
|
+
break; // break only for previous db version (cascade statements)
|
|
112
|
+
default:
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
[queue inDatabase:^(FMDatabase *database) {
|
|
117
|
+
NSString *stmt = [sql componentsJoinedByString:@";"];
|
|
118
|
+
if (![database executeStatements:stmt]) {
|
|
119
|
+
NSLog(@"Db upgrade failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
|
|
120
|
+
}
|
|
121
|
+
}];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURLocation.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 10/06/16.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#ifndef MAURLocation_h
|
|
9
|
+
#define MAURLocation_h
|
|
10
|
+
|
|
11
|
+
#import <Foundation/Foundation.h>
|
|
12
|
+
#import <CoreLocation/CoreLocation.h>
|
|
13
|
+
|
|
14
|
+
@class MAURLocation;
|
|
15
|
+
|
|
16
|
+
typedef MAURLocation * _Nullable (^ MAURLocationTransform)(MAURLocation * _Nonnull location);
|
|
17
|
+
|
|
18
|
+
typedef NS_ENUM(NSInteger, MAURLocationStatus) {
|
|
19
|
+
MAURLocationDeleted = 0,
|
|
20
|
+
MAURLocationPostPending = 1,
|
|
21
|
+
MAURLocationSyncPending = 2,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
@interface MAURLocation : NSObject <NSCopying>
|
|
25
|
+
|
|
26
|
+
@property (nonatomic, retain) NSNumber *locationId;
|
|
27
|
+
@property (nonatomic, retain) NSDate *time;
|
|
28
|
+
@property (nonatomic, retain) NSNumber *accuracy;
|
|
29
|
+
@property (nonatomic, retain) NSNumber *altitudeAccuracy;
|
|
30
|
+
@property (nonatomic, retain) NSNumber *speed;
|
|
31
|
+
@property (nonatomic, retain) NSNumber *heading;
|
|
32
|
+
@property (nonatomic, retain) NSNumber *altitude;
|
|
33
|
+
@property (nonatomic, retain) NSNumber *latitude;
|
|
34
|
+
@property (nonatomic, retain) NSNumber *longitude;
|
|
35
|
+
@property (nonatomic, retain) NSString *provider;
|
|
36
|
+
@property (nonatomic, retain) NSNumber *locationProvider;
|
|
37
|
+
@property (nonatomic, retain) NSNumber *radius; //only for stationary locations
|
|
38
|
+
@property (nonatomic) BOOL isValid;
|
|
39
|
+
@property (nonatomic, retain) NSDate *recordedAt;
|
|
40
|
+
/** True if location was simulated by software (e.g. Simulator). iOS 15+. */
|
|
41
|
+
@property (nonatomic, retain) NSNumber *simulated;
|
|
42
|
+
/**
|
|
43
|
+
* v4.3 — Driving events anexados a este fix.
|
|
44
|
+
* v4.5: persiste en SQLite (events_json TEXT) — sobrevive a la cola de sync.
|
|
45
|
+
* Cada elemento es un NSDictionary con al menos { "type": NSString, "time": NSNumber }.
|
|
46
|
+
*/
|
|
47
|
+
@property (nonatomic, retain) NSMutableArray *drivingEvents;
|
|
48
|
+
/** v4.4 — Battery percentage (0-100) at the time of this fix.
|
|
49
|
+
* v4.5: persisted in SQLite (battery_level INTEGER). */
|
|
50
|
+
@property (nonatomic, retain) NSNumber *batteryLevel;
|
|
51
|
+
/** v4.4 — Whether the device is charging at the time of this fix.
|
|
52
|
+
* v4.5: persisted in SQLite (is_charging INTEGER). */
|
|
53
|
+
@property (nonatomic, retain) NSNumber *isCharging;
|
|
54
|
+
|
|
55
|
+
+ (instancetype) fromCLLocation:(CLLocation*)location;
|
|
56
|
+
+ (NSTimeInterval) locationAge:(CLLocation*)location;
|
|
57
|
+
+ (NSMutableDictionary*) toDictionary:(CLLocation*)location;
|
|
58
|
+
- (NSTimeInterval) locationAge;
|
|
59
|
+
- (NSDictionary*) toDictionary;
|
|
60
|
+
- (NSDictionary*) toDictionaryWithId;
|
|
61
|
+
- (id) toResultFromTemplate:(id)locationTemplate;
|
|
62
|
+
- (CLLocationCoordinate2D) coordinate;
|
|
63
|
+
- (BOOL) hasAccuracy;
|
|
64
|
+
- (BOOL) hasTime;
|
|
65
|
+
- (double) distanceFromLocation:(MAURLocation*)location;
|
|
66
|
+
- (BOOL) isBetterLocation:(MAURLocation*)location;
|
|
67
|
+
- (BOOL) isBeyond:(MAURLocation*)location radius:(NSInteger)radius;
|
|
68
|
+
- (id) copyWithZone: (NSZone *)zone;
|
|
69
|
+
- (id) getValueForKey:(id)key;
|
|
70
|
+
|
|
71
|
+
@end
|
|
72
|
+
|
|
73
|
+
#endif /* MAURLocation_h */
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURLocation.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 10/06/16.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <Foundation/Foundation.h>
|
|
9
|
+
#import <CoreLocation/CoreLocation.h>
|
|
10
|
+
#import "MAURLocation.h"
|
|
11
|
+
|
|
12
|
+
enum {
|
|
13
|
+
TWO_MINUTES = 120,
|
|
14
|
+
MAX_SECONDS_FROM_NOW = 86400
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
@interface MAURLocationMapper : NSObject
|
|
18
|
+
- (NSDictionary*) withDictionary:(NSDictionary*)values;
|
|
19
|
+
- (NSArray*) withArray:(NSArray*)values;
|
|
20
|
+
+ (instancetype) map:(MAURLocation*)location;
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
// v4.5.1 — _location was previously a file-scope global. With real-time post (background queue)
|
|
24
|
+
// and background sync (NSURLSession queue) running concurrently, the second [+map:] invocation
|
|
25
|
+
// overwrote _location while the first mapper was mid-serialize, producing mixed location fields
|
|
26
|
+
// at the backend. Now per-instance ivar.
|
|
27
|
+
@implementation MAURLocationMapper {
|
|
28
|
+
MAURLocation *_location;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
- (id) mapValue:(id)value
|
|
32
|
+
{
|
|
33
|
+
if ([value isKindOfClass:[NSString class]]) {
|
|
34
|
+
id locationValue = [_location getValueForKey:value];
|
|
35
|
+
// v4.5.1 — for placeholder keys ("@time", "@events", "@battery", ...), if the location
|
|
36
|
+
// has no value, return NSNull instead of leaking the literal "@events" string to the
|
|
37
|
+
// backend. For non-placeholder static strings (e.g. a `deviceId` literal in postTemplate)
|
|
38
|
+
// keep the previous behaviour and return the string as-is.
|
|
39
|
+
if ([value hasPrefix:@"@"]) {
|
|
40
|
+
return locationValue != nil ? locationValue : [NSNull null];
|
|
41
|
+
}
|
|
42
|
+
return locationValue != nil ? locationValue : value;
|
|
43
|
+
} else if ([value isKindOfClass:[NSDictionary class]]) {
|
|
44
|
+
return [self withDictionary:value];
|
|
45
|
+
} else if ([value isKindOfClass:[NSArray class]]) {
|
|
46
|
+
return [self withArray:value];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
- (NSDictionary*) withDictionary:(NSDictionary*)values
|
|
53
|
+
{
|
|
54
|
+
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:values.count];
|
|
55
|
+
|
|
56
|
+
for (id key in values) {
|
|
57
|
+
id value = [values objectForKey:key];
|
|
58
|
+
[dict setObject:[self mapValue:value] forKey:key];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return dict;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
- (NSArray*) withArray:(NSArray*)values
|
|
65
|
+
{
|
|
66
|
+
NSMutableArray *locationArray = [[NSMutableArray alloc] initWithCapacity:values.count];
|
|
67
|
+
|
|
68
|
+
for (id value in values) {
|
|
69
|
+
[locationArray addObject:[self mapValue:value]];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return locationArray;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
+ (instancetype) map:(MAURLocation*)location
|
|
76
|
+
{
|
|
77
|
+
MAURLocationMapper *instance = [[MAURLocationMapper alloc] init];
|
|
78
|
+
instance->_location = location;
|
|
79
|
+
return instance;
|
|
80
|
+
}
|
|
81
|
+
@end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@implementation MAURLocation
|
|
85
|
+
|
|
86
|
+
@synthesize locationId, time, accuracy, altitudeAccuracy, speed, heading, altitude, latitude, longitude, provider, locationProvider, radius, isValid, recordedAt, simulated, drivingEvents, batteryLevel, isCharging;
|
|
87
|
+
|
|
88
|
+
+ (instancetype) fromCLLocation:(CLLocation*)location;
|
|
89
|
+
{
|
|
90
|
+
MAURLocation *instance = [[MAURLocation alloc] init];
|
|
91
|
+
|
|
92
|
+
instance.time = location.timestamp;
|
|
93
|
+
instance.accuracy = [NSNumber numberWithDouble:location.horizontalAccuracy];
|
|
94
|
+
instance.altitudeAccuracy = [NSNumber numberWithDouble:location.verticalAccuracy];
|
|
95
|
+
instance.speed = [NSNumber numberWithDouble:location.speed];
|
|
96
|
+
instance.heading = [NSNumber numberWithDouble:location.course]; // will be deprecated
|
|
97
|
+
instance.altitude = [NSNumber numberWithDouble:location.altitude];
|
|
98
|
+
instance.latitude = [NSNumber numberWithDouble:location.coordinate.latitude];
|
|
99
|
+
instance.longitude = [NSNumber numberWithDouble:location.coordinate.longitude];
|
|
100
|
+
|
|
101
|
+
if (@available(iOS 15.0, *)) {
|
|
102
|
+
if (location.sourceInformation != nil && location.sourceInformation.isSimulatedBySoftware) {
|
|
103
|
+
instance.simulated = @YES;
|
|
104
|
+
} else {
|
|
105
|
+
instance.simulated = @NO;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return instance;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
+ (NSTimeInterval) locationAge:(CLLocation*)location
|
|
113
|
+
{
|
|
114
|
+
return -[location.timestamp timeIntervalSinceNow];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
+ (NSDictionary*) toDictionary:(CLLocation*)location;
|
|
118
|
+
{
|
|
119
|
+
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
|
|
120
|
+
|
|
121
|
+
NSNumber* timestamp = [NSNumber numberWithDouble:([location.timestamp timeIntervalSince1970] * 1000)];
|
|
122
|
+
[dict setObject:timestamp forKey:@"time"];
|
|
123
|
+
[dict setObject:[NSNumber numberWithDouble:location.horizontalAccuracy] forKey:@"accuracy"];
|
|
124
|
+
[dict setObject:[NSNumber numberWithDouble:location.verticalAccuracy] forKey:@"altitudeAccuracy"];
|
|
125
|
+
[dict setObject:[NSNumber numberWithDouble:location.speed] forKey:@"speed"];
|
|
126
|
+
[dict setObject:[NSNumber numberWithDouble:location.course] forKey:@"heading"];
|
|
127
|
+
[dict setObject:[NSNumber numberWithDouble:location.course] forKey:@"bearing"];
|
|
128
|
+
[dict setObject:[NSNumber numberWithDouble:location.altitude] forKey:@"altitude"];
|
|
129
|
+
[dict setObject:[NSNumber numberWithDouble:location.coordinate.latitude] forKey:@"latitude"];
|
|
130
|
+
[dict setObject:[NSNumber numberWithDouble:location.coordinate.longitude] forKey:@"longitude"];
|
|
131
|
+
|
|
132
|
+
return dict;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
- (instancetype) init
|
|
136
|
+
{
|
|
137
|
+
self = [super init];
|
|
138
|
+
if (self != nil) {
|
|
139
|
+
[self commonInit];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return self;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
- (void) commonInit
|
|
146
|
+
{
|
|
147
|
+
isValid = true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* Age of location measured from now in seconds
|
|
152
|
+
*
|
|
153
|
+
*/
|
|
154
|
+
- (NSTimeInterval) locationAge
|
|
155
|
+
{
|
|
156
|
+
return -[time timeIntervalSinceNow];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
- (NSDictionary*) toDictionaryWithId
|
|
160
|
+
{
|
|
161
|
+
NSMutableDictionary *dict = (NSMutableDictionary*)[self toDictionary];
|
|
162
|
+
|
|
163
|
+
// locationId is solely for internal purposes like deleteLocation method!!!
|
|
164
|
+
if (locationId != nil) [dict setObject:locationId forKey:@"id"];
|
|
165
|
+
|
|
166
|
+
return dict;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
- (NSMutableDictionary*) toDictionary
|
|
170
|
+
{
|
|
171
|
+
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:13];
|
|
172
|
+
|
|
173
|
+
if (time != nil) [dict setObject:[NSNumber numberWithDouble:([time timeIntervalSince1970] * 1000)] forKey:@"time"];
|
|
174
|
+
if (accuracy != nil) [dict setObject:accuracy forKey:@"accuracy"];
|
|
175
|
+
if (altitudeAccuracy != nil) [dict setObject:altitudeAccuracy forKey:@"altitudeAccuracy"];
|
|
176
|
+
if (speed != nil) [dict setObject:speed forKey:@"speed"];
|
|
177
|
+
if (heading != nil) [dict setObject:heading forKey:@"heading"]; // @deprecated
|
|
178
|
+
if (heading != nil) [dict setObject:heading forKey:@"bearing"];
|
|
179
|
+
if (altitude != nil) [dict setObject:altitude forKey:@"altitude"];
|
|
180
|
+
if (latitude != nil) [dict setObject:latitude forKey:@"latitude"];
|
|
181
|
+
if (longitude != nil) [dict setObject:longitude forKey:@"longitude"];
|
|
182
|
+
if (provider != nil) [dict setObject:provider forKey:@"provider"];
|
|
183
|
+
if (locationProvider != nil) [dict setObject:locationProvider forKey:@"locationProvider"];
|
|
184
|
+
if (radius != nil) [dict setObject:radius forKey:@"radius"];
|
|
185
|
+
if (recordedAt != nil) [dict setObject:[NSNumber numberWithDouble:([recordedAt timeIntervalSince1970] * 1000)] forKey:@"recordedAt"];
|
|
186
|
+
if (simulated != nil) [dict setObject:simulated forKey:@"simulated"];
|
|
187
|
+
// v4.3 — driving events anexados a este fix
|
|
188
|
+
if (drivingEvents != nil && [drivingEvents count] > 0) [dict setObject:drivingEvents forKey:@"events"];
|
|
189
|
+
// v4.4 — battery snapshot
|
|
190
|
+
if (batteryLevel != nil) [dict setObject:batteryLevel forKey:@"battery"];
|
|
191
|
+
if (isCharging != nil) [dict setObject:isCharging forKey:@"isCharging"];
|
|
192
|
+
|
|
193
|
+
return dict;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
- (id) getValueForKey:(id)key
|
|
197
|
+
{
|
|
198
|
+
if (key == nil || ![key isKindOfClass:[NSString class]]) {
|
|
199
|
+
return nil;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if ([key isEqualToString:@"@id"]) {
|
|
203
|
+
return locationId;
|
|
204
|
+
}
|
|
205
|
+
if ([key isEqualToString:@"@time"]) {
|
|
206
|
+
return [NSNumber numberWithDouble:([time timeIntervalSince1970] * 1000)];
|
|
207
|
+
}
|
|
208
|
+
if ([key isEqualToString:@"@accuracy"]) {
|
|
209
|
+
return accuracy;
|
|
210
|
+
}
|
|
211
|
+
if ([key isEqualToString:@"@altitudeAccuracy"]) {
|
|
212
|
+
return altitudeAccuracy;
|
|
213
|
+
}
|
|
214
|
+
if ([key isEqualToString:@"@speed"]) {
|
|
215
|
+
return speed;
|
|
216
|
+
}
|
|
217
|
+
if ([key isEqualToString:@"@heading"]) {
|
|
218
|
+
return heading;
|
|
219
|
+
}
|
|
220
|
+
if ([key isEqualToString:@"@bearing"]) {
|
|
221
|
+
return heading;
|
|
222
|
+
}
|
|
223
|
+
if ([key isEqualToString:@"@altitude"]) {
|
|
224
|
+
return altitude;
|
|
225
|
+
}
|
|
226
|
+
if ([key isEqualToString:@"@latitude"]) {
|
|
227
|
+
return latitude;
|
|
228
|
+
}
|
|
229
|
+
if ([key isEqualToString:@"@longitude"]) {
|
|
230
|
+
return longitude;
|
|
231
|
+
}
|
|
232
|
+
if ([key isEqualToString:@"@provider"]) {
|
|
233
|
+
return provider;
|
|
234
|
+
}
|
|
235
|
+
if ([key isEqualToString:@"@locationProvider"]) {
|
|
236
|
+
return locationProvider;
|
|
237
|
+
}
|
|
238
|
+
if ([key isEqualToString:@"@radius"]) {
|
|
239
|
+
return radius;
|
|
240
|
+
}
|
|
241
|
+
if ([key isEqualToString:@"@recordedAt"]) {
|
|
242
|
+
return [NSNumber numberWithDouble:([recordedAt timeIntervalSince1970] * 1000)];
|
|
243
|
+
}
|
|
244
|
+
if ([key isEqualToString:@"@simulated"]) {
|
|
245
|
+
return simulated;
|
|
246
|
+
}
|
|
247
|
+
// v4.3 — driving events array (nil when no events on this fix; mapper drops nil keys).
|
|
248
|
+
if ([key isEqualToString:@"@events"]) {
|
|
249
|
+
return (drivingEvents != nil && [drivingEvents count] > 0) ? drivingEvents : nil;
|
|
250
|
+
}
|
|
251
|
+
// v4.4 — battery snapshot
|
|
252
|
+
if ([key isEqualToString:@"@battery"]) return batteryLevel;
|
|
253
|
+
if ([key isEqualToString:@"@isCharging"]) return isCharging;
|
|
254
|
+
|
|
255
|
+
return nil;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
- (id) toResultFromTemplate:(id)locationTemplate
|
|
259
|
+
{
|
|
260
|
+
if ([locationTemplate isKindOfClass:[NSArray class]]) {
|
|
261
|
+
MAURLocationMapper *mapper = [MAURLocationMapper map:self];
|
|
262
|
+
return [mapper withArray:locationTemplate];
|
|
263
|
+
} else if ([locationTemplate isKindOfClass:[NSDictionary class]]) {
|
|
264
|
+
MAURLocationMapper *mapper = [MAURLocationMapper map:self];
|
|
265
|
+
return [mapper withDictionary:locationTemplate];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return [self toDictionary];
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
- (CLLocationCoordinate2D) coordinate
|
|
272
|
+
{
|
|
273
|
+
CLLocationCoordinate2D coordinate;
|
|
274
|
+
coordinate.latitude = [latitude doubleValue];
|
|
275
|
+
coordinate.longitude = [longitude doubleValue];
|
|
276
|
+
return coordinate;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
- (double) distanceFromLocation:(MAURLocation*)location
|
|
280
|
+
{
|
|
281
|
+
const float EarthRadius = 6378137.0f;
|
|
282
|
+
double a_lat = [self.latitude doubleValue];
|
|
283
|
+
double a_lon = [self.longitude doubleValue];
|
|
284
|
+
double b_lat = [location.latitude doubleValue];
|
|
285
|
+
double b_lon = [location.longitude doubleValue];
|
|
286
|
+
double dtheta = (a_lat - b_lat) * (M_PI / 180.0);
|
|
287
|
+
double dlambda = (a_lon - b_lon) * (M_PI / 180.0);
|
|
288
|
+
double mean_t = (a_lat + b_lat) * (M_PI / 180.0) / 2.0;
|
|
289
|
+
double cos_meant = cosf(mean_t);
|
|
290
|
+
|
|
291
|
+
return sqrtf((EarthRadius * EarthRadius) * (dtheta * dtheta + cos_meant * cos_meant * dlambda * dlambda));
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Determines whether instance is better then Location reading
|
|
296
|
+
* @param location The new Location that you want to evaluate
|
|
297
|
+
* Note: code taken from https://developer.android.com/guide/topics/location/strategies.html
|
|
298
|
+
*/
|
|
299
|
+
- (BOOL) isBetterLocation:(MAURLocation*)location
|
|
300
|
+
{
|
|
301
|
+
if (location == nil) {
|
|
302
|
+
// A instance location is always better than no location
|
|
303
|
+
return NO;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Check whether the new location fix is newer or older
|
|
307
|
+
NSTimeInterval timeDelta = [self.time timeIntervalSinceDate:location.time];
|
|
308
|
+
BOOL isSignificantlyNewer = timeDelta > TWO_MINUTES;
|
|
309
|
+
BOOL isSignificantlyOlder = timeDelta < -TWO_MINUTES;
|
|
310
|
+
BOOL isNewer = timeDelta > 0;
|
|
311
|
+
|
|
312
|
+
// If it's been more than two minutes since the current location, use the new location
|
|
313
|
+
// because the user has likely moved
|
|
314
|
+
if (isSignificantlyNewer) {
|
|
315
|
+
return YES;
|
|
316
|
+
// If the new location is more than two minutes older, it must be worse
|
|
317
|
+
} else if (isSignificantlyOlder) {
|
|
318
|
+
return NO;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Check whether the new location fix is more or less accurate
|
|
322
|
+
NSInteger accuracyDelta = [self.accuracy integerValue] - [location.accuracy integerValue];
|
|
323
|
+
BOOL isLessAccurate = accuracyDelta > 0;
|
|
324
|
+
BOOL isMoreAccurate = accuracyDelta < 0;
|
|
325
|
+
BOOL isSignificantlyLessAccurate = accuracyDelta > 200;
|
|
326
|
+
|
|
327
|
+
// Check if the old and new location are from the same provider
|
|
328
|
+
BOOL isFromSameProvider = YES; //TODO: check
|
|
329
|
+
|
|
330
|
+
// Determine location quality using a combination of timeliness and accuracy
|
|
331
|
+
if (isMoreAccurate) {
|
|
332
|
+
return YES;
|
|
333
|
+
} else if (isNewer && !isLessAccurate) {
|
|
334
|
+
return YES;
|
|
335
|
+
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
|
|
336
|
+
return YES;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return NO;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
- (BOOL) isBeyond:(MAURLocation*)location radius:(NSInteger)definedRadius
|
|
343
|
+
{
|
|
344
|
+
double pointDistance = [self distanceFromLocation:location];
|
|
345
|
+
return (pointDistance - [self.accuracy doubleValue] - [location.accuracy doubleValue]) > definedRadius;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
- (BOOL) hasAccuracy
|
|
349
|
+
{
|
|
350
|
+
if (accuracy == nil || accuracy < 0) return NO;
|
|
351
|
+
return YES;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
- (BOOL) hasTime
|
|
355
|
+
{
|
|
356
|
+
if (time != nil && [time timeIntervalSinceNow] > MAX_SECONDS_FROM_NOW) return NO;
|
|
357
|
+
return YES;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
- (NSString *) description
|
|
361
|
+
{
|
|
362
|
+
return [NSString stringWithFormat:@"Location: id=%@ time=%@ lat=%@ lon=%@ accu=%@ aaccu=%@ speed=%@ bear=%@ alt=%@", locationId, time, latitude, longitude, accuracy, altitudeAccuracy, speed, heading, altitude];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
-(id) copyWithZone: (NSZone *) zone
|
|
366
|
+
{
|
|
367
|
+
MAURLocation *copy = [[[self class] allocWithZone: zone] init];
|
|
368
|
+
if (copy) {
|
|
369
|
+
copy.time = time;
|
|
370
|
+
copy.accuracy = accuracy;
|
|
371
|
+
copy.altitudeAccuracy = altitudeAccuracy;
|
|
372
|
+
copy.speed = speed;
|
|
373
|
+
copy.heading = heading;
|
|
374
|
+
copy.altitude = altitude;
|
|
375
|
+
copy.latitude = latitude;
|
|
376
|
+
copy.longitude = longitude;
|
|
377
|
+
copy.provider = provider;
|
|
378
|
+
copy.locationProvider = locationProvider;
|
|
379
|
+
copy.radius = radius;
|
|
380
|
+
copy.isValid = isValid;
|
|
381
|
+
copy.simulated = simulated;
|
|
382
|
+
// v4.3: copy driving events array reference (transient; mutating one affects the other,
|
|
383
|
+
// but in practice the original is discarded right after the copy is posted).
|
|
384
|
+
copy.drivingEvents = drivingEvents != nil ? [drivingEvents mutableCopy] : nil;
|
|
385
|
+
copy.batteryLevel = batteryLevel;
|
|
386
|
+
copy.isCharging = isCharging;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return copy;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
@end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURLocationContract.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 23/06/16.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#ifndef MAURLocationContract_h
|
|
10
|
+
#define MAURLocationContract_h
|
|
11
|
+
|
|
12
|
+
#define LC_TABLE_NAME "location"
|
|
13
|
+
#define LC_COLUMN_NAME_ID "id"
|
|
14
|
+
#define LC_COLUMN_NAME_NULLABLE "NULLHACK"
|
|
15
|
+
#define LC_COLUMN_NAME_TIME "time"
|
|
16
|
+
#define LC_COLUMN_NAME_ACCURACY "accuracy"
|
|
17
|
+
#define LC_COLUMN_NAME_SPEED "speed"
|
|
18
|
+
#define LC_COLUMN_NAME_BEARING "bearing"
|
|
19
|
+
#define LC_COLUMN_NAME_ALTITUDE "altitude"
|
|
20
|
+
#define LC_COLUMN_NAME_LATITUDE "latitude"
|
|
21
|
+
#define LC_COLUMN_NAME_LONGITUDE "longitude"
|
|
22
|
+
#define LC_COLUMN_NAME_PROVIDER "provider"
|
|
23
|
+
#define LC_COLUMN_NAME_LOCATION_PROVIDER "service_provider"
|
|
24
|
+
#define LC_COLUMN_NAME_STATUS "valid"
|
|
25
|
+
#define LC_COLUMN_NAME_RECORDED_AT "recorded_at"
|
|
26
|
+
// v4.5 — survive sync queue
|
|
27
|
+
#define LC_COLUMN_NAME_EVENTS_JSON "events_json"
|
|
28
|
+
#define LC_COLUMN_NAME_BATTERY_LEVEL "battery_level"
|
|
29
|
+
#define LC_COLUMN_NAME_IS_CHARGING "is_charging"
|
|
30
|
+
|
|
31
|
+
@interface MAURLocationContract : NSObject
|
|
32
|
+
|
|
33
|
+
+ (NSString*) createTableSQL;
|
|
34
|
+
|
|
35
|
+
@end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#endif /* MAURLocationContract_h */
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURLocationContract.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 23/06/16.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
#import "MAURSQLiteHelper.h"
|
|
11
|
+
#import "MAURLocationContract.h"
|
|
12
|
+
|
|
13
|
+
@implementation MAURLocationContract
|
|
14
|
+
|
|
15
|
+
+ (NSString*) createTableSQL
|
|
16
|
+
{
|
|
17
|
+
NSArray *columns = @[
|
|
18
|
+
@{ @"name": @LC_COLUMN_NAME_ID, @"type": [SQLPrimaryKeyAutoIncColumnType sqlColumnWithType: kInteger]},
|
|
19
|
+
@{ @"name": @LC_COLUMN_NAME_TIME, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
20
|
+
@{ @"name": @LC_COLUMN_NAME_ACCURACY, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
21
|
+
@{ @"name": @LC_COLUMN_NAME_SPEED, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
22
|
+
@{ @"name": @LC_COLUMN_NAME_BEARING, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
23
|
+
@{ @"name": @LC_COLUMN_NAME_ALTITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
24
|
+
@{ @"name": @LC_COLUMN_NAME_LATITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
25
|
+
@{ @"name": @LC_COLUMN_NAME_LONGITUDE, @"type": [SQLColumnType sqlColumnWithType: kReal]},
|
|
26
|
+
@{ @"name": @LC_COLUMN_NAME_PROVIDER, @"type": [SQLColumnType sqlColumnWithType: kText]},
|
|
27
|
+
@{ @"name": @LC_COLUMN_NAME_LOCATION_PROVIDER, @"type": [SQLColumnType sqlColumnWithType: kText]},
|
|
28
|
+
@{ @"name": @LC_COLUMN_NAME_STATUS, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
|
|
29
|
+
@{ @"name": @LC_COLUMN_NAME_RECORDED_AT, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
|
|
30
|
+
// v4.5 — survive sync queue
|
|
31
|
+
@{ @"name": @LC_COLUMN_NAME_EVENTS_JSON, @"type": [SQLColumnType sqlColumnWithType: kText]},
|
|
32
|
+
@{ @"name": @LC_COLUMN_NAME_BATTERY_LEVEL, @"type": [SQLColumnType sqlColumnWithType: kInteger]},
|
|
33
|
+
@{ @"name": @LC_COLUMN_NAME_IS_CHARGING, @"type": [SQLColumnType sqlColumnWithType: kInteger]}
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
return [MAURSQLiteHelper createTableSqlStatement:@LC_TABLE_NAME columns:columns];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@end
|