@maplibre/maplibre-react-native 11.0.0-alpha.31 → 11.0.0-alpha.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/android/src/main/java/org/maplibre/reactnative/MLRNPackage.kt +10 -12
  3. package/android/src/main/java/org/maplibre/reactnative/components/mapview/MLRNMapView.kt +9 -0
  4. package/android/src/main/java/org/maplibre/reactnative/components/mapview/MLRNMapViewManager.kt +5 -1
  5. package/android/src/main/java/org/maplibre/reactnative/modules/MLRNModule.java +6 -24
  6. package/android/src/main/java/org/maplibre/reactnative/modules/MLRNOfflineModule.kt +561 -0
  7. package/ios/components/map-view/MLRNMapView.h +1 -0
  8. package/ios/components/map-view/MLRNMapView.m +5 -0
  9. package/ios/components/map-view/MLRNMapViewComponentView.mm +4 -0
  10. package/ios/modules/mlrn/MLRNModule.m +0 -13
  11. package/ios/modules/offline/MLRNOfflineModule.h +4 -7
  12. package/ios/modules/offline/MLRNOfflineModule.mm +693 -0
  13. package/lib/commonjs/MLRNModule.js +1 -3
  14. package/lib/commonjs/MLRNModule.js.map +1 -1
  15. package/lib/commonjs/components/map-view/AndroidTextureMapViewNativeComponent.ts +1 -0
  16. package/lib/commonjs/components/map-view/MapView.js.map +1 -1
  17. package/lib/commonjs/components/map-view/MapViewNativeComponent.ts +1 -0
  18. package/lib/commonjs/index.js +0 -8
  19. package/lib/commonjs/index.js.map +1 -1
  20. package/lib/commonjs/modules/offline/NativeOfflineModule.js +9 -0
  21. package/lib/commonjs/modules/offline/NativeOfflineModule.js.map +1 -0
  22. package/lib/commonjs/modules/offline/OfflineManager.js +124 -164
  23. package/lib/commonjs/modules/offline/OfflineManager.js.map +1 -1
  24. package/lib/commonjs/modules/offline/OfflinePack.js +15 -25
  25. package/lib/commonjs/modules/offline/OfflinePack.js.map +1 -1
  26. package/lib/module/MLRNModule.js +0 -1
  27. package/lib/module/MLRNModule.js.map +1 -1
  28. package/lib/module/components/map-view/AndroidTextureMapViewNativeComponent.ts +1 -0
  29. package/lib/module/components/map-view/MapView.js.map +1 -1
  30. package/lib/module/components/map-view/MapViewNativeComponent.ts +1 -0
  31. package/lib/module/index.js +0 -1
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/modules/offline/NativeOfflineModule.js +5 -0
  34. package/lib/module/modules/offline/NativeOfflineModule.js.map +1 -0
  35. package/lib/module/modules/offline/OfflineManager.js +123 -163
  36. package/lib/module/modules/offline/OfflineManager.js.map +1 -1
  37. package/lib/module/modules/offline/OfflinePack.js +14 -25
  38. package/lib/module/modules/offline/OfflinePack.js.map +1 -1
  39. package/lib/typescript/commonjs/src/MLRNModule.d.ts +1 -6
  40. package/lib/typescript/commonjs/src/MLRNModule.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/src/components/map-view/AndroidTextureMapViewNativeComponent.d.ts +1 -0
  42. package/lib/typescript/commonjs/src/components/map-view/AndroidTextureMapViewNativeComponent.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/src/components/map-view/MapView.d.ts +6 -0
  44. package/lib/typescript/commonjs/src/components/map-view/MapView.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/src/components/map-view/MapViewNativeComponent.d.ts +1 -0
  46. package/lib/typescript/commonjs/src/components/map-view/MapViewNativeComponent.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/src/index.d.ts +2 -5
  48. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/src/modules/offline/NativeOfflineModule.d.ts +50 -0
  50. package/lib/typescript/commonjs/src/modules/offline/NativeOfflineModule.d.ts.map +1 -0
  51. package/lib/typescript/commonjs/src/modules/offline/OfflineManager.d.ts +66 -69
  52. package/lib/typescript/commonjs/src/modules/offline/OfflineManager.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/src/modules/offline/OfflinePack.d.ts +11 -9
  54. package/lib/typescript/commonjs/src/modules/offline/OfflinePack.d.ts.map +1 -1
  55. package/lib/typescript/module/src/MLRNModule.d.ts +1 -6
  56. package/lib/typescript/module/src/MLRNModule.d.ts.map +1 -1
  57. package/lib/typescript/module/src/components/map-view/AndroidTextureMapViewNativeComponent.d.ts +1 -0
  58. package/lib/typescript/module/src/components/map-view/AndroidTextureMapViewNativeComponent.d.ts.map +1 -1
  59. package/lib/typescript/module/src/components/map-view/MapView.d.ts +6 -0
  60. package/lib/typescript/module/src/components/map-view/MapView.d.ts.map +1 -1
  61. package/lib/typescript/module/src/components/map-view/MapViewNativeComponent.d.ts +1 -0
  62. package/lib/typescript/module/src/components/map-view/MapViewNativeComponent.d.ts.map +1 -1
  63. package/lib/typescript/module/src/index.d.ts +2 -5
  64. package/lib/typescript/module/src/index.d.ts.map +1 -1
  65. package/lib/typescript/module/src/modules/offline/NativeOfflineModule.d.ts +50 -0
  66. package/lib/typescript/module/src/modules/offline/NativeOfflineModule.d.ts.map +1 -0
  67. package/lib/typescript/module/src/modules/offline/OfflineManager.d.ts +66 -69
  68. package/lib/typescript/module/src/modules/offline/OfflineManager.d.ts.map +1 -1
  69. package/lib/typescript/module/src/modules/offline/OfflinePack.d.ts +11 -9
  70. package/lib/typescript/module/src/modules/offline/OfflinePack.d.ts.map +1 -1
  71. package/package.json +7 -3
  72. package/src/MLRNModule.ts +0 -8
  73. package/src/components/map-view/AndroidTextureMapViewNativeComponent.ts +1 -0
  74. package/src/components/map-view/MapView.tsx +7 -0
  75. package/src/components/map-view/MapViewNativeComponent.ts +1 -0
  76. package/src/index.ts +13 -5
  77. package/src/modules/offline/NativeOfflineModule.ts +63 -0
  78. package/src/modules/offline/OfflineManager.ts +174 -210
  79. package/src/modules/offline/OfflinePack.ts +22 -32
  80. package/android/src/main/java/org/maplibre/reactnative/modules/MLRNOfflineModule.java +0 -586
  81. package/ios/modules/offline/MLRNOfflineModule.m +0 -524
  82. package/lib/commonjs/modules/offline/OfflineCreatePackOptions.js +0 -37
  83. package/lib/commonjs/modules/offline/OfflineCreatePackOptions.js.map +0 -1
  84. package/lib/commonjs/utils/makeNativeBounds.js +0 -11
  85. package/lib/commonjs/utils/makeNativeBounds.js.map +0 -1
  86. package/lib/module/modules/offline/OfflineCreatePackOptions.js +0 -32
  87. package/lib/module/modules/offline/OfflineCreatePackOptions.js.map +0 -1
  88. package/lib/module/utils/makeNativeBounds.js +0 -7
  89. package/lib/module/utils/makeNativeBounds.js.map +0 -1
  90. package/lib/typescript/commonjs/src/modules/offline/OfflineCreatePackOptions.d.ts +0 -20
  91. package/lib/typescript/commonjs/src/modules/offline/OfflineCreatePackOptions.d.ts.map +0 -1
  92. package/lib/typescript/commonjs/src/utils/makeNativeBounds.d.ts +0 -2
  93. package/lib/typescript/commonjs/src/utils/makeNativeBounds.d.ts.map +0 -1
  94. package/lib/typescript/module/src/modules/offline/OfflineCreatePackOptions.d.ts +0 -20
  95. package/lib/typescript/module/src/modules/offline/OfflineCreatePackOptions.d.ts.map +0 -1
  96. package/lib/typescript/module/src/utils/makeNativeBounds.d.ts +0 -2
  97. package/lib/typescript/module/src/utils/makeNativeBounds.d.ts.map +0 -1
  98. package/src/modules/offline/OfflineCreatePackOptions.ts +0 -53
  99. package/src/utils/makeNativeBounds.ts +0 -5
@@ -1,586 +0,0 @@
1
- package org.maplibre.reactnative.modules;
2
-
3
- import android.content.Context;
4
- import android.os.Handler;
5
- import android.os.Looper;
6
- import android.util.Log;
7
-
8
- import com.facebook.react.bridge.*;
9
- import com.facebook.react.module.annotations.ReactModule;
10
- import com.facebook.react.modules.core.RCTNativeAppEventEmitter;
11
- import org.maplibre.geojson.FeatureCollection;
12
- import org.maplibre.android.geometry.LatLngBounds;
13
- import org.maplibre.android.offline.OfflineManager;
14
- import org.maplibre.android.offline.OfflineRegion;
15
- import org.maplibre.android.offline.OfflineRegionDefinition;
16
- import org.maplibre.android.offline.OfflineRegionError;
17
- import org.maplibre.android.offline.OfflineRegionStatus;
18
- import org.maplibre.android.offline.OfflineTilePyramidRegionDefinition;
19
- import org.maplibre.android.storage.FileSource;
20
- import org.maplibre.reactnative.events.IEvent;
21
- import org.maplibre.reactnative.events.OfflineEvent;
22
- import org.maplibre.reactnative.events.constants.EventTypes;
23
- import org.maplibre.reactnative.utils.ConvertUtils;
24
- import org.maplibre.reactnative.utils.GeoJSONUtils;
25
- import org.maplibre.android.maps.Style;
26
-
27
- import org.json.JSONException;
28
- import org.json.JSONObject;
29
-
30
- import java.io.File;
31
- import java.io.UnsupportedEncodingException;
32
- import java.util.Locale;
33
-
34
- @ReactModule(name = MLRNOfflineModule.REACT_CLASS)
35
- public class MLRNOfflineModule extends ReactContextBaseJavaModule {
36
- public static final String REACT_CLASS = "MLRNOfflineModule";
37
-
38
- public static final int INACTIVE_REGION_DOWNLOAD_STATE = OfflineRegion.STATE_INACTIVE;
39
- public static final int ACTIVE_REGION_DOWNLOAD_STATE = OfflineRegion.STATE_ACTIVE;
40
- public static final int COMPLETE_REGION_DOWNLOAD_STATE = 2;
41
-
42
- public static final String OFFLINE_ERROR = "MapboxOfflineRegionError";
43
- public static final String OFFLINE_PROGRESS = "MapboxOfflineRegionProgress";
44
-
45
- public static final Double DEFAULT_MIN_ZOOM_LEVEL = 10.0;
46
- public static final Double DEFAULT_MAX_ZOOM_LEVEL = 20.0;
47
-
48
- private final Context mContext;
49
- private final ReactContext mReactContext;
50
- private Double mProgressEventThrottle = 300.0;
51
-
52
- public MLRNOfflineModule(ReactApplicationContext reactApplicationContext) {
53
- super(reactApplicationContext);
54
- mReactContext = reactApplicationContext;
55
- mContext = reactApplicationContext.getApplicationContext();
56
- }
57
-
58
- @Override
59
- public String getName () {
60
- return REACT_CLASS;
61
- }
62
-
63
- @ReactMethod
64
- public void addListener(String eventName) {
65
- // Set up any upstream listeners or background tasks as necessary
66
- }
67
-
68
- @ReactMethod
69
- public void removeListeners(Integer count) {
70
- // Remove upstream listeners, stop unnecessary background tasks
71
- }
72
-
73
- @ReactMethod
74
- public void createPack(ReadableMap options, final Promise promise) {
75
- final String name = ConvertUtils.getString("name", options, "");
76
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
77
- LatLngBounds latLngBounds = getBoundsFromOptions(options);
78
-
79
- OfflineRegionDefinition definition = makeDefinition(latLngBounds, options);
80
- byte[] metadataBytes = getMetadataBytes(ConvertUtils.getString("metadata", options, ""));
81
-
82
- OfflineManager.CreateOfflineRegionCallback callback = new OfflineManager.CreateOfflineRegionCallback() {
83
- @Override
84
- public void onCreate(OfflineRegion offlineRegion) {
85
- promise.resolve(fromOfflineRegion(offlineRegion));
86
- setOfflineRegionObserver(name, offlineRegion);
87
- }
88
-
89
- @Override
90
- public void onError(String error) {
91
- sendEvent(makeErrorEvent(name, EventTypes.OFFLINE_ERROR, error));
92
- }
93
- };
94
-
95
- offlineManager.createOfflineRegion(definition, metadataBytes, callback);
96
- }
97
-
98
- @ReactMethod
99
- public void getPacks(final Promise promise) {
100
- activateFileSource();
101
-
102
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
103
-
104
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
105
- @Override
106
- public void onList(OfflineRegion[] offlineRegions) {
107
- WritableArray payload = Arguments.createArray();
108
-
109
- for (OfflineRegion region : offlineRegions) {
110
- payload.pushMap(fromOfflineRegion(region));
111
- }
112
-
113
- promise.resolve(payload);
114
- }
115
-
116
- @Override
117
- public void onError(String error) {
118
- promise.reject("getRegions", error);
119
- }
120
- });
121
- }
122
-
123
- @ReactMethod
124
- public void invalidateAmbientCache(final Promise promise) {
125
- activateFileSource();
126
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
127
- offlineManager.invalidateAmbientCache(new OfflineManager.FileSourceCallback() {
128
- @Override
129
- public void onSuccess() {
130
- promise.resolve(null);
131
- }
132
-
133
- @Override
134
- public void onError(String error) {
135
- promise.reject("invalidateAmbientCache", error);
136
- }
137
- });
138
- }
139
-
140
- @ReactMethod
141
- public void clearAmbientCache(final Promise promise) {
142
- activateFileSource();
143
-
144
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
145
-
146
- offlineManager.clearAmbientCache(new OfflineManager.FileSourceCallback() {
147
- @Override
148
- public void onSuccess() {
149
- promise.resolve(null);
150
- }
151
-
152
- @Override
153
- public void onError(String error) {
154
- promise.reject("clearAmbientCache", error);
155
- }
156
- });
157
- }
158
-
159
- @ReactMethod
160
- public void setMaximumAmbientCacheSize(int size, final Promise promise) {
161
- activateFileSource();
162
-
163
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
164
-
165
- offlineManager.setMaximumAmbientCacheSize(size, new OfflineManager.FileSourceCallback() {
166
- @Override
167
- public void onSuccess() {
168
- promise.resolve(null);
169
- }
170
-
171
- @Override
172
- public void onError(String error) {
173
- promise.reject("setMaximumAmbientCacheSize", error);
174
- }
175
- });
176
- }
177
-
178
-
179
- @ReactMethod
180
- public void resetDatabase(final Promise promise) {
181
- activateFileSource();
182
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
183
- offlineManager.resetDatabase(new OfflineManager.FileSourceCallback() {
184
- @Override
185
- public void onSuccess() {
186
- promise.resolve(null);
187
- }
188
-
189
- @Override
190
- public void onError(String error) {
191
- promise.reject("resetDatabase", error);
192
- }
193
- });
194
- }
195
-
196
- @ReactMethod
197
- public void getPackStatus(final String name, final Promise promise) {
198
- activateFileSource();
199
-
200
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
201
-
202
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
203
- @Override
204
- public void onList(OfflineRegion[] offlineRegions) {
205
- OfflineRegion region = getRegionByName(name, offlineRegions);
206
-
207
- if (region == null) {
208
- promise.resolve(null);
209
- Log.w(REACT_CLASS, "getPackStatus - Unknown offline region");
210
- return;
211
- }
212
-
213
- region.getStatus(new OfflineRegion.OfflineRegionStatusCallback() {
214
- @Override
215
- public void onStatus(OfflineRegionStatus status) {
216
- promise.resolve(makeRegionStatus(name, status));
217
- }
218
-
219
- @Override
220
- public void onError(String error) {
221
- promise.reject("getPackStatus", error);
222
- }
223
- });
224
- }
225
-
226
- @Override
227
- public void onError(String error) {
228
- promise.reject("getPackStatus", error);
229
- }
230
- });
231
- }
232
-
233
- @ReactMethod
234
- public void setPackObserver(final String name, final Promise promise) {
235
- activateFileSource();
236
-
237
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
238
-
239
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
240
- @Override
241
- public void onList(OfflineRegion[] offlineRegions) {
242
- OfflineRegion region = getRegionByName(name, offlineRegions);
243
- boolean hasRegion = region != null;
244
-
245
- if (hasRegion) {
246
- setOfflineRegionObserver(name, region);
247
- }
248
-
249
- promise.resolve(hasRegion);
250
- }
251
-
252
- @Override
253
- public void onError(String error) {
254
- promise.reject("setPackObserver", error);
255
- }
256
- });
257
- }
258
-
259
- @ReactMethod
260
- public void invalidatePack(final String name, final Promise promise) {
261
- activateFileSource();
262
-
263
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
264
-
265
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
266
- @Override
267
- public void onList(OfflineRegion[] offlineRegions) {
268
- OfflineRegion region = getRegionByName(name, offlineRegions);
269
-
270
- if (region == null) {
271
- promise.resolve(null);
272
- Log.w(REACT_CLASS, "invalidateRegion - Unknown offline region");
273
- return;
274
- }
275
-
276
- region.invalidate(new OfflineRegion.OfflineRegionInvalidateCallback() {
277
- @Override
278
- public void onInvalidate() {
279
- promise.resolve(null);
280
- }
281
-
282
- @Override
283
- public void onError(String error) {
284
- promise.reject("invalidateRegion", error);
285
- }
286
- });
287
- }
288
-
289
- @Override
290
- public void onError(String error) {
291
- promise.reject("invalidateRegion", error);
292
- }
293
- });
294
- }
295
-
296
- @ReactMethod
297
- public void deletePack(final String name, final Promise promise) {
298
- activateFileSource();
299
-
300
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
301
-
302
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
303
- @Override
304
- public void onList(OfflineRegion[] offlineRegions) {
305
- OfflineRegion region = getRegionByName(name, offlineRegions);
306
-
307
- if (region == null) {
308
- promise.resolve(null);
309
- Log.w(REACT_CLASS, "deleteRegion - Unknown offline region");
310
- return;
311
- }
312
-
313
- // stop download before deleting (https://github.com/mapbox/mapbox-gl-native/issues/12382#issuecomment-431055103)
314
- region.setDownloadState(INACTIVE_REGION_DOWNLOAD_STATE);
315
-
316
- region.delete(new OfflineRegion.OfflineRegionDeleteCallback() {
317
- @Override
318
- public void onDelete() {
319
- promise.resolve(null);
320
- }
321
-
322
- @Override
323
- public void onError(String error) {
324
- promise.reject("deleteRegion", error);
325
- }
326
- });
327
- }
328
-
329
- @Override
330
- public void onError(String error) {
331
- promise.reject("deleteRegion", error);
332
- }
333
- });
334
- }
335
-
336
- @ReactMethod
337
- public void pausePackDownload(final String name, final Promise promise) {
338
- activateFileSource();
339
-
340
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
341
-
342
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
343
- @Override
344
- public void onList(OfflineRegion[] offlineRegions) {
345
- final OfflineRegion offlineRegion = getRegionByName(name, offlineRegions);
346
-
347
- if (offlineRegion == null) {
348
- promise.reject("pauseRegionDownload", "Unknown offline region");
349
- return;
350
- }
351
-
352
- new Handler(Looper.getMainLooper()).post(new Runnable() {
353
- @Override
354
- public void run() {
355
- offlineRegion.setDownloadState(INACTIVE_REGION_DOWNLOAD_STATE);
356
- promise.resolve(null);
357
- }
358
- });
359
- }
360
-
361
- @Override
362
- public void onError(String error) {
363
- promise.reject("pauseRegionDownload", error);
364
- }
365
- });
366
- }
367
-
368
- @ReactMethod
369
- public void resumePackDownload(final String name, final Promise promise) {
370
- activateFileSource();
371
-
372
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
373
-
374
- offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
375
- @Override
376
- public void onList(OfflineRegion[] offlineRegions) {
377
- OfflineRegion offlineRegion = getRegionByName(name, offlineRegions);
378
-
379
- if (offlineRegion == null) {
380
- promise.reject("resumeRegionDownload", "Unknown offline region");
381
- return;
382
- }
383
-
384
- offlineRegion.setDownloadState(ACTIVE_REGION_DOWNLOAD_STATE);
385
- promise.resolve(null);
386
- }
387
-
388
- @Override
389
- public void onError(String error) {
390
- promise.reject("resumeRegionDownload", error);
391
- }
392
- });
393
- }
394
-
395
- @ReactMethod
396
- public void mergeOfflineRegions(final String path, final Promise promise) {
397
- activateFileSource();
398
-
399
- final OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
400
-
401
- offlineManager.mergeOfflineRegions(path, new OfflineManager.MergeOfflineRegionsCallback() {
402
- @Override
403
- public void onMerge(OfflineRegion[] offlineRegions) {
404
- promise.resolve(null);
405
- }
406
-
407
- @Override
408
- public void onError(String error) {
409
- promise.reject("mergeOfflineRegions", error);
410
- }
411
- });
412
- }
413
-
414
- @ReactMethod
415
- public void setTileCountLimit(int tileCountLimit) {
416
- OfflineManager offlineManager = OfflineManager.Companion.getInstance(mContext);
417
- offlineManager.setOfflineMapboxTileCountLimit(tileCountLimit);
418
- }
419
-
420
- @ReactMethod
421
- public void setProgressEventThrottle(double eventThrottle) {
422
- mProgressEventThrottle = eventThrottle;
423
- }
424
-
425
- private OfflineRegionDefinition makeDefinition(LatLngBounds latLngBounds, ReadableMap options) {
426
- return new OfflineTilePyramidRegionDefinition(
427
- ConvertUtils.getString("styleURL", options, MLRNModule.DEFAULT_STYLE_URL),
428
- latLngBounds,
429
- ConvertUtils.getDouble("minZoom", options, DEFAULT_MIN_ZOOM_LEVEL),
430
- ConvertUtils.getDouble("maxZoom", options, DEFAULT_MAX_ZOOM_LEVEL),
431
- mContext.getResources().getDisplayMetrics().density);
432
- }
433
-
434
- private byte[] getMetadataBytes(String metadata) {
435
- byte[] metadataBytes = null;
436
-
437
- if (metadata == null || metadata.isEmpty()) {
438
- return metadataBytes;
439
- }
440
-
441
- try {
442
- metadataBytes = metadata.getBytes("utf-8");
443
- } catch (UnsupportedEncodingException e) {
444
- Log.w(REACT_CLASS, e.getLocalizedMessage());
445
- }
446
-
447
- return metadataBytes;
448
- }
449
-
450
- private void setOfflineRegionObserver(final String name, final OfflineRegion region) {
451
- region.setObserver(new OfflineRegion.OfflineRegionObserver() {
452
- OfflineRegionStatus prevStatus = null;
453
- long timestamp = System.currentTimeMillis();
454
-
455
- @Override
456
- public void onStatusChanged(OfflineRegionStatus status) {
457
- if (shouldSendUpdate(System.currentTimeMillis(), status)) {
458
- sendEvent(makeStatusEvent(name, status));
459
- timestamp = System.currentTimeMillis();
460
- }
461
- prevStatus = status;
462
- }
463
-
464
- @Override
465
- public void onError(OfflineRegionError error) {
466
- sendEvent(makeErrorEvent(name, EventTypes.OFFLINE_ERROR, error.getMessage()));
467
- }
468
-
469
- @Override
470
- public void mapboxTileCountLimitExceeded(long limit) {
471
- String message = String.format(Locale.getDefault(), "Mapbox tile limit exceeded %d", limit);
472
- sendEvent(makeErrorEvent(name, EventTypes.OFFLINE_TILE_LIMIT, message));
473
- }
474
-
475
- private boolean shouldSendUpdate (long currentTimestamp, OfflineRegionStatus curStatus) {
476
- if (prevStatus == null) {
477
- return false;
478
- }
479
-
480
- if (prevStatus.getDownloadState() != curStatus.getDownloadState()) {
481
- return true;
482
- }
483
-
484
- if (currentTimestamp - timestamp > mProgressEventThrottle) {
485
- return true;
486
- }
487
-
488
- return false;
489
- }
490
- });
491
-
492
- region.setDownloadState(ACTIVE_REGION_DOWNLOAD_STATE);
493
- }
494
-
495
- private void sendEvent(IEvent event) {
496
- RCTNativeAppEventEmitter eventEmitter = getEventEmitter();
497
- eventEmitter.emit(event.getKey(), event.toJSON());
498
- }
499
-
500
- private RCTNativeAppEventEmitter getEventEmitter() {
501
- return mReactContext.getJSModule(RCTNativeAppEventEmitter.class);
502
- }
503
-
504
- private OfflineEvent makeErrorEvent(String regionName, String errorType, String message) {
505
- WritableMap payload = new WritableNativeMap();
506
- payload.putString("message", message);
507
- payload.putString("name", regionName);
508
- return new OfflineEvent(OFFLINE_ERROR, errorType, payload);
509
- }
510
-
511
- private OfflineEvent makeStatusEvent(String regionName, OfflineRegionStatus status) {
512
- return new OfflineEvent(OFFLINE_PROGRESS, EventTypes.OFFLINE_STATUS, makeRegionStatus(regionName, status));
513
- }
514
-
515
- private WritableMap makeRegionStatus(String regionName, OfflineRegionStatus status) {
516
- WritableMap map = Arguments.createMap();
517
-
518
- int downloadState = status.getDownloadState();
519
- double percentage = 0.0;
520
-
521
- if (status.isComplete()) {
522
- downloadState = COMPLETE_REGION_DOWNLOAD_STATE;
523
- percentage = 100.0;
524
- } else {
525
- percentage = status.getRequiredResourceCount() >= 0
526
- ? (100.0 * status.getCompletedResourceCount() / status.getRequiredResourceCount()) :
527
- 0.0;
528
- }
529
-
530
- map.putString("name", regionName);
531
- map.putInt("state", downloadState);
532
- map.putDouble("percentage", percentage);
533
- map.putInt("completedResourceCount", (int)status.getCompletedResourceCount());
534
- map.putInt("completedResourceSize", (int)status.getCompletedResourceSize());
535
- map.putInt("completedTileSize", (int)status.getCompletedTileSize());
536
- map.putInt("completedTileCount", (int)status.getCompletedTileCount());
537
- map.putInt("requiredResourceCount", (int)status.getRequiredResourceCount());
538
-
539
- return map;
540
- }
541
-
542
- private LatLngBounds getBoundsFromOptions(ReadableMap options) {
543
- String featureCollectionJSONStr = ConvertUtils.getString("bounds", options, "{}");
544
- FeatureCollection featureCollection = FeatureCollection.fromJson(featureCollectionJSONStr);
545
- return GeoJSONUtils.toLatLngBounds(featureCollection);
546
- }
547
-
548
- private WritableMap fromOfflineRegion(OfflineRegion region) {
549
- WritableMap map = Arguments.createMap();
550
- map.putArray("bounds", GeoJSONUtils.fromLatLngBounds(region.getDefinition().getBounds()));
551
- map.putString("metadata", new String(region.getMetadata()));
552
- return map;
553
- }
554
-
555
- private OfflineRegion getRegionByName(String name, OfflineRegion[] offlineRegions) {
556
- if (name == null || name.isEmpty()) {
557
- return null;
558
- }
559
-
560
- for (OfflineRegion region : offlineRegions) {
561
- boolean isRegion = false;
562
-
563
- try {
564
- byte[] byteMetadata = region.getMetadata();
565
-
566
- if (byteMetadata != null) {
567
- JSONObject metadata = new JSONObject(new String(byteMetadata));
568
- isRegion = name.equals(metadata.getString("name"));
569
- }
570
- } catch (JSONException e) {
571
- Log.w(REACT_CLASS, e.getLocalizedMessage());
572
- }
573
-
574
- if (isRegion) {
575
- return region;
576
- }
577
- }
578
-
579
- return null;
580
- }
581
-
582
- private void activateFileSource() {
583
- FileSource fileSource = FileSource.getInstance(mContext);
584
- fileSource.activate();
585
- }
586
- }