From 76d2b200ae4bb21dac04a0e874ee9831ae4a8ac9 Mon Sep 17 00:00:00 2001 From: Mateusz Cicheński Date: Wed, 30 Nov 2022 01:16:34 +0000 Subject: Don't move PiP towards a corner after user manually moved it. With keep clear areas flag on, PiP will gravitate towards one of the bottom corners of the screen if possible. However, once a user moves PiP manually, it will only continue to avoid occluding keep clear areas, but no longer move downwards. This also happens if user resized the window. This can be disabled by turning the newly introduced sysprop flag. Bug: 258529269 Test: manually Change-Id: Ieaa292c54762d5cd005bcdf7eab48d6082e5c3a9 --- .../com/android/wm/shell/pip/PipBoundsState.java | 15 +++++++ .../pip/phone/PhonePipKeepClearAlgorithm.java | 48 +++++++++++++--------- .../wm/shell/pip/phone/PipTouchHandler.java | 2 + 3 files changed, 46 insertions(+), 19 deletions(-) (limited to 'libs') diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java index 17d7f5d0d567..5376ae372de2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java @@ -97,6 +97,8 @@ public class PipBoundsState { private int mShelfHeight; /** Whether the user has resized the PIP manually. */ private boolean mHasUserResizedPip; + /** Whether the user has moved the PIP manually. */ + private boolean mHasUserMovedPip; /** * Areas defined by currently visible apps that they prefer to keep clear from overlays such as * the PiP. Restricted areas may only move the PiP a limited amount from its anchor position. @@ -279,6 +281,7 @@ public class PipBoundsState { if (changed) { clearReentryState(); setHasUserResizedPip(false); + setHasUserMovedPip(false); } } @@ -442,6 +445,16 @@ public class PipBoundsState { mHasUserResizedPip = hasUserResizedPip; } + /** Returns whether the user has moved the PIP. */ + public boolean hasUserMovedPip() { + return mHasUserMovedPip; + } + + /** Set whether the user has moved the PIP. */ + public void setHasUserMovedPip(boolean hasUserMovedPip) { + mHasUserMovedPip = hasUserMovedPip; + } + /** * Registers a callback when the minimal size of PIP that is set by the app changes. */ @@ -577,6 +590,8 @@ public class PipBoundsState { pw.println(innerPrefix + "mImeHeight=" + mImeHeight); pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing); pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight); + pw.println(innerPrefix + "mHasUserMovedPip=" + mHasUserMovedPip); + pw.println(innerPrefix + "mHasUserResizedPip=" + mHasUserResizedPip); if (mPipReentryState == null) { pw.println(innerPrefix + "mPipReentryState=null"); } else { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java index 84071e08d472..690505e03fce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithm.java @@ -19,6 +19,7 @@ package com.android.wm.shell.pip.phone; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.os.SystemProperties; import android.util.ArraySet; import android.view.Gravity; @@ -34,6 +35,10 @@ import java.util.Set; */ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm { + private boolean mKeepClearAreaGravityEnabled = + SystemProperties.getBoolean( + "persist.wm.debug.enable_pip_keep_clear_algorithm_gravity", false); + protected int mKeepClearAreasPadding; public PhonePipKeepClearAlgorithm(Context context) { @@ -53,31 +58,36 @@ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithm { Rect startingBounds = pipBoundsState.getBounds().isEmpty() ? pipBoundsAlgorithm.getEntryDestinationBoundsIgnoringKeepClearAreas() : pipBoundsState.getBounds(); - float snapFraction = pipBoundsAlgorithm.getSnapFraction(startingBounds); - int verticalGravity = Gravity.BOTTOM; - int horizontalGravity; - if (snapFraction >= 0.5f && snapFraction < 2.5f) { - horizontalGravity = Gravity.RIGHT; - } else { - horizontalGravity = Gravity.LEFT; - } - // push the bounds based on the gravity Rect insets = new Rect(); pipBoundsAlgorithm.getInsetBounds(insets); if (pipBoundsState.isImeShowing()) { insets.bottom -= pipBoundsState.getImeHeight(); } - Rect pushedBounds = new Rect(startingBounds); - if (verticalGravity == Gravity.BOTTOM) { - pushedBounds.offsetTo(pushedBounds.left, - insets.bottom - pushedBounds.height()); - } - if (horizontalGravity == Gravity.RIGHT) { - pushedBounds.offsetTo(insets.right - pushedBounds.width(), pushedBounds.top); - } else { - pushedBounds.offsetTo(insets.left, pushedBounds.top); + Rect pipBounds = new Rect(startingBounds); + + // move PiP towards corner if user hasn't moved it manually or the flag is on + if (mKeepClearAreaGravityEnabled + || (!pipBoundsState.hasUserMovedPip() && !pipBoundsState.hasUserResizedPip())) { + float snapFraction = pipBoundsAlgorithm.getSnapFraction(startingBounds); + int verticalGravity = Gravity.BOTTOM; + int horizontalGravity; + if (snapFraction >= 0.5f && snapFraction < 2.5f) { + horizontalGravity = Gravity.RIGHT; + } else { + horizontalGravity = Gravity.LEFT; + } + if (verticalGravity == Gravity.BOTTOM) { + pipBounds.offsetTo(pipBounds.left, + insets.bottom - pipBounds.height()); + } + if (horizontalGravity == Gravity.RIGHT) { + pipBounds.offsetTo(insets.right - pipBounds.width(), pipBounds.top); + } else { + pipBounds.offsetTo(insets.left, pipBounds.top); + } } - return findUnoccludedPosition(pushedBounds, pipBoundsState.getRestrictedKeepClearAreas(), + + return findUnoccludedPosition(pipBounds, pipBoundsState.getRestrictedKeepClearAreas(), pipBoundsState.getUnrestrictedKeepClearAreas(), insets); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index a9a97beb9180..83bc7c0e6e7d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -875,6 +875,8 @@ public class PipTouchHandler { } if (touchState.isDragging()) { + mPipBoundsState.setHasUserMovedPip(true); + // Move the pinned stack freely final PointF lastDelta = touchState.getLastTouchDelta(); float lastX = mStartPosition.x + mDelta.x; -- cgit v1.2.3-59-g8ed1b