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.

(cherry picked from commit f466ecb066)
This commit is contained in:
Kazuki Takise
2019-12-26 16:10:03 +09:00
committed by Geoffrey Métais
parent 4598db40d7
commit a5b8465ea8

View File

@@ -595,16 +595,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) {