diff options
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java | 27 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java | 29 |
2 files changed, 44 insertions, 12 deletions
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 461fdef2b755..3396f7097ce0 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java @@ -89,6 +89,8 @@ public class PipMenuActivity extends Activity { private static final String TAG = "PipMenuActivity"; + private static final int MESSAGE_INVALID_TYPE = -1; + public static final int MESSAGE_SHOW_MENU = 1; public static final int MESSAGE_POKE_MENU = 2; public static final int MESSAGE_HIDE_MENU = 3; @@ -96,6 +98,7 @@ public class PipMenuActivity extends Activity { public static final int MESSAGE_UPDATE_DISMISS_FRACTION = 5; public static final int MESSAGE_ANIMATION_ENDED = 6; public static final int MESSAGE_POINTER_EVENT = 7; + public static final int MESSAGE_MENU_EXPANDED = 8; private static final int INITIAL_DISMISS_DELAY = 3500; private static final int POST_INTERACTION_DISMISS_DELAY = 2000; @@ -170,12 +173,15 @@ public class PipMenuActivity extends Activity { mAllowTouches = true; break; } - case MESSAGE_POINTER_EVENT: { final MotionEvent ev = (MotionEvent) msg.obj; dispatchPointerEvent(ev); break; } + case MESSAGE_MENU_EXPANDED : { + mMenuContainerAnimator.start(); + break; + } } } }; @@ -389,9 +395,9 @@ public class PipMenuActivity extends Activity { } if (withDelay) { // starts the menu container animation after window expansion is completed - notifyMenuStateChange(menuState, resizeMenuOnShow, mMenuContainerAnimator::start); + notifyMenuStateChange(menuState, resizeMenuOnShow, MESSAGE_MENU_EXPANDED); } else { - notifyMenuStateChange(menuState, resizeMenuOnShow, null /* callback */); + notifyMenuStateChange(menuState, resizeMenuOnShow, MESSAGE_INVALID_TYPE); mMenuContainerAnimator.start(); } } else { @@ -417,7 +423,7 @@ public class PipMenuActivity extends Activity { if (mMenuState != MENU_STATE_NONE) { cancelDelayedFinish(); if (notifyMenuVisibility) { - notifyMenuStateChange(MENU_STATE_NONE, mResize, null /* callback */); + notifyMenuStateChange(MENU_STATE_NONE, mResize, MESSAGE_INVALID_TYPE); } mMenuContainerAnimator = new AnimatorSet(); ObjectAnimator menuAnim = ObjectAnimator.ofFloat(mMenuContainer, View.ALPHA, @@ -579,14 +585,21 @@ public class PipMenuActivity extends Activity { mBackgroundDrawable.setAlpha(alpha); } - private void notifyMenuStateChange(int menuState, boolean resize, Runnable callback) { + private void notifyMenuStateChange(int menuState, boolean resize, int callbackWhat) { mMenuState = menuState; mResize = resize; Message m = Message.obtain(); m.what = PipMenuActivityController.MESSAGE_MENU_STATE_CHANGED; m.arg1 = menuState; - m.arg2 = resize ? 1 : 0; - m.obj = callback; + m.arg2 = resize ? 1 : 0; + if (callbackWhat != MESSAGE_INVALID_TYPE) { + // This message could be sent across processes when in secondary user. + // Make the receiver end sending back via our own Messenger + m.replyTo = mMessenger; + final Bundle data = new Bundle(1); + data.putInt(PipMenuActivityController.EXTRA_MESSAGE_CALLBACK_WHAT, callbackWhat); + m.obj = data; + } sendMessage(m, "Could not notify controller of PIP menu visibility"); } 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 36a9a34dce17..bf2c3e9d0d6e 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java @@ -19,6 +19,7 @@ package com.android.systemui.pip.phone; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import android.annotation.Nullable; import android.app.ActivityManager.StackInfo; import android.app.ActivityOptions; import android.app.ActivityTaskManager; @@ -66,6 +67,7 @@ public class PipMenuActivityController { public static final String EXTRA_MENU_STATE = "menu_state"; public static final String EXTRA_SHOW_MENU_WITH_DELAY = "show_menu_with_delay"; public static final String EXTRA_SHOW_RESIZE_HANDLE = "show_resize_handle"; + public static final String EXTRA_MESSAGE_CALLBACK_WHAT = "message_callback_what"; public static final int MESSAGE_MENU_STATE_CHANGED = 100; public static final int MESSAGE_EXPAND_PIP = 101; @@ -129,9 +131,10 @@ public class PipMenuActivityController { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_MENU_STATE_CHANGED: { - int menuState = msg.arg1; - boolean resize = msg.arg2 != 0; - onMenuStateChanged(menuState, resize, (Runnable) msg.obj); + final int menuState = msg.arg1; + final boolean resize = msg.arg2 != 0; + onMenuStateChanged(menuState, resize, + getMenuStateChangeFinishedCallback(msg.replyTo, (Bundle) msg.obj)); break; } case MESSAGE_EXPAND_PIP: { @@ -254,8 +257,8 @@ public class PipMenuActivityController { } /** - * Similar to {@link #showMenu(int, Rect, boolean, boolean)} but only show the menu upon - * PiP window transition is finished. + * Similar to {@link #showMenu(int, Rect, boolean, boolean, boolean)} but only show the menu + * upon PiP window transition is finished. */ public void showMenuWithDelay(int menuState, Rect stackBounds, boolean allowMenuTimeout, boolean willResizeMenu, boolean showResizeHandle) { @@ -272,6 +275,22 @@ public class PipMenuActivityController { false /* withDelay */, showResizeHandle); } + private Runnable getMenuStateChangeFinishedCallback(@Nullable Messenger replyTo, + @Nullable Bundle data) { + if (replyTo == null || data == null) { + return null; + } + return () -> { + try { + final Message m = Message.obtain(); + m.what = data.getInt(EXTRA_MESSAGE_CALLBACK_WHAT); + replyTo.send(m); + } catch (RemoteException e) { + // ignored + } + }; + } + private void showMenuInternal(int menuState, Rect stackBounds, boolean allowMenuTimeout, boolean willResizeMenu, boolean withDelay, boolean showResizeHandle) { if (DEBUG) { |