From 159d4b52d974136c12d69c8ae9f5b955faa92228 Mon Sep 17 00:00:00 2001 From: Jonny1987 Date: Wed, 14 Aug 2024 18:03:03 +0100 Subject: [PATCH] Fix issue where running a background isolate causes method channel not to work (#63) * Fix issue where running a background isolate causes method channel not to work Made the method channel and call handler static so every flutter engine can access * Update RadarFlutterPlugin.java --------- Co-authored-by: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> --- .../io/radar/flutter/RadarFlutterPlugin.java | 407 +++++++++--------- 1 file changed, 203 insertions(+), 204 deletions(-) diff --git a/android/src/main/java/io/radar/flutter/RadarFlutterPlugin.java b/android/src/main/java/io/radar/flutter/RadarFlutterPlugin.java index 66cf30f..931be70 100644 --- a/android/src/main/java/io/radar/flutter/RadarFlutterPlugin.java +++ b/android/src/main/java/io/radar/flutter/RadarFlutterPlugin.java @@ -67,30 +67,27 @@ import io.flutter.view.FlutterRunArguments; import io.flutter.view.FlutterCallbackInformation; -public class RadarFlutterPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware, RequestPermissionsResultListener { +public class RadarFlutterPlugin implements FlutterPlugin, ActivityAware, RequestPermissionsResultListener { - private static FlutterEngine sBackgroundFlutterEngine; - - private Activity mActivity; - private Context mContext; + private static Activity mActivity; + private static Context mContext; private static final String TAG = "RadarFlutterPlugin"; private static final String CALLBACK_DISPATCHER_HANDLE_KEY = "callbackDispatcherHandle"; - private static MethodChannel sBackgroundChannel; - private MethodChannel channel; + private static MethodChannel channel; + private static RadarMethodCallHandler callHandler; private static final Object lock = new Object(); private static final int PERMISSIONS_REQUEST_CODE = 20160525; - private Result mPermissionsRequestResult; + private static Result mPermissionsRequestResult; @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { mContext = binding.getApplicationContext(); - channel = new MethodChannel(binding.getFlutterEngine().getDartExecutor(), "flutter_radar"); - Radar.setReceiver(new RadarFlutterReceiver(channel)); - Radar.setVerifiedReceiver(new RadarFlutterVerifiedReceiver(channel)); - channel.setMethodCallHandler(this); + channel = new MethodChannel(binding.getBinaryMessenger(), "flutter_radar"); + callHandler = new RadarMethodCallHandler(); + channel.setMethodCallHandler(callHandler); } @Override @@ -121,12 +118,12 @@ public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding } public static void registerWith(Registrar registrar) { - RadarFlutterPlugin plugin = new RadarFlutterPlugin(); - - MethodChannel channel = new MethodChannel(registrar.messenger(), "radar_flutter_plugin"); - channel.setMethodCallHandler(plugin); - plugin.mContext = registrar.context(); - plugin.mActivity = registrar.activity(); + mContext = registrar.context(); + mActivity = registrar.activity(); + + channel = new MethodChannel(registrar.messenger(), "flutter_radar"); + callHandler = new RadarMethodCallHandler(); + channel.setMethodCallHandler(callHandler); } private static void runOnMainThread(final Runnable runnable) { @@ -143,152 +140,154 @@ public boolean onRequestPermissionsResult(int requestCode, String[] permissions, return true; } - @Override - public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { - try { - switch (call.method) { - case "initialize": - initialize(call, result); - break; - case "setLogLevel": - setLogLevel(call, result); - break; - case "getPermissionsStatus": - getPermissionStatus(result); - break; - case "requestPermissions": - requestPermissions(call, result); - break; - case "setUserId": - setUserId(call, result); - break; - case "getUserId": - getUserId(result); - break; - case "setDescription": - setDescription(call, result); - break; - case "getDescription": - getDescription(result); - break; - case "setMetadata": - setMetadata(call, result); - break; - case "getMetadata": - getMetadata(result); - break; - case "setAnonymousTrackingEnabled": - setAnonymousTrackingEnabled(call, result); - break; - case "getLocation": - getLocation(call, result); - break; - case "trackOnce": - trackOnce(call, result); - break; - case "startTracking": - startTracking(call, result); - break; - case "startTrackingCustom": - startTrackingCustom(call, result); - break; - case "startTrackingVerified": - startTrackingVerified(call, result); - break; - case "stopTrackingVerified": - stopTrackingVerified(call, result); - break; - case "stopTracking": - stopTracking(result); - break; - case "isTracking": - isTracking(result); - break; - case "isUsingRemoteTrackingOptions": - isUsingRemoteTrackingOptions(result); - break; - case "getTrackingOptions": - getTrackingOptions(result); - break; - case "mockTracking": - mockTracking(call, result); - break; - case "startTrip": - startTrip(call, result); - break; - case "updateTrip": - updateTrip(call, result); - break; - case "getTripOptions": - getTripOptions(result); - break; - case "completeTrip": - completeTrip(result); - break; - case "cancelTrip": - cancelTrip(result); - break; - case "getContext": - getContext(call, result); - break; - case "searchGeofences": - searchGeofences(call, result); - break; - case "searchPlaces": - searchPlaces(call, result); - break; - case "autocomplete": - autocomplete(call, result); - break; - case "forwardGeocode": - geocode(call, result); - break; - case "reverseGeocode": - reverseGeocode(call, result); - break; - case "ipGeocode": - ipGeocode(call, result); - break; - case "getDistance": - getDistance(call, result); - break; - case "logConversion": - logConversion(call, result); - break; - case "logTermination": - // do nothing - break; - case "logBackgrounding": - logBackgrounding(result); - break; - case "logResigningActive": - logResigningActive(result); - break; - case "getMatrix": - getMatrix(call, result); - break; - case "setNotificationOptions": - setNotificationOptions(call, result); - break; - case "setForegroundServiceOptions": - setForegroundServiceOptions(call, result); - break; - case "trackVerified": - trackVerified(call, result); - break; - case "validateAddress": - validateAddress(call, result); - break; - default: - result.notImplemented(); - break; + public static class RadarMethodCallHandler implements MethodCallHandler { + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { + try { + switch (call.method) { + case "initialize": + initialize(call, result); + break; + case "setLogLevel": + setLogLevel(call, result); + break; + case "getPermissionsStatus": + getPermissionStatus(result); + break; + case "requestPermissions": + requestPermissions(call, result); + break; + case "setUserId": + setUserId(call, result); + break; + case "getUserId": + getUserId(result); + break; + case "setDescription": + setDescription(call, result); + break; + case "getDescription": + getDescription(result); + break; + case "setMetadata": + setMetadata(call, result); + break; + case "getMetadata": + getMetadata(result); + break; + case "setAnonymousTrackingEnabled": + setAnonymousTrackingEnabled(call, result); + break; + case "getLocation": + getLocation(call, result); + break; + case "trackOnce": + trackOnce(call, result); + break; + case "startTracking": + startTracking(call, result); + break; + case "startTrackingCustom": + startTrackingCustom(call, result); + break; + case "startTrackingVerified": + startTrackingVerified(call, result); + break; + case "stopTrackingVerified": + stopTrackingVerified(call, result); + break; + case "stopTracking": + stopTracking(result); + break; + case "isTracking": + isTracking(result); + break; + case "isUsingRemoteTrackingOptions": + isUsingRemoteTrackingOptions(result); + break; + case "getTrackingOptions": + getTrackingOptions(result); + break; + case "mockTracking": + mockTracking(call, result); + break; + case "startTrip": + startTrip(call, result); + break; + case "updateTrip": + updateTrip(call, result); + break; + case "getTripOptions": + getTripOptions(result); + break; + case "completeTrip": + completeTrip(result); + break; + case "cancelTrip": + cancelTrip(result); + break; + case "getContext": + getContext(call, result); + break; + case "searchGeofences": + searchGeofences(call, result); + break; + case "searchPlaces": + searchPlaces(call, result); + break; + case "autocomplete": + autocomplete(call, result); + break; + case "forwardGeocode": + geocode(call, result); + break; + case "reverseGeocode": + reverseGeocode(call, result); + break; + case "ipGeocode": + ipGeocode(call, result); + break; + case "getDistance": + getDistance(call, result); + break; + case "logConversion": + logConversion(call, result); + break; + case "logTermination": + // do nothing + break; + case "logBackgrounding": + logBackgrounding(result); + break; + case "logResigningActive": + logResigningActive(result); + break; + case "getMatrix": + getMatrix(call, result); + break; + case "setNotificationOptions": + setNotificationOptions(call, result); + break; + case "setForegroundServiceOptions": + setForegroundServiceOptions(call, result); + break; + case "trackVerified": + trackVerified(call, result); + break; + case "validateAddress": + validateAddress(call, result); + break; + default: + result.notImplemented(); + break; + } + } catch (Error | Exception e) { + result.error(e.toString(), e.getMessage(), e.getMessage()); } - } catch (Error | Exception e) { - result.error(e.toString(), e.getMessage(), e.getMessage()); } } - private void initialize(MethodCall call, Result result) { + private static void initialize(MethodCall call, Result result) { String publishableKey = call.argument("publishableKey"); SharedPreferences.Editor editor = mContext.getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).edit(); editor.putString("x_platform_sdk_type", "Flutter"); @@ -300,7 +299,7 @@ private void initialize(MethodCall call, Result result) { result.success(true); } - private void setNotificationOptions(MethodCall call, Result result) { + private static void setNotificationOptions(MethodCall call, Result result) { HashMap notificationOptionsMap = (HashMap)call.arguments; JSONObject notificationOptionsJson = new JSONObject(notificationOptionsMap); RadarNotificationOptions options = RadarNotificationOptions.fromJson(notificationOptionsJson); @@ -308,7 +307,7 @@ private void setNotificationOptions(MethodCall call, Result result) { result.success(true); } - private void setForegroundServiceOptions(MethodCall call, Result result) { + private static void setForegroundServiceOptions(MethodCall call, Result result) { HashMap foregroundServiceOptionsMap = (HashMap)call.arguments; JSONObject foregroundServiceOptionsJson = new JSONObject(foregroundServiceOptionsMap); RadarTrackingOptionsForegroundService options = RadarTrackingOptionsForegroundService.fromJson(foregroundServiceOptionsJson); @@ -316,7 +315,7 @@ private void setForegroundServiceOptions(MethodCall call, Result result) { result.success(true); } - private void setLogLevel(MethodCall call, Result result) { + private static void setLogLevel(MethodCall call, Result result) { String logLevel = call.argument("logLevel"); if (logLevel == null) { Radar.setLogLevel(Radar.RadarLogLevel.NONE); @@ -335,7 +334,7 @@ private void setLogLevel(MethodCall call, Result result) { } - private void getPermissionStatus(Result result) { + private static void getPermissionStatus(Result result) { String status = "NOT_DETERMINED"; if (mActivity == null || result == null) { @@ -359,7 +358,7 @@ private void getPermissionStatus(Result result) { result.success(status); } - private void requestPermissions(MethodCall call, Result result) { + private static void requestPermissions(MethodCall call, Result result) { boolean background = call.argument("background"); mPermissionsRequestResult = result; if (mActivity != null) { @@ -373,36 +372,36 @@ private void requestPermissions(MethodCall call, Result result) { } } - private void setUserId(MethodCall call, Result result) { + private static void setUserId(MethodCall call, Result result) { String userId = call.argument("userId"); Radar.setUserId(userId); result.success(true); } - private void getUserId(Result result) { + private static void getUserId(Result result) { String userId = Radar.getUserId(); result.success(userId); } - private void setDescription(MethodCall call, Result result) { + private static void setDescription(MethodCall call, Result result) { String description = call.argument("description"); Radar.setDescription(description); result.success(true); } - private void getDescription(Result result) { + private static void getDescription(Result result) { String description = Radar.getDescription(); result.success(description); } - private void setMetadata(MethodCall call, Result result) { + private static void setMetadata(MethodCall call, Result result) { HashMap metadataMap = (HashMap)call.arguments; JSONObject metadata = new JSONObject(metadataMap); Radar.setMetadata(metadata); result.success(true); } - private void getMetadata(Result result) { + private static void getMetadata(Result result) { JSONObject metadata = Radar.getMetadata(); HashMap metadataMap = null; if (metadata != null) { @@ -411,13 +410,13 @@ private void getMetadata(Result result) { result.success(metadataMap); } - private void setAnonymousTrackingEnabled(MethodCall call, Result result) { + private static void setAnonymousTrackingEnabled(MethodCall call, Result result) { boolean enabled = call.argument("enabled"); Radar.setAnonymousTrackingEnabled(enabled); result.success(true); } - private void getLocation(MethodCall call, final Result result) { + private static void getLocation(MethodCall call, final Result result) { Radar.RadarLocationCallback callback = new Radar.RadarLocationCallback() { @Override public void onComplete(final Radar.RadarStatus status, final Location location, final boolean stopped) { @@ -456,7 +455,7 @@ public void run() { } } - private void trackOnce(MethodCall call, final Result result) { + private static void trackOnce(MethodCall call, final Result result) { Radar.RadarTrackCallback callback = new Radar.RadarTrackCallback() { @Override public void onComplete(final Radar.RadarStatus status, final Location location, final RadarEvent[] events, final RadarUser user) { @@ -514,7 +513,7 @@ public void run() { } } - private void startTracking(MethodCall call, Result result) { + private static void startTracking(MethodCall call, Result result) { String preset = call.argument("preset"); if (preset == null) { Radar.startTracking(RadarTrackingOptions.RESPONSIVE); @@ -530,7 +529,7 @@ private void startTracking(MethodCall call, Result result) { result.success(true); } - private void startTrackingCustom(MethodCall call, Result result) { + private static void startTrackingCustom(MethodCall call, Result result) { HashMap optionsMap = (HashMap)call.arguments; JSONObject optionsJson = new JSONObject(optionsMap); RadarTrackingOptions options = RadarTrackingOptions.fromJson(optionsJson); @@ -538,19 +537,19 @@ private void startTrackingCustom(MethodCall call, Result result) { result.success(true); } - private void startTrackingVerified(MethodCall call, Result result) { + private static void startTrackingVerified(MethodCall call, Result result) { int interval = call.hasArgument("interval") && call.argument("interval") != null ? (int)call.argument("interval") : 1; Boolean beacons = call.hasArgument("beacons") ? call.argument("beacons") : false; Radar.startTrackingVerified(interval, beacons); result.success(true); } - private void stopTrackingVerified(MethodCall call, Result result) { + private static void stopTrackingVerified(MethodCall call, Result result) { Radar.stopTrackingVerified(); result.success(true); } - public void mockTracking(MethodCall call, final Result result) { + public static void mockTracking(MethodCall call, final Result result) { HashMap originMap = (HashMap)call.argument("origin"); Location origin = locationForMap(originMap); HashMap destinationMap = (HashMap)call.argument("destination"); @@ -575,17 +574,17 @@ public void onComplete(Radar.RadarStatus status, Location location, RadarEvent[] }); } - private void stopTracking(Result result) { + private static void stopTracking(Result result) { Radar.stopTracking(); result.success(true); } - private void isTracking(Result result) { + private static void isTracking(Result result) { Boolean isTracking = Radar.isTracking(); result.success(isTracking); } - private void getTrackingOptions(Result result) throws JSONException { + private static void getTrackingOptions(Result result) throws JSONException { RadarTrackingOptions options = Radar.getTrackingOptions(); JSONObject optionsJson = options.toJson(); HashMap optionsMap = null; @@ -595,7 +594,7 @@ private void getTrackingOptions(Result result) throws JSONException { result.success(optionsMap); } - public void startTrip(MethodCall call, Result result) throws JSONException { + public static void startTrip(MethodCall call, Result result) throws JSONException { HashMap tripOptionsMap = (HashMap)call.argument("tripOptions"); JSONObject tripOptionsJson = jsonForMap(tripOptionsMap); RadarTripOptions tripOptions = RadarTripOptions.fromJson(tripOptionsJson); @@ -634,7 +633,7 @@ public void run() { }); } - public void updateTrip(MethodCall call, Result result) throws JSONException { + public static void updateTrip(MethodCall call, Result result) throws JSONException { HashMap tripOptionsMap = (HashMap)call.argument("tripOptions"); JSONObject tripOptionsJson = jsonForMap(tripOptionsMap); RadarTripOptions tripOptions = RadarTripOptions.fromJson(tripOptionsJson); @@ -682,13 +681,13 @@ public void run() { }); } - public void getTripOptions(Result result) { + public static void getTripOptions(Result result) { RadarTripOptions tripOptions = Radar.getTripOptions(); HashMap map = new Gson().fromJson(tripOptions.toJson().toString(), HashMap.class); result.success(map); } - public void completeTrip(Result result) { + public static void completeTrip(Result result) { Radar.completeTrip(new Radar.RadarTripCallback() { @Override public void onComplete(@NonNull Radar.RadarStatus status, @@ -718,7 +717,7 @@ public void run() { }); } - public void cancelTrip(Result result) { + public static void cancelTrip(Result result) { Radar.cancelTrip(new Radar.RadarTripCallback() { @Override public void onComplete(@NonNull Radar.RadarStatus status, @@ -748,7 +747,7 @@ public void run() { }); } - public void getContext(MethodCall call, final Result result) { + public static void getContext(MethodCall call, final Result result) { Radar.RadarContextCallback callback = new Radar.RadarContextCallback() { @Override public void onComplete(final Radar.RadarStatus status, final Location location, final RadarContext context) { @@ -784,7 +783,7 @@ public void run() { } } - private void searchGeofences(MethodCall call, final Result result) throws JSONException { + private static void searchGeofences(MethodCall call, final Result result) throws JSONException { Radar.RadarSearchGeofencesCallback callback = new Radar.RadarSearchGeofencesCallback() { @Override public void onComplete(final Radar.RadarStatus status, final Location location, final RadarGeofence[] geofences) { @@ -831,7 +830,7 @@ public void run() { } } - public void searchPlaces(MethodCall call, final Result result) { + public static void searchPlaces(MethodCall call, final Result result) { Radar.RadarSearchPlacesCallback callback = new Radar.RadarSearchPlacesCallback() { @Override public void onComplete(final Radar.RadarStatus status, final Location location, final RadarPlace[] places) { @@ -880,7 +879,7 @@ public void run() { } } - public void autocomplete(MethodCall call, final Result result) { + public static void autocomplete(MethodCall call, final Result result) { String query = call.argument("query"); HashMap nearMap = (HashMap)call.argument("near"); Location near = locationForMap(nearMap); @@ -914,7 +913,7 @@ public void run() { }); } - public void geocode(MethodCall call, final Result result) { + public static void geocode(MethodCall call, final Result result) { String query = call.argument("query"); Radar.geocode(query, null, null, new Radar.RadarGeocodeCallback() { @@ -941,7 +940,7 @@ public void run() { }); } - public void reverseGeocode(MethodCall call, final Result result) { + public static void reverseGeocode(MethodCall call, final Result result) { Radar.RadarGeocodeCallback callback = new Radar.RadarGeocodeCallback() { @Override public void onComplete(final Radar.RadarStatus status, final RadarAddress[] addresses) { @@ -976,7 +975,7 @@ public void run() { } } - public void ipGeocode(MethodCall call, final Result result) { + public static void ipGeocode(MethodCall call, final Result result) { Radar.ipGeocode(new Radar.RadarIpGeocodeCallback() { @Override public void onComplete(final Radar.RadarStatus status, final RadarAddress address, final boolean proxy) { @@ -1002,7 +1001,7 @@ public void run() { }); } - public void getDistance(MethodCall call, final Result result) throws JSONException { + public static void getDistance(MethodCall call, final Result result) throws JSONException { Radar.RadarRouteCallback callback = new Radar.RadarRouteCallback() { @Override public void onComplete(final Radar.RadarStatus status, final RadarRoutes routes) { @@ -1057,7 +1056,7 @@ public void run() { } } - public void logConversion(MethodCall call, final Result result) throws JSONException { + public static void logConversion(MethodCall call, final Result result) throws JSONException { Radar.RadarLogConversionCallback callback = new Radar.RadarLogConversionCallback() { @Override public void onComplete(@NonNull Radar.RadarStatus status, @Nullable RadarEvent event) { @@ -1092,17 +1091,17 @@ public void run() { } } - public void logBackgrounding(Result result) { + public static void logBackgrounding(Result result) { Radar.logBackgrounding(); result.success(true); } - public void logResigningActive(Result result) { + public static void logResigningActive(Result result) { Radar.logResigningActive(); result.success(true); } - public void getMatrix(MethodCall call, final Result result) throws JSONException { + public static void getMatrix(MethodCall call, final Result result) throws JSONException { ArrayList originsArr = call.argument("origins"); Location[] origins = new Location[originsArr.size()]; for (int i = 0; i < originsArr.size(); i++) { @@ -1156,7 +1155,7 @@ public void run() { }); } - public void trackVerified(MethodCall call, final Result result) { + public static void trackVerified(MethodCall call, final Result result) { Boolean beacons = call.hasArgument("beacons") ? call.argument("beacons") : false; Radar.RadarTrackVerifiedCallback callback = new Radar.RadarTrackVerifiedCallback() { @@ -1183,12 +1182,12 @@ public void run() { Radar.trackVerified(beacons, callback); } - private void isUsingRemoteTrackingOptions(Result result) { + private static void isUsingRemoteTrackingOptions(Result result) { Boolean isRemoteTracking = Radar.isUsingRemoteTrackingOptions(); result.success(isRemoteTracking); } - public void validateAddress(MethodCall call, final Result result) throws JSONException { + public static void validateAddress(MethodCall call, final Result result) throws JSONException { Radar.RadarValidateAddressCallback callback = new Radar.RadarValidateAddressCallback() { @Override public void onComplete(final Radar.RadarStatus status, final RadarAddress address, final Radar.RadarAddressVerificationStatus verificationStatus) { @@ -1221,7 +1220,7 @@ public void run() { Radar.validateAddress(address, callback); } - private Location locationForMap(HashMap locationMap) { + private static Location locationForMap(HashMap locationMap) { double latitude = (Double)locationMap.get("latitude"); double longitude = (Double)locationMap.get("longitude"); Location location = new Location("RadarSDK"); @@ -1235,7 +1234,7 @@ private Location locationForMap(HashMap locationMap) { return location; } - private JSONObject jsonForMap(HashMap map) throws JSONException { + private static JSONObject jsonForMap(HashMap map) throws JSONException { JSONObject obj = new JSONObject(); try { for (Object key : map.keySet()) {