[Android] TV: Integrate Picture-In-Picture mode

Geoffrey Métais git at videolan.org
Wed Feb 8 17:26:22 CET 2017


vlc-android | branch: master | Geoffrey Métais <geoffrey.metais at gmail.com> | Tue Dec  6 16:00:35 2016 +0100| [326474f62ded587469a6884043333fa2e56cf799] | committer: Geoffrey Métais

TV: Integrate Picture-In-Picture mode

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

 vlc-android/AndroidManifest.xml                       |  4 +++-
 .../videolan/vlc/gui/dialogs/AdvOptionsDialog.java    | 19 ++++++++++++++-----
 .../videolan/vlc/gui/video/VideoPlayerActivity.java   | 16 ++++++++++++++--
 3 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/vlc-android/AndroidManifest.xml b/vlc-android/AndroidManifest.xml
index ce1c8a0..addefbe 100644
--- a/vlc-android/AndroidManifest.xml
+++ b/vlc-android/AndroidManifest.xml
@@ -470,7 +470,9 @@
                  android:process=":logger" />
         <activity
             android:name=".gui.video.VideoPlayerActivity"
-            android:configChanges="orientation|screenSize"
+            android:resizeableActivity="true"
+            android:supportsPictureInPicture="true"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
             android:exported="true"
             android:launchMode="singleTop"
             android:theme="@style/Theme.VLC.Player" />
diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/AdvOptionsDialog.java b/vlc-android/src/org/videolan/vlc/gui/dialogs/AdvOptionsDialog.java
index f6159b6..ed0a251 100644
--- a/vlc-android/src/org/videolan/vlc/gui/dialogs/AdvOptionsDialog.java
+++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/AdvOptionsDialog.java
@@ -22,6 +22,7 @@
  */
 package org.videolan.vlc.gui.dialogs;
 
+import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.AlarmManager;
 import android.app.PendingIntent;
@@ -31,7 +32,9 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.res.TypedArray;
 import android.graphics.Color;
+import android.os.Build;
 import android.os.Bundle;
+import android.support.annotation.RequiresApi;
 import android.support.v4.app.DialogFragment;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.preference.PreferenceManager;
@@ -47,6 +50,7 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import org.videolan.libvlc.MediaPlayer;
+import org.videolan.libvlc.util.AndroidUtil;
 import org.videolan.vlc.PlaybackService;
 import org.videolan.vlc.R;
 import org.videolan.vlc.VLCApplication;
@@ -443,6 +447,7 @@ public class AdvOptionsDialog extends DialogFragment implements View.OnClickList
 
 
 
+    @TargetApi(Build.VERSION_CODES.N)
     @Override
     public void onClick(View v) {
         switch (v.getId()){
@@ -473,10 +478,14 @@ public class AdvOptionsDialog extends DialogFragment implements View.OnClickList
                 ((VideoPlayerActivity)getActivity()).switchToAudioMode(true);
                 break;
             case ID_POPUP_VIDEO:
-                if (Permissions.canDrawOverlays(mActivity))
-                    ((VideoPlayerActivity)getActivity()).switchToPopupMode();
-                else
-                    Permissions.checkDrawOverlaysPermission(mActivity);
+                if (VLCApplication.showTvUi()) {
+                    getActivity().enterPictureInPictureMode();
+                } else {
+                    if (Permissions.canDrawOverlays(mActivity))
+                        ((VideoPlayerActivity)getActivity()).switchToPopupMode();
+                    else
+                        Permissions.checkDrawOverlaysPermission(mActivity);
+                }
                 break;
             case ID_EQUALIZER:
                 Intent i = new Intent(getActivity(), SecondaryActivity.class);
@@ -549,7 +558,7 @@ public class AdvOptionsDialog extends DialogFragment implements View.OnClickList
                 mAdapter.addOption(new Option(ID_PLAY_AS_AUDIO, R.attr.ic_playasaudio_on, getString(R.string.play_as_audio)));
             mAdapter.addOption(new Option(ID_SPU_DELAY, R.attr.ic_subtitledelay, getString(R.string.spu_delay)));
             mAdapter.addOption(new Option(ID_AUDIO_DELAY, R.attr.ic_audiodelay, getString(R.string.audio_delay)));
-            if (!tvUi)
+            if (!tvUi || AndroidUtil.isNougatOrLater())
                 mAdapter.addOption(new Option(ID_POPUP_VIDEO, R.attr.ic_popup_dim, getString(R.string.popup_playback_title)));
             mAdapter.addOption(new Option(ID_REPEAT, R.attr.ic_repeat, getString(R.string.repeat_title)));
             if (mService.canShuffle())
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
index d3b8233..62a1c12 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
@@ -585,7 +585,8 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVLCVout.C
             mSize.setOnClickListener(null);
 
         /* Stop the earliest possible to avoid vout error */
-        if (isFinishing() || (AndroidDevices.isAndroidTv() && !requestVisibleBehind(true)))
+        if ((!AndroidUtil.isNougatOrLater() || !isInPictureInPictureMode()) &&
+                (isFinishing() || (AndroidDevices.isAndroidTv() && !requestVisibleBehind(true))))
             stopPlayback();
     }
 
@@ -1840,6 +1841,17 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVLCVout.C
         }
     }
 
+    @Override
+    public boolean isInPictureInPictureMode() {
+        return AndroidUtil.isNougatOrLater() && super.isInPictureInPictureMode();
+    }
+
+    @Override
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        changeMediaPlayerLayout(mVideoWidth, mVideoHeight);
+        super.onPictureInPictureModeChanged(isInPictureInPictureMode);
+    }
+
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
     private void changeSurfaceLayout() {
         int sw;
@@ -1879,7 +1891,7 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVLCVout.C
         }
         LayoutParams lp = surface.getLayoutParams();
 
-        if (mVideoWidth * mVideoHeight == 0) {
+        if (mVideoWidth * mVideoHeight == 0 || isInPictureInPictureMode()) {
             /* Case of OpenGL vouts: handles the placement of the video using MediaPlayer API */
             lp.width  = LayoutParams.MATCH_PARENT;
             lp.height = LayoutParams.MATCH_PARENT;



More information about the Android mailing list