diff --git a/lib/base/audio_handler.dart b/lib/base/audio_handler.dart index 20156443..5d71e088 100644 --- a/lib/base/audio_handler.dart +++ b/lib/base/audio_handler.dart @@ -29,6 +29,7 @@ import 'package:namida/controller/scroll_search_controller.dart'; import 'package:namida/controller/settings_controller.dart'; import 'package:namida/controller/thumbnail_manager.dart'; import 'package:namida/controller/video_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/controller/waveform_controller.dart'; import 'package:namida/core/constants.dart'; import 'package:namida/core/enums.dart'; @@ -730,7 +731,6 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { if (startPlaying) { setVolume(_userPlayerVolume); await onPlayRaw(); - settings.wakelockMode.value.toggleOn(currentVideoStream.value != null || currentCachedVideo.value != null); } if (sourceChanged) { await seek(currentPositionMS.milliseconds); @@ -1086,6 +1086,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { @override FutureOr onPlayingStateChange(bool isPlaying) { CurrentColor.inst.switchColorPalettes(isPlaying); + WakelockController.inst.updatePlayPauseStatus(isPlaying); if (isPlaying) { _resourcesDisposeTimer?.cancel(); _resourcesDisposeTimer = null; diff --git a/lib/controller/lyrics_controller.dart b/lib/controller/lyrics_controller.dart index bdc3ccc0..7caaf79e 100644 --- a/lib/controller/lyrics_controller.dart +++ b/lib/controller/lyrics_controller.dart @@ -14,6 +14,7 @@ import 'package:path/path.dart' as p; import 'package:namida/class/lyrics.dart'; import 'package:namida/class/track.dart'; import 'package:namida/controller/settings_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/core/constants.dart'; import 'package:namida/core/extensions.dart'; import 'package:namida/packages/lyrics_lrc_parsed_view.dart'; @@ -33,6 +34,7 @@ class Lyrics { Track? _currentTrack; void _updateWidgets(Lrc? lrc) { + WakelockController.inst.updateLRCStatus(lrc != null); lrcViewKey?.currentState?.fillLists(lrc); lrcViewKeyFullscreen.currentState?.fillLists(lrc); } diff --git a/lib/controller/miniplayer_controller.dart b/lib/controller/miniplayer_controller.dart index 4f26ae12..f2543999 100644 --- a/lib/controller/miniplayer_controller.dart +++ b/lib/controller/miniplayer_controller.dart @@ -11,10 +11,10 @@ import 'package:namida/controller/navigator_controller.dart'; import 'package:namida/controller/player_controller.dart'; import 'package:namida/controller/settings_controller.dart'; import 'package:namida/controller/video_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/core/dimensions.dart'; import 'package:namida/core/extensions.dart'; import 'package:namida/core/icon_fonts/broken_icons.dart'; -import 'package:namida/core/namida_converter_ext.dart'; import 'package:namida/packages/mp.dart'; class MiniPlayerController { @@ -275,7 +275,6 @@ class MiniPlayerController { if (_defaultShouldDismissMiniplayer) { snapToMini(); _onMiniplayerDismiss(); - _toggleWakelockOff(); return; } } @@ -312,23 +311,14 @@ class MiniPlayerController { if (shouldSnapToExpanded) { snapToExpanded(); - _toggleWakelockOn(); } else { - _toggleWakelockOff(); if (shouldSnapToMini) snapToMini(); if (shouldSnapToQueue) snapToQueue(animateScrollController: _offset < maxOffset * 1.8); } } - void _toggleWakelockOn() { - settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized); - } - - void _toggleWakelockOff() { - settings.wakelockMode.value.toggleOff(); - } - void snapToExpanded({bool haptic = true}) { + WakelockController.inst.updateMiniplayerStatus(true); _offset = maxOffset; if (_prevOffset < maxOffset) bounceUp = true; if (_prevOffset > maxOffset) bounceDown = true; @@ -337,6 +327,7 @@ class MiniPlayerController { } void snapToMini({bool haptic = true}) { + WakelockController.inst.updateMiniplayerStatus(false); _offset = 0; bounceDown = false; _snap(haptic: haptic); @@ -364,6 +355,7 @@ class MiniPlayerController { } Future snapToQueue({bool animateScrollController = true, bool haptic = true}) async { + WakelockController.inst.updateMiniplayerStatus(false); _offset = maxOffset * 2; bounceUp = false; diff --git a/lib/controller/navigator_controller.dart b/lib/controller/navigator_controller.dart index 9a539b8c..f483dc67 100644 --- a/lib/controller/navigator_controller.dart +++ b/lib/controller/navigator_controller.dart @@ -12,6 +12,7 @@ import 'package:namida/controller/miniplayer_controller.dart'; import 'package:namida/controller/scroll_search_controller.dart'; import 'package:namida/controller/settings_controller.dart'; import 'package:namida/controller/settings_search_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/core/constants.dart'; import 'package:namida/core/dimensions.dart'; import 'package:namida/core/enums.dart'; @@ -168,6 +169,7 @@ class NamidaNavigator { if (_isInFullScreen) return; _isInFullScreen = true; + WakelockController.inst.updateFullscreenStatus(true); Get.to( () => WillPopScope( @@ -205,6 +207,7 @@ class NamidaNavigator { ]); _isInFullScreen = false; + WakelockController.inst.updateFullscreenStatus(false); } Future navigateTo( diff --git a/lib/controller/player_controller.dart b/lib/controller/player_controller.dart index ddd042bb..5dd73180 100644 --- a/lib/controller/player_controller.dart +++ b/lib/controller/player_controller.dart @@ -17,6 +17,7 @@ import 'package:namida/controller/navigator_controller.dart'; import 'package:namida/controller/queue_controller.dart'; import 'package:namida/controller/settings_controller.dart'; import 'package:namida/controller/video_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/core/enums.dart'; import 'package:namida/core/extensions.dart'; import 'package:namida/core/icon_fonts/broken_icons.dart'; @@ -121,9 +122,12 @@ class Player { ); _videoPlayerInfoSub?.cancel(); _videoPlayerInfoSub = _audioHandler.videoPlayerInfo.listen((info) { - if (info == null) return; - if (info.width == -1 || info.height == -1) return; - NamidaChannel.inst.updatePipRatio(width: info.width, height: info.height); + if (info == null || info.width == -1 || info.height == -1) { + WakelockController.inst.updateVideoStatus(false); + } else { + WakelockController.inst.updateVideoStatus(true); + NamidaChannel.inst.updatePipRatio(width: info.width, height: info.height); + } }); prepareTotalListenTime(); setSkipSilenceEnabled(settings.playerSkipSilenceEnabled.value); @@ -375,7 +379,6 @@ class Player { Future play() async { await _audioHandler.play(); - settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized); } Future playRaw() async { @@ -384,7 +387,6 @@ class Player { Future pause() async { await _audioHandler.pause(); - settings.wakelockMode.value.toggleOff(); } Future dispose() async { diff --git a/lib/controller/video_controller.dart b/lib/controller/video_controller.dart index c66cd151..92b29965 100644 --- a/lib/controller/video_controller.dart +++ b/lib/controller/video_controller.dart @@ -21,7 +21,6 @@ import 'package:namida/core/constants.dart'; import 'package:namida/core/enums.dart'; import 'package:namida/core/extensions.dart'; import 'package:namida/core/functions.dart'; -import 'package:namida/core/namida_converter_ext.dart'; import 'package:namida/ui/widgets/video_widget.dart'; import 'package:namida/youtube/controller/youtube_controller.dart'; @@ -300,7 +299,6 @@ class VideoController { loopingAnimation: canLoopVideo(v, track.duration), isFile: true, ); - settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized); } }); } diff --git a/lib/controller/wakelock_controller.dart b/lib/controller/wakelock_controller.dart new file mode 100644 index 00000000..3d89fc1d --- /dev/null +++ b/lib/controller/wakelock_controller.dart @@ -0,0 +1,74 @@ +import 'package:wakelock_plus/wakelock_plus.dart'; + +import 'package:namida/controller/settings_controller.dart'; +import 'package:namida/core/enums.dart'; + +class WakelockController { + static final WakelockController inst = WakelockController._internal(); + WakelockController._internal(); + + bool _isMiniplayerExpanded = false; + bool _isFullScreen = false; + bool _isVideoAvailable = false; + bool _isPlaying = false; + bool _isLRCAvailable = false; + + /// An LRC is automatically considered to be a video (tehe). + bool get _isVideoAvailableAndPlaying => (_isVideoAvailable || _isLRCAvailable) && _isPlaying; + + WakelockMode get _userWakelockMode => settings.wakelockMode.value; + + void updateMiniplayerStatus(bool expanded) { + _isMiniplayerExpanded = expanded; + _reEvaluate(); + } + + void updateFullscreenStatus(bool fullscreen) { + _isFullScreen = fullscreen; + _reEvaluate(); + } + + /// Should be called whenever a video is loaded/unloaded. + void updateVideoStatus(bool videoAvailable) { + _isVideoAvailable = videoAvailable; + _reEvaluate(); + } + + void updatePlayPauseStatus(bool playing) { + _isPlaying = playing; + _reEvaluate(); + } + + void updateLRCStatus(bool hasLRC) { + _isLRCAvailable = hasLRC; + _reEvaluate(); + } + + void _reEvaluate() { + if (_isFullScreen) { + // -- user pref is ignored in fullscreen. + if (_isVideoAvailableAndPlaying) { + _enable(); + } else { + _disable(); + } + return; + } + if (_userWakelockMode == WakelockMode.expandedAndVideo && _isMiniplayerExpanded && _isVideoAvailableAndPlaying) { + _enable(); + } else if (_userWakelockMode == WakelockMode.expanded && _isMiniplayerExpanded) { + _enable(); + } else { + // -- if none was evaluated, or user pref == WakelockMode.none, we disable wakelock + _disable(); + } + } + + void _enable() { + WakelockPlus.enable(); + } + + void _disable() { + WakelockPlus.disable(); + } +} diff --git a/lib/core/namida_converter_ext.dart b/lib/core/namida_converter_ext.dart index fab509e4..f4bb4c87 100644 --- a/lib/core/namida_converter_ext.dart +++ b/lib/core/namida_converter_ext.dart @@ -10,7 +10,6 @@ import 'package:get/get.dart'; import 'package:history_manager/history_manager.dart'; import 'package:newpipeextractor_dart/newpipeextractor_dart.dart'; import 'package:path/path.dart' as p; -import 'package:wakelock_plus/wakelock_plus.dart'; import 'package:namida/class/lang.dart'; import 'package:namida/class/media_info.dart'; @@ -465,18 +464,6 @@ extension PlaylistToQueueSource on Playlist { extension WAKELOCKMODETEXT on WakelockMode { String toText() => _NamidaConverters.inst.getTitle(this); - void toggleOn(bool isShowingVideo) { - if (settings.wakelockMode.value == WakelockMode.expanded) { - WakelockPlus.enable(); - } - if (settings.wakelockMode.value == WakelockMode.expandedAndVideo && isShowingVideo) { - WakelockPlus.enable(); - } - } - - void toggleOff() { - WakelockPlus.disable(); - } } extension NotificationTapActionTEXT on NotificationTapAction { diff --git a/lib/packages/mp.dart b/lib/packages/mp.dart index 79c7f78b..fbf56237 100644 --- a/lib/packages/mp.dart +++ b/lib/packages/mp.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:namida/controller/player_controller.dart'; -import 'package:namida/controller/settings_controller.dart'; +import 'package:namida/controller/wakelock_controller.dart'; import 'package:namida/core/extensions.dart'; -import 'package:namida/core/namida_converter_ext.dart'; import 'package:namida/ui/widgets/custom_widgets.dart'; /// Used to retain state for cases like navigating after pip mode. @@ -73,11 +71,7 @@ class NamidaYTMiniplayerState extends State with SingleTicke _dragheight = _wasExpanded ? _maxHeight : widget.minHeight; - if (_wasExpanded) { - _toggleWakelockOn(); - } else { - _toggleWakelockOff(); - } + WakelockController.inst.updateMiniplayerStatus(_wasExpanded); } void _listenerHeightChange() { @@ -120,25 +114,13 @@ class NamidaYTMiniplayerState extends State with SingleTicke void animateToState(bool toExpanded, {Duration? dur, bool dismiss = false}) { if (dismiss) { _updateHeight(0, duration: dur ?? widget.duration); - _toggleWakelockOff(); + WakelockController.inst.updateMiniplayerStatus(false); return; } _updateHeight(toExpanded ? widget.maxHeight : widget.minHeight, duration: dur ?? widget.duration); _wasExpanded = toExpanded; - if (toExpanded) { - _toggleWakelockOn(); - } else { - _toggleWakelockOff(); - } - } - - void _toggleWakelockOn() { - settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized); - } - - void _toggleWakelockOff() { - settings.wakelockMode.value.toggleOff(); + WakelockController.inst.updateMiniplayerStatus(toExpanded); } @override