PSDK-1017 - Версия плеера

This commit is contained in:
Elena Nazarova
2023-12-29 12:15:07 +03:00
committed by Jura Shikin
parent 5d9c5b8fcf
commit 7b3a76233a
8 changed files with 72 additions and 10 deletions
@@ -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<SettingsEvent, SettingsState> {
final SettingsRepository _repository;
StreamSubscription<String>? _versionSubscription;
SettingsBloc(this._repository) : super(SettingsInitialState.createFromRepository(_repository)) {
_onInitialize();
on<DismissEvent>(_onDismissEvent);
on<CrashEvent>(_onCrashEvent);
on<SkinChangedEvent>(_onSkinChangedEvent);
@@ -32,9 +36,25 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
on<TrackTimeoutsChangedEvent>(_onTrackTimeoutsChangedEvent);
on<ChunkTimeoutsChangedEvent>(_onChunkTimeoutsChangedEvent);
on<LogTypeChangedEvent>(_onLogTypeChangedEvent);
on<VersionReceivedEvent>(_onVersionReceived);
}
_onInitialize() {
_versionSubscription = PlayerVersionObserver().versionStream.listen((version) {
add(VersionReceivedEvent(version));
});
}
_onVersionReceived(VersionReceivedEvent event, Emitter<SettingsState> emit) {
final settingsState = state;
if (settingsState is! SettingsInitialState) { return; }
emit(settingsState.copy(playerVersion: event.version));
}
_onDismissEvent(DismissEvent event, Emitter<SettingsState> emit) {
_versionSubscription?.cancel();
_versionSubscription = null;
emit(SettingsDismiss());
}
@@ -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);
@@ -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,
@@ -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> packageInfo) {
Widget _buildVersion(AsyncSnapshot<PackageInfo> 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 {
+1
View File
@@ -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';
@@ -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<String>();
Stream<String> get versionStream => _versionStreamController.stream.asBroadcastStream();
PlayerVersionObserver() {
_pluginChannel.setMethodCallHandler(_pluginVersionHandler);
_pluginChannel.invokeMethod("getPlayerVersion");
}
Future<dynamic> _pluginVersionHandler(MethodCall call) async {
switch (call.method) {
case 'pluginVersion':
final version = call.arguments['version'];
if (version != null) {
_versionStreamController.add(version);
}
break;
default:
break;
}
}
}
@@ -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":
@@ -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<int> state(PlayerId playerId) async {
throw UnimplementedError('state() has not been implemented.');
}
@@ -128,5 +128,4 @@ abstract class NutPlayerPlatform extends PlatformInterface {
Stream<Object> skinActionStream() {
throw UnimplementedError('skinActionStream() has not been implemented.');
}
}