Skip to content

Commit

Permalink
core: wakelock logic rewrite
Browse files Browse the repository at this point in the history
  • Loading branch information
MSOB7YY committed Feb 9, 2024
1 parent 19bbf11 commit d7bb2bf
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 55 deletions.
3 changes: 2 additions & 1 deletion lib/base/audio_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -730,7 +731,6 @@ class NamidaAudioVideoHandler<Q extends Playable> extends BasicAudioHandler<Q> {
if (startPlaying) {
setVolume(_userPlayerVolume);
await onPlayRaw();
settings.wakelockMode.value.toggleOn(currentVideoStream.value != null || currentCachedVideo.value != null);
}
if (sourceChanged) {
await seek(currentPositionMS.milliseconds);
Expand Down Expand Up @@ -1086,6 +1086,7 @@ class NamidaAudioVideoHandler<Q extends Playable> extends BasicAudioHandler<Q> {
@override
FutureOr<void> onPlayingStateChange(bool isPlaying) {
CurrentColor.inst.switchColorPalettes(isPlaying);
WakelockController.inst.updatePlayPauseStatus(isPlaying);
if (isPlaying) {
_resourcesDisposeTimer?.cancel();
_resourcesDisposeTimer = null;
Expand Down
2 changes: 2 additions & 0 deletions lib/controller/lyrics_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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);
}
Expand Down
16 changes: 4 additions & 12 deletions lib/controller/miniplayer_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -275,7 +275,6 @@ class MiniPlayerController {
if (_defaultShouldDismissMiniplayer) {
snapToMini();
_onMiniplayerDismiss();
_toggleWakelockOff();
return;
}
}
Expand Down Expand Up @@ -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;
Expand All @@ -337,6 +327,7 @@ class MiniPlayerController {
}

void snapToMini({bool haptic = true}) {
WakelockController.inst.updateMiniplayerStatus(false);
_offset = 0;
bounceDown = false;
_snap(haptic: haptic);
Expand Down Expand Up @@ -364,6 +355,7 @@ class MiniPlayerController {
}

Future<void> snapToQueue({bool animateScrollController = true, bool haptic = true}) async {
WakelockController.inst.updateMiniplayerStatus(false);
_offset = maxOffset * 2;
bounceUp = false;

Expand Down
3 changes: 3 additions & 0 deletions lib/controller/navigator_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -168,6 +169,7 @@ class NamidaNavigator {
if (_isInFullScreen) return;

_isInFullScreen = true;
WakelockController.inst.updateFullscreenStatus(true);

Get.to(
() => WillPopScope(
Expand Down Expand Up @@ -205,6 +207,7 @@ class NamidaNavigator {
]);

_isInFullScreen = false;
WakelockController.inst.updateFullscreenStatus(false);
}

Future<void> navigateTo(
Expand Down
12 changes: 7 additions & 5 deletions lib/controller/player_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -375,7 +379,6 @@ class Player {

Future<void> play() async {
await _audioHandler.play();
settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized);
}

Future<void> playRaw() async {
Expand All @@ -384,7 +387,6 @@ class Player {

Future<void> pause() async {
await _audioHandler.pause();
settings.wakelockMode.value.toggleOff();
}

Future<void> dispose() async {
Expand Down
2 changes: 0 additions & 2 deletions lib/controller/video_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -300,7 +299,6 @@ class VideoController {
loopingAnimation: canLoopVideo(v, track.duration),
isFile: true,
);
settings.wakelockMode.value.toggleOn(Player.inst.videoInitialized);
}
});
}
Expand Down
74 changes: 74 additions & 0 deletions lib/controller/wakelock_controller.dart
Original file line number Diff line number Diff line change
@@ -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();
}
}
13 changes: 0 additions & 13 deletions lib/core/namida_converter_ext.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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 {
Expand Down
26 changes: 4 additions & 22 deletions lib/packages/mp.dart
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -73,11 +71,7 @@ class NamidaYTMiniplayerState extends State<NamidaYTMiniplayer> with SingleTicke

_dragheight = _wasExpanded ? _maxHeight : widget.minHeight;

if (_wasExpanded) {
_toggleWakelockOn();
} else {
_toggleWakelockOff();
}
WakelockController.inst.updateMiniplayerStatus(_wasExpanded);
}

void _listenerHeightChange() {
Expand Down Expand Up @@ -120,25 +114,13 @@ class NamidaYTMiniplayerState extends State<NamidaYTMiniplayer> 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
Expand Down

0 comments on commit d7bb2bf

Please sign in to comment.