@maplibre/maplibre-react-native 10.1.0 → 10.1.2
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/ios/MLRN/CameraStop.h +1 -1
- package/ios/MLRN/CameraStop.m +58 -60
- package/ios/MLRN/CameraUpdateItem.h +2 -1
- package/ios/MLRN/CameraUpdateItem.m +132 -132
- package/ios/MLRN/CameraUpdateQueue.m +43 -47
- package/ios/MLRN/FilterParser.h +1 -1
- package/ios/MLRN/FilterParser.m +5 -6
- package/ios/MLRN/MLRNBackgroundLayer.m +10 -9
- package/ios/MLRN/MLRNBackgroundLayerManager.m +4 -5
- package/ios/MLRN/MLRNCallout.h +1 -1
- package/ios/MLRN/MLRNCallout.m +37 -36
- package/ios/MLRN/MLRNCalloutManager.m +2 -3
- package/ios/MLRN/MLRNCamera.h +1 -1
- package/ios/MLRN/MLRNCamera.m +169 -182
- package/ios/MLRN/MLRNCameraManager.m +4 -6
- package/ios/MLRN/MLRNCircleLayer.m +17 -14
- package/ios/MLRN/MLRNCircleLayerManager.m +4 -5
- package/ios/MLRN/MLRNCustomHeaders.h +2 -2
- package/ios/MLRN/MLRNCustomHeaders.m +63 -63
- package/ios/MLRN/MLRNEvent.h +3 -3
- package/ios/MLRN/MLRNEvent.m +19 -24
- package/ios/MLRN/MLRNEventProtocol.h +1 -1
- package/ios/MLRN/MLRNFillExtrusionLayer.m +18 -14
- package/ios/MLRN/MLRNFillExtrusionLayerManager.m +4 -5
- package/ios/MLRN/MLRNFillLayer.m +16 -14
- package/ios/MLRN/MLRNFillLayerManager.m +4 -5
- package/ios/MLRN/MLRNHeatmapLayer.m +17 -14
- package/ios/MLRN/MLRNHeatmapLayerManager.m +4 -5
- package/ios/MLRN/MLRNImageQueue.h +4 -1
- package/ios/MLRN/MLRNImageQueue.m +29 -32
- package/ios/MLRN/MLRNImageQueueOperation.h +1 -1
- package/ios/MLRN/MLRNImageQueueOperation.m +92 -91
- package/ios/MLRN/MLRNImageSource.m +36 -38
- package/ios/MLRN/MLRNImageSourceManager.m +2 -3
- package/ios/MLRN/MLRNImageUtils.h +3 -3
- package/ios/MLRN/MLRNImageUtils.m +15 -14
- package/ios/MLRN/MLRNImages.h +0 -1
- package/ios/MLRN/MLRNImages.m +89 -91
- package/ios/MLRN/MLRNImagesManager.m +4 -5
- package/ios/MLRN/MLRNLayer.h +9 -11
- package/ios/MLRN/MLRNLayer.m +170 -182
- package/ios/MLRN/MLRNLight.m +21 -23
- package/ios/MLRN/MLRNLightManager.m +2 -3
- package/ios/MLRN/MLRNLineLayer.m +17 -15
- package/ios/MLRN/MLRNLineLayerManager.m +4 -6
- package/ios/MLRN/MLRNLocation.h +1 -1
- package/ios/MLRN/MLRNLocation.m +16 -17
- package/ios/MLRN/MLRNLocationManager.m +109 -124
- package/ios/MLRN/MLRNLocationManagerDelegate.h +3 -3
- package/ios/MLRN/MLRNLocationModule.h +1 -1
- package/ios/MLRN/MLRNLocationModule.m +40 -55
- package/ios/MLRN/MLRNLogging.h +1 -4
- package/ios/MLRN/MLRNLogging.m +84 -89
- package/ios/MLRN/MLRNMapTouchEvent.h +2 -2
- package/ios/MLRN/MLRNMapTouchEvent.m +50 -49
- package/ios/MLRN/MLRNMapView.h +43 -36
- package/ios/MLRN/MLRNMapView.m +409 -440
- package/ios/MLRN/MLRNMapViewManager.m +489 -502
- package/ios/MLRN/MLRNModule.h +1 -1
- package/ios/MLRN/MLRNModule.m +111 -105
- package/ios/MLRN/MLRNNativeUserLocation.m +24 -27
- package/ios/MLRN/MLRNNativeUserLocationManager.m +4 -8
- package/ios/MLRN/MLRNOfflineModule.h +1 -1
- package/ios/MLRN/MLRNOfflineModule.m +416 -421
- package/ios/MLRN/MLRNPointAnnotation.h +2 -2
- package/ios/MLRN/MLRNPointAnnotation.m +154 -175
- package/ios/MLRN/MLRNPointAnnotationManager.m +2 -3
- package/ios/MLRN/MLRNRasterLayer.m +16 -12
- package/ios/MLRN/MLRNRasterLayerManager.m +4 -5
- package/ios/MLRN/MLRNRasterSource.m +21 -17
- package/ios/MLRN/MLRNRasterSourceManager.m +2 -3
- package/ios/MLRN/MLRNShapeSource.h +17 -16
- package/ios/MLRN/MLRNShapeSource.m +94 -102
- package/ios/MLRN/MLRNShapeSourceManager.h +2 -2
- package/ios/MLRN/MLRNShapeSourceManager.m +86 -90
- package/ios/MLRN/MLRNSnapshotModule.h +1 -1
- package/ios/MLRN/MLRNSnapshotModule.m +51 -53
- package/ios/MLRN/MLRNSource.h +12 -12
- package/ios/MLRN/MLRNSource.m +82 -88
- package/ios/MLRN/MLRNStyleValue.h +1 -1
- package/ios/MLRN/MLRNStyleValue.m +128 -128
- package/ios/MLRN/MLRNSymbolLayer.m +17 -13
- package/ios/MLRN/MLRNSymbolLayerManager.m +4 -5
- package/ios/MLRN/MLRNTileSource.h +1 -1
- package/ios/MLRN/MLRNTileSource.m +21 -20
- package/ios/MLRN/MLRNUserLocation.h +1 -1
- package/ios/MLRN/MLRNUserLocation.m +10 -12
- package/ios/MLRN/MLRNUtils.h +18 -11
- package/ios/MLRN/MLRNUtils.m +168 -160
- package/ios/MLRN/MLRNVectorLayer.m +28 -34
- package/ios/MLRN/MLRNVectorSource.h +3 -1
- package/ios/MLRN/MLRNVectorSource.m +14 -11
- package/ios/MLRN/MLRNVectorSourceManager.h +2 -2
- package/ios/MLRN/MLRNVectorSourceManager.m +36 -39
- package/ios/MLRN/ViewManager.h +1 -1
- package/ios/MLRN/ViewManager.m +29 -35
- package/lib/commonjs/components/MarkerView.js +1 -1
- package/lib/commonjs/components/ShapeSource.js +2 -1
- package/lib/commonjs/components/ShapeSource.js.map +1 -1
- package/lib/commonjs/components/UserLocation.js +8 -38
- package/lib/commonjs/components/UserLocation.js.map +1 -1
- package/lib/commonjs/components/UserLocationPuck.js +52 -0
- package/lib/commonjs/components/UserLocationPuck.js.map +1 -0
- package/lib/commonjs/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +12 -9
- package/lib/commonjs/components/UserLocationPuckHeading.js.map +1 -0
- package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js +8 -7
- package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -2
- package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js +28 -38
- package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedShape.js +11 -7
- package/lib/commonjs/utils/animated/AnimatedShape.js.map +1 -1
- package/lib/module/components/MarkerView.js +1 -1
- package/lib/module/components/ShapeSource.js +2 -1
- package/lib/module/components/ShapeSource.js.map +1 -1
- package/lib/module/components/UserLocation.js +7 -36
- package/lib/module/components/UserLocation.js.map +1 -1
- package/lib/module/components/UserLocationPuck.js +48 -0
- package/lib/module/components/UserLocationPuck.js.map +1 -0
- package/lib/module/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +11 -7
- package/lib/module/components/UserLocationPuckHeading.js.map +1 -0
- package/lib/module/utils/animated/AbstractAnimatedCoordinates.js +8 -7
- package/lib/module/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
- package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -3
- package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
- package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js +29 -39
- package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
- package/lib/module/utils/animated/AnimatedShape.js +11 -7
- package/lib/module/utils/animated/AnimatedShape.js.map +1 -1
- package/lib/typescript/commonjs/src/components/MarkerView.d.ts +1 -1
- package/lib/typescript/commonjs/src/components/ShapeSource.d.ts +1 -1
- package/lib/typescript/commonjs/src/components/ShapeSource.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/components/UserLocation.d.ts +0 -1
- package/lib/typescript/commonjs/src/components/UserLocation.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts +9 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts +9 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
- package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
- package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts +0 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
- package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts +8 -5
- package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts.map +1 -1
- package/lib/typescript/module/src/components/MarkerView.d.ts +1 -1
- package/lib/typescript/module/src/components/ShapeSource.d.ts +1 -1
- package/lib/typescript/module/src/components/ShapeSource.d.ts.map +1 -1
- package/lib/typescript/module/src/components/UserLocation.d.ts +0 -1
- package/lib/typescript/module/src/components/UserLocation.d.ts.map +1 -1
- package/lib/typescript/module/src/components/UserLocationPuck.d.ts +9 -0
- package/lib/typescript/module/src/components/UserLocationPuck.d.ts.map +1 -0
- package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts +9 -0
- package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
- package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
- package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts +0 -1
- package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
- package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts +8 -5
- package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/components/MarkerView.tsx +1 -1
- package/src/components/ShapeSource.tsx +58 -53
- package/src/components/UserLocation.tsx +13 -51
- package/src/components/UserLocationPuck.tsx +62 -0
- package/src/components/UserLocationPuckHeading.tsx +33 -0
- package/src/utils/animated/AbstractAnimatedCoordinates.ts +26 -15
- package/src/utils/animated/AnimatedExtractCoordinateFromArray.ts +10 -6
- package/src/utils/animated/AnimatedRouteCoordinatesArray.ts +63 -51
- package/src/utils/animated/AnimatedShape.ts +22 -13
- package/lib/commonjs/components/HeadingIndicator.js.map +0 -1
- package/lib/module/components/HeadingIndicator.js.map +0 -1
- package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts +0 -7
- package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts.map +0 -1
- package/lib/typescript/module/src/components/HeadingIndicator.d.ts +0 -7
- package/lib/typescript/module/src/components/HeadingIndicator.d.ts.map +0 -1
- package/src/components/HeadingIndicator.tsx +0 -26
|
@@ -1,529 +1,524 @@
|
|
|
1
1
|
#import "MLRNOfflineModule.h"
|
|
2
|
-
#import "MLRNUtils.h"
|
|
3
2
|
#import "MLRNEvent.h"
|
|
4
3
|
#import "MLRNEventTypes.h"
|
|
4
|
+
#import "MLRNUtils.h"
|
|
5
5
|
|
|
6
|
-
@implementation MLRNOfflineModule
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
NSMutableArray<RCTPromiseResolveBlock> *packRequestQueue;
|
|
6
|
+
@implementation MLRNOfflineModule {
|
|
7
|
+
NSUInteger lastPackState;
|
|
8
|
+
double lastPackTimestamp;
|
|
9
|
+
double eventThrottle;
|
|
10
|
+
BOOL hasListeners;
|
|
11
|
+
NSMutableArray<RCTPromiseResolveBlock> *packRequestQueue;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
RCT_EXPORT_MODULE()
|
|
16
15
|
|
|
17
|
-
+ (BOOL)requiresMainQueueSetup
|
|
18
|
-
|
|
19
|
-
return YES;
|
|
16
|
+
+ (BOOL)requiresMainQueueSetup {
|
|
17
|
+
return YES;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
- (void)startObserving
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
hasListeners = YES;
|
|
20
|
+
- (void)startObserving {
|
|
21
|
+
[super startObserving];
|
|
22
|
+
hasListeners = YES;
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
- (void)stopObserving
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
hasListeners = NO;
|
|
25
|
+
- (void)stopObserving {
|
|
26
|
+
[super stopObserving];
|
|
27
|
+
hasListeners = NO;
|
|
32
28
|
}
|
|
33
29
|
|
|
34
30
|
NSString *const RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS = @"MapboxOfflineRegionProgress";
|
|
35
31
|
NSString *const RCT_MAPBOX_OFFLINE_CALLBACK_ERROR = @"MapboOfflineRegionError";
|
|
36
32
|
|
|
37
|
-
- (instancetype)init
|
|
38
|
-
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
[[
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
- (void)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if ([path isAbsolutePath]) {
|
|
120
|
-
absolutePath = path;
|
|
121
|
-
} else {
|
|
122
|
-
NSBundle *mainBundle = [NSBundle mainBundle];
|
|
123
|
-
NSString *fileName = [path stringByDeletingPathExtension];
|
|
124
|
-
NSString *extension = [path pathExtension];
|
|
125
|
-
absolutePath = [mainBundle pathForResource:fileName ofType:extension];
|
|
126
|
-
if (!absolutePath) {
|
|
127
|
-
return reject(@"asset_does_not_exist", [NSString stringWithFormat:@"The given assetName, %@, can't be found in the app's bundle.", path], nil);
|
|
33
|
+
- (instancetype)init {
|
|
34
|
+
if (self = [super init]) {
|
|
35
|
+
packRequestQueue = [NSMutableArray new];
|
|
36
|
+
eventThrottle = 300;
|
|
37
|
+
lastPackState = -1;
|
|
38
|
+
|
|
39
|
+
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
|
|
40
|
+
[defaultCenter addObserver:self
|
|
41
|
+
selector:@selector(offlinePackProgressDidChange:)
|
|
42
|
+
name:MLNOfflinePackProgressChangedNotification
|
|
43
|
+
object:nil];
|
|
44
|
+
[defaultCenter addObserver:self
|
|
45
|
+
selector:@selector(offlinePackDidReceiveError:)
|
|
46
|
+
name:MLNOfflinePackErrorNotification
|
|
47
|
+
object:nil];
|
|
48
|
+
[defaultCenter addObserver:self
|
|
49
|
+
selector:@selector(offlinePackDidReceiveMaxAllowedMapboxTiles:)
|
|
50
|
+
name:MLNOfflinePackMaximumMapboxTilesReachedNotification
|
|
51
|
+
object:nil];
|
|
52
|
+
|
|
53
|
+
[[MLNOfflineStorage sharedOfflineStorage] addObserver:self
|
|
54
|
+
forKeyPath:@"packs"
|
|
55
|
+
options:NSKeyValueObservingOptionInitial
|
|
56
|
+
context:NULL];
|
|
57
|
+
}
|
|
58
|
+
return self;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
- (void)dealloc {
|
|
62
|
+
[[MLNOfflineStorage sharedOfflineStorage] removeObserver:self forKeyPath:@"packs"];
|
|
63
|
+
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
- (NSArray<NSString *> *)supportedEvents {
|
|
67
|
+
return @[ RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS, RCT_MAPBOX_OFFLINE_CALLBACK_ERROR ];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
71
|
+
ofObject:(id)object
|
|
72
|
+
change:(NSDictionary<NSKeyValueChangeKey, id> *)change
|
|
73
|
+
context:(void *)context {
|
|
74
|
+
if ([keyPath isEqualToString:@"state"] && [object isKindOfClass:[MLNOfflinePack class]]) {
|
|
75
|
+
MLNOfflinePack *pack = (MLNOfflinePack *)object;
|
|
76
|
+
[self observerStateForPack:pack context:context];
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (packRequestQueue.count == 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
|
|
85
|
+
if (packs == nil) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
while (packRequestQueue.count > 0) {
|
|
90
|
+
RCTPromiseResolveBlock resolve = [packRequestQueue objectAtIndex:0];
|
|
91
|
+
resolve([self _convertPacksToJson:packs]);
|
|
92
|
+
[packRequestQueue removeObjectAtIndex:0];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
RCT_EXPORT_METHOD(createPack : (NSDictionary *)options resolver : (RCTPromiseResolveBlock)
|
|
97
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
98
|
+
NSString *styleURL = options[@"styleURL"];
|
|
99
|
+
MLNCoordinateBounds bounds = [MLRNUtils fromFeatureCollection:options[@"bounds"]];
|
|
100
|
+
|
|
101
|
+
id<MLNOfflineRegion> offlineRegion =
|
|
102
|
+
[[MLNTilePyramidOfflineRegion alloc] initWithStyleURL:[NSURL URLWithString:styleURL]
|
|
103
|
+
bounds:bounds
|
|
104
|
+
fromZoomLevel:[options[@"minZoom"] doubleValue]
|
|
105
|
+
toZoomLevel:[options[@"maxZoom"] doubleValue]];
|
|
106
|
+
NSData *context = [self _archiveMetadata:options[@"metadata"]];
|
|
107
|
+
|
|
108
|
+
[[MLNOfflineStorage sharedOfflineStorage]
|
|
109
|
+
addPackForRegion:offlineRegion
|
|
110
|
+
withContext:context
|
|
111
|
+
completionHandler:^(MLNOfflinePack *pack, NSError *error) {
|
|
112
|
+
if (error != nil) {
|
|
113
|
+
reject(@"createPack", error.description, error);
|
|
114
|
+
return;
|
|
128
115
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
116
|
+
resolve([self _convertPackToDict:pack]);
|
|
117
|
+
[pack resume];
|
|
118
|
+
}];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
RCT_EXPORT_METHOD(mergeOfflineRegions : (NSString *)path resolver : (RCTPromiseResolveBlock)
|
|
122
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
123
|
+
NSString *absolutePath;
|
|
124
|
+
if ([path isAbsolutePath]) {
|
|
125
|
+
absolutePath = path;
|
|
126
|
+
} else {
|
|
127
|
+
NSBundle *mainBundle = [NSBundle mainBundle];
|
|
128
|
+
NSString *fileName = [path stringByDeletingPathExtension];
|
|
129
|
+
NSString *extension = [path pathExtension];
|
|
130
|
+
absolutePath = [mainBundle pathForResource:fileName ofType:extension];
|
|
131
|
+
if (!absolutePath) {
|
|
132
|
+
return reject(
|
|
133
|
+
@"asset_does_not_exist",
|
|
134
|
+
[NSString
|
|
135
|
+
stringWithFormat:@"The given assetName, %@, can't be found in the app's bundle.",
|
|
136
|
+
path],
|
|
137
|
+
nil);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
[[MLNOfflineStorage sharedOfflineStorage]
|
|
142
|
+
addContentsOfFile:absolutePath
|
|
143
|
+
withCompletionHandler:^(NSURL *fileURL, NSArray<MLNOfflinePack *> *packs, NSError *error) {
|
|
132
144
|
if (error != nil) {
|
|
133
|
-
|
|
134
|
-
|
|
145
|
+
reject(@"mergeOfflineRegions", error.description, error);
|
|
146
|
+
return;
|
|
135
147
|
}
|
|
136
148
|
resolve(nil);
|
|
137
|
-
|
|
149
|
+
}];
|
|
138
150
|
}
|
|
139
151
|
|
|
140
|
-
RCT_EXPORT_METHOD(getPacks:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)
|
|
141
|
-
{
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (packs == nil) {
|
|
146
|
-
// packs have not loaded yet
|
|
147
|
-
[self->packRequestQueue addObject:resolve];
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
resolve([self _convertPacksToJson:packs]);
|
|
152
|
-
});
|
|
153
|
-
}
|
|
152
|
+
RCT_EXPORT_METHOD(getPacks : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)
|
|
153
|
+
reject) {
|
|
154
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
155
|
+
NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
|
|
154
156
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
resolve(nil);
|
|
163
|
-
}];
|
|
164
|
-
}
|
|
157
|
+
if (packs == nil) {
|
|
158
|
+
// packs have not loaded yet
|
|
159
|
+
[self->packRequestQueue addObject:resolve];
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
165
162
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
[[MLNOfflineStorage sharedOfflineStorage] clearAmbientCacheWithCompletionHandler:^(NSError *error) {
|
|
169
|
-
if (error != nil) {
|
|
170
|
-
reject(@"clearAmbientCache", error.description, error);
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
resolve(nil);
|
|
174
|
-
}];
|
|
163
|
+
resolve([self _convertPacksToJson:packs]);
|
|
164
|
+
});
|
|
175
165
|
}
|
|
176
166
|
|
|
177
|
-
RCT_EXPORT_METHOD(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
{
|
|
181
|
-
[[MLNOfflineStorage sharedOfflineStorage] setMaximumAmbientCacheSize:cacheSize withCompletionHandler:^(NSError *error) {
|
|
167
|
+
RCT_EXPORT_METHOD(invalidateAmbientCache : (RCTPromiseResolveBlock)
|
|
168
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
169
|
+
[[MLNOfflineStorage sharedOfflineStorage]
|
|
170
|
+
invalidateAmbientCacheWithCompletionHandler:^(NSError *error) {
|
|
182
171
|
if (error != nil) {
|
|
183
|
-
|
|
184
|
-
|
|
172
|
+
reject(@"invalidateAmbientCache", error.description, error);
|
|
173
|
+
return;
|
|
185
174
|
}
|
|
186
175
|
resolve(nil);
|
|
187
|
-
|
|
188
|
-
|
|
176
|
+
}];
|
|
189
177
|
}
|
|
190
178
|
|
|
191
|
-
RCT_EXPORT_METHOD(
|
|
192
|
-
{
|
|
193
|
-
|
|
179
|
+
RCT_EXPORT_METHOD(clearAmbientCache : (RCTPromiseResolveBlock)
|
|
180
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
181
|
+
[[MLNOfflineStorage sharedOfflineStorage]
|
|
182
|
+
clearAmbientCacheWithCompletionHandler:^(NSError *error) {
|
|
194
183
|
if (error != nil) {
|
|
195
|
-
|
|
196
|
-
|
|
184
|
+
reject(@"clearAmbientCache", error.description, error);
|
|
185
|
+
return;
|
|
197
186
|
}
|
|
198
187
|
resolve(nil);
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
RCT_EXPORT_METHOD(getPackStatus:(NSString *)name
|
|
204
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
205
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
206
|
-
{
|
|
207
|
-
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
208
|
-
|
|
209
|
-
if (pack == nil) {
|
|
210
|
-
resolve(nil);
|
|
211
|
-
NSLog(@"getPackStatus - Unknown offline region");
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (pack.state == MLNOfflinePackStateUnknown) {
|
|
216
|
-
[pack addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:(__bridge_retained void*)resolve];
|
|
217
|
-
[pack requestProgress];
|
|
218
|
-
} else {
|
|
219
|
-
resolve([self _makeRegionStatusPayload:name pack:pack]);
|
|
220
|
-
}
|
|
188
|
+
}];
|
|
221
189
|
}
|
|
222
190
|
|
|
223
|
-
|
|
224
|
-
RCTPromiseResolveBlock
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
191
|
+
RCT_EXPORT_METHOD(setMaximumAmbientCacheSize : (NSUInteger)cacheSize resolver : (
|
|
192
|
+
RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
193
|
+
[[MLNOfflineStorage sharedOfflineStorage]
|
|
194
|
+
setMaximumAmbientCacheSize:cacheSize
|
|
195
|
+
withCompletionHandler:^(NSError *error) {
|
|
196
|
+
if (error != nil) {
|
|
197
|
+
reject(@"setMaximumAmbientCacheSize", error.description, error);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
resolve(nil);
|
|
201
|
+
}];
|
|
231
202
|
}
|
|
232
203
|
|
|
233
|
-
RCT_EXPORT_METHOD(
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
{
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
if (pack == nil) {
|
|
240
|
-
resolve(nil);
|
|
241
|
-
return;
|
|
204
|
+
RCT_EXPORT_METHOD(resetDatabase : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)
|
|
205
|
+
reject) {
|
|
206
|
+
[[MLNOfflineStorage sharedOfflineStorage] resetDatabaseWithCompletionHandler:^(NSError *error) {
|
|
207
|
+
if (error != nil) {
|
|
208
|
+
reject(@"resetDatabase", error.description, error);
|
|
209
|
+
return;
|
|
242
210
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
reject(@"invalidatePack", error.description, error);
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
resolve(nil);
|
|
249
|
-
}];
|
|
211
|
+
resolve(nil);
|
|
212
|
+
}];
|
|
250
213
|
}
|
|
251
214
|
|
|
252
|
-
RCT_EXPORT_METHOD(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
{
|
|
256
|
-
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
215
|
+
RCT_EXPORT_METHOD(getPackStatus : (NSString *)name resolver : (RCTPromiseResolveBlock)
|
|
216
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
217
|
+
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
257
218
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
219
|
+
if (pack == nil) {
|
|
220
|
+
resolve(nil);
|
|
221
|
+
NSLog(@"getPackStatus - Unknown offline region");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (pack.state == MLNOfflinePackStateUnknown) {
|
|
226
|
+
[pack addObserver:self
|
|
227
|
+
forKeyPath:@"state"
|
|
228
|
+
options:NSKeyValueObservingOptionNew
|
|
229
|
+
context:(__bridge_retained void *)resolve];
|
|
230
|
+
[pack requestProgress];
|
|
231
|
+
} else {
|
|
232
|
+
resolve([self _makeRegionStatusPayload:name pack:pack]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
- (void)observerStateForPack:(MLNOfflinePack *)pack context:(nullable void *)context {
|
|
237
|
+
RCTPromiseResolveBlock resolve = (__bridge_transfer RCTPromiseResolveBlock)context;
|
|
238
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
239
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
240
|
+
NSString *name = metadata[@"name"];
|
|
241
|
+
resolve([self _makeRegionStatusPayload:name pack:pack]);
|
|
242
|
+
});
|
|
243
|
+
[pack removeObserver:self forKeyPath:@"state" context:context];
|
|
274
244
|
}
|
|
275
245
|
|
|
276
|
-
RCT_EXPORT_METHOD(
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
{
|
|
280
|
-
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
246
|
+
RCT_EXPORT_METHOD(invalidatePack : (NSString *)name resolver : (RCTPromiseResolveBlock)
|
|
247
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
248
|
+
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
281
249
|
|
|
282
|
-
|
|
283
|
-
reject(@"pausePackDownload", @"Unknown offline region", nil);
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
if (pack.state == MLNOfflinePackStateInactive || pack.state == MLNOfflinePackStateComplete) {
|
|
288
|
-
resolve(nil);
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
[pack suspend];
|
|
250
|
+
if (pack == nil) {
|
|
293
251
|
resolve(nil);
|
|
294
|
-
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
[[MLNOfflineStorage sharedOfflineStorage] invalidatePack:pack
|
|
255
|
+
withCompletionHandler:^(NSError *error) {
|
|
256
|
+
if (error != nil) {
|
|
257
|
+
reject(@"invalidatePack", error.description, error);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
resolve(nil);
|
|
261
|
+
}];
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
RCT_EXPORT_METHOD(deletePack : (NSString *)name resolver : (RCTPromiseResolveBlock)
|
|
265
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
266
|
+
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
267
|
+
|
|
268
|
+
if (pack == nil) {
|
|
269
|
+
resolve(nil);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (pack.state == MLNOfflinePackStateInvalid) {
|
|
273
|
+
NSError *error = [NSError errorWithDomain:MLNErrorDomain
|
|
274
|
+
code:1
|
|
275
|
+
userInfo:@{
|
|
276
|
+
NSLocalizedDescriptionKey :
|
|
277
|
+
NSLocalizedString(@"Pack has already been deleted", nil)
|
|
278
|
+
}];
|
|
279
|
+
reject(@"deletePack", error.description, error);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
[[MLNOfflineStorage sharedOfflineStorage] removePack:pack
|
|
283
|
+
withCompletionHandler:^(NSError *error) {
|
|
284
|
+
if (error != nil) {
|
|
285
|
+
reject(@"deletePack", error.description, error);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
resolve(nil);
|
|
289
|
+
}];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
RCT_EXPORT_METHOD(pausePackDownload : (NSString *)name resolver : (RCTPromiseResolveBlock)
|
|
293
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
294
|
+
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
295
|
+
|
|
296
|
+
if (pack == nil) {
|
|
297
|
+
reject(@"pausePackDownload", @"Unknown offline region", nil);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (pack.state == MLNOfflinePackStateInactive || pack.state == MLNOfflinePackStateComplete) {
|
|
302
|
+
resolve(nil);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
295
305
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
{
|
|
300
|
-
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
306
|
+
[pack suspend];
|
|
307
|
+
resolve(nil);
|
|
308
|
+
}
|
|
301
309
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
310
|
+
RCT_EXPORT_METHOD(resumePackDownload : (NSString *)name resolver : (RCTPromiseResolveBlock)
|
|
311
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
312
|
+
MLNOfflinePack *pack = [self _getPackFromName:name];
|
|
306
313
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
314
|
+
if (pack == nil) {
|
|
315
|
+
reject(@"resumePack", @"Unknown offline region", nil);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
311
318
|
|
|
312
|
-
|
|
319
|
+
if (pack.state == MLNOfflinePackStateActive || pack.state == MLNOfflinePackStateComplete) {
|
|
313
320
|
resolve(nil);
|
|
314
|
-
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
315
323
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
[[MLNOfflineStorage sharedOfflineStorage] setMaximumAllowedMapboxTiles:[limit intValue]];
|
|
324
|
+
[pack resume];
|
|
325
|
+
resolve(nil);
|
|
319
326
|
}
|
|
320
327
|
|
|
321
|
-
RCT_EXPORT_METHOD(
|
|
322
|
-
|
|
323
|
-
eventThrottle = [throttleValue doubleValue];
|
|
328
|
+
RCT_EXPORT_METHOD(setTileCountLimit : (nonnull NSNumber *)limit) {
|
|
329
|
+
[[MLNOfflineStorage sharedOfflineStorage] setMaximumAllowedMapboxTiles:[limit intValue]];
|
|
324
330
|
}
|
|
325
331
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
332
|
+
RCT_EXPORT_METHOD(setProgressEventThrottle : (nonnull NSNumber *)throttleValue) {
|
|
333
|
+
eventThrottle = [throttleValue doubleValue];
|
|
334
|
+
}
|
|
329
335
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}
|
|
336
|
+
- (void)offlinePackProgressDidChange:(NSNotification *)notification {
|
|
337
|
+
MLNOfflinePack *pack = notification.object;
|
|
333
338
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
[self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS event:event];
|
|
338
|
-
lastPackTimestamp = [self _getCurrentTimestamp];
|
|
339
|
-
}
|
|
339
|
+
if (pack.state == MLNOfflinePackStateInvalid) {
|
|
340
|
+
return; // Avoid invalid offline pack exception
|
|
341
|
+
}
|
|
340
342
|
|
|
341
|
-
|
|
343
|
+
if ([self _shouldSendProgressEvent:[self _getCurrentTimestamp] pack:pack]) {
|
|
344
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
345
|
+
MLRNEvent *event = [self _makeProgressEvent:metadata[@"name"] pack:pack];
|
|
346
|
+
[self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS event:event];
|
|
347
|
+
lastPackTimestamp = [self _getCurrentTimestamp];
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
lastPackState = pack.state;
|
|
342
351
|
}
|
|
343
352
|
|
|
344
|
-
- (void)offlinePackDidReceiveError:(NSNotification *)notification
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
353
|
+
- (void)offlinePackDidReceiveError:(NSNotification *)notification {
|
|
354
|
+
MLNOfflinePack *pack = notification.object;
|
|
355
|
+
if (pack.state == MLNOfflinePackStateInvalid) {
|
|
356
|
+
return; // Avoid invalid offline pack exception
|
|
357
|
+
}
|
|
358
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
351
359
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
+
NSString *name = metadata[@"name"];
|
|
361
|
+
if (name != nil) {
|
|
362
|
+
NSError *error = notification.userInfo[MLNOfflinePackUserInfoKeyError];
|
|
363
|
+
MLRNEvent *event = [self _makeErrorEvent:name
|
|
364
|
+
type:RCT_MAPBOX_OFFLINE_ERROR
|
|
365
|
+
message:error.description];
|
|
366
|
+
[self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
|
|
367
|
+
}
|
|
360
368
|
}
|
|
361
369
|
|
|
362
|
-
- (void)offlinePackDidReceiveMaxAllowedMapboxTiles:(NSNotification *)notification
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
370
|
+
- (void)offlinePackDidReceiveMaxAllowedMapboxTiles:(NSNotification *)notification {
|
|
371
|
+
MLNOfflinePack *pack = notification.object;
|
|
372
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
366
373
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
+
NSString *name = metadata[@"name"];
|
|
375
|
+
if (name != nil) {
|
|
376
|
+
MLRNEvent *event = [self _makeErrorEvent:name
|
|
377
|
+
type:RCT_MAPBOX_OFFLINE_ERROR
|
|
378
|
+
message:@"Mapbox tile limit exceeded"];
|
|
379
|
+
[self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
|
|
380
|
+
}
|
|
374
381
|
}
|
|
375
382
|
|
|
376
|
-
- (double)_getCurrentTimestamp
|
|
377
|
-
|
|
378
|
-
return CACurrentMediaTime() * 1000;
|
|
383
|
+
- (double)_getCurrentTimestamp {
|
|
384
|
+
return CACurrentMediaTime() * 1000;
|
|
379
385
|
}
|
|
380
386
|
|
|
381
|
-
- (NSData *)_archiveMetadata:(NSString *)metadata
|
|
382
|
-
|
|
383
|
-
return [NSKeyedArchiver archivedDataWithRootObject:metadata];
|
|
387
|
+
- (NSData *)_archiveMetadata:(NSString *)metadata {
|
|
388
|
+
return [NSKeyedArchiver archivedDataWithRootObject:metadata];
|
|
384
389
|
}
|
|
385
390
|
|
|
386
|
-
- (NSDictionary *)_unarchiveMetadata:(MLNOfflinePack *)pack
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
}
|
|
391
|
+
- (NSDictionary *)_unarchiveMetadata:(MLNOfflinePack *)pack {
|
|
392
|
+
id data = [NSKeyedUnarchiver unarchiveObjectWithData:pack.context];
|
|
393
|
+
// Version v5 store data as NSDictionary while v6 store data as JSON string.
|
|
394
|
+
// User might save offline pack in v5 and then try to read in v6.
|
|
395
|
+
// In v5 are metadata stored nested which need to be handled in JS.
|
|
396
|
+
// Example of how data are stored in v5
|
|
397
|
+
// {
|
|
398
|
+
// name: "New York",
|
|
399
|
+
// metadata: {
|
|
400
|
+
// customMeta: "...",
|
|
401
|
+
// }
|
|
402
|
+
// }
|
|
403
|
+
if ([data isKindOfClass:[NSDictionary class]]) {
|
|
404
|
+
return data;
|
|
405
|
+
}
|
|
402
406
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
407
|
+
if (data == nil) {
|
|
408
|
+
return @{};
|
|
409
|
+
}
|
|
406
410
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
411
|
+
return [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding]
|
|
412
|
+
options:NSJSONReadingMutableContainers
|
|
413
|
+
error:nil];
|
|
410
414
|
}
|
|
411
415
|
|
|
412
|
-
- (NSDictionary *)_makeRegionStatusPayload:(NSString *)name pack:(MLNOfflinePack *)pack
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
float progressPercentage = (float)completedResources / expectedResources;
|
|
416
|
+
- (NSDictionary *)_makeRegionStatusPayload:(NSString *)name pack:(MLNOfflinePack *)pack {
|
|
417
|
+
uint64_t completedResources = pack.progress.countOfResourcesCompleted;
|
|
418
|
+
uint64_t expectedResources = pack.progress.countOfResourcesExpected;
|
|
419
|
+
float progressPercentage = (float)completedResources / expectedResources;
|
|
417
420
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
421
|
+
// prevent NaN errors when expectedResources is 0
|
|
422
|
+
if (expectedResources == 0) {
|
|
423
|
+
progressPercentage = 0;
|
|
424
|
+
}
|
|
422
425
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
426
|
+
return @{
|
|
427
|
+
@"state" : @(pack.state),
|
|
428
|
+
@"name" : name,
|
|
429
|
+
@"percentage" : @(ceilf(progressPercentage * 100.0)),
|
|
430
|
+
@"completedResourceCount" : @(pack.progress.countOfResourcesCompleted),
|
|
431
|
+
@"completedResourceSize" : @(pack.progress.countOfBytesCompleted),
|
|
432
|
+
@"completedTileSize" : @(pack.progress.countOfTileBytesCompleted),
|
|
433
|
+
@"completedTileCount" : @(pack.progress.countOfTilesCompleted),
|
|
434
|
+
@"requiredResourceCount" : @(pack.progress.maximumResourcesExpected)
|
|
435
|
+
};
|
|
433
436
|
}
|
|
434
437
|
|
|
435
|
-
- (MLRNEvent *)_makeProgressEvent:(NSString *)name pack:(MLNOfflinePack *)pack
|
|
436
|
-
|
|
437
|
-
|
|
438
|
+
- (MLRNEvent *)_makeProgressEvent:(NSString *)name pack:(MLNOfflinePack *)pack {
|
|
439
|
+
return [MLRNEvent makeEvent:RCT_MAPBOX_OFFLINE_PROGRESS
|
|
440
|
+
withPayload:[self _makeRegionStatusPayload:name pack:pack]];
|
|
438
441
|
}
|
|
439
442
|
|
|
440
|
-
- (MLRNEvent *)_makeErrorEvent:(NSString *)name type:(NSString *)type message:(NSString *)message
|
|
441
|
-
{
|
|
442
|
-
|
|
443
|
-
return [MLRNEvent makeEvent:type withPayload:payload];
|
|
443
|
+
- (MLRNEvent *)_makeErrorEvent:(NSString *)name type:(NSString *)type message:(NSString *)message {
|
|
444
|
+
NSDictionary *payload = @{@"name" : name, @"message" : message};
|
|
445
|
+
return [MLRNEvent makeEvent:type withPayload:payload];
|
|
444
446
|
}
|
|
445
447
|
|
|
446
|
-
- (NSArray<NSDictionary *> *)_convertPacksToJson:(NSArray<MLNOfflinePack *> *)packs
|
|
447
|
-
|
|
448
|
-
NSMutableArray<NSDictionary *> *jsonPacks = [NSMutableArray new];
|
|
448
|
+
- (NSArray<NSDictionary *> *)_convertPacksToJson:(NSArray<MLNOfflinePack *> *)packs {
|
|
449
|
+
NSMutableArray<NSDictionary *> *jsonPacks = [NSMutableArray new];
|
|
449
450
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
451
|
+
if (packs == nil) {
|
|
452
|
+
return jsonPacks;
|
|
453
|
+
}
|
|
453
454
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
455
|
+
for (MLNOfflinePack *pack in packs) {
|
|
456
|
+
[jsonPacks addObject:[self _convertPackToDict:pack]];
|
|
457
|
+
}
|
|
457
458
|
|
|
458
|
-
|
|
459
|
+
return jsonPacks;
|
|
459
460
|
}
|
|
460
461
|
|
|
461
|
-
- (NSDictionary *)_convertPackToDict:(MLNOfflinePack *)pack
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
462
|
+
- (NSDictionary *)_convertPackToDict:(MLNOfflinePack *)pack {
|
|
463
|
+
// format bounds
|
|
464
|
+
MLNTilePyramidOfflineRegion *region = (MLNTilePyramidOfflineRegion *)pack.region;
|
|
465
|
+
if (region == nil) {
|
|
466
|
+
return nil;
|
|
467
|
+
}
|
|
468
468
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
469
|
+
NSArray *jsonBounds = @[
|
|
470
|
+
@[ @(region.bounds.ne.longitude), @(region.bounds.ne.latitude) ],
|
|
471
|
+
@[ @(region.bounds.sw.longitude), @(region.bounds.sw.latitude) ]
|
|
472
|
+
];
|
|
473
473
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
@"bounds": jsonBounds
|
|
482
|
-
};
|
|
474
|
+
// format metadata
|
|
475
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
476
|
+
NSData *jsonMetadata = [NSJSONSerialization dataWithJSONObject:metadata options:0 error:nil];
|
|
477
|
+
return @{
|
|
478
|
+
@"metadata" : [[NSString alloc] initWithData:jsonMetadata encoding:NSUTF8StringEncoding],
|
|
479
|
+
@"bounds" : jsonBounds
|
|
480
|
+
};
|
|
483
481
|
}
|
|
484
482
|
|
|
485
|
-
- (MLNOfflinePack *)_getPackFromName:(NSString *)name
|
|
486
|
-
|
|
487
|
-
NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
|
|
483
|
+
- (MLNOfflinePack *)_getPackFromName:(NSString *)name {
|
|
484
|
+
NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
|
|
488
485
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
486
|
+
if (packs == nil) {
|
|
487
|
+
return nil;
|
|
488
|
+
}
|
|
492
489
|
|
|
493
|
-
|
|
494
|
-
|
|
490
|
+
for (MLNOfflinePack *pack in packs) {
|
|
491
|
+
NSDictionary *metadata = [self _unarchiveMetadata:pack];
|
|
495
492
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
}
|
|
493
|
+
if ([name isEqualToString:metadata[@"name"]]) {
|
|
494
|
+
return pack;
|
|
499
495
|
}
|
|
496
|
+
}
|
|
500
497
|
|
|
501
|
-
|
|
498
|
+
return nil;
|
|
502
499
|
}
|
|
503
500
|
|
|
504
|
-
- (void)_sendEvent:(NSString *)eventName event:(MLRNEvent *)event
|
|
505
|
-
{
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
[self sendEventWithName:eventName body:[event toJSON]];
|
|
501
|
+
- (void)_sendEvent:(NSString *)eventName event:(MLRNEvent *)event {
|
|
502
|
+
if (!hasListeners) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
[self sendEventWithName:eventName body:[event toJSON]];
|
|
510
506
|
}
|
|
511
507
|
|
|
512
|
-
- (BOOL)_shouldSendProgressEvent:(double)currentTimestamp pack:(MLNOfflinePack *)currentPack
|
|
513
|
-
{
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
}
|
|
508
|
+
- (BOOL)_shouldSendProgressEvent:(double)currentTimestamp pack:(MLNOfflinePack *)currentPack {
|
|
509
|
+
if (lastPackState == -1) {
|
|
510
|
+
return YES;
|
|
511
|
+
}
|
|
517
512
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
513
|
+
if (lastPackState != currentPack.state) {
|
|
514
|
+
return YES;
|
|
515
|
+
}
|
|
521
516
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
517
|
+
if (currentTimestamp - lastPackTimestamp > eventThrottle) {
|
|
518
|
+
return YES;
|
|
519
|
+
}
|
|
525
520
|
|
|
526
|
-
|
|
521
|
+
return NO;
|
|
527
522
|
}
|
|
528
523
|
|
|
529
524
|
@end
|