From 7b3a76233ae6a2c85865202a5f95d57dcbfd3386 Mon Sep 17 00:00:00 2001 From: Elena Nazarova Date: Fri, 29 Dec 2023 12:15:07 +0300 Subject: [PATCH] =?UTF-8?q?PSDK-1017=20-=20=D0=92=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BB=D0=B5=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings_screen/domain/settings_bloc.dart | 20 ++++++++++++++ .../domain/settings_event.dart | 5 ++++ .../domain/settings_state.dart | 7 +++++ .../presentation/settings_view.dart | 17 ++++++------ nut_player/lib/nut_player.dart | 1 + .../lib/src/player_version_observer.dart | 27 +++++++++++++++++++ .../ios/Classes/NutPlayerIosPlugin.swift | 2 ++ .../lib/src/nut_player_platform.dart | 3 +-- 8 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 nut_player/lib/src/player_version_observer.dart diff --git a/nut_player/example/lib/src/features/settings_screen/domain/settings_bloc.dart b/nut_player/example/lib/src/features/settings_screen/domain/settings_bloc.dart index e1bb278..6afd3a3 100644 --- a/nut_player/example/lib/src/features/settings_screen/domain/settings_bloc.dart +++ b/nut_player/example/lib/src/features/settings_screen/domain/settings_bloc.dart @@ -1,6 +1,8 @@ +import 'dart:async'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:nut_player/nut_player.dart'; import 'package:nut_player_example/src/common/models/option_data.dart'; import 'package:nut_player_example/src/common/repository/settings_repository.dart'; import 'package:nut_player_example/src/features/player_screen/mapper/settings_mapper.dart'; @@ -10,8 +12,10 @@ part 'settings_state.dart'; class SettingsBloc extends Bloc { final SettingsRepository _repository; + StreamSubscription? _versionSubscription; SettingsBloc(this._repository) : super(SettingsInitialState.createFromRepository(_repository)) { + _onInitialize(); on(_onDismissEvent); on(_onCrashEvent); on(_onSkinChangedEvent); @@ -32,9 +36,25 @@ class SettingsBloc extends Bloc { on(_onTrackTimeoutsChangedEvent); on(_onChunkTimeoutsChangedEvent); on(_onLogTypeChangedEvent); + on(_onVersionReceived); + } + + _onInitialize() { + _versionSubscription = PlayerVersionObserver().versionStream.listen((version) { + add(VersionReceivedEvent(version)); + }); + } + + _onVersionReceived(VersionReceivedEvent event, Emitter emit) { + final settingsState = state; + if (settingsState is! SettingsInitialState) { return; } + + emit(settingsState.copy(playerVersion: event.version)); } _onDismissEvent(DismissEvent event, Emitter emit) { + _versionSubscription?.cancel(); + _versionSubscription = null; emit(SettingsDismiss()); } diff --git a/nut_player/example/lib/src/features/settings_screen/domain/settings_event.dart b/nut_player/example/lib/src/features/settings_screen/domain/settings_event.dart index 968f7c7..c4fb23a 100644 --- a/nut_player/example/lib/src/features/settings_screen/domain/settings_event.dart +++ b/nut_player/example/lib/src/features/settings_screen/domain/settings_event.dart @@ -7,6 +7,11 @@ class DismissEvent extends SettingsEvent {} class CrashEvent extends SettingsEvent {} +class VersionReceivedEvent extends SettingsEvent { + final String version; + VersionReceivedEvent(this.version); +} + class SpeedChangedEvent extends SettingsEvent { final OptionData option; SpeedChangedEvent(this.option); diff --git a/nut_player/example/lib/src/features/settings_screen/domain/settings_state.dart b/nut_player/example/lib/src/features/settings_screen/domain/settings_state.dart index 87fe442..81503f3 100644 --- a/nut_player/example/lib/src/features/settings_screen/domain/settings_state.dart +++ b/nut_player/example/lib/src/features/settings_screen/domain/settings_state.dart @@ -53,6 +53,8 @@ class SettingsDismiss extends SettingsState {} @immutable class SettingsInitialState extends SettingsState { + final String playerVersion; + final bool isSkinByDefault; final FullscreenSettings fullscreenSettings; @@ -78,6 +80,7 @@ class SettingsInitialState extends SettingsState { final LogType log; SettingsInitialState({ + required this.playerVersion, required this.isSkinByDefault, required this.fullscreenSettings, required this.isPipAvailable, @@ -99,6 +102,8 @@ class SettingsInitialState extends SettingsState { }); SettingsInitialState copy({ + String? playerVersion, + bool? isSkinByDefault, FullscreenSettings? fullscreenSettings, @@ -124,6 +129,7 @@ class SettingsInitialState extends SettingsState { LogType? log }) { return SettingsInitialState( + playerVersion: playerVersion ?? this.playerVersion, isSkinByDefault: isSkinByDefault ?? this.isSkinByDefault, fullscreenSettings: fullscreenSettings ?? this.fullscreenSettings, isPipAvailable: isPipAvailable ?? this.isPipAvailable, @@ -147,6 +153,7 @@ class SettingsInitialState extends SettingsState { factory SettingsInitialState.createFromRepository(SettingsRepository repository) { return SettingsInitialState( + playerVersion: "", isSkinByDefault: repository.isSkinByDefault, fullscreenSettings: SettingsMapper.fullscreenSetting(repository.fullscreenSettings), isPipAvailable: repository.isPipAvailable, diff --git a/nut_player/example/lib/src/features/settings_screen/presentation/settings_view.dart b/nut_player/example/lib/src/features/settings_screen/presentation/settings_view.dart index a710951..ca408ea 100644 --- a/nut_player/example/lib/src/features/settings_screen/presentation/settings_view.dart +++ b/nut_player/example/lib/src/features/settings_screen/presentation/settings_view.dart @@ -152,7 +152,7 @@ class SettingsView extends StatelessWidget { child: FutureBuilder( future: PackageInfo.fromPlatform(), builder: (context, snapshot) { - return _buildVersion(snapshot); + return _buildVersion(snapshot, bloc.state); }) ) ] @@ -164,19 +164,20 @@ class SettingsView extends StatelessWidget { ); } - Widget _buildVersion(AsyncSnapshot packageInfo) { + Widget _buildVersion(AsyncSnapshot packageInfo, SettingsState state) { const textStyle = TextStyle( decoration: TextDecoration.none, color: CupertinoColors.systemGrey, fontSize: 13, fontWeight: FontWeight.w400); + if (packageInfo.hasData) { - return Column( - children: [ - Text('APP VERSION ${packageInfo.requireData.version} (${packageInfo.requireData.buildNumber})', style: textStyle), - const Text('NUT.PLAYER VERSION', style: textStyle) - ], - ); + var versions = [Text('ВЕРСИЯ ПРИЛОЖЕНИЯ ${packageInfo.requireData.version}', style: textStyle)]; + + final settingsState = state; + if (settingsState is! SettingsInitialState) { return Column(children: versions); } + versions.add(Text('ВЕРСИЯ NUT.PLAYER ${settingsState.playerVersion}', style: textStyle)); + return Column(children: versions); } else if (packageInfo.hasError) { return Text(packageInfo.error.toString(), style: textStyle); } else { diff --git a/nut_player/lib/nut_player.dart b/nut_player/lib/nut_player.dart index d716d1b..4190117 100644 --- a/nut_player/lib/nut_player.dart +++ b/nut_player/lib/nut_player.dart @@ -4,6 +4,7 @@ export 'src/legacy/video_progress_indicator.dart'; // new one export 'src/widget/video_player.dart'; export 'src/controller/video_player_controller.dart'; +export 'src/player_version_observer.dart'; // export 'src/provider/provider.dart'; export 'src/provider/common_provider.dart'; diff --git a/nut_player/lib/src/player_version_observer.dart b/nut_player/lib/src/player_version_observer.dart new file mode 100644 index 0000000..656229c --- /dev/null +++ b/nut_player/lib/src/player_version_observer.dart @@ -0,0 +1,27 @@ +import 'dart:async'; +import 'package:flutter/services.dart'; + +class PlayerVersionObserver { + final MethodChannel _pluginChannel = const MethodChannel('tech.nut/plugin'); + final _versionStreamController = StreamController(); + + Stream get versionStream => _versionStreamController.stream.asBroadcastStream(); + + PlayerVersionObserver() { + _pluginChannel.setMethodCallHandler(_pluginVersionHandler); + _pluginChannel.invokeMethod("getPlayerVersion"); + } + + Future _pluginVersionHandler(MethodCall call) async { + switch (call.method) { + case 'pluginVersion': + final version = call.arguments['version']; + if (version != null) { + _versionStreamController.add(version); + } + break; + default: + break; + } + } +} \ No newline at end of file diff --git a/nut_player_ios/ios/Classes/NutPlayerIosPlugin.swift b/nut_player_ios/ios/Classes/NutPlayerIosPlugin.swift index 9b3145c..e6783ab 100644 --- a/nut_player_ios/ios/Classes/NutPlayerIosPlugin.swift +++ b/nut_player_ios/ios/Classes/NutPlayerIosPlugin.swift @@ -62,6 +62,8 @@ public class NutPlayerIosPlugin: NSObject, FlutterPlugin, NutPlayerViewFactoryDe // print("Method: \(call.method), arguments: \(call.arguments)") switch call.method { + case "getPlayerVersion": + self.playerCall(for: Int64(), method: "pluginVersion", arguments: ["version": NutPlayer.version ?? ""]) case "pluginInitialize": self.pluginInitialize(arguments, result: result) case "pluginDispose": diff --git a/nut_player_platform_interface/lib/src/nut_player_platform.dart b/nut_player_platform_interface/lib/src/nut_player_platform.dart index 3fbe6ae..5073af7 100644 --- a/nut_player_platform_interface/lib/src/nut_player_platform.dart +++ b/nut_player_platform_interface/lib/src/nut_player_platform.dart @@ -1,5 +1,4 @@ import 'package:flutter/widgets.dart'; -import 'package:flutter/services.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import '../nut_player_platform_interface.dart'; import 'model/platform_player_content.dart'; @@ -31,6 +30,7 @@ abstract class NutPlayerPlatform extends PlatformInterface { /// Platform Methods Future state(PlayerId playerId) async { + throw UnimplementedError('state() has not been implemented.'); } @@ -128,5 +128,4 @@ abstract class NutPlayerPlatform extends PlatformInterface { Stream skinActionStream() { throw UnimplementedError('skinActionStream() has not been implemented.'); } - } \ No newline at end of file