Merge "Workaround launching PiP task with CLEAR_TASK & NEW_TASK flag." into oc-dev

This commit is contained in:
Winson Chung
2017-05-04 16:16:28 +00:00
committed by Android (Google) Code Review
9 changed files with 42 additions and 21 deletions

View File

@@ -39,8 +39,11 @@ oneway interface ITaskStackListener {
* Called whenever IActivityManager.startActivity is called on an activity that is already
* running in the pinned stack and the activity is not actually started, but the task is either
* brought to the front or a new Intent is delivered to it.
*
* @param clearedTask whether or not the launch activity also cleared the task as a part of
* starting
*/
void onPinnedActivityRestartAttempt();
void onPinnedActivityRestartAttempt(boolean clearedTask);
/**
* Called whenever the pinned stack is starting animating a resize.

View File

@@ -39,7 +39,7 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub {
}
@Override
public void onPinnedActivityRestartAttempt() throws RemoteException {
public void onPinnedActivityRestartAttempt(boolean clearedTask) throws RemoteException {
}
@Override

View File

@@ -107,12 +107,12 @@ public class PipManager implements BasePipManager {
}
@Override
public void onPinnedActivityRestartAttempt() {
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
if (!checkCurrentUserId(false /* debug */)) {
return;
}
mTouchHandler.getMotionHelper().expandPip();
mTouchHandler.getMotionHelper().expandPip(clearedTask /* skipAnimation */);
}
};

View File

@@ -140,14 +140,25 @@ public class PipMotionHelper {
* Resizes the pinned stack back to fullscreen.
*/
void expandPip() {
expandPip(false /* skipAnimation */);
}
/**
* Resizes the pinned stack back to fullscreen.
*/
void expandPip(boolean skipAnimation) {
cancelAnimations();
mHandler.post(() -> {
try {
mActivityManager.resizeStack(PINNED_STACK_ID, null /* bounds */,
true /* allowResizeInDockedMode */, true /* preserveWindows */,
true /* animate */, EXPAND_STACK_TO_FULLSCREEN_DURATION);
if (skipAnimation) {
mActivityManager.moveTasksToFullscreenStack(PINNED_STACK_ID, true /* onTop */);
} else {
mActivityManager.resizeStack(PINNED_STACK_ID, null /* bounds */,
true /* allowResizeInDockedMode */, true /* preserveWindows */,
true /* animate */, EXPAND_STACK_TO_FULLSCREEN_DURATION);
}
} catch (RemoteException e) {
Log.e(TAG, "Error showing PiP menu activity", e);
Log.e(TAG, "Error expanding PiP activity", e);
}
});
}

View File

@@ -625,7 +625,7 @@ public class PipManager implements BasePipManager {
}
@Override
public void onPinnedActivityRestartAttempt() {
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
if (!checkCurrentUserId(DEBUG)) {
return;

View File

@@ -158,7 +158,7 @@ public class SystemServicesProxy {
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
public void onActivityPinned(String packageName) { }
public void onActivityUnpinned() { }
public void onPinnedActivityRestartAttempt() { }
public void onPinnedActivityRestartAttempt(boolean clearedTask) { }
public void onPinnedStackAnimationStarted() { }
public void onPinnedStackAnimationEnded() { }
public void onActivityForcedResizable(String packageName, int taskId, int reason) { }
@@ -223,10 +223,11 @@ public class SystemServicesProxy {
}
@Override
public void onPinnedActivityRestartAttempt()
public void onPinnedActivityRestartAttempt(boolean clearedTask)
throws RemoteException{
mHandler.removeMessages(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT);
mHandler.sendEmptyMessage(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT);
mHandler.obtainMessage(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT, clearedTask ? 1 : 0, 0)
.sendToTarget();
}
@Override
@@ -1294,7 +1295,8 @@ public class SystemServicesProxy {
}
case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
mTaskStackListeners.get(i).onPinnedActivityRestartAttempt();
mTaskStackListeners.get(i).onPinnedActivityRestartAttempt(
msg.arg1 != 0);
}
break;
}

View File

@@ -19890,8 +19890,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
* NOTE: For the pinned stack, this method is only called after the bounds animation has
* animated the stack to the fullscreen.
* NOTE: For the pinned stack, this method is usually called after the bounds animation has
* animated the stack to the fullscreen, but can also be called if we are relaunching an
* activity and clearing the task at the same time.
*/
@Override
public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {

View File

@@ -575,12 +575,15 @@ class ActivityStarter {
return;
}
if (startedActivityStackId == PINNED_STACK_ID
&& (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP)) {
boolean clearedTask = (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
== (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
if (startedActivityStackId == PINNED_STACK_ID && (result == START_TASK_TO_FRONT
|| result == START_DELIVERED_TO_TOP || clearedTask)) {
// The activity was already running in the pinned stack so it wasn't started, but either
// brought to the front or the new intent was delivered to it since it was already in
// front. Notify anyone interested in this piece of information.
mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt();
mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
clearedTask);
return;
}
}

View File

@@ -104,7 +104,7 @@ class TaskChangeNotificationController {
};
private final TaskStackConsumer mNotifyPinnedActivityRestartAttempt = (l, m) -> {
l.onPinnedActivityRestartAttempt();
l.onPinnedActivityRestartAttempt(m.arg1 != 0);
};
private final TaskStackConsumer mNotifyPinnedStackAnimationStarted = (l, m) -> {
@@ -300,10 +300,11 @@ class TaskChangeNotificationController {
* running in the pinned stack and the activity was not actually started, but the task is
* either brought to the front or a new Intent is delivered to it.
*/
void notifyPinnedActivityRestartAttempt() {
void notifyPinnedActivityRestartAttempt(boolean clearedTask) {
mHandler.removeMessages(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
final Message msg =
mHandler.obtainMessage(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
mHandler.obtainMessage(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG,
clearedTask ? 1 : 0, 0);
forAllLocalListeners(mNotifyPinnedActivityRestartAttempt, msg);
msg.sendToTarget();
}