fix(lyrics): hide controls after five seconds only during playback

This commit is contained in:
zarzet
2026-09-25 16:26:25 +07:00
parent fc13a6c7c0
commit e09d0c1609
3 changed files with 100 additions and 14 deletions
+15 -1
View File
@@ -316,6 +316,7 @@ class NowPlayingScreen extends ConsumerStatefulWidget {
class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
final PageController _pageController = PageController();
ProviderSubscription<AsyncValue<MediaItem?>>? _mediaItemSub;
ProviderSubscription<bool>? _lyricsPlayingSub;
String? _loadedSource;
String? _loadedResolvedSource;
String? _loadedMetadataPath;
@@ -359,6 +360,15 @@ class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
inspectUnresolvedContentUri: _currentPage == 1,
),
);
_lyricsPlayingSub = ref.listenManual<bool>(playbackPlayingProvider, (
previous,
playing,
) {
if (!playing && _lyricsControlsHidden) {
setState(() => _lyricsControlsHidden = false);
}
_scheduleLyricsControlsHide();
});
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
_loadMetadataForItem(ref.read(currentMediaItemProvider).value);
@@ -380,6 +390,7 @@ class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
void dispose() {
_lyricsIdleTimer?.cancel();
_mediaItemSub?.close();
_lyricsPlayingSub?.close();
_pageController.dispose();
_artworkColorsChanged.dispose();
super.dispose();
@@ -1039,6 +1050,7 @@ class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
context.isMornye &&
!_landscape &&
_currentPage == 1 &&
ref.read(playbackPlayingProvider) &&
!MediaQuery.accessibleNavigationOf(context);
void _scheduleLyricsControlsHide() {
@@ -1050,7 +1062,7 @@ class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
_lyricsPointers.isNotEmpty) {
return;
}
_lyricsIdleTimer = Timer(const Duration(seconds: 3), () {
_lyricsIdleTimer = Timer(const Duration(seconds: 5), () {
if (!mounted || !_canAutoHideLyricsControls) return;
if (ModalRoute.of(context)?.isCurrent == false) {
_scheduleLyricsControlsHide();
@@ -1394,6 +1406,8 @@ class _NowPlayingScreenState extends ConsumerState<NowPlayingScreen> {
if (landscape) {
return MornyeLandscapePlayer(
page: _currentPage,
isPlaying: ref.watch(playbackPlayingProvider),
controlsHeldOpen: _lyricsOptionsOpen,
onPageChanged: _setMornyePage,
artwork: stage(artworkOnly: true),
header: _trackHeader(mediaItem, colorScheme, compact: true),
+11 -2
View File
@@ -17,8 +17,10 @@ class MornyeLandscapePlayer extends StatefulWidget {
required this.controls,
required this.volume,
required this.page,
required this.isPlaying,
required this.onPageChanged,
this.lyricsOptions,
this.controlsHeldOpen = false,
});
final Widget artwork;
@@ -28,6 +30,8 @@ class MornyeLandscapePlayer extends StatefulWidget {
final Widget controls;
final Widget volume;
final int page;
final bool isPlaying;
final bool controlsHeldOpen;
final ValueChanged<int> onPageChanged;
final Widget? lyricsOptions;
@@ -54,21 +58,26 @@ class _MornyeLandscapePlayerState extends State<MornyeLandscapePlayer> {
@override
void didUpdateWidget(MornyeLandscapePlayer oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.page != widget.page) {
if (oldWidget.page != widget.page ||
oldWidget.isPlaying != widget.isPlaying) {
_actionsVisible = true;
_scheduleHide();
} else if (oldWidget.controlsHeldOpen != widget.controlsHeldOpen) {
_scheduleHide();
}
}
void _scheduleHide() {
_hideTimer?.cancel();
if (widget.page != 1 ||
!widget.isPlaying ||
widget.controlsHeldOpen ||
!_actionsVisible ||
_audioOutputOpen ||
MediaQuery.accessibleNavigationOf(context)) {
return;
}
_hideTimer = Timer(const Duration(seconds: 3), () {
_hideTimer = Timer(const Duration(seconds: 5), () {
if (!mounted) return;
if (ModalRoute.of(context)?.isCurrent == false) {
_scheduleHide();