From 8df1bb8640741714d99707a5ac1531ff8ed8ca07 Mon Sep 17 00:00:00 2001 From: VikasNadcab Date: Thu, 11 Dec 2025 07:53:47 +0000 Subject: [PATCH 1/2] change regfistration --- .../FlutterUploaderPlugin.java | 98 ++++++++++--------- 1 file changed, 53 insertions(+), 45 deletions(-) diff --git a/android/src/main/java/com/bluechilli/flutteruploader/FlutterUploaderPlugin.java b/android/src/main/java/com/bluechilli/flutteruploader/FlutterUploaderPlugin.java index 682cef36..3a653c90 100644 --- a/android/src/main/java/com/bluechilli/flutteruploader/FlutterUploaderPlugin.java +++ b/android/src/main/java/com/bluechilli/flutteruploader/FlutterUploaderPlugin.java @@ -1,21 +1,22 @@ package com.bluechilli.flutteruploader; -import static com.bluechilli.flutteruploader.MethodCallHandlerImpl.FLUTTER_UPLOAD_WORK_TAG; - import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.work.WorkInfo; import androidx.work.WorkManager; + import com.bluechilli.flutteruploader.plugin.CachingStreamHandler; import com.bluechilli.flutteruploader.plugin.StatusListener; import com.bluechilli.flutteruploader.plugin.UploadObserver; + import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.PluginRegistry.Registrar; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -23,35 +24,29 @@ import java.util.List; import java.util.Map; -/** FlutterUploaderPlugin */ +import static com.bluechilli.flutteruploader.MethodCallHandlerImpl.FLUTTER_UPLOAD_WORK_TAG; + +/** FlutterUploaderPlugin - Fully migrated to Flutter Android v2 embedding */ public class FlutterUploaderPlugin implements FlutterPlugin, StatusListener { private static final String CHANNEL_NAME = "flutter_uploader"; private static final String PROGRESS_EVENT_CHANNEL_NAME = "flutter_uploader/events/progress"; private static final String RESULT_EVENT_CHANNEL_NAME = "flutter_uploader/events/result"; - private MethodChannel channel; - private MethodCallHandlerImpl methodCallHandler; - private UploadObserver uploadObserver; + private @Nullable MethodChannel methodChannel; + private @Nullable MethodCallHandlerImpl methodCallHandler; + private @Nullable UploadObserver uploadObserver; + private @Nullable LiveData> workInfoLiveData; - private EventChannel progressEventChannel; + private @Nullable EventChannel progressEventChannel; private final CachingStreamHandler> progressStreamHandler = new CachingStreamHandler<>(); - private EventChannel resultEventChannel; + private @Nullable EventChannel resultEventChannel; private final CachingStreamHandler> resultStreamHandler = new CachingStreamHandler<>(); - private LiveData> workInfoLiveData; - - public static void registerWith(Registrar registrar) { - final FlutterUploaderPlugin plugin = new FlutterUploaderPlugin(); - plugin.startListening(registrar.context(), registrar.messenger()); - registrar.addViewDestroyListener( - view -> { - plugin.stopListening(); - return false; - }); - } + + // ---------- FlutterPlugin Lifecycle ---------- @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { @@ -63,64 +58,77 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { stopListening(); } + // ---------- Setup & Teardown ---------- + private void startListening(Context context, BinaryMessenger messenger) { final int timeout = FlutterUploaderInitializer.getConnectionTimeout(context); - channel = new MethodChannel(messenger, CHANNEL_NAME); + // Method channel + methodChannel = new MethodChannel(messenger, CHANNEL_NAME); methodCallHandler = new MethodCallHandlerImpl(context, timeout, this); + methodChannel.setMethodCallHandler(methodCallHandler); + // Observe WorkManager uploads uploadObserver = new UploadObserver(this); - workInfoLiveData = - WorkManager.getInstance(context).getWorkInfosByTagLiveData(FLUTTER_UPLOAD_WORK_TAG); + workInfoLiveData = WorkManager.getInstance(context) + .getWorkInfosByTagLiveData(FLUTTER_UPLOAD_WORK_TAG); workInfoLiveData.observeForever(uploadObserver); - channel.setMethodCallHandler(methodCallHandler); - + // Progress event channel progressEventChannel = new EventChannel(messenger, PROGRESS_EVENT_CHANNEL_NAME); progressEventChannel.setStreamHandler(progressStreamHandler); + // Result event channel resultEventChannel = new EventChannel(messenger, RESULT_EVENT_CHANNEL_NAME); resultEventChannel.setStreamHandler(resultStreamHandler); } private void stopListening() { - channel.setMethodCallHandler(null); - channel = null; + // Method channel + if (methodChannel != null) { + methodChannel.setMethodCallHandler(null); + methodChannel = null; + } + methodCallHandler = null; - if (uploadObserver != null) { + // WorkManager observer + if (uploadObserver != null && workInfoLiveData != null) { workInfoLiveData.removeObserver(uploadObserver); workInfoLiveData = null; uploadObserver = null; } - methodCallHandler = null; - - progressEventChannel.setStreamHandler(null); - progressEventChannel = null; - - resultEventChannel.setStreamHandler(null); - resultEventChannel = null; + // Event channels + if (progressEventChannel != null) { + progressEventChannel.setStreamHandler(null); + progressEventChannel = null; + } + if (resultEventChannel != null) { + resultEventChannel.setStreamHandler(null); + resultEventChannel = null; + } + // Clear cached events progressStreamHandler.clear(); resultStreamHandler.clear(); } + // ---------- StatusListener Callbacks ---------- + @Override public void onEnqueued(String id) { Map args = new HashMap<>(); args.put("taskId", id); args.put("status", UploadStatus.ENQUEUED); - resultStreamHandler.add(id, args); } @Override public void onUpdateProgress(String id, int status, int progress) { - final Map args = new HashMap<>(); + Map args = new HashMap<>(); args.put("taskId", id); args.put("status", status); args.put("progress", progress); - progressStreamHandler.add(id, args); } @@ -132,17 +140,16 @@ public void onFailed( String code, String message, @Nullable String[] details) { + Map args = new HashMap<>(); args.put("taskId", id); args.put("status", status); args.put("statusCode", statusCode); args.put("code", code); args.put("message", message); - args.put( - "details", - details != null - ? new ArrayList<>(Arrays.asList(details)) - : Collections.emptyList()); + args.put("details", details != null + ? new ArrayList<>(Arrays.asList(details)) + : Collections.emptyList()); resultStreamHandler.add(id, args); } @@ -154,12 +161,13 @@ public void onCompleted( int statusCode, String response, @Nullable Map headers) { + Map args = new HashMap<>(); args.put("taskId", id); args.put("status", status); args.put("statusCode", statusCode); args.put("message", response); - args.put("headers", headers != null ? headers : Collections.emptyMap()); + args.put("headers", headers != null ? headers : Collections.emptyMap()); resultStreamHandler.add(id, args); } @@ -169,4 +177,4 @@ public void onWorkPruned() { progressStreamHandler.clear(); resultStreamHandler.clear(); } -} +} \ No newline at end of file From 5e95638d2dffe12e43eb9f99ff46290036be4df9 Mon Sep 17 00:00:00 2001 From: VikasNadcab Date: Thu, 11 Dec 2025 07:56:23 +0000 Subject: [PATCH 2/2] asd --- android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android/build.gradle b/android/build.gradle index 2c90b8a7..9b0fc043 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -22,6 +22,7 @@ rootProject.allprojects { apply plugin: 'com.android.library' android { + namespace 'com.bluechilli.flutteruploader' compileSdkVersion 31 defaultConfig {