diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index 3512a6d5e217..0e3466551c99 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; + _controller.pause(); + break; + case AppLifecycleState.resumed: + if (_wasPlayingBeforePause) { + _controller.play(); + } + break; + default: + } + } + + void dispose() { + WidgetsBinding.instance.removeObserver(this); + } +} + /// Displays the video controlled by [controller]. class VideoPlayer extends StatelessWidget { final VideoPlayerController controller;