@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,23 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURActivity.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 13/12/2017.
|
|
6
|
+
// Copyright © 2017 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#ifndef MAURActivity_h
|
|
10
|
+
#define MAURActivity_h
|
|
11
|
+
|
|
12
|
+
#import <Foundation/Foundation.h>
|
|
13
|
+
|
|
14
|
+
@interface MAURActivity : NSObject <NSCopying>
|
|
15
|
+
|
|
16
|
+
@property NSNumber *confidence;
|
|
17
|
+
@property NSString *type;
|
|
18
|
+
|
|
19
|
+
- (NSDictionary*) toDictionary;
|
|
20
|
+
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
#endif /* MAURActivity_h */
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURActivity.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 13/12/2017.
|
|
6
|
+
// Copyright © 2017 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import "MAURActivity.h"
|
|
10
|
+
|
|
11
|
+
@implementation MAURActivity
|
|
12
|
+
|
|
13
|
+
@synthesize type, confidence;
|
|
14
|
+
|
|
15
|
+
- (instancetype) init
|
|
16
|
+
{
|
|
17
|
+
self = [super init];
|
|
18
|
+
if (self != nil) {
|
|
19
|
+
confidence = [NSNumber numberWithInt:0];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return self;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
- (NSDictionary*) toDictionary
|
|
26
|
+
{
|
|
27
|
+
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
|
|
28
|
+
|
|
29
|
+
if (confidence != nil) [dict setObject:confidence forKey:@"confidence"];
|
|
30
|
+
if (type != nil) [dict setObject:type forKey:@"type"];
|
|
31
|
+
|
|
32
|
+
return dict;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (NSString *) description
|
|
36
|
+
{
|
|
37
|
+
return [NSString stringWithFormat:@"Activity: confidence=%@ type=%@", confidence, type];
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
-(id) copyWithZone: (NSZone *) zone
|
|
42
|
+
{
|
|
43
|
+
MAURActivity *copy = [[[self class] allocWithZone: zone] init];
|
|
44
|
+
if (copy) {
|
|
45
|
+
copy.confidence = confidence;
|
|
46
|
+
copy.type = type;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return copy;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURActivityLocationProvider.h
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 14/09/2016.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#ifndef MAURActivityLocationProvider_h
|
|
10
|
+
#define MAURActivityLocationProvider_h
|
|
11
|
+
|
|
12
|
+
#import "MAURAbstractLocationProvider.h"
|
|
13
|
+
|
|
14
|
+
@interface MAURActivityLocationProvider : MAURAbstractLocationProvider<MAURLocationProvider>
|
|
15
|
+
|
|
16
|
+
@end
|
|
17
|
+
|
|
18
|
+
#endif /* MAURActivityLocationProvider_h */
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURActivityLocationProvider.m
|
|
3
|
+
// BackgroundGeolocation
|
|
4
|
+
//
|
|
5
|
+
// Created by Marian Hello on 14/09/2016.
|
|
6
|
+
// Copyright © 2016 mauron85. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
// v4.5.2 — refactored to use CoreMotion's CMMotionActivityManager directly.
|
|
9
|
+
// The SOMotionDetector dependency (sources + plugin.xml entries) was removed
|
|
10
|
+
// in this version.
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
#import <Foundation/Foundation.h>
|
|
14
|
+
#import <CoreMotion/CoreMotion.h>
|
|
15
|
+
#import "MAURActivityLocationProvider.h"
|
|
16
|
+
#import "MAURActivity.h"
|
|
17
|
+
#import "MAURLocationManager.h"
|
|
18
|
+
#import "MAURLogging.h"
|
|
19
|
+
|
|
20
|
+
static NSString * const TAG = @"ActivityLocationProvider";
|
|
21
|
+
static NSString * const Domain = @"com.marianhello";
|
|
22
|
+
|
|
23
|
+
// Local motion-type enum (replaces the legacy SOMotionType used previously).
|
|
24
|
+
typedef NS_ENUM(NSUInteger, MAURMotionType) {
|
|
25
|
+
MAURMotionTypeUnknown = 0,
|
|
26
|
+
MAURMotionTypeNotMoving,
|
|
27
|
+
MAURMotionTypeWalking,
|
|
28
|
+
MAURMotionTypeRunning,
|
|
29
|
+
MAURMotionTypeAutomotive,
|
|
30
|
+
MAURMotionTypeCycling
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
@implementation MAURActivityLocationProvider {
|
|
34
|
+
BOOL isStarted;
|
|
35
|
+
BOOL isTracking;
|
|
36
|
+
BOOL motionAvailable;
|
|
37
|
+
BOOL motionPermissionErrorEmitted;
|
|
38
|
+
MAURMotionType lastMotionType;
|
|
39
|
+
|
|
40
|
+
MAURLocationManager *locationManager;
|
|
41
|
+
CMMotionActivityManager *activityManager;
|
|
42
|
+
NSOperationQueue *activityQueue;
|
|
43
|
+
|
|
44
|
+
// v4.5.2: cache of active config so motion callbacks can read
|
|
45
|
+
// activityConfidenceThreshold without re-fetching.
|
|
46
|
+
MAURConfig *currentConfig;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
- (instancetype) init
|
|
50
|
+
{
|
|
51
|
+
self = [super init];
|
|
52
|
+
|
|
53
|
+
if (self) {
|
|
54
|
+
isStarted = NO;
|
|
55
|
+
isTracking = NO;
|
|
56
|
+
motionAvailable = NO;
|
|
57
|
+
motionPermissionErrorEmitted = NO;
|
|
58
|
+
lastMotionType = MAURMotionTypeUnknown;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return self;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
- (void) onCreate {
|
|
65
|
+
locationManager = [MAURLocationManager sharedInstance];
|
|
66
|
+
locationManager.delegate = self;
|
|
67
|
+
|
|
68
|
+
// v4.5.2 — CoreMotion direct. Without CMMotionActivityManager support the
|
|
69
|
+
// provider cannot drive STILL/ACTIVE transitions; emit a clear error so the
|
|
70
|
+
// host app knows to fall back to DISTANCE_FILTER or RAW.
|
|
71
|
+
motionAvailable = [CMMotionActivityManager isActivityAvailable];
|
|
72
|
+
if (!motionAvailable) {
|
|
73
|
+
DDLogError(@"%@ CMMotionActivityManager unavailable on this device; ACTIVITY_PROVIDER will be inert.", TAG);
|
|
74
|
+
NSError *err = [NSError errorWithDomain:Domain
|
|
75
|
+
code:MAURBGServiceError
|
|
76
|
+
userInfo:@{ NSLocalizedDescriptionKey: @"CMMotionActivityManager unavailable on this device." }];
|
|
77
|
+
if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
|
|
78
|
+
[self.delegate onError:err];
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
activityManager = [[CMMotionActivityManager alloc] init];
|
|
84
|
+
activityQueue = [[NSOperationQueue alloc] init];
|
|
85
|
+
activityQueue.name = @"MAURActivityRecognitionQueue";
|
|
86
|
+
activityQueue.maxConcurrentOperationCount = 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
- (BOOL) onConfigure:(MAURConfig*)config error:(NSError * __autoreleasing *)outError
|
|
90
|
+
{
|
|
91
|
+
DDLogVerbose(@"%@ configure", TAG);
|
|
92
|
+
|
|
93
|
+
currentConfig = config;
|
|
94
|
+
|
|
95
|
+
locationManager.pausesLocationUpdatesAutomatically = [config pauseLocationUpdates];
|
|
96
|
+
locationManager.activityType = [config decodeActivityType];
|
|
97
|
+
locationManager.distanceFilter = config.distanceFilter.integerValue; // meters
|
|
98
|
+
locationManager.desiredAccuracy = [config decodeDesiredAccuracy];
|
|
99
|
+
|
|
100
|
+
return YES;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
- (BOOL) onStart:(NSError * __autoreleasing *)outError
|
|
104
|
+
{
|
|
105
|
+
DDLogInfo(@"%@ will start", TAG);
|
|
106
|
+
|
|
107
|
+
if (isStarted) {
|
|
108
|
+
return YES;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!motionAvailable || activityManager == nil) {
|
|
112
|
+
// No motion service: degrade gracefully — keep emitting raw location
|
|
113
|
+
// changes via the manager, but the STILL/ACTIVE state machine is off.
|
|
114
|
+
[self startTracking];
|
|
115
|
+
isStarted = YES;
|
|
116
|
+
return YES;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// iOS 11+: surface motion-permission denial up-front so the host app can
|
|
120
|
+
// re-prompt. Older iOS versions deliver permission errors via the handler.
|
|
121
|
+
if (@available(iOS 11.0, *)) {
|
|
122
|
+
CMAuthorizationStatus authStatus = [CMMotionActivityManager authorizationStatus];
|
|
123
|
+
if (authStatus == CMAuthorizationStatusDenied || authStatus == CMAuthorizationStatusRestricted) {
|
|
124
|
+
if (!motionPermissionErrorEmitted) {
|
|
125
|
+
NSError *err = [NSError errorWithDomain:Domain
|
|
126
|
+
code:MAURBGServiceError
|
|
127
|
+
userInfo:@{ NSLocalizedDescriptionKey: @"Motion & Fitness permission denied; ACTIVITY_PROVIDER cannot detect STILL/ACTIVE." }];
|
|
128
|
+
if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
|
|
129
|
+
[self.delegate onError:err];
|
|
130
|
+
}
|
|
131
|
+
motionPermissionErrorEmitted = YES;
|
|
132
|
+
}
|
|
133
|
+
// Still start raw tracking so locations flow.
|
|
134
|
+
[self startTracking];
|
|
135
|
+
isStarted = YES;
|
|
136
|
+
return YES;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
__weak typeof(self) weakSelf = self;
|
|
141
|
+
[activityManager startActivityUpdatesToQueue:activityQueue
|
|
142
|
+
withHandler:^(CMMotionActivity * _Nullable activity) {
|
|
143
|
+
typeof(self) strongSelf = weakSelf;
|
|
144
|
+
if (strongSelf == nil || activity == nil) return;
|
|
145
|
+
[strongSelf handleActivityUpdate:activity];
|
|
146
|
+
}];
|
|
147
|
+
|
|
148
|
+
// v4.5.2 — start tracking immediately. Without this, if the user opens the
|
|
149
|
+
// app while already still, CoreMotion fires STILL first and `handleActivityUpdate`
|
|
150
|
+
// never calls startTracking (its rule is "ACTIVE → start"), so no fix is ever
|
|
151
|
+
// produced and the initial stationary is never emitted. Mirrors the legacy
|
|
152
|
+
// SOMotionDetector behavior. If CoreMotion subsequently confirms STILL, the
|
|
153
|
+
// first incoming fix will trigger `onStationaryChanged` + `stopTracking`, so
|
|
154
|
+
// battery cost stays bounded.
|
|
155
|
+
[self startTracking];
|
|
156
|
+
|
|
157
|
+
isStarted = YES;
|
|
158
|
+
return YES;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
- (BOOL) onStop:(NSError * __autoreleasing *)outError
|
|
162
|
+
{
|
|
163
|
+
DDLogInfo(@"%@ will stop", TAG);
|
|
164
|
+
|
|
165
|
+
if (!isStarted) {
|
|
166
|
+
return YES;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (activityManager != nil) {
|
|
170
|
+
[activityManager stopActivityUpdates];
|
|
171
|
+
}
|
|
172
|
+
[self stopTracking];
|
|
173
|
+
isStarted = NO;
|
|
174
|
+
|
|
175
|
+
return YES;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
#pragma mark - CMMotionActivity → MAURActivity bridge
|
|
179
|
+
|
|
180
|
+
- (void) handleActivityUpdate:(CMMotionActivity *)activity
|
|
181
|
+
{
|
|
182
|
+
// CMMotionActivityConfidence: Low=0, Medium=1, High=2 → normalize to 0-100
|
|
183
|
+
// so activityConfidenceThreshold means the same thing as on Android.
|
|
184
|
+
int confidence;
|
|
185
|
+
switch (activity.confidence) {
|
|
186
|
+
case CMMotionActivityConfidenceLow: confidence = 20; break;
|
|
187
|
+
case CMMotionActivityConfidenceMedium: confidence = 40; break;
|
|
188
|
+
case CMMotionActivityConfidenceHigh: confidence = 80; break;
|
|
189
|
+
default: confidence = 0; break;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
NSNumber *thresholdN = currentConfig.activityConfidenceThreshold;
|
|
193
|
+
if (thresholdN != nil && confidence < thresholdN.intValue) {
|
|
194
|
+
DDLogDebug(@"%@ ignoring low-confidence activity confidence=%d threshold=%@", TAG, confidence, thresholdN);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
MAURMotionType motionType;
|
|
199
|
+
NSString *typeStr;
|
|
200
|
+
if (activity.automotive) {
|
|
201
|
+
motionType = MAURMotionTypeAutomotive;
|
|
202
|
+
typeStr = @"IN_VEHICLE";
|
|
203
|
+
} else if (activity.cycling) {
|
|
204
|
+
motionType = MAURMotionTypeCycling;
|
|
205
|
+
typeStr = @"ON_BICYCLE";
|
|
206
|
+
} else if (activity.running) {
|
|
207
|
+
motionType = MAURMotionTypeRunning;
|
|
208
|
+
typeStr = @"RUNNING";
|
|
209
|
+
} else if (activity.walking) {
|
|
210
|
+
motionType = MAURMotionTypeWalking;
|
|
211
|
+
typeStr = @"WALKING";
|
|
212
|
+
} else if (activity.stationary) {
|
|
213
|
+
motionType = MAURMotionTypeNotMoving;
|
|
214
|
+
typeStr = @"STILL";
|
|
215
|
+
} else {
|
|
216
|
+
// CoreMotion fired "unknown" or no specific motion flag set. Do NOT
|
|
217
|
+
// collapse this to NotMoving — under uncertainty we keep the current
|
|
218
|
+
// tracking state (legacy behavior was to stop on UNKNOWN, which paused
|
|
219
|
+
// GPS unexpectedly during low-confidence motion gaps).
|
|
220
|
+
motionType = MAURMotionTypeUnknown;
|
|
221
|
+
typeStr = @"UNKNOWN";
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Hop to main queue: location manager + delegate are main-thread-affine.
|
|
225
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
226
|
+
// UNKNOWN must not perturb the state machine: no emit, no lastMotionType
|
|
227
|
+
// mutation, no tracking change. Otherwise a sequence STILL → UNKNOWN
|
|
228
|
+
// would lose the STILL state and the next fix would be delivered as a
|
|
229
|
+
// regular location instead of stationary.
|
|
230
|
+
if (motionType == MAURMotionTypeUnknown) {
|
|
231
|
+
DDLogDebug(@"%@ ignoring UNKNOWN activity (state preserved, confidence=%d)", TAG, confidence);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
BOOL changed = (motionType != self->lastMotionType);
|
|
236
|
+
self->lastMotionType = motionType;
|
|
237
|
+
|
|
238
|
+
if (changed) {
|
|
239
|
+
DDLogDebug(@"%@ activityTypeChanged: %@ confidence=%d", TAG, typeStr, confidence);
|
|
240
|
+
MAURActivity *act = [[MAURActivity alloc] init];
|
|
241
|
+
act.type = typeStr;
|
|
242
|
+
act.confidence = [NSNumber numberWithInt:confidence];
|
|
243
|
+
if (super.delegate && [super.delegate respondsToSelector:@selector(onActivityChanged:)]) {
|
|
244
|
+
[super.delegate onActivityChanged:act];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Tracking control:
|
|
249
|
+
// - ACTIVE motion (walking, running, automotive, cycling) → ensure tracking is on.
|
|
250
|
+
// - STILL → leave tracking running; it will be stopped after the next fix (legacy).
|
|
251
|
+
if (motionType != MAURMotionTypeNotMoving) {
|
|
252
|
+
[self startTracking];
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
#pragma mark - Location plumbing
|
|
258
|
+
|
|
259
|
+
- (void) startTracking
|
|
260
|
+
{
|
|
261
|
+
if (isTracking) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
NSError *error = nil;
|
|
266
|
+
if ([locationManager start:&error]) {
|
|
267
|
+
isTracking = YES;
|
|
268
|
+
} else {
|
|
269
|
+
if (self.delegate && [self.delegate respondsToSelector:@selector(onError:)]) {
|
|
270
|
+
[self.delegate onError:error];
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
- (void) stopTracking
|
|
276
|
+
{
|
|
277
|
+
if (isTracking) {
|
|
278
|
+
[locationManager stop:nil];
|
|
279
|
+
isTracking = NO;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
- (void) onSwitchMode:(MAUROperationalMode)mode
|
|
284
|
+
{
|
|
285
|
+
/* do nothing */
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
- (void) onAuthorizationChanged:(MAURLocationAuthorizationStatus)authStatus
|
|
289
|
+
{
|
|
290
|
+
[self.delegate onAuthorizationChanged:authStatus];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
- (void) onLocationsChanged:(NSArray*)locations
|
|
294
|
+
{
|
|
295
|
+
// v4.5.2: while NotMoving we only emit the stationary fix; the previous
|
|
296
|
+
// code fell through and also delivered each location as onLocationChanged,
|
|
297
|
+
// which produced phantom "moving" rows during a STILL window.
|
|
298
|
+
if (lastMotionType == MAURMotionTypeNotMoving) {
|
|
299
|
+
[self stopTracking];
|
|
300
|
+
[self.delegate onStationaryChanged:[MAURLocation fromCLLocation:[locations lastObject]]];
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
for (CLLocation *location in locations) {
|
|
305
|
+
MAURLocation *bgloc = [MAURLocation fromCLLocation:location];
|
|
306
|
+
[self.delegate onLocationChanged:bgloc];
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
- (void) onError:(NSError*)error
|
|
311
|
+
{
|
|
312
|
+
[self.delegate onError:error];
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
- (void) onPause:(CLLocationManager*)manager
|
|
316
|
+
{
|
|
317
|
+
[self.delegate onLocationPause];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
- (void) onResume:(CLLocationManager*)manager
|
|
321
|
+
{
|
|
322
|
+
[self.delegate onLocationResume];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
- (void) onDestroy {
|
|
326
|
+
DDLogInfo(@"Destroying %@ ", TAG);
|
|
327
|
+
[self onStop:nil];
|
|
328
|
+
|
|
329
|
+
// v4.5.2: MAURLocationManager is a singleton shared with the other providers
|
|
330
|
+
// (RAW, DISTANCE). Release the delegate slot so a subsequent provider swap
|
|
331
|
+
// does not leave this destroyed instance as the active delegate.
|
|
332
|
+
if (locationManager != nil && locationManager.delegate == self) {
|
|
333
|
+
locationManager.delegate = nil;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
activityManager = nil;
|
|
337
|
+
activityQueue = nil;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
@end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MAURBackgroundGeolocationFacade.h
|
|
3
|
+
//
|
|
4
|
+
// Created by Marian Hello on 04/06/16.
|
|
5
|
+
// Version 2.0.0
|
|
6
|
+
//
|
|
7
|
+
// According to apache license
|
|
8
|
+
//
|
|
9
|
+
// This is class is using code from christocracy cordova-plugin-background-geolocation plugin
|
|
10
|
+
// https://github.com/christocracy/cordova-plugin-background-geolocation
|
|
11
|
+
|
|
12
|
+
#ifndef MAURBackgroundGeolocationFacade_h
|
|
13
|
+
#define MAURBackgroundGeolocationFacade_h
|
|
14
|
+
|
|
15
|
+
#import "MAURProviderDelegate.h"
|
|
16
|
+
#import "MAURLocation.h"
|
|
17
|
+
#import "MAURConfig.h"
|
|
18
|
+
|
|
19
|
+
// v3.5 Phase 4: heartbeat notification. userInfo[@"location"] is the latest MAURLocation
|
|
20
|
+
// (may be absent if no fix has been received yet).
|
|
21
|
+
extern NSString * _Nonnull const MAURHeartbeatNotification;
|
|
22
|
+
|
|
23
|
+
// v4.0 Phase 6: driver-insight notifications. userInfo carries `location` and event-specific keys.
|
|
24
|
+
extern NSString * _Nonnull const MAURTripStartNotification;
|
|
25
|
+
extern NSString * _Nonnull const MAURTripEndNotification; // userInfo: location, distance, durationMs
|
|
26
|
+
extern NSString * _Nonnull const MAURMovingNotification;
|
|
27
|
+
extern NSString * _Nonnull const MAURStoppedNotification;
|
|
28
|
+
extern NSString * _Nonnull const MAURSpeedingNotification; // userInfo: location, speedKmh, limitKmh
|
|
29
|
+
extern NSString * _Nonnull const MAURProviderChangeNotification;// userInfo: provider
|
|
30
|
+
extern NSString * _Nonnull const MAURSOSNotification; // userInfo: location, payload (NSDictionary)
|
|
31
|
+
// v4.1 GPS-derived sensor-like events. userInfo: location, value (double)
|
|
32
|
+
extern NSString * _Nonnull const MAURHardBrakeNotification;
|
|
33
|
+
extern NSString * _Nonnull const MAURRapidAccelerationNotification;
|
|
34
|
+
extern NSString * _Nonnull const MAURSharpTurnNotification;
|
|
35
|
+
extern NSString * _Nonnull const MAURPossibleCrashNotification;
|
|
36
|
+
// v4.2 sensor fusion events. userInfo: location, source ("gps"|"sensor"), value (double)
|
|
37
|
+
extern NSString * _Nonnull const MAURPhoneUsageWhileDrivingNotification;
|
|
38
|
+
|
|
39
|
+
@interface MAURBackgroundGeolocationFacade : NSObject
|
|
40
|
+
|
|
41
|
+
@property (weak, nonatomic) id<MAURProviderDelegate> delegate;
|
|
42
|
+
|
|
43
|
+
- (BOOL) configure:(MAURConfig*)config error:(NSError * __autoreleasing *)outError;
|
|
44
|
+
- (BOOL) start:(NSError * __autoreleasing *)outError;
|
|
45
|
+
- (BOOL) stop:(NSError * __autoreleasing *)outError;
|
|
46
|
+
- (BOOL) locationServicesEnabled;
|
|
47
|
+
- (MAURLocationAuthorizationStatus) authorizationStatus;
|
|
48
|
+
- (BOOL) isStarted;
|
|
49
|
+
- (void) showAppSettings;
|
|
50
|
+
- (void) showLocationSettings;
|
|
51
|
+
- (void) switchMode:(MAUROperationalMode)mode;
|
|
52
|
+
- (MAURLocation*)getStationaryLocation;
|
|
53
|
+
- (NSArray<MAURLocation*>*) getLocations;
|
|
54
|
+
- (NSArray<MAURLocation*>*) getValidLocations;
|
|
55
|
+
- (NSArray<MAURLocation*>*) getValidLocationsAndDelete;
|
|
56
|
+
- (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError;
|
|
57
|
+
- (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError;
|
|
58
|
+
- (MAURLocation*)getCurrentLocation:(int)timeout maximumAge:(long)maximumAge
|
|
59
|
+
enableHighAccuracy:(BOOL)enableHighAccuracy
|
|
60
|
+
error:(NSError * __autoreleasing *)outError;
|
|
61
|
+
- (MAURConfig*) getConfig;
|
|
62
|
+
- (NSArray*) getLogEntries:(NSInteger)limit;
|
|
63
|
+
- (NSArray*) getLogEntries:(NSInteger)limit fromLogEntryId:(NSInteger)entryId minLogLevelFromString:(NSString *)minLogLevel;
|
|
64
|
+
/** v4.0 Phase 6 — Trigger an SOS event with the latest known location and a user payload. */
|
|
65
|
+
- (void) triggerSOS:(NSDictionary * _Nullable)payload;
|
|
66
|
+
- (void) forceSync;
|
|
67
|
+
- (void) clearSync;
|
|
68
|
+
- (NSInteger) getPendingSyncCount;
|
|
69
|
+
- (void) startSession;
|
|
70
|
+
- (NSArray<MAURLocation*>*) getSessionLocations;
|
|
71
|
+
- (void) clearSession;
|
|
72
|
+
- (NSInteger) getSessionLocationsCount;
|
|
73
|
+
- (void) onAppTerminate;
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Sets a transform for each coordinate about to be committed (sent or saved for later sync).
|
|
78
|
+
* You can use this for modifying the coordinates in any way.
|
|
79
|
+
*
|
|
80
|
+
* If the transform returns <code>nil</code>, it will prevent the location from being committed.
|
|
81
|
+
* @param transform - the transform block
|
|
82
|
+
*/
|
|
83
|
+
+ (void) setLocationTransform:(MAURLocationTransform _Nullable)transform;
|
|
84
|
+
+ (MAURLocationTransform _Nullable) locationTransform;
|
|
85
|
+
|
|
86
|
+
@end
|
|
87
|
+
|
|
88
|
+
#endif /* MAURBackgroundGeolocationFacade_h */
|