Browse Source

Merge pull request #633 from ente-io/wake_lock

Fix device sleep issue for videos played inside memories widget
Neeraj Gupta 2 years ago
parent
commit
2ddae3b7a6
2 changed files with 27 additions and 26 deletions
  1. 0 26
      lib/ui/viewer/file/detail_page.dart
  2. 27 0
      lib/ui/viewer/file/video_widget.dart

+ 0 - 26
lib/ui/viewer/file/detail_page.dart

@@ -16,7 +16,6 @@ import 'package:photos/ui/viewer/gallery/gallery.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/file_util.dart';
 import 'package:photos/utils/navigation_util.dart';
-import 'package:wakelock/wakelock.dart';
 
 enum DetailPageMode {
   minimalistic,
@@ -75,12 +74,9 @@ class _DetailPageState extends State<DetailPage> {
   bool _shouldHideAppBar = false;
   GlobalKey<FadingAppBarState> _appBarKey;
   GlobalKey<FadingBottomBarState> _bottomBarKey;
-  bool wakeLockEnabledHere;
 
   @override
   void initState() {
-    wakeLockEnabledHere = false;
-
     _files = [
       ...widget.config.files
     ]; // Make a copy since we append preceding and succeeding entries to this
@@ -95,11 +91,6 @@ class _DetailPageState extends State<DetailPage> {
       SystemUiMode.manual,
       overlays: SystemUiOverlay.values,
     );
-    if (wakeLockEnabledHere) {
-      Wakelock.enabled.then((isEnabled) {
-        isEnabled ? Wakelock.disable() : null;
-      });
-    }
     super.dispose();
   }
 
@@ -163,7 +154,6 @@ class _DetailPageState extends State<DetailPage> {
           },
           playbackCallback: (isPlaying) {
             _shouldHideAppBar = isPlaying;
-            _keepScreenAliveOnPlaying(isPlaying);
             Future.delayed(Duration.zero, () {
               _toggleFullScreen();
             });
@@ -261,22 +251,6 @@ class _DetailPageState extends State<DetailPage> {
     }
   }
 
-  void _keepScreenAliveOnPlaying(bool isPlaying) {
-    if (isPlaying) {
-      Wakelock.enabled.then((value) {
-        if (value == false) {
-          Wakelock.enable();
-          wakeLockEnabledHere = true;
-          //wakeLockEnabledHere will not be set to true if wakeLock is already enabled from settings on iOS.
-          //We shouldn't disable when video is not playing if it was enabled manually by the user from ente settings by user.
-        }
-      });
-    }
-    if (wakeLockEnabledHere && !isPlaying) {
-      Wakelock.disable();
-    }
-  }
-
   Future<void> _onFileDeleted(File file) async {
     final totalFiles = _files.length;
     if (totalFiles == 1) {

+ 27 - 0
lib/ui/viewer/file/video_widget.dart

@@ -1,5 +1,6 @@
 // @dart=2.9
 
+import 'dart:async';
 import 'dart:io' as io;
 
 import 'package:chewie/chewie.dart';
@@ -16,6 +17,7 @@ import 'package:photos/utils/file_util.dart';
 import 'package:photos/utils/toast_util.dart';
 import 'package:video_player/video_player.dart';
 import 'package:visibility_detector/visibility_detector.dart';
+import 'package:wakelock/wakelock.dart';
 
 class VideoWidget extends StatefulWidget {
   final File file;
@@ -41,6 +43,7 @@ class _VideoWidgetState extends State<VideoWidget> {
   ChewieController _chewieController;
   double _progress;
   bool _isPlaying;
+  bool _wakeLockEnabledHere = false;
 
   @override
   void initState() {
@@ -113,6 +116,13 @@ class _VideoWidgetState extends State<VideoWidget> {
     if (_chewieController != null) {
       _chewieController.dispose();
     }
+    if (_wakeLockEnabledHere) {
+      unawaited(
+        Wakelock.enabled.then((isEnabled) {
+          isEnabled ? Wakelock.disable() : null;
+        }),
+      );
+    }
     super.dispose();
   }
 
@@ -198,6 +208,22 @@ class _VideoWidgetState extends State<VideoWidget> {
     );
   }
 
+  Future<void> _keepScreenAliveOnPlaying(bool isPlaying) async {
+    if (isPlaying) {
+      return Wakelock.enabled.then((value) {
+        if (value == false) {
+          Wakelock.enable();
+          //wakeLockEnabledHere will not be set to true if wakeLock is already enabled from settings on iOS.
+          //We shouldn't disable when video is not playing if it was enabled manually by the user from ente settings by user.
+          _wakeLockEnabledHere = true;
+        }
+      });
+    }
+    if (_wakeLockEnabledHere && !isPlaying) {
+      return Wakelock.disable();
+    }
+  }
+
   Widget _getVideoPlayer() {
     _videoPlayerController.addListener(() {
       if (_isPlaying != _videoPlayerController.value.isPlaying) {
@@ -205,6 +231,7 @@ class _VideoWidgetState extends State<VideoWidget> {
         if (widget.playbackCallback != null) {
           widget.playbackCallback(_isPlaying);
         }
+        unawaited(_keepScreenAliveOnPlaying(_isPlaying));
       }
     });
     _chewieController = ChewieController(