Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d89a6944 authored by Jaewan Kim's avatar Jaewan Kim
Browse files

PIP: Move PIP to left when Settings is visible

Default PIP location hides the upper part of the Settings,
so it should be moved a bit not to cover it.

Bug: 27891236
Change-Id: I6f13419cc9dc91522696c14a202e25652bd2232a
parent 48143f7e
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -15,6 +15,10 @@
-->
-->


<resources>
<resources>
    <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows,
         when the PIP menu is shown with settings. -->
    <string translatable="false" name="pip_settings_bounds">"662 54 1142 324"</string>

    <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows,
    <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows,
         when the PIP menu is shown in center. -->
         when the PIP menu is shown in center. -->
    <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string>
    <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string>
+62 −4
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import android.os.Handler;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.util.Log;
import android.util.Log;
import android.util.Pair;


import com.android.systemui.Prefs;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.R;
@@ -62,6 +63,20 @@ public class PipManager {


    private static final int MAX_RUNNING_TASKS_COUNT = 10;
    private static final int MAX_RUNNING_TASKS_COUNT = 10;


    /**
     * List of package and class name which are considered as Settings,
     * so PIP location should be adjusted to the left of the side panel.
     */
    private static final List<Pair<String, String>> sSettingsPackageAndClassNamePairList;
    static {
        sSettingsPackageAndClassNamePairList = new ArrayList<>();
        sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
                "com.android.tv.settings", null));
        sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
                "com.google.android.leanbacklauncher",
                "com.google.android.leanbacklauncher.settings.HomeScreenSettingsActivity"));
    }

    /**
    /**
     * State when there's no PIP.
     * State when there's no PIP.
     */
     */
@@ -108,6 +123,7 @@ public class PipManager {
    private int mSuspendPipResizingReason;
    private int mSuspendPipResizingReason;


    private Context mContext;
    private Context mContext;
    private SystemServicesProxy mSystemServiceProxy;
    private PipRecentsOverlayManager mPipRecentsOverlayManager;
    private PipRecentsOverlayManager mPipRecentsOverlayManager;
    private IActivityManager mActivityManager;
    private IActivityManager mActivityManager;
    private MediaSessionManager mMediaSessionManager;
    private MediaSessionManager mMediaSessionManager;
@@ -117,6 +133,8 @@ public class PipManager {
    private List<MediaListener> mMediaListeners = new ArrayList<>();
    private List<MediaListener> mMediaListeners = new ArrayList<>();
    private Rect mCurrentPipBounds;
    private Rect mCurrentPipBounds;
    private Rect mPipBounds;
    private Rect mPipBounds;
    private Rect mDefaultPipBounds;
    private Rect mSettingsPipBounds;
    private Rect mMenuModePipBounds;
    private Rect mMenuModePipBounds;
    private Rect mRecentsPipBounds;
    private Rect mRecentsPipBounds;
    private Rect mRecentsFocusedPipBounds;
    private Rect mRecentsFocusedPipBounds;
@@ -176,8 +194,10 @@ public class PipManager {
        mInitialized = true;
        mInitialized = true;
        mContext = context;
        mContext = context;
        Resources res = context.getResources();
        Resources res = context.getResources();
        mPipBounds = Rect.unflattenFromString(res.getString(
        mDefaultPipBounds = Rect.unflattenFromString(res.getString(
                com.android.internal.R.string.config_defaultPictureInPictureBounds));
                com.android.internal.R.string.config_defaultPictureInPictureBounds));
        mSettingsPipBounds = Rect.unflattenFromString(res.getString(
                R.string.pip_settings_bounds));
        mMenuModePipBounds = Rect.unflattenFromString(res.getString(
        mMenuModePipBounds = Rect.unflattenFromString(res.getString(
                R.string.pip_menu_bounds));
                R.string.pip_menu_bounds));
        mRecentsPipBounds = Rect.unflattenFromString(res.getString(
        mRecentsPipBounds = Rect.unflattenFromString(res.getString(
@@ -186,9 +206,11 @@ public class PipManager {
                R.string.pip_recents_focused_bounds));
                R.string.pip_recents_focused_bounds));
        mRecentsFocusChangedAnimationDurationMs = res.getInteger(
        mRecentsFocusChangedAnimationDurationMs = res.getInteger(
                R.integer.recents_tv_pip_focus_anim_duration);
                R.integer.recents_tv_pip_focus_anim_duration);
        mPipBounds = mDefaultPipBounds;


        mActivityManager = ActivityManagerNative.getDefault();
        mActivityManager = ActivityManagerNative.getDefault();
        SystemServicesProxy.getInstance(context).registerTaskStackListener(mTaskStackListener);
        mSystemServiceProxy = SystemServicesProxy.getInstance(context);
        mSystemServiceProxy.registerTaskStackListener(mTaskStackListener);
        IntentFilter intentFilter = new IntentFilter();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED);
        intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED);
        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
@@ -522,10 +544,25 @@ public class PipManager {
        return PLAYBACK_STATE_UNAVAILABLE;
        return PLAYBACK_STATE_UNAVAILABLE;
    }
    }


    private static boolean isSettingsShown(ComponentName topActivity) {
        for (Pair<String, String> componentName : sSettingsPackageAndClassNamePairList) {
            String packageName = componentName.first;
            if (topActivity.getPackageName().equals(componentName.first)) {
                String className = componentName.second;
                if (className == null || topActivity.getClassName().equals(className)) {
                    return true;
                }
            }
        }
        return false;
    }

    private TaskStackListener mTaskStackListener = new TaskStackListener() {
    private TaskStackListener mTaskStackListener = new TaskStackListener() {
        @Override
        @Override
        public void onTaskStackChanged() {
        public void onTaskStackChanged() {
            if (mState != STATE_NO_PIP) {
            if (mState != STATE_NO_PIP) {
                boolean hasPip = false;

                StackInfo stackInfo = null;
                StackInfo stackInfo = null;
                try {
                try {
                    stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
                    stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
@@ -541,11 +578,32 @@ public class PipManager {
                for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) {
                for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) {
                    if (stackInfo.taskIds[i] == mPipTaskId) {
                    if (stackInfo.taskIds[i] == mPipTaskId) {
                        // PIP task is still alive.
                        // PIP task is still alive.
                        return;
                        hasPip = true;
                        break;
                    }
                    }
                }
                }
                if (!hasPip) {
                    // PIP task doesn't exist anymore in PINNED_STACK.
                    // PIP task doesn't exist anymore in PINNED_STACK.
                    closePipInternal(true);
                    closePipInternal(true);
                    return;
                }
            }
            if (mState == STATE_PIP_OVERLAY) {
                try {
                    List<RunningTaskInfo> runningTasks = mActivityManager.getTasks(1, 0);
                    if (runningTasks == null || runningTasks.size() == 0) {
                        return;
                    }
                    RunningTaskInfo topTask = runningTasks.get(0);
                    Rect bounds = isSettingsShown(topTask.topActivity)
                          ? mSettingsPipBounds : mDefaultPipBounds;
                    if (mPipBounds != bounds) {
                        mPipBounds = bounds;
                        resizePinnedStack(STATE_PIP_OVERLAY);
                    }
                } catch (RemoteException e) {
                    Log.d(TAG, "Failed to detect top activity", e);
                }
            }
            }
        }
        }