From 081ecb3340497b337153930b90b9b3f4bc15b754 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Mon, 13 Apr 2020 16:49:03 -0700 Subject: [PATCH] Differentiate user resize and system expand When a resize is caused by expand/collapse on a PiP window without user interaction, we should not try to restore to that bounds. Also in this change: - Explicitly set the Looper for Handler in both PipMenuActivity and PipMenuActivityController Bug: 151969002 Bug: 152416170 Test: manually expand/collapse Google Maps PiP window Test: manually drag to resize the PiP Change-Id: I948b3f0f8eefe55e6545cb254c5bcf9f7bd884c6 --- .../android/systemui/pip/phone/PipManager.java | 8 ++++---- .../systemui/pip/phone/PipMenuActivity.java | 9 +++++---- .../pip/phone/PipMenuActivityController.java | 11 +++++++---- .../pip/phone/PipResizeGestureHandler.java | 16 +++++++--------- .../systemui/pip/phone/PipTouchHandler.java | 13 ++++++++++--- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index c3779efcf4b29..ba9a30fb554f2 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -339,18 +339,18 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio @Override public void onPipTransitionFinished(ComponentName activity, int direction) { - onPipTransitionFinishedOrCanceled(); + onPipTransitionFinishedOrCanceled(direction); } @Override public void onPipTransitionCanceled(ComponentName activity, int direction) { - onPipTransitionFinishedOrCanceled(); + onPipTransitionFinishedOrCanceled(direction); } - private void onPipTransitionFinishedOrCanceled() { + private void onPipTransitionFinishedOrCanceled(int direction) { // Re-enable touches after the animation completes mTouchHandler.setTouchEnabled(true); - mTouchHandler.onPinnedStackAnimationEnded(); + mTouchHandler.onPinnedStackAnimationEnded(direction); mMenuController.onPinnedStackAnimationEnded(); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java index 2b9b1716cb186..ec15dd16f46e9 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java @@ -54,6 +54,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; @@ -129,9 +130,7 @@ public class PipMenuActivity extends Activity { } }; - private Handler mHandler = new Handler(); - private Messenger mToControllerMessenger; - private Messenger mMessenger = new Messenger(new Handler() { + private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { @@ -174,7 +173,9 @@ public class PipMenuActivity extends Activity { } } } - }); + }; + private Messenger mToControllerMessenger; + private Messenger mMessenger = new Messenger(mHandler); private final Runnable mFinishRunnable = new Runnable() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java index d660b670446bb..61ed40d5d7828 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java @@ -30,6 +30,7 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.Debug; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; @@ -122,7 +123,7 @@ public class PipMenuActivityController { private boolean mStartActivityRequested; private long mStartActivityRequestedTime; private Messenger mToActivityMessenger; - private Handler mHandler = new Handler() { + private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { @@ -133,15 +134,15 @@ public class PipMenuActivityController { break; } case MESSAGE_EXPAND_PIP: { - mListeners.forEach(l -> l.onPipExpand()); + mListeners.forEach(Listener::onPipExpand); break; } case MESSAGE_DISMISS_PIP: { - mListeners.forEach(l -> l.onPipDismiss()); + mListeners.forEach(Listener::onPipDismiss); break; } case MESSAGE_SHOW_MENU: { - mListeners.forEach(l -> l.onPipShowMenu()); + mListeners.forEach(Listener::onPipShowMenu); break; } case MESSAGE_UPDATE_ACTIVITY_CALLBACK: { @@ -259,6 +260,8 @@ public class PipMenuActivityController { if (DEBUG) { Log.d(TAG, "showMenu() state=" + menuState + " hasActivity=" + (mToActivityMessenger != null) + + " allowMenuTimeout=" + allowMenuTimeout + + " willResizeMenu=" + willResizeMenu + " callers=\n" + Debug.getCallers(5, " ")); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java index 0b076559ae367..d80f18a983ee8 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java @@ -56,7 +56,6 @@ public class PipResizeGestureHandler { private final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); private final PipBoundsHandler mPipBoundsHandler; - private final PipTouchHandler mPipTouchHandler; private final PipMotionHelper mMotionHelper; private final int mDisplayId; private final Executor mMainExecutor; @@ -70,10 +69,10 @@ public class PipResizeGestureHandler { private final Rect mTmpBounds = new Rect(); private final int mDelta; - private boolean mAllowGesture = false; + private boolean mAllowGesture; private boolean mIsAttached; private boolean mIsEnabled; - private boolean mEnablePipResize; + private boolean mEnableUserResize; private InputMonitor mInputMonitor; private InputEventReceiver mInputEventReceiver; @@ -82,21 +81,20 @@ public class PipResizeGestureHandler { private int mCtrlType; public PipResizeGestureHandler(Context context, PipBoundsHandler pipBoundsHandler, - PipTouchHandler pipTouchHandler, PipMotionHelper motionHelper, - DeviceConfigProxy deviceConfig, PipTaskOrganizer pipTaskOrganizer) { + PipMotionHelper motionHelper, DeviceConfigProxy deviceConfig, + PipTaskOrganizer pipTaskOrganizer) { final Resources res = context.getResources(); context.getDisplay().getMetrics(mDisplayMetrics); mDisplayId = context.getDisplayId(); mMainExecutor = context.getMainExecutor(); mPipBoundsHandler = pipBoundsHandler; - mPipTouchHandler = pipTouchHandler; mMotionHelper = motionHelper; mPipTaskOrganizer = pipTaskOrganizer; context.getDisplay().getRealSize(mMaxSize); mDelta = res.getDimensionPixelSize(R.dimen.pip_resize_edge_size); - mEnablePipResize = DeviceConfig.getBoolean( + mEnableUserResize = DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_SYSTEMUI, PIP_USER_RESIZE, /* defaultValue = */ true); @@ -105,7 +103,7 @@ public class PipResizeGestureHandler { @Override public void onPropertiesChanged(DeviceConfig.Properties properties) { if (properties.getKeyset().contains(PIP_USER_RESIZE)) { - mEnablePipResize = properties.getBoolean( + mEnableUserResize = properties.getBoolean( PIP_USER_RESIZE, /* defaultValue = */ true); } } @@ -134,7 +132,7 @@ public class PipResizeGestureHandler { } private void updateIsEnabled() { - boolean isEnabled = mIsAttached && mEnablePipResize; + boolean isEnabled = mIsAttached && mEnableUserResize; if (isEnabled == mIsEnabled) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index 350ce293a13f8..878611e68cac5 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -16,6 +16,7 @@ package com.android.systemui.pip.phone; +import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_FULL; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE; @@ -56,6 +57,7 @@ import androidx.dynamicanimation.animation.SpringForce; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.logging.MetricsLoggerWrapper; import com.android.systemui.R; +import com.android.systemui.pip.PipAnimationController; import com.android.systemui.pip.PipBoundsHandler; import com.android.systemui.pip.PipSnapAlgorithm; import com.android.systemui.pip.PipTaskOrganizer; @@ -229,7 +231,7 @@ public class PipTouchHandler { mMotionHelper = new PipMotionHelper(mContext, activityTaskManager, pipTaskOrganizer, mMenuController, mSnapAlgorithm, mFlingAnimationUtils, floatingContentCoordinator); mPipResizeGestureHandler = - new PipResizeGestureHandler(context, pipBoundsHandler, this, mMotionHelper, + new PipResizeGestureHandler(context, pipBoundsHandler, mMotionHelper, deviceConfig, pipTaskOrganizer); mTouchState = new PipTouchState(ViewConfiguration.get(context), mHandler, () -> mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), @@ -339,11 +341,16 @@ public class PipTouchHandler { mPipResizeGestureHandler.onActivityUnpinned(); } - public void onPinnedStackAnimationEnded() { + public void onPinnedStackAnimationEnded( + @PipAnimationController.TransitionDirection int direction) { // Always synchronize the motion helper bounds once PiP animations finish mMotionHelper.synchronizePinnedStackBounds(); updateMovementBounds(); - mResizedBounds.set(mMotionHelper.getBounds()); + if (direction == TRANSITION_DIRECTION_TO_PIP) { + // updates mResizedBounds only if it's an entering PiP animation + // mResized should be otherwise updated in setMenuState. + mResizedBounds.set(mMotionHelper.getBounds()); + } if (mShowPipMenuOnAnimationEnd) { mMenuController.showMenu(MENU_STATE_CLOSE, mMotionHelper.getBounds(),