1+ import 'dart:io' ;
2+
13import 'package:flutter/material.dart' ;
24import 'package:flutter/services.dart' ;
3-
45import 'package:collection/collection.dart' ;
6+ import 'package:flutter/foundation.dart' ;
57import 'package:flutter_riverpod/flutter_riverpod.dart' ;
68import 'package:screen_brightness/screen_brightness.dart' ;
9+ import 'package:volume_controller/volume_controller.dart' ;
710
811import 'package:fladder/models/settings/key_combinations.dart' ;
912import 'package:fladder/models/settings/video_player_settings.dart' ;
@@ -18,10 +21,38 @@ final videoPlayerSettingsProvider =
1821final playbackRateProvider = StateProvider <double >((ref) => 1.0 );
1922
2023class VideoPlayerSettingsProviderNotifier extends StateNotifier <VideoPlayerSettingsModel > {
21- VideoPlayerSettingsProviderNotifier (this .ref) : super (VideoPlayerSettingsModel ());
24+ VideoPlayerSettingsProviderNotifier (this .ref) : super (VideoPlayerSettingsModel ()) {
25+ _initVolumeSync ();
26+ }
2227
2328 final Ref ref;
2429
30+ void _initVolumeSync () async {
31+ // Initialize volume from system volume on mobile/supported platforms
32+ if (! kIsWeb && (Platform .isAndroid || Platform .isIOS)) {
33+ VolumeController .instance.showSystemUI = false ;
34+ final initialVolume = await VolumeController .instance.getVolume ();
35+ state = state.copyWith (internalVolume: initialVolume * 100 );
36+
37+ VolumeController .instance.addListener ((volume) {
38+ // Update both the model and the player when system volume changes (hardware buttons)
39+ final newVolume = volume * 100 ;
40+ if ((state.internalVolume - newVolume).abs () > 0.1 ) {
41+ state = state.copyWith (internalVolume: newVolume);
42+ ref.read (videoPlayerProvider).setVolume (newVolume);
43+ }
44+ });
45+ }
46+ }
47+
48+ @override
49+ void dispose () {
50+ if (! kIsWeb && (Platform .isAndroid || Platform .isIOS)) {
51+ VolumeController .instance.removeListener ();
52+ }
53+ super .dispose ();
54+ }
55+
2556 @override
2657 set state (VideoPlayerSettingsModel value) {
2758 final oldState = super .state;
@@ -63,12 +94,18 @@ class VideoPlayerSettingsProviderNotifier extends StateNotifier<VideoPlayerSetti
6394 void setVolume (double value) {
6495 state = state.copyWith (internalVolume: value);
6596 ref.read (videoPlayerProvider).setVolume (value);
97+ if (! kIsWeb && (Platform .isAndroid || Platform .isIOS)) {
98+ VolumeController .instance.setVolume (value / 100 );
99+ }
66100 }
67101
68102 void steppedVolume (int i) {
69103 final value = (state.volume + i).clamp (0 , 100 ).toDouble ();
70104 state = state.copyWith (internalVolume: value);
71105 ref.read (videoPlayerProvider).setVolume (value);
106+ if (! kIsWeb && (Platform .isAndroid || Platform .isIOS)) {
107+ VolumeController .instance.setVolume (value / 100 );
108+ }
72109 }
73110
74111 void steppedSpeed (double i) {
0 commit comments