@capawesome/capacitor-live-update 6.8.0 → 6.9.1

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 (56) hide show
  1. package/CapawesomeCapacitorLiveUpdate.podspec +2 -2
  2. package/README.md +429 -20
  3. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdate.java +894 -279
  4. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdateConfig.java +35 -0
  5. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdateHttpClient.java +56 -11
  6. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdatePlugin.java +274 -38
  7. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdatePreferences.java +52 -3
  8. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetChannelsResponseItem.java +28 -0
  9. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetLatestBundleResponse.java +11 -2
  10. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/events/DownloadBundleProgressEvent.java +32 -0
  11. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/events/NextBundleSetEvent.java +26 -0
  12. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/options/FetchChannelsOptions.java +38 -0
  13. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/options/SetConfigOptions.java +19 -0
  14. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/options/SyncOptions.java +4 -0
  15. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/ChannelResult.java +28 -0
  16. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/FetchChannelsResult.java +28 -0
  17. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/FetchLatestBundleResult.java +8 -0
  18. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/GetBlockedBundlesResult.java +27 -0
  19. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/GetConfigResult.java +40 -0
  20. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/GetDownloadedBundlesResult.java +27 -0
  21. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/IsSyncingResult.java +26 -0
  22. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/ReadyResult.java +32 -0
  23. package/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/interfaces/DownloadProgressCallback.java +5 -0
  24. package/dist/docs.json +853 -50
  25. package/dist/esm/definitions.d.ts +411 -1
  26. package/dist/esm/definitions.js.map +1 -1
  27. package/dist/esm/web.d.ts +10 -2
  28. package/dist/esm/web.js +24 -0
  29. package/dist/esm/web.js.map +1 -1
  30. package/dist/plugin.cjs.js +24 -0
  31. package/dist/plugin.cjs.js.map +1 -1
  32. package/dist/plugin.js +24 -0
  33. package/dist/plugin.js.map +1 -1
  34. package/ios/Plugin/Classes/Events/DownloadBundleProgressEvent.swift +25 -0
  35. package/ios/Plugin/Classes/Events/NextBundleSetEvent.swift +16 -0
  36. package/ios/Plugin/Classes/Options/FetchChannelsOptions.swift +26 -0
  37. package/ios/Plugin/Classes/Options/SetConfigOptions.swift +14 -0
  38. package/ios/Plugin/Classes/Options/SyncOptions.swift +4 -0
  39. package/ios/Plugin/Classes/Results/ChannelResult.swift +19 -0
  40. package/ios/Plugin/Classes/Results/FetchChannelsResult.swift +16 -0
  41. package/ios/Plugin/Classes/Results/{FetchLatestBundle.swift → FetchLatestBundleResult.swift} +6 -1
  42. package/ios/Plugin/Classes/Results/GetBlockedBundlesResult.swift +16 -0
  43. package/ios/Plugin/Classes/Results/GetConfigResult.swift +19 -0
  44. package/ios/Plugin/Classes/Results/GetDownloadedBundlesResult.swift +16 -0
  45. package/ios/Plugin/Classes/Results/IsSyncingResult.swift +16 -0
  46. package/ios/Plugin/Classes/Results/ReadyResult.swift +22 -0
  47. package/ios/Plugin/LiveUpdate.swift +456 -152
  48. package/ios/Plugin/LiveUpdateConfig.swift +3 -0
  49. package/ios/Plugin/LiveUpdateHttpClient.swift +21 -4
  50. package/ios/Plugin/LiveUpdatePlugin.swift +174 -14
  51. package/ios/Plugin/LiveUpdatePreferences.swift +54 -12
  52. package/ios/Plugin/Protocols/Api/GetChannelsResponseItem.swift +4 -0
  53. package/ios/Plugin/Protocols/Api/GetLatestBundleResponse.swift +1 -0
  54. package/package.json +5 -5
  55. package/ios/Plugin/LiveUpdatePlugin.h +0 -10
  56. package/ios/Plugin/LiveUpdatePlugin.m +0 -27
@@ -1,21 +1,36 @@
1
1
  package io.capawesome.capacitorjs.plugins.liveupdate;
2
2
 
3
+ import android.webkit.WebView;
4
+ import androidx.annotation.NonNull;
3
5
  import androidx.annotation.Nullable;
6
+ import com.getcapacitor.JSObject;
4
7
  import com.getcapacitor.Logger;
5
8
  import com.getcapacitor.Plugin;
6
9
  import com.getcapacitor.PluginCall;
7
10
  import com.getcapacitor.PluginMethod;
11
+ import com.getcapacitor.WebViewListener;
8
12
  import com.getcapacitor.annotation.CapacitorPlugin;
13
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.events.DownloadBundleProgressEvent;
14
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.events.NextBundleSetEvent;
9
15
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.DeleteBundleOptions;
10
16
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.DownloadBundleOptions;
17
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.FetchChannelsOptions;
11
18
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.FetchLatestBundleOptions;
12
19
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SetBundleOptions;
13
20
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SetChannelOptions;
21
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SetConfigOptions;
14
22
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SetCustomIdOptions;
15
23
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SetNextBundleOptions;
16
24
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.options.SyncOptions;
25
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.FetchChannelsResult;
26
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.FetchLatestBundleResult;
27
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetBlockedBundlesResult;
28
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetBundleResult;
29
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetConfigResult;
17
30
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetCurrentBundleResult;
31
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetDownloadedBundlesResult;
18
32
  import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.GetNextBundleResult;
33
+ import io.capawesome.capacitorjs.plugins.liveupdate.classes.results.IsSyncingResult;
19
34
  import io.capawesome.capacitorjs.plugins.liveupdate.interfaces.EmptyCallback;
20
35
  import io.capawesome.capacitorjs.plugins.liveupdate.interfaces.NonEmptyCallback;
21
36
  import io.capawesome.capacitorjs.plugins.liveupdate.interfaces.Result;
@@ -24,12 +39,13 @@ import io.capawesome.capacitorjs.plugins.liveupdate.interfaces.Result;
24
39
  public class LiveUpdatePlugin extends Plugin {
25
40
 
26
41
  public static final String TAG = "LiveUpdate";
27
- public static final String VERSION = "6.8.0";
42
+ public static final String VERSION = "6.9.1";
28
43
  public static final String SHARED_PREFERENCES_NAME = "CapawesomeLiveUpdate"; // DO NOT CHANGE
29
44
  public static final String ERROR_APP_ID_MISSING = "appId must be configured.";
30
45
  public static final String ERROR_BUNDLE_EXISTS = "bundle already exists.";
31
46
  public static final String ERROR_BUNDLE_ID_MISSING = "bundleId must be provided.";
32
47
  public static final String ERROR_BUNDLE_INDEX_HTML_MISSING = "The bundle does not contain an index.html file.";
48
+ public static final String ERROR_BUNDLE_MOVE_FAILED = "Bundle could not be moved.";
33
49
  public static final String ERROR_BUNDLE_NOT_FOUND = "bundle not found.";
34
50
  public static final String ERROR_CHECKSUM_CALCULATION_FAILED = "Failed to calculate checksum.";
35
51
  public static final String ERROR_CHECKSUM_MISMATCH = "Checksum mismatch.";
@@ -42,8 +58,9 @@ public class LiveUpdatePlugin extends Plugin {
42
58
  public static final String ERROR_SIGNATURE_MISSING = "Bundle does not contain a signature.";
43
59
  public static final String ERROR_SYNC_IN_PROGRESS = "Sync is already in progress.";
44
60
  public static final String ERROR_UNKNOWN_ERROR = "An unknown error has occurred.";
45
-
46
- private boolean syncInProgress = false;
61
+ public static final String EVENT_DOWNLOAD_BUNDLE_PROGRESS = "downloadBundleProgress";
62
+ public static final String EVENT_NEXT_BUNDLE_SET = "nextBundleSet";
63
+ public static final String EVENT_RELOADED = "reloaded";
47
64
 
48
65
  @Nullable
49
66
  private LiveUpdateConfig config;
@@ -51,6 +68,8 @@ public class LiveUpdatePlugin extends Plugin {
51
68
  @Nullable
52
69
  private LiveUpdate implementation;
53
70
 
71
+ private boolean webViewListenerRegistered = false;
72
+
54
73
  public void load() {
55
74
  try {
56
75
  config = getLiveUpdateConfig();
@@ -60,6 +79,46 @@ public class LiveUpdatePlugin extends Plugin {
60
79
  }
61
80
  }
62
81
 
82
+ @Override
83
+ protected void handleOnResume() {
84
+ super.handleOnResume();
85
+ try {
86
+ // Notify the implementation that the app has resumed
87
+ if (implementation != null) {
88
+ implementation.handleOnResume();
89
+ }
90
+ // Register WebView listener to trigger auto-update when page is loaded
91
+ // Important: For some reason, the listener CANNOT be registered in the load() method
92
+ // or constructor, it MUST be done here in onResume().
93
+ if (!webViewListenerRegistered) {
94
+ webViewListenerRegistered = true;
95
+ getBridge()
96
+ .addWebViewListener(
97
+ new WebViewListener() {
98
+ @Override
99
+ public void onPageLoaded(WebView webView) {
100
+ if (implementation != null) {
101
+ implementation.handleOnPageLoaded();
102
+ }
103
+ }
104
+ }
105
+ );
106
+ }
107
+ } catch (Exception exception) {
108
+ Logger.error(TAG, exception.getMessage(), exception);
109
+ }
110
+ }
111
+
112
+ @PluginMethod
113
+ public void clearBlockedBundles(PluginCall call) {
114
+ try {
115
+ implementation.clearBlockedBundles();
116
+ resolveCall(call);
117
+ } catch (Exception exception) {
118
+ rejectCall(call, exception);
119
+ }
120
+ }
121
+
63
122
  @PluginMethod
64
123
  public void deleteBundle(PluginCall call) {
65
124
  try {
@@ -73,7 +132,7 @@ public class LiveUpdatePlugin extends Plugin {
73
132
  EmptyCallback callback = new EmptyCallback() {
74
133
  @Override
75
134
  public void success() {
76
- call.resolve();
135
+ resolveCall(call);
77
136
  }
78
137
 
79
138
  @Override
@@ -109,7 +168,7 @@ public class LiveUpdatePlugin extends Plugin {
109
168
  EmptyCallback callback = new EmptyCallback() {
110
169
  @Override
111
170
  public void success() {
112
- call.resolve();
171
+ resolveCall(call);
113
172
  }
114
173
 
115
174
  @Override
@@ -127,11 +186,17 @@ public class LiveUpdatePlugin extends Plugin {
127
186
  @PluginMethod
128
187
  public void fetchLatestBundle(PluginCall call) {
129
188
  try {
189
+ String appId = config.getAppId();
190
+ if (appId == null || appId.isEmpty()) {
191
+ call.reject(ERROR_APP_ID_MISSING);
192
+ return;
193
+ }
194
+
130
195
  FetchLatestBundleOptions options = new FetchLatestBundleOptions(call);
131
- NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
196
+ NonEmptyCallback<FetchLatestBundleResult> callback = new NonEmptyCallback<>() {
132
197
  @Override
133
- public void success(Result result) {
134
- call.resolve(result.toJSObject());
198
+ public void success(FetchLatestBundleResult result) {
199
+ resolveCall(call, result.toJSObject());
135
200
  }
136
201
 
137
202
  @Override
@@ -146,13 +211,63 @@ public class LiveUpdatePlugin extends Plugin {
146
211
  }
147
212
  }
148
213
 
214
+ @PluginMethod
215
+ public void getBlockedBundles(PluginCall call) {
216
+ try {
217
+ NonEmptyCallback<GetBlockedBundlesResult> callback = new NonEmptyCallback<>() {
218
+ @Override
219
+ public void success(GetBlockedBundlesResult result) {
220
+ resolveCall(call, result.toJSObject());
221
+ }
222
+
223
+ @Override
224
+ public void error(Exception exception) {
225
+ rejectCall(call, exception);
226
+ }
227
+ };
228
+
229
+ assert implementation != null;
230
+ implementation.getBlockedBundles(callback);
231
+ } catch (Exception exception) {
232
+ rejectCall(call, exception);
233
+ }
234
+ }
235
+
236
+ @PluginMethod
237
+ public void fetchChannels(PluginCall call) {
238
+ try {
239
+ String appId = config.getAppId();
240
+ if (appId == null || appId.isEmpty()) {
241
+ call.reject(ERROR_APP_ID_MISSING);
242
+ return;
243
+ }
244
+
245
+ FetchChannelsOptions options = new FetchChannelsOptions(call);
246
+ NonEmptyCallback<FetchChannelsResult> callback = new NonEmptyCallback<>() {
247
+ @Override
248
+ public void success(FetchChannelsResult result) {
249
+ resolveCall(call, result.toJSObject());
250
+ }
251
+
252
+ @Override
253
+ public void error(Exception exception) {
254
+ rejectCall(call, exception);
255
+ }
256
+ };
257
+
258
+ implementation.fetchChannels(options, callback);
259
+ } catch (Exception exception) {
260
+ rejectCall(call, exception);
261
+ }
262
+ }
263
+
149
264
  @PluginMethod
150
265
  public void getBundle(PluginCall call) {
151
266
  try {
152
- NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
267
+ NonEmptyCallback<GetBundleResult> callback = new NonEmptyCallback<>() {
153
268
  @Override
154
- public void success(Result result) {
155
- call.resolve(result.toJSObject());
269
+ public void success(GetBundleResult result) {
270
+ resolveCall(call, result.toJSObject());
156
271
  }
157
272
 
158
273
  @Override
@@ -161,6 +276,7 @@ public class LiveUpdatePlugin extends Plugin {
161
276
  }
162
277
  };
163
278
 
279
+ assert implementation != null;
164
280
  implementation.getBundle(callback);
165
281
  } catch (Exception exception) {
166
282
  rejectCall(call, exception);
@@ -173,7 +289,7 @@ public class LiveUpdatePlugin extends Plugin {
173
289
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
174
290
  @Override
175
291
  public void success(Result result) {
176
- call.resolve(result.toJSObject());
292
+ resolveCall(call, result.toJSObject());
177
293
  }
178
294
 
179
295
  @Override
@@ -188,13 +304,35 @@ public class LiveUpdatePlugin extends Plugin {
188
304
  }
189
305
  }
190
306
 
307
+ @PluginMethod
308
+ public void getDownloadedBundles(PluginCall call) {
309
+ try {
310
+ NonEmptyCallback<GetDownloadedBundlesResult> callback = new NonEmptyCallback<>() {
311
+ @Override
312
+ public void success(GetDownloadedBundlesResult result) {
313
+ resolveCall(call, result.toJSObject());
314
+ }
315
+
316
+ @Override
317
+ public void error(Exception exception) {
318
+ rejectCall(call, exception);
319
+ }
320
+ };
321
+
322
+ assert implementation != null;
323
+ implementation.getDownloadedBundles(callback);
324
+ } catch (Exception exception) {
325
+ rejectCall(call, exception);
326
+ }
327
+ }
328
+
191
329
  @PluginMethod
192
330
  public void getChannel(PluginCall call) {
193
331
  try {
194
332
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
195
333
  @Override
196
334
  public void success(Result result) {
197
- call.resolve(result.toJSObject());
335
+ resolveCall(call, result.toJSObject());
198
336
  }
199
337
 
200
338
  @Override
@@ -209,13 +347,35 @@ public class LiveUpdatePlugin extends Plugin {
209
347
  }
210
348
  }
211
349
 
350
+ @PluginMethod
351
+ public void getConfig(PluginCall call) {
352
+ try {
353
+ NonEmptyCallback<GetConfigResult> callback = new NonEmptyCallback<>() {
354
+ @Override
355
+ public void success(GetConfigResult result) {
356
+ resolveCall(call, result.toJSObject());
357
+ }
358
+
359
+ @Override
360
+ public void error(Exception exception) {
361
+ rejectCall(call, exception);
362
+ }
363
+ };
364
+
365
+ assert implementation != null;
366
+ implementation.getConfig(callback);
367
+ } catch (Exception exception) {
368
+ rejectCall(call, exception);
369
+ }
370
+ }
371
+
212
372
  @PluginMethod
213
373
  public void getCurrentBundle(PluginCall call) {
214
374
  try {
215
375
  NonEmptyCallback<GetCurrentBundleResult> callback = new NonEmptyCallback<>() {
216
376
  @Override
217
377
  public void success(GetCurrentBundleResult result) {
218
- call.resolve(result.toJSObject());
378
+ resolveCall(call, result.toJSObject());
219
379
  }
220
380
 
221
381
  @Override
@@ -237,7 +397,7 @@ public class LiveUpdatePlugin extends Plugin {
237
397
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
238
398
  @Override
239
399
  public void success(Result result) {
240
- call.resolve(result.toJSObject());
400
+ resolveCall(call, result.toJSObject());
241
401
  }
242
402
 
243
403
  @Override
@@ -258,7 +418,7 @@ public class LiveUpdatePlugin extends Plugin {
258
418
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
259
419
  @Override
260
420
  public void success(Result result) {
261
- call.resolve(result.toJSObject());
421
+ resolveCall(call, result.toJSObject());
262
422
  }
263
423
 
264
424
  @Override
@@ -279,7 +439,7 @@ public class LiveUpdatePlugin extends Plugin {
279
439
  NonEmptyCallback<GetNextBundleResult> callback = new NonEmptyCallback<>() {
280
440
  @Override
281
441
  public void success(GetNextBundleResult result) {
282
- call.resolve(result.toJSObject());
442
+ resolveCall(call, result.toJSObject());
283
443
  }
284
444
 
285
445
  @Override
@@ -301,7 +461,7 @@ public class LiveUpdatePlugin extends Plugin {
301
461
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
302
462
  @Override
303
463
  public void success(Result result) {
304
- call.resolve(result.toJSObject());
464
+ resolveCall(call, result.toJSObject());
305
465
  }
306
466
 
307
467
  @Override
@@ -322,7 +482,7 @@ public class LiveUpdatePlugin extends Plugin {
322
482
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
323
483
  @Override
324
484
  public void success(Result result) {
325
- call.resolve(result.toJSObject());
485
+ resolveCall(call, result.toJSObject());
326
486
  }
327
487
 
328
488
  @Override
@@ -337,11 +497,44 @@ public class LiveUpdatePlugin extends Plugin {
337
497
  }
338
498
  }
339
499
 
500
+ @PluginMethod
501
+ public void isSyncing(PluginCall call) {
502
+ try {
503
+ NonEmptyCallback<IsSyncingResult> callback = new NonEmptyCallback<>() {
504
+ @Override
505
+ public void success(IsSyncingResult result) {
506
+ resolveCall(call, result.toJSObject());
507
+ }
508
+
509
+ @Override
510
+ public void error(Exception exception) {
511
+ rejectCall(call, exception);
512
+ }
513
+ };
514
+
515
+ assert implementation != null;
516
+ implementation.isSyncing(callback);
517
+ } catch (Exception exception) {
518
+ rejectCall(call, exception);
519
+ }
520
+ }
521
+
340
522
  @PluginMethod
341
523
  public void ready(PluginCall call) {
342
524
  try {
343
- implementation.ready();
344
- call.resolve();
525
+ NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
526
+ @Override
527
+ public void success(Result result) {
528
+ resolveCall(call, result.toJSObject());
529
+ }
530
+
531
+ @Override
532
+ public void error(Exception exception) {
533
+ rejectCall(call, exception);
534
+ }
535
+ };
536
+
537
+ implementation.ready(callback);
345
538
  } catch (Exception exception) {
346
539
  rejectCall(call, exception);
347
540
  }
@@ -351,7 +544,7 @@ public class LiveUpdatePlugin extends Plugin {
351
544
  public void reload(PluginCall call) {
352
545
  try {
353
546
  implementation.reload();
354
- call.resolve();
547
+ resolveCall(call);
355
548
  } catch (Exception exception) {
356
549
  rejectCall(call, exception);
357
550
  }
@@ -361,7 +554,17 @@ public class LiveUpdatePlugin extends Plugin {
361
554
  public void reset(PluginCall call) {
362
555
  try {
363
556
  implementation.reset();
364
- call.resolve();
557
+ resolveCall(call);
558
+ } catch (Exception exception) {
559
+ rejectCall(call, exception);
560
+ }
561
+ }
562
+
563
+ @PluginMethod
564
+ public void resetConfig(PluginCall call) {
565
+ try {
566
+ implementation.resetConfig();
567
+ resolveCall(call);
365
568
  } catch (Exception exception) {
366
569
  rejectCall(call, exception);
367
570
  }
@@ -380,7 +583,7 @@ public class LiveUpdatePlugin extends Plugin {
380
583
  EmptyCallback callback = new EmptyCallback() {
381
584
  @Override
382
585
  public void success() {
383
- call.resolve();
586
+ resolveCall(call);
384
587
  }
385
588
 
386
589
  @Override
@@ -404,7 +607,7 @@ public class LiveUpdatePlugin extends Plugin {
404
607
  EmptyCallback callback = new EmptyCallback() {
405
608
  @Override
406
609
  public void success() {
407
- call.resolve();
610
+ resolveCall(call);
408
611
  }
409
612
 
410
613
  @Override
@@ -419,6 +622,17 @@ public class LiveUpdatePlugin extends Plugin {
419
622
  }
420
623
  }
421
624
 
625
+ @PluginMethod
626
+ public void setConfig(PluginCall call) {
627
+ try {
628
+ SetConfigOptions options = new SetConfigOptions(call);
629
+ implementation.setConfig(options);
630
+ resolveCall(call);
631
+ } catch (Exception exception) {
632
+ rejectCall(call, exception);
633
+ }
634
+ }
635
+
422
636
  @PluginMethod
423
637
  public void setCustomId(PluginCall call) {
424
638
  try {
@@ -432,7 +646,7 @@ public class LiveUpdatePlugin extends Plugin {
432
646
  EmptyCallback callback = new EmptyCallback() {
433
647
  @Override
434
648
  public void success() {
435
- call.resolve();
649
+ resolveCall(call);
436
650
  }
437
651
 
438
652
  @Override
@@ -454,7 +668,7 @@ public class LiveUpdatePlugin extends Plugin {
454
668
  EmptyCallback callback = new EmptyCallback() {
455
669
  @Override
456
670
  public void success() {
457
- call.resolve();
671
+ resolveCall(call);
458
672
  }
459
673
 
460
674
  @Override
@@ -473,46 +687,54 @@ public class LiveUpdatePlugin extends Plugin {
473
687
  public void sync(PluginCall call) {
474
688
  try {
475
689
  String appId = config.getAppId();
476
- if (appId == null) {
690
+ if (appId == null || appId.isEmpty()) {
477
691
  call.reject(ERROR_APP_ID_MISSING);
478
692
  return;
479
693
  }
480
694
 
481
- if (syncInProgress) {
482
- call.reject(ERROR_SYNC_IN_PROGRESS);
483
- return;
484
- }
485
- syncInProgress = true;
486
-
487
695
  SyncOptions options = new SyncOptions(call);
488
696
  NonEmptyCallback<Result> callback = new NonEmptyCallback<>() {
489
697
  @Override
490
698
  public void success(Result result) {
491
- syncInProgress = false;
492
- call.resolve(result.toJSObject());
699
+ resolveCall(call, result.toJSObject());
493
700
  }
494
701
 
495
702
  @Override
496
703
  public void error(Exception exception) {
497
- syncInProgress = false;
498
704
  rejectCall(call, exception);
499
705
  }
500
706
  };
501
707
 
502
708
  implementation.sync(options, callback);
503
709
  } catch (Exception exception) {
504
- syncInProgress = false;
505
710
  rejectCall(call, exception);
506
711
  }
507
712
  }
508
713
 
714
+ public void notifyDownloadBundleProgressListeners(@NonNull DownloadBundleProgressEvent event) {
715
+ notifyListeners(EVENT_DOWNLOAD_BUNDLE_PROGRESS, event.toJSObject(), false);
716
+ }
717
+
718
+ public void notifyNextBundleSetListeners(@NonNull NextBundleSetEvent event) {
719
+ notifyListeners(EVENT_NEXT_BUNDLE_SET, event.toJSObject(), false);
720
+ }
721
+
722
+ public void notifyReloadedListeners() {
723
+ JSObject event = new JSObject();
724
+ notifyListeners(EVENT_RELOADED, event, true);
725
+ }
726
+
509
727
  private LiveUpdateConfig getLiveUpdateConfig() {
510
728
  LiveUpdateConfig config = new LiveUpdateConfig();
511
729
 
512
730
  String appId = getConfig().getString("appId", config.getAppId());
513
731
  config.setAppId(appId);
732
+ boolean autoBlockRolledBackBundles = getConfig().getBoolean("autoBlockRolledBackBundles", config.getAutoBlockRolledBackBundles());
733
+ config.setAutoBlockRolledBackBundles(autoBlockRolledBackBundles);
514
734
  boolean autoDeleteBundles = getConfig().getBoolean("autoDeleteBundles", config.getAutoDeleteBundles());
515
735
  config.setAutoDeleteBundles(autoDeleteBundles);
736
+ String autoUpdateStrategy = getConfig().getString("autoUpdateStrategy", config.getAutoUpdateStrategy());
737
+ config.setAutoUpdateStrategy(autoUpdateStrategy);
516
738
  String defaultChannel = getConfig().getString("defaultChannel", config.getDefaultChannel());
517
739
  config.setDefaultChannel(defaultChannel);
518
740
  boolean enabled = getConfig().getBoolean("enabled", config.getEnabled());
@@ -527,10 +749,24 @@ public class LiveUpdatePlugin extends Plugin {
527
749
  config.setReadyTimeout(readyTimeout);
528
750
  boolean resetOnUpdate = getConfig().getBoolean("resetOnUpdate", config.getResetOnUpdate());
529
751
  config.setResetOnUpdate(resetOnUpdate);
752
+ String serverDomain = getConfig().getString("serverDomain", config.getServerDomain());
753
+ config.setServerDomain(serverDomain);
754
+ // Map the deprecated `location` option to `serverDomain` if `serverDomain` was not explicitly set.
755
+ if (serverDomain.equals("api.cloud.capawesome.io") && location != null && location.equals("eu")) {
756
+ config.setServerDomain("api.cloud.capawesome.eu");
757
+ }
530
758
 
531
759
  return config;
532
760
  }
533
761
 
762
+ private void resolveCall(@NonNull PluginCall call) {
763
+ call.resolve();
764
+ }
765
+
766
+ private void resolveCall(@NonNull PluginCall call, @NonNull JSObject result) {
767
+ call.resolve(result);
768
+ }
769
+
534
770
  private void rejectCall(PluginCall call, Exception exception) {
535
771
  String message = exception.getMessage();
536
772
  if (exception instanceof java.net.SocketTimeoutException) {
@@ -15,16 +15,24 @@ public class LiveUpdatePreferences {
15
15
  @NonNull
16
16
  private final SharedPreferences.Editor settingsEditor;
17
17
 
18
+ private final String appIdKey = "appId"; // DO NOT CHANGE
19
+ private final String blockedBundleIdsKey = "blockedBundleIds"; // DO NOT CHANGE
18
20
  private final String channelKey = "channel"; // DO NOT CHANGE
19
21
  private final String deviceIdKey = "deviceId"; // DO NOT CHANGE
20
22
  private final String customIdKey = "customId"; // DO NOT CHANGE
21
23
  private final String lastVersionCodeKey = "lastVersionCode"; // DO NOT CHANGE
24
+ private final String previousBundleIdKey = "previousBundleId"; // DO NOT CHANGE
22
25
 
23
26
  public LiveUpdatePreferences(@NonNull Context context) {
24
27
  this.context = context;
25
28
  this.settingsEditor = context.getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE).edit();
26
29
  }
27
30
 
31
+ @Nullable
32
+ public String getAppId() {
33
+ return context.getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE).getString(appIdKey, null);
34
+ }
35
+
28
36
  @Nullable
29
37
  public String getChannel() {
30
38
  return context.getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE).getString(channelKey, null);
@@ -49,7 +57,39 @@ public class LiveUpdatePreferences {
49
57
  }
50
58
 
51
59
  public int getLastVersionCode() {
52
- return context.getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE).getInt(lastVersionCodeKey, 0);
60
+ return context.getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE).getInt(lastVersionCodeKey, -1);
61
+ }
62
+
63
+ @Nullable
64
+ public String getPreviousBundleId() {
65
+ return context
66
+ .getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE)
67
+ .getString(previousBundleIdKey, null);
68
+ }
69
+
70
+ @Nullable
71
+ public String getBlockedBundleIds() {
72
+ return context
73
+ .getSharedPreferences(LiveUpdatePlugin.SHARED_PREFERENCES_NAME, Activity.MODE_PRIVATE)
74
+ .getString(blockedBundleIdsKey, null);
75
+ }
76
+
77
+ public void setAppId(@Nullable String appId) {
78
+ if (appId == null) {
79
+ settingsEditor.remove(appIdKey);
80
+ } else {
81
+ settingsEditor.putString(appIdKey, appId);
82
+ }
83
+ settingsEditor.apply();
84
+ }
85
+
86
+ public void setBlockedBundleIds(@Nullable String blockedBundleIds) {
87
+ if (blockedBundleIds == null) {
88
+ settingsEditor.remove(blockedBundleIdsKey);
89
+ } else {
90
+ settingsEditor.putString(blockedBundleIdsKey, blockedBundleIds);
91
+ }
92
+ settingsEditor.apply();
53
93
  }
54
94
 
55
95
  public void setChannel(@Nullable String channel) {
@@ -79,8 +119,17 @@ public class LiveUpdatePreferences {
79
119
  settingsEditor.apply();
80
120
  }
81
121
 
82
- public void setLastVersionCode(int lastVersionCode) {
83
- settingsEditor.putInt(lastVersionCodeKey, lastVersionCode);
122
+ public void setLastVersionCode(int versionCode) {
123
+ settingsEditor.putInt(lastVersionCodeKey, versionCode);
124
+ settingsEditor.apply();
125
+ }
126
+
127
+ public void setPreviousBundleId(@Nullable String bundleId) {
128
+ if (bundleId == null) {
129
+ settingsEditor.remove(previousBundleIdKey);
130
+ } else {
131
+ settingsEditor.putString(previousBundleIdKey, bundleId);
132
+ }
84
133
  settingsEditor.apply();
85
134
  }
86
135
  }
@@ -0,0 +1,28 @@
1
+ package io.capawesome.capacitorjs.plugins.liveupdate.classes.api;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import org.json.JSONObject;
5
+
6
+ public class GetChannelsResponseItem {
7
+
8
+ @NonNull
9
+ private final String id;
10
+
11
+ @NonNull
12
+ private final String name;
13
+
14
+ public GetChannelsResponseItem(@NonNull JSONObject responseJson) {
15
+ this.id = responseJson.optString("id");
16
+ this.name = responseJson.optString("name");
17
+ }
18
+
19
+ @NonNull
20
+ public String getId() {
21
+ return id;
22
+ }
23
+
24
+ @NonNull
25
+ public String getName() {
26
+ return name;
27
+ }
28
+ }