Merge "Workaround launching PiP task with CLEAR_TASK & NEW_TASK flag." into oc-dev
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user