From a7ccb8f16517d832e65e499bfe814641ee89e2cd Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 30 Nov 2017 13:22:08 +0100 Subject: [PATCH 1/2] Pause video when app goes in background --- packages/video_player/lib/video_player.dart | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index 3512a6d5e217..fadd9c658ab7 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -93,10 +93,13 @@ class VideoPlayerController extends ValueNotifier { bool isDisposed = false; Completer _creatingCompleter; StreamSubscription> _eventSubscription; + _VideoAppLifeCycleObserver _lifeCycleObserver; VideoPlayerController(this.uri) : super(new VideoPlayerValue(duration: null)); Future initialize() async { + _lifeCycleObserver = new _VideoAppLifeCycleObserver(this); + _lifeCycleObserver.initialize(); _creatingCompleter = new Completer(); final Map response = await _channel.invokeMethod( 'create', @@ -159,6 +162,7 @@ class VideoPlayerController extends ValueNotifier { } } isDisposed = true; + _lifeCycleObserver.dispose(); super.dispose(); } @@ -261,6 +265,37 @@ class VideoPlayerController extends ValueNotifier { } } +class _VideoAppLifeCycleObserver extends WidgetsBindingObserver { + bool wasPlayingBeforePause = false; + final VideoPlayerController controller; + + _VideoAppLifeCycleObserver(this.controller); + + void initialize() { + WidgetsBinding.instance.addObserver(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.paused: + wasPlayingBeforePause = controller.value.isPlaying; + if (controller.value.initialized) controller.pause(); + break; + case AppLifecycleState.resumed: + if (wasPlayingBeforePause) { + if (controller.value.initialized) controller.play(); + } + break; + default: + } + } + + void dispose() { + WidgetsBinding.instance.removeObserver(this); + } +} + /// Displays the video controlled by [controller]. class VideoPlayer extends StatelessWidget { final VideoPlayerController controller; From ce3c42d9bb8ce9a5607d38f983a059f98aef87f4 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 30 Nov 2017 14:13:00 +0100 Subject: [PATCH 2/2] Address review --- packages/video_player/lib/video_player.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index fadd9c658ab7..0e3466551c99 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -266,10 +266,10 @@ class VideoPlayerController extends ValueNotifier { } class _VideoAppLifeCycleObserver extends WidgetsBindingObserver { - bool wasPlayingBeforePause = false; - final VideoPlayerController controller; + bool _wasPlayingBeforePause = false; + final VideoPlayerController _controller; - _VideoAppLifeCycleObserver(this.controller); + _VideoAppLifeCycleObserver(this._controller); void initialize() { WidgetsBinding.instance.addObserver(this); @@ -279,12 +279,12 @@ class _VideoAppLifeCycleObserver extends WidgetsBindingObserver { void didChangeAppLifecycleState(AppLifecycleState state) { switch (state) { case AppLifecycleState.paused: - wasPlayingBeforePause = controller.value.isPlaying; - if (controller.value.initialized) controller.pause(); + _wasPlayingBeforePause = _controller.value.isPlaying; + _controller.pause(); break; case AppLifecycleState.resumed: - if (wasPlayingBeforePause) { - if (controller.value.initialized) controller.play(); + if (_wasPlayingBeforePause) { + _controller.play(); } break; default: