From 8841673b889b887ea74fdec62c8b3193cca85fa9 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Fri, 1 Sep 2023 19:14:47 +0800 Subject: [PATCH] Fix native image processor messages not reporting to flutter --- app/lib/bloc/scan_account_dir.dart | 20 ++++++++---- app/lib/event/native_event.dart | 15 --------- app/lib/widget/home_photos.dart | 21 +++++++----- .../np_platform_image_processor/Event.kt | 18 +++++------ .../ImageProcessorChannelHandler.kt | 24 ++++++++++++-- .../ImageProcessorService.kt | 6 ++-- .../InternalEvent.kt | 13 ++++++++ .../NativeEvent.kt | 15 --------- .../NpPlatformImageProcessorPlugin.kt | 32 +++++++------------ .../lib/np_platform_image_processor.dart | 1 + .../lib/src/event.dart | 22 +++++++++++++ .../lib/src/event_handler.dart | 30 +++++++++++++++++ .../lib/src/event_handler.g.dart | 14 ++++++++ .../lib/src/image_processor.dart | 4 +++ np_platform_image_processor/pubspec.yaml | 6 ++++ .../nkming/nc_photos/plugin/NativeEvent.kt | 6 ++++ .../plugin}/NativeEventChannelHandler.kt | 2 +- .../nkming/nc_photos/plugin/NcPhotosPlugin.kt | 16 ++++++++++ 18 files changed, 183 insertions(+), 82 deletions(-) create mode 100644 np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/InternalEvent.kt delete mode 100644 np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEvent.kt create mode 100644 np_platform_image_processor/lib/src/event.dart create mode 100644 np_platform_image_processor/lib/src/event_handler.dart create mode 100644 np_platform_image_processor/lib/src/event_handler.g.dart create mode 100644 plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEvent.kt rename {np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor => plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin}/NativeEventChannelHandler.kt (96%) diff --git a/app/lib/bloc/scan_account_dir.dart b/app/lib/bloc/scan_account_dir.dart index 36fe3104..b45bed2f 100644 --- a/app/lib/bloc/scan_account_dir.dart +++ b/app/lib/bloc/scan_account_dir.dart @@ -17,12 +17,14 @@ import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/native_event.dart'; import 'package:nc_photos/exception.dart'; import 'package:nc_photos/progress_util.dart'; +import 'package:nc_photos/stream_extension.dart'; import 'package:nc_photos/throttler.dart'; import 'package:nc_photos/use_case/ls.dart'; import 'package:nc_photos/use_case/scan_dir.dart'; import 'package:nc_photos/use_case/scan_dir_offline.dart'; import 'package:nc_photos/use_case/sync_dir.dart'; import 'package:np_codegen/np_codegen.dart'; +import 'package:np_platform_image_processor/np_platform_image_processor.dart'; import 'package:np_platform_util/np_platform_util.dart'; import 'package:to_string/to_string.dart'; @@ -132,7 +134,8 @@ class ScanAccountDirBloc _accountPrefUpdatedEventListener.begin(); _nativeFileExifUpdatedListener?.begin(); - _imageProcessorUploadSuccessListener?.begin(); + _imageProcessorUploadSuccessListener = _imageProcessorUploadSuccessStream + ?.listen(_onImageProcessorUploadSuccessEvent); on(_onEvent, transformer: ((events, mapper) { return events.distinct((a, b) { @@ -166,7 +169,7 @@ class ScanAccountDirBloc } @override - close() { + Future close() { _fileRemovedEventListener.end(); _filePropertyUpdatedEventListener.end(); _fileTrashbinRestoredEventListener.end(); @@ -176,7 +179,8 @@ class ScanAccountDirBloc _accountPrefUpdatedEventListener.end(); _nativeFileExifUpdatedListener?.end(); - _imageProcessorUploadSuccessListener?.end(); + _imageProcessorUploadSuccessListener?.cancel(); + _imageProcessorUploadSuccessListener = null; _refreshThrottler.clear(); return super.close(); @@ -526,11 +530,13 @@ class ScanAccountDirBloc late final _nativeFileExifUpdatedListener = getRawPlatform() == NpPlatform.web ? null : NativeEventListener(_onNativeFileExifUpdated); - late final _imageProcessorUploadSuccessListener = - getRawPlatform() == NpPlatform.web + + Stream? + get _imageProcessorUploadSuccessStream => getRawPlatform() == + NpPlatform.web ? null - : NativeEventListener( - _onImageProcessorUploadSuccessEvent); + : ImageProcessor.stream.whereType(); + StreamSubscription? _imageProcessorUploadSuccessListener; late final _refreshThrottler = Throttler( onTriggered: (_) { diff --git a/app/lib/event/native_event.dart b/app/lib/event/native_event.dart index 7854b214..b78ab066 100644 --- a/app/lib/event/native_event.dart +++ b/app/lib/event/native_event.dart @@ -31,9 +31,6 @@ class NativeEventListener { case FileExifUpdatedEvent._id: return FileExifUpdatedEvent.fromEvent(ev); - case ImageProcessorUploadSuccessEvent._id: - return ImageProcessorUploadSuccessEvent.fromEvent(ev); - default: throw ArgumentError("Invalid event: ${ev.event}"); } @@ -66,15 +63,3 @@ class FileExifUpdatedEvent { final List fileIds; } - -class ImageProcessorUploadSuccessEvent { - const ImageProcessorUploadSuccessEvent(); - - factory ImageProcessorUploadSuccessEvent.fromEvent(NativeEventObject ev) { - assert(ev.event == _id); - assert(ev.data == null); - return const ImageProcessorUploadSuccessEvent(); - } - - static const _id = "ImageProcessorUploadSuccessEvent"; -} diff --git a/app/lib/widget/home_photos.dart b/app/lib/widget/home_photos.dart index bd4cbbfe..e07d2b10 100644 --- a/app/lib/widget/home_photos.dart +++ b/app/lib/widget/home_photos.dart @@ -22,7 +22,6 @@ import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/event/event.dart'; -import 'package:nc_photos/event/native_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; @@ -31,6 +30,7 @@ import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/service.dart' as service; import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/snack_bar_manager.dart'; +import 'package:nc_photos/stream_extension.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme/dimension.dart'; import 'package:nc_photos/throttler.dart'; @@ -52,6 +52,7 @@ import 'package:nc_photos/widget/viewer.dart'; import 'package:nc_photos/widget/zoom_menu_button.dart'; import 'package:np_async/np_async.dart'; import 'package:np_codegen/np_codegen.dart'; +import 'package:np_platform_image_processor/np_platform_image_processor.dart'; import 'package:np_platform_util/np_platform_util.dart'; import 'package:visibility_detector/visibility_detector.dart'; @@ -87,7 +88,8 @@ class _HomePhotosState extends State _initBloc(); _web?.onInitState(); _prefUpdatedListener.begin(); - _imageProcessorUploadSuccessListener?.begin(); + _imageProcessorUploadSuccessListener = _imageProcessorUploadSuccessStream + ?.listen(_onImageProcessorUploadSuccessEvent); _onBackToTopListener.begin(); } @@ -95,7 +97,8 @@ class _HomePhotosState extends State dispose() { _onBackToTopListener.end(); _prefUpdatedListener.end(); - _imageProcessorUploadSuccessListener?.end(); + _imageProcessorUploadSuccessListener?.cancel(); + _imageProcessorUploadSuccessListener = null; _web?.onDispose(); super.dispose(); } @@ -726,14 +729,16 @@ class _HomePhotosState extends State late final _prefUpdatedListener = AppEventListener(_onPrefUpdated); - late final _imageProcessorUploadSuccessListener = - getRawPlatform() == NpPlatform.web - ? null - : NativeEventListener( - _onImageProcessorUploadSuccessEvent); late final _onBackToTopListener = AppEventListener(_onBackToTop); + Stream? + get _imageProcessorUploadSuccessStream => getRawPlatform() == + NpPlatform.web + ? null + : ImageProcessor.stream.whereType(); + StreamSubscription? _imageProcessorUploadSuccessListener; + late final _Web? _web = getRawPlatform() == NpPlatform.web ? _Web(this) : null; diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/Event.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/Event.kt index d647891c..392f23e5 100644 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/Event.kt +++ b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/Event.kt @@ -1,13 +1,13 @@ package com.nkming.nc_photos.np_platform_image_processor -import android.net.Uri +internal interface ImageProcessorEvent { + fun getId(): String +} -internal interface MessageEvent +internal class ImageProcessorUploadSuccessEvent : ImageProcessorEvent { + companion object { + const val id = "ImageProcessorUploadSuccessEvent" + } -internal data class ImageProcessorCompletedEvent( - val result: Uri, -) : MessageEvent - -internal data class ImageProcessorFailedEvent( - val exception: Throwable, -) : MessageEvent + override fun getId() = id +} diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorChannelHandler.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorChannelHandler.kt index 83c82354..6676b152 100644 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorChannelHandler.kt +++ b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorChannelHandler.kt @@ -23,8 +23,22 @@ import java.io.Serializable internal class ImageProcessorChannelHandler(context: Context) : MethodChannel.MethodCallHandler, EventChannel.StreamHandler { companion object { + const val EVENT_CHANNEL = "${K.LIB_ID}/image_processor_event" const val METHOD_CHANNEL = "${K.LIB_ID}/image_processor_method" + fun fire(ev: ImageProcessorEvent) { + synchronized(eventSinks) { + for (s in eventSinks.values) { + s.success(buildMap { + put("event", ev.getId()) + }) + } + } + } + + private val eventSinks = mutableMapOf() + private var nextId = 0 + private const val TAG = "ImageProcessorChannelHandler" } @@ -158,11 +172,15 @@ internal class ImageProcessorChannelHandler(context: Context) : } override fun onListen(arguments: Any?, events: EventChannel.EventSink) { - eventSink = events + synchronized(eventSinks) { + eventSinks[id] = events + } } override fun onCancel(arguments: Any?) { - eventSink = null + synchronized(eventSinks) { + eventSinks.remove(id) + } } private fun zeroDce( @@ -271,7 +289,7 @@ internal class ImageProcessorChannelHandler(context: Context) : } private val context = context - private var eventSink: EventChannel.EventSink? = null + private val id = nextId++ } internal interface ImageFilter { diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorService.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorService.kt index f2f7b6ed..225ea2de 100644 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorService.kt +++ b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/ImageProcessorService.kt @@ -399,9 +399,9 @@ internal class ImageProcessorService : Service() { private fun notifyResult(event: MessageEvent, shouldFireEvent: Boolean) { if (event is ImageProcessorCompletedEvent) { if (shouldFireEvent) { - // NativeEventChannelHandler.fire( - // ImageProcessorUploadSuccessEvent() - // ) + ImageProcessorChannelHandler.fire( + ImageProcessorUploadSuccessEvent() + ) } notificationManager.notify( RESULT_NOTIFICATION_ID, buildResultNotification(event.result) diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/InternalEvent.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/InternalEvent.kt new file mode 100644 index 00000000..d647891c --- /dev/null +++ b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/InternalEvent.kt @@ -0,0 +1,13 @@ +package com.nkming.nc_photos.np_platform_image_processor + +import android.net.Uri + +internal interface MessageEvent + +internal data class ImageProcessorCompletedEvent( + val result: Uri, +) : MessageEvent + +internal data class ImageProcessorFailedEvent( + val exception: Throwable, +) : MessageEvent diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEvent.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEvent.kt deleted file mode 100644 index 49a9e209..00000000 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.nkming.nc_photos.np_platform_image_processor - -// To be removed -internal interface NativeEvent { - fun getId(): String - fun getData(): String? = null -} - -internal class ImageProcessorUploadSuccessEvent : NativeEvent { - companion object { - const val id = "ImageProcessorUploadSuccessEvent" - } - - override fun getId() = id -} diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NpPlatformImageProcessorPlugin.kt b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NpPlatformImageProcessorPlugin.kt index ae15dc83..9a23b7a9 100644 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NpPlatformImageProcessorPlugin.kt +++ b/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NpPlatformImageProcessorPlugin.kt @@ -19,38 +19,28 @@ class NpPlatformImageProcessorPlugin : FlutterPlugin { override fun onAttachedToEngine( @NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding ) { + val imageProcessorHandler = ImageProcessorChannelHandler( + flutterPluginBinding.applicationContext + ) + imageProcessorEventChannel = EventChannel( + flutterPluginBinding.binaryMessenger, + ImageProcessorChannelHandler.EVENT_CHANNEL + ) + imageProcessorEventChannel.setStreamHandler(imageProcessorHandler) imageProcessorMethodChannel = MethodChannel( flutterPluginBinding.binaryMessenger, ImageProcessorChannelHandler.METHOD_CHANNEL ) - imageProcessorMethodChannel.setMethodCallHandler( - ImageProcessorChannelHandler( - flutterPluginBinding.applicationContext - ) - ) - - val nativeEventHandler = NativeEventChannelHandler() - nativeEventChannel = EventChannel( - flutterPluginBinding.binaryMessenger, - NativeEventChannelHandler.EVENT_CHANNEL - ) - nativeEventChannel.setStreamHandler(nativeEventHandler) - nativeEventMethodChannel = MethodChannel( - flutterPluginBinding.binaryMessenger, - NativeEventChannelHandler.METHOD_CHANNEL - ) - nativeEventMethodChannel.setMethodCallHandler(nativeEventHandler) + imageProcessorMethodChannel.setMethodCallHandler(imageProcessorHandler) } override fun onDetachedFromEngine( @NonNull binding: FlutterPlugin.FlutterPluginBinding ) { + imageProcessorEventChannel.setStreamHandler(null) imageProcessorMethodChannel.setMethodCallHandler(null) - nativeEventChannel.setStreamHandler(null) - nativeEventMethodChannel.setMethodCallHandler(null) } private lateinit var imageProcessorMethodChannel: MethodChannel - private lateinit var nativeEventChannel: EventChannel - private lateinit var nativeEventMethodChannel: MethodChannel + private lateinit var imageProcessorEventChannel: EventChannel } diff --git a/np_platform_image_processor/lib/np_platform_image_processor.dart b/np_platform_image_processor/lib/np_platform_image_processor.dart index 6ad41cbb..690c0afc 100644 --- a/np_platform_image_processor/lib/np_platform_image_processor.dart +++ b/np_platform_image_processor/lib/np_platform_image_processor.dart @@ -1,3 +1,4 @@ library np_platform_image_processor; +export 'src/event.dart'; export 'src/image_processor.dart'; diff --git a/np_platform_image_processor/lib/src/event.dart b/np_platform_image_processor/lib/src/event.dart new file mode 100644 index 00000000..3c85173b --- /dev/null +++ b/np_platform_image_processor/lib/src/event.dart @@ -0,0 +1,22 @@ +abstract class ImageProcessorEvent { + static ImageProcessorEvent fromNativeEvent(dynamic ev) { + final id = ev["event"]; + switch (id) { + case ImageProcessorUploadSuccessEvent._id: + return ImageProcessorUploadSuccessEvent.fromNativeEvent(ev); + default: + throw UnsupportedError("Unknown event: $id"); + } + } +} + +class ImageProcessorUploadSuccessEvent implements ImageProcessorEvent { + const ImageProcessorUploadSuccessEvent._(); + + factory ImageProcessorUploadSuccessEvent.fromNativeEvent(dynamic ev) { + assert(ev.event == _id); + return const ImageProcessorUploadSuccessEvent._(); + } + + static const _id = "ImageProcessorUploadSuccessEvent"; +} diff --git a/np_platform_image_processor/lib/src/event_handler.dart b/np_platform_image_processor/lib/src/event_handler.dart new file mode 100644 index 00000000..9d9a36d7 --- /dev/null +++ b/np_platform_image_processor/lib/src/event_handler.dart @@ -0,0 +1,30 @@ +import 'package:flutter/services.dart'; +import 'package:logging/logging.dart'; +import 'package:np_codegen/np_codegen.dart'; +import 'package:np_platform_image_processor/src/event.dart'; +import 'package:np_platform_image_processor/src/k.dart' as k; + +part 'event_handler.g.dart'; + +@npLog +class EventHandler { + static Stream get stream => + _eventChannel.receiveBroadcastStream().map(_toEvent).whereNotNull(); + + static ImageProcessorEvent? _toEvent(dynamic ev) { + try { + return ImageProcessorEvent.fromNativeEvent(ev); + } catch (e, stackTrace) { + _log.severe("Failed while parsing native events", e, stackTrace); + return null; + } + } + + static const _eventChannel = EventChannel("${k.libId}/image_processor_event"); + + static final _log = _$EventHandlerNpLog.log; +} + +extension on Stream { + Stream whereNotNull() => where((e) => e != null).cast(); +} diff --git a/np_platform_image_processor/lib/src/event_handler.g.dart b/np_platform_image_processor/lib/src/event_handler.g.dart new file mode 100644 index 00000000..c0258905 --- /dev/null +++ b/np_platform_image_processor/lib/src/event_handler.g.dart @@ -0,0 +1,14 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'event_handler.dart'; + +// ************************************************************************** +// NpLogGenerator +// ************************************************************************** + +extension _$EventHandlerNpLog on EventHandler { + // ignore: unused_element + Logger get _log => log; + + static final log = Logger("src.event_handler.EventHandler"); +} diff --git a/np_platform_image_processor/lib/src/image_processor.dart b/np_platform_image_processor/lib/src/image_processor.dart index 29f06000..110d0e4c 100644 --- a/np_platform_image_processor/lib/src/image_processor.dart +++ b/np_platform_image_processor/lib/src/image_processor.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:flutter/services.dart'; +import 'package:np_platform_image_processor/src/event.dart'; +import 'package:np_platform_image_processor/src/event_handler.dart'; import 'package:np_platform_image_processor/src/k.dart' as k; import 'package:np_platform_raw_image/np_platform_raw_image.dart'; @@ -75,6 +77,8 @@ class TransformOrientationFilter implements ImageFilter { } class ImageProcessor { + static Stream get stream => EventHandler.stream; + static Future zeroDce( String fileUrl, String filename, diff --git a/np_platform_image_processor/pubspec.yaml b/np_platform_image_processor/pubspec.yaml index 3db76bdc..1d98bfc1 100644 --- a/np_platform_image_processor/pubspec.yaml +++ b/np_platform_image_processor/pubspec.yaml @@ -11,11 +11,17 @@ environment: dependencies: flutter: sdk: flutter + collection: ^1.15.0 logging: ^1.1.1 + np_codegen: + path: ../codegen np_platform_raw_image: path: ../np_platform_raw_image dev_dependencies: + build_runner: ^2.2.1 + np_codegen_build: + path: ../codegen_build np_lints: path: ../np_lints diff --git a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEvent.kt b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEvent.kt new file mode 100644 index 00000000..adc6d2f8 --- /dev/null +++ b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEvent.kt @@ -0,0 +1,6 @@ +package com.nkming.nc_photos.plugin + +internal interface NativeEvent { + fun getId(): String + fun getData(): String? = null +} diff --git a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEventChannelHandler.kt b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEventChannelHandler.kt similarity index 96% rename from np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEventChannelHandler.kt rename to plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEventChannelHandler.kt index 9c2afc75..d97790f8 100644 --- a/np_platform_image_processor/android/src/main/kotlin/com/nkming/nc_photos/np_platform_image_processor/NativeEventChannelHandler.kt +++ b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NativeEventChannelHandler.kt @@ -1,4 +1,4 @@ -package com.nkming.nc_photos.np_platform_image_processor +package com.nkming.nc_photos.plugin import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.MethodCall diff --git a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt index 4d554ebf..460679f6 100644 --- a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt +++ b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt @@ -60,6 +60,18 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, PreferenceChannelHandler.METHOD_CHANNEL ) preferenceMethodChannel.setMethodCallHandler(preferenceChannelHandler) + + val nativeEventHandler = NativeEventChannelHandler() + nativeEventChannel = EventChannel( + flutterPluginBinding.binaryMessenger, + NativeEventChannelHandler.EVENT_CHANNEL + ) + nativeEventChannel.setStreamHandler(nativeEventHandler) + nativeEventMethodChannel = MethodChannel( + flutterPluginBinding.binaryMessenger, + NativeEventChannelHandler.METHOD_CHANNEL + ) + nativeEventMethodChannel.setMethodCallHandler(nativeEventHandler) } override fun onDetachedFromEngine( @@ -70,6 +82,8 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, mediaStoreMethodChannel.setMethodCallHandler(null) contentUriMethodChannel.setMethodCallHandler(null) preferenceMethodChannel.setMethodCallHandler(null) + nativeEventChannel.setStreamHandler(null) + nativeEventMethodChannel.setMethodCallHandler(null) } override fun onAttachedToActivity(binding: ActivityPluginBinding) { @@ -122,6 +136,8 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, private lateinit var mediaStoreMethodChannel: MethodChannel private lateinit var contentUriMethodChannel: MethodChannel private lateinit var preferenceMethodChannel: MethodChannel + private lateinit var nativeEventChannel: EventChannel + private lateinit var nativeEventMethodChannel: MethodChannel private lateinit var mediaStoreChannelHandler: MediaStoreChannelHandler }