Kaynağa Gözat

use handler to post results and callback events, fixes #33

Taner Sener 6 yıl önce
ebeveyn
işleme
f52e46f8e5

+ 1 - 0
.gitignore

@@ -5,3 +5,4 @@
 build/
 /pubspec.lock
 /.packages
+/.gradle/

+ 4 - 2
android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegExecuteAsyncArgumentsTask.java

@@ -39,10 +39,12 @@ public class FlutterFFmpegExecuteAsyncArgumentsTask extends AsyncTask<String, In
 
     private final MethodChannel.Result result;
     private final List<String> arguments;
+    private final FlutterFFmpegResultHandler flutterFFmpegResultHandler;
 
-    FlutterFFmpegExecuteAsyncArgumentsTask(final List<String> arguments, final MethodChannel.Result result) {
+    FlutterFFmpegExecuteAsyncArgumentsTask(final FlutterFFmpegResultHandler flutterFFmpegResultHandler, final List<String> arguments, final MethodChannel.Result result) {
         this.arguments = arguments;
         this.result = result;
+        this.flutterFFmpegResultHandler = flutterFFmpegResultHandler;
     }
 
     @Override
@@ -60,7 +62,7 @@ public class FlutterFFmpegExecuteAsyncArgumentsTask extends AsyncTask<String, In
 
     @Override
     protected void onPostExecute(final Integer rc) {
-        result.success(FlutterFFmpegPlugin.toIntMap(FlutterFFmpegPlugin.KEY_RC, rc));
+        flutterFFmpegResultHandler.success(result, FlutterFFmpegPlugin.toIntMap(FlutterFFmpegPlugin.KEY_RC, rc));
     }
 
 }

+ 4 - 2
android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegExecuteAsyncCommandTask.java

@@ -36,8 +36,9 @@ public class FlutterFFmpegExecuteAsyncCommandTask extends AsyncTask<String, Inte
 
     private String delimiter;
     private final MethodChannel.Result result;
+    private final FlutterFFmpegResultHandler flutterFFmpegResultHandler;
 
-    FlutterFFmpegExecuteAsyncCommandTask(final String delimiter, final MethodChannel.Result result) {
+    FlutterFFmpegExecuteAsyncCommandTask(final FlutterFFmpegResultHandler flutterFFmpegResultHandler, final String delimiter, final MethodChannel.Result result) {
         if (delimiter == null) {
             this.delimiter = " ";
         } else {
@@ -45,6 +46,7 @@ public class FlutterFFmpegExecuteAsyncCommandTask extends AsyncTask<String, Inte
         }
 
         this.result = result;
+        this.flutterFFmpegResultHandler = flutterFFmpegResultHandler;
     }
 
     @Override
@@ -66,7 +68,7 @@ public class FlutterFFmpegExecuteAsyncCommandTask extends AsyncTask<String, Inte
 
     @Override
     protected void onPostExecute(final Integer rc) {
-        result.success(FlutterFFmpegPlugin.toIntMap(FlutterFFmpegPlugin.KEY_RC, rc));
+        flutterFFmpegResultHandler.success(result, FlutterFFmpegPlugin.toIntMap(FlutterFFmpegPlugin.KEY_RC, rc));
     }
 
 }

+ 4 - 2
android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegGetMediaInformationAsyncTask.java

@@ -37,10 +37,12 @@ public class FlutterFFmpegGetMediaInformationAsyncTask extends AsyncTask<String,
 
     private Integer timeout;
     private final MethodChannel.Result result;
+    private final FlutterFFmpegResultHandler flutterFFmpegResultHandler;
 
-    FlutterFFmpegGetMediaInformationAsyncTask(final Integer timeout, final MethodChannel.Result result) {
+    FlutterFFmpegGetMediaInformationAsyncTask(final FlutterFFmpegResultHandler flutterFFmpegResultHandler, final Integer timeout, final MethodChannel.Result result) {
         this.timeout = timeout;
         this.result = result;
+        this.flutterFFmpegResultHandler = flutterFFmpegResultHandler;
     }
 
     @Override
@@ -64,7 +66,7 @@ public class FlutterFFmpegGetMediaInformationAsyncTask extends AsyncTask<String,
 
     @Override
     protected void onPostExecute(final MediaInformation mediaInformation) {
-        result.success(FlutterFFmpegPlugin.toMediaInformationMap(mediaInformation));
+        flutterFFmpegResultHandler.success(result, FlutterFFmpegPlugin.toMediaInformationMap(mediaInformation));
     }
 
 }

+ 20 - 17
android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegPlugin.java

@@ -80,6 +80,7 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
 
     private EventChannel.EventSink eventSink;
     private final Registrar registrar;
+    private final FlutterFFmpegResultHandler flutterFFmpegResultHandler;
 
     /**
      * Registers plugin to registry.
@@ -87,17 +88,19 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
      * @param registrar receiver of plugin registration
      */
     public static void registerWith(final Registrar registrar) {
-        FlutterFFmpegPlugin handler = new FlutterFFmpegPlugin(registrar);
+        FlutterFFmpegPlugin flutterFFmpegPlugin = new FlutterFFmpegPlugin(registrar);
 
         final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_ffmpeg");
-        channel.setMethodCallHandler(handler);
+        channel.setMethodCallHandler(flutterFFmpegPlugin);
 
         final EventChannel eventChannel = new EventChannel(registrar.messenger(), "flutter_ffmpeg_event");
-        eventChannel.setStreamHandler(handler);
+        eventChannel.setStreamHandler(flutterFFmpegPlugin);
     }
 
     private FlutterFFmpegPlugin(Registrar registrar) {
         this.registrar = registrar;
+
+        this.flutterFFmpegResultHandler = new FlutterFFmpegResultHandler();
     }
 
     private Context getActiveContext() {
@@ -115,18 +118,18 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
         if (call.method.equals("getPlatform")) {
 
             final String abi = AbiDetect.getAbi();
-            result.success(toStringMap(KEY_PLATFORM, PLATFORM_NAME + "-" + abi));
+            flutterFFmpegResultHandler.success(result, toStringMap(KEY_PLATFORM, PLATFORM_NAME + "-" + abi));
 
         } else if (call.method.equals("getFFmpegVersion")) {
 
             final String version = FFmpeg.getFFmpegVersion();
-            result.success(toStringMap(KEY_VERSION, version));
+            flutterFFmpegResultHandler.success(result, toStringMap(KEY_VERSION, version));
 
         } else if (call.method.equals("executeWithArguments")) {
 
             List<String> arguments = call.argument("arguments");
 
-            final FlutterFFmpegExecuteAsyncArgumentsTask asyncTask = new FlutterFFmpegExecuteAsyncArgumentsTask(arguments, result);
+            final FlutterFFmpegExecuteAsyncArgumentsTask asyncTask = new FlutterFFmpegExecuteAsyncArgumentsTask(flutterFFmpegResultHandler, arguments, result);
             asyncTask.execute("dummy-trigger");
 
         } else if (call.method.equals("execute")) {
@@ -134,7 +137,7 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
             String command = call.argument("command");
             String delimiter = call.argument("delimiter");
 
-            final FlutterFFmpegExecuteAsyncCommandTask asyncTask = new FlutterFFmpegExecuteAsyncCommandTask(delimiter, result);
+            final FlutterFFmpegExecuteAsyncCommandTask asyncTask = new FlutterFFmpegExecuteAsyncCommandTask(flutterFFmpegResultHandler, delimiter, result);
             asyncTask.execute(command);
 
         } else if (call.method.equals("cancel")) {
@@ -152,7 +155,7 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
         } else if (call.method.equals("getLogLevel")) {
 
             final Level level = Config.getLogLevel();
-            result.success(toIntMap(KEY_LOG_LEVEL, levelToInt(level)));
+            flutterFFmpegResultHandler.success(result, toIntMap(KEY_LOG_LEVEL, levelToInt(level)));
 
         } else if (call.method.equals("setLogLevel")) {
 
@@ -192,7 +195,7 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
 
         } else if (call.method.equals("getLastReceivedStatistics")) {
 
-            result.success(toMap(Config.getLastReceivedStatistics()));
+            flutterFFmpegResultHandler.success(result, toMap(Config.getLastReceivedStatistics()));
 
         } else if (call.method.equals("resetStatistics")) {
 
@@ -217,22 +220,22 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
         } else if (call.method.equals("getPackageName")) {
 
             final String packageName = Config.getPackageName();
-            result.success(toStringMap(KEY_PACKAGE_NAME, packageName));
+            flutterFFmpegResultHandler.success(result, toStringMap(KEY_PACKAGE_NAME, packageName));
 
         } else if (call.method.equals("getExternalLibraries")) {
 
             final List<String> externalLibraries = Config.getExternalLibraries();
-            result.success(externalLibraries);
+            flutterFFmpegResultHandler.success(result, externalLibraries);
 
         } else if (call.method.equals("getLastReturnCode")) {
 
             int lastReturnCode = FFmpeg.getLastReturnCode();
-            result.success(toIntMap(KEY_LAST_RC, lastReturnCode));
+            flutterFFmpegResultHandler.success(result, toIntMap(KEY_LAST_RC, lastReturnCode));
 
         } else if (call.method.equals("getLastCommandOutput")) {
 
             final String lastCommandOutput = FFmpeg.getLastCommandOutput();
-            result.success(toStringMap(KEY_LAST_COMMAND_OUTPUT, lastCommandOutput));
+            flutterFFmpegResultHandler.success(result, toStringMap(KEY_LAST_COMMAND_OUTPUT, lastCommandOutput));
 
         } else if (call.method.equals("getMediaInformation")) {
             final String path = call.argument("path");
@@ -241,11 +244,11 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
                 timeout = 10000;
             }
 
-            final FlutterFFmpegGetMediaInformationAsyncTask asyncTask = new FlutterFFmpegGetMediaInformationAsyncTask(timeout, result);
+            final FlutterFFmpegGetMediaInformationAsyncTask asyncTask = new FlutterFFmpegGetMediaInformationAsyncTask(flutterFFmpegResultHandler, timeout, result);
             asyncTask.execute(path);
 
         } else {
-            result.notImplemented();
+            flutterFFmpegResultHandler.notImplemented(result);
         }
     }
 
@@ -268,13 +271,13 @@ public class FlutterFFmpegPlugin implements MethodCallHandler, EventChannel.Stre
 
         logWrapperMap.put(EVENT_LOG, logMap);
 
-        eventSink.success(logWrapperMap);
+        flutterFFmpegResultHandler.success(eventSink, logWrapperMap);
     }
 
     protected void emitStatistics(final Statistics statistics) {
         final HashMap<String, Object> statisticsMap = new HashMap<>();
         statisticsMap.put(EVENT_STAT, toMap(statistics));
-        eventSink.success(statisticsMap);
+        flutterFFmpegResultHandler.success(eventSink, statisticsMap);
     }
 
     public static int levelToInt(final Level level) {

+ 77 - 0
android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegResultHandler.java

@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2019 Taner Sener
+ *
+ * This file is part of FlutterFFmpeg.
+ *
+ * FlutterFFmpeg is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FlutterFFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FlutterFFmpeg.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.arthenica.flutter.ffmpeg;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import io.flutter.plugin.common.EventChannel;
+import io.flutter.plugin.common.MethodChannel;
+
+/**
+ * <h3>Flutter FFmpeg Result Handler</h3>
+ *
+ * @author Taner Sener
+ * @since 0.2.2
+ */
+class FlutterFFmpegResultHandler {
+    private final Handler handler;
+
+    FlutterFFmpegResultHandler() {
+        handler = new Handler(Looper.getMainLooper());
+    }
+
+    void notImplemented(final MethodChannel.Result result) {
+        handler.post(new Runnable() {
+
+            @Override
+            public void run() {
+                if (result != null) {
+                    result.notImplemented();
+                }
+            }
+        });
+    }
+
+    void success(final MethodChannel.Result result, final Object object) {
+        handler.post(new Runnable() {
+
+            @Override
+            public void run() {
+                if (result != null) {
+                    result.success(object);
+                }
+            }
+        });
+    }
+
+    void success(final EventChannel.EventSink eventSink, final Object object) {
+        handler.post(new Runnable() {
+
+            @Override
+            public void run() {
+                if (eventSink != null) {
+                    eventSink.success(object);
+                }
+            }
+        });
+    }
+
+}

+ 8 - 8
example/pubspec.lock

@@ -7,7 +7,7 @@ packages:
       name: async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.8"
+    version: "2.2.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -59,7 +59,7 @@ packages:
       name: matcher
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.3+1"
+    version: "0.12.5"
   meta:
     dependency: transitive
     description:
@@ -87,14 +87,14 @@ packages:
       name: pedantic
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.0"
+    version: "1.5.0"
   quiver:
     dependency: transitive
     description:
       name: quiver
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.3"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -106,7 +106,7 @@ packages:
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.5.4"
+    version: "1.5.5"
   stack_trace:
     dependency: transitive
     description:
@@ -120,7 +120,7 @@ packages:
       name: stream_channel
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.6.8"
+    version: "2.0.0"
   string_scanner:
     dependency: transitive
     description:
@@ -141,7 +141,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.2"
+    version: "0.2.5"
   typed_data:
     dependency: transitive
     description:
@@ -157,5 +157,5 @@ packages:
     source: hosted
     version: "2.0.8"
 sdks:
-  dart: ">=2.1.0 <3.0.0"
+  dart: ">=2.2.0 <3.0.0"
   flutter: ">=0.1.4 <2.0.0"

+ 1 - 0
flutter_ffmpeg.iml

@@ -25,6 +25,7 @@
       <excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
       <excludeFolder url="file://$MODULE_DIR$/packages" />
     </content>
+    <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Dart SDK" level="project" />
     <orderEntry type="library" name="Flutter Plugins" level="project" />