[Android] Support Picture-in-Picture on Chrome OS

Kazuki Takise git at videolan.org
Fri Dec 27 12:08:02 CET 2019


vlc-android | branch: master | Kazuki Takise <takise at google.com> | Thu Dec 26 16:10:03 2019 +0900| [f466ecb066841924e1291cfcb11b83d3afa47b65] | committer: Geoffrey Métais

Support Picture-in-Picture on Chrome OS

enterPictureInPictureMode() must be called in onUserLeaveHint() to
support Picture-in-Picture in a multi-window environment such as
Chrome OS.

The current implemententation (calling the API in onPause()) causes
the following issues on Chrome OS:

- VLC enters PiP without being occluded, but just with another
  window activated. In a multi-window environment, we can't assume
  onPause() means the window gets hidden. As only one window can
  be resumed at the same time, it's possible that a window is
  fully visible, but paused.
- When some ChromeOS-specific system UI gets shown (e.g. Alt-Tab
  window cycler, Overview Mode), VLC enters PiP unexpectedly.

This patch moves switchToPopup() from onPause() to onUserLeaveHint()
to prevent those issues.

> https://code.videolan.org/videolan/vlc-android/commit/f466ecb066841924e1291cfcb11b83d3afa47b65
---

 .../org/videolan/vlc/gui/video/VideoPlayerActivity.kt | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
index 5a039c801..38e9f77e6 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
@@ -601,16 +601,17 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
 
         /* Stop the earliest possible to avoid vout error */
 
-        if (!isInPictureInPictureMode) {
-            if (finishing || (AndroidUtil.isNougatOrLater && !AndroidUtil.isOOrLater //Video on background on Nougat Android TVs
+        if (!isInPictureInPictureMode
+                && (finishing || (AndroidUtil.isNougatOrLater && !AndroidUtil.isOOrLater //Video on background on Nougat Android TVs
+                                  && AndroidDevices.isAndroidTv && !requestVisibleBehind(true))))
+            stopPlayback()
+    }
 
-                            && AndroidDevices.isAndroidTv && !requestVisibleBehind(true)))
-                stopPlayback()
-            else if (displayManager.isPrimary && !isShowingDialog && "2" == settings.getString(KEY_VIDEO_APP_SWITCH, "0")
-                    && isInteractive && service?.hasRenderer() == false) {
-                switchToPopup()
-            }
-        }
+    @TargetApi(Build.VERSION_CODES.O)
+    override fun onUserLeaveHint() {
+        if (!isInPictureInPictureMode && displayManager.isPrimary && !isShowingDialog &&
+                "2" == settings.getString(KEY_VIDEO_APP_SWITCH, "0") && isInteractive && service?.hasRenderer() == false)
+            switchToPopup()
     }
 
     override fun onSaveInstanceState(outState: Bundle) {



More information about the Android mailing list