Do not send Runnable via Messenger across processes

Instead of passing the Message#replyTo to the receiver and let receiver
post back via Messenger.

Video: http://go/recall/-/aaaaaabFQoRHlzixHdtY/cnIejHZmI9hPxzC1bjOixm
Bug: 157241292
Test: expand PiP window in secondary user
Change-Id: I276923d3508f5cce8f5c34cdcf7c11433eb8ee6b
This commit is contained in:
Hongwei Wang
2020-05-21 13:23:39 -07:00
parent 535e4abdd2
commit 97f28fd64a
2 changed files with 44 additions and 12 deletions

View File

@@ -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");
}

View File

@@ -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) {