Skip to content

Commit

Permalink
Moved EventChannel creation in the downloadOfflineRegion method (#205)
Browse files Browse the repository at this point in the history
Here i splitted the downloadOfflineRegion method on the native side both
on IOS and android. This is to avoid edge case when the download is so
fast that the event channel doesnt link to the native side. When this
happen, the callback `onEvent` is never called. This is an inconsitency
that can create infinite loadings.
  • Loading branch information
mariusvn authored Mar 19, 2023
1 parent f357093 commit ed46a8f
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 20 deletions.
21 changes: 16 additions & 5 deletions android/src/main/java/com/mapbox/mapboxgl/GlobalMethodHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class GlobalMethodHandler implements MethodChannel.MethodCallHandler {
@NonNull private final BinaryMessenger messenger;
@Nullable private PluginRegistry.Registrar registrar;
@Nullable private FlutterPlugin.FlutterAssets flutterAssets;
@Nullable private OfflineChannelHandlerImpl downloadOfflineRegionChannelHandler;

GlobalMethodHandler(@NonNull PluginRegistry.Registrar registrar) {
this.registrar = registrar;
Expand Down Expand Up @@ -93,19 +94,29 @@ public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
Map<String, String> headers = (Map<String, String>) methodCall.argument("headers");
MapboxHttpRequestUtil.setHttpHeaders(headers, result);
break;
case "downloadOfflineRegion#setup":
String channelName = methodCall.argument("channelName");
// Prepare args
downloadOfflineRegionChannelHandler = new OfflineChannelHandlerImpl(messenger, channelName);
result.success(null);
break;
case "downloadOfflineRegion":
// Get args from caller
Map<String, Object> definitionMap = (Map<String, Object>) methodCall.argument("definition");
Map<String, Object> metadataMap = (Map<String, Object>) methodCall.argument("metadata");
String channelName = methodCall.argument("channelName");

// Prepare args
OfflineChannelHandlerImpl channelHandler =
new OfflineChannelHandlerImpl(messenger, channelName);
if (downloadOfflineRegionChannelHandler == null) {
result.error(
"downloadOfflineRegion#setup NOT CALLED",
"The setup has not been called, please call downloadOfflineRegion#setup before",
null);
break;
}

// Start downloading
OfflineManagerUtils.downloadRegion(
result, context, definitionMap, metadataMap, channelHandler);
result, context, definitionMap, metadataMap, downloadOfflineRegionChannelHandler);
downloadOfflineRegionChannelHandler = null;
break;
case "getListOfRegions":
OfflineManagerUtils.regionsList(result, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,6 @@ public void onCreate(OfflineRegion offlineRegion) {
result.success(new Gson().toJson(regionData));

_offlineRegion = offlineRegion;
// Start downloading region
_offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
channelHandler.onStart();
// Observe downloading state
OfflineRegion.OfflineRegionObserver observer =
new OfflineRegion.OfflineRegionObserver() {
Expand Down Expand Up @@ -140,7 +137,12 @@ public void mapboxTileCountLimitExceeded(long limit) {
deleteRegion(null, context, _offlineRegion.getID());
}
};

_offlineRegion.setObserver(observer);

// Start downloading region
_offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
channelHandler.onStart();
}

/**
Expand Down
40 changes: 32 additions & 8 deletions ios/Classes/SwiftMapboxGlFlutterPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import Mapbox
import UIKit

public class SwiftMapboxGlFlutterPlugin: NSObject, FlutterPlugin {
static var downloadOfflineRegionChannelHandler: OfflineChannelHandler? = nil

public static func register(with registrar: FlutterPluginRegistrar) {
let instance = MapboxMapFactory(withRegistrar: registrar)
registrar.register(instance, withId: "plugins.flutter.io/mapbox_gl")
Expand Down Expand Up @@ -35,33 +37,55 @@ public class SwiftMapboxGlFlutterPlugin: NSObject, FlutterPlugin {
guard let arguments = methodCall.arguments as? [String: String] else { return }
let tilesdb = arguments["tilesdb"]
installOfflineMapTiles(registrar: registrar, tilesdb: tilesdb!)
result(nil)
case "downloadOfflineRegion#setup":
guard let args = methodCall.arguments as? [String: Any],
let channelName = args["channelName"] as? String
else {
print(
"downloadOfflineRegion#setup unexpected arguments: \(String(describing: methodCall.arguments))"
)
result(nil)
return
}

downloadOfflineRegionChannelHandler = OfflineChannelHandler(
messenger: registrar.messenger(),
channelName: channelName
)

result(nil)
case "downloadOfflineRegion":
// Get download region arguments from caller
guard let args = methodCall.arguments as? [String: Any],
let definitionDictionary = args["definition"] as? [String: Any],
let metadata = args["metadata"] as? [String: Any],
let defintion = OfflineRegionDefinition.fromDictionary(definitionDictionary),
let channelName = args["channelName"] as? String
let defintion = OfflineRegionDefinition.fromDictionary(definitionDictionary)
else {
print(
"downloadOfflineRegion unexpected arguments: \(String(describing: methodCall.arguments))"
)
result(nil)
return
}
// Prepare channel
let channelHandler = OfflineChannelHandler(
messenger: registrar.messenger(),
channelName: channelName
)

if (downloadOfflineRegionChannelHandler == nil) {
result(FlutterError(
code: "downloadOfflineRegion#setup NOT CALLED",
message: "The setup has not been called, please call downloadOfflineRegion#setup before",
details: nil
))
return
}

OfflineManagerUtils.downloadRegion(
definition: defintion,
metadata: metadata,
result: result,
registrar: registrar,
channelHandler: channelHandler
channelHandler: downloadOfflineRegionChannelHandler!
)
downloadOfflineRegionChannelHandler = nil;
case "setOfflineTileCountLimit":
guard let arguments = methodCall.arguments as? [String: Any],
let limit = arguments["limit"] as? UInt64
Expand Down
12 changes: 8 additions & 4 deletions lib/src/global.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,9 @@ Future<OfflineRegion> downloadOfflineRegion(
String channelName =
'downloadOfflineRegion_${DateTime.now().microsecondsSinceEpoch}';

final result = await _globalChannel
.invokeMethod('downloadOfflineRegion', <String, dynamic>{
await _globalChannel
.invokeMethod('downloadOfflineRegion#setup', <String, dynamic>{
'channelName': channelName,
'definition': definition.toMap(),
'metadata': metadata,
});

if (onEvent != null) {
Expand Down Expand Up @@ -144,5 +142,11 @@ Future<OfflineRegion> downloadOfflineRegion(
});
}

final result = await _globalChannel
.invokeMethod('downloadOfflineRegion', <String, dynamic>{
'definition': definition.toMap(),
'metadata': metadata,
});

return OfflineRegion.fromMap(json.decode(result));
}

0 comments on commit ed46a8f

Please sign in to comment.