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
|
* 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
|
* 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.
|
* 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.
|
* Called whenever the pinned stack is starting animating a resize.
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPinnedActivityRestartAttempt() throws RemoteException {
|
public void onPinnedActivityRestartAttempt(boolean clearedTask) throws RemoteException {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -107,12 +107,12 @@ public class PipManager implements BasePipManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPinnedActivityRestartAttempt() {
|
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
|
||||||
if (!checkCurrentUserId(false /* debug */)) {
|
if (!checkCurrentUserId(false /* debug */)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTouchHandler.getMotionHelper().expandPip();
|
mTouchHandler.getMotionHelper().expandPip(clearedTask /* skipAnimation */);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -140,14 +140,25 @@ public class PipMotionHelper {
|
|||||||
* Resizes the pinned stack back to fullscreen.
|
* Resizes the pinned stack back to fullscreen.
|
||||||
*/
|
*/
|
||||||
void expandPip() {
|
void expandPip() {
|
||||||
|
expandPip(false /* skipAnimation */);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resizes the pinned stack back to fullscreen.
|
||||||
|
*/
|
||||||
|
void expandPip(boolean skipAnimation) {
|
||||||
cancelAnimations();
|
cancelAnimations();
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
try {
|
try {
|
||||||
|
if (skipAnimation) {
|
||||||
|
mActivityManager.moveTasksToFullscreenStack(PINNED_STACK_ID, true /* onTop */);
|
||||||
|
} else {
|
||||||
mActivityManager.resizeStack(PINNED_STACK_ID, null /* bounds */,
|
mActivityManager.resizeStack(PINNED_STACK_ID, null /* bounds */,
|
||||||
true /* allowResizeInDockedMode */, true /* preserveWindows */,
|
true /* allowResizeInDockedMode */, true /* preserveWindows */,
|
||||||
true /* animate */, EXPAND_STACK_TO_FULLSCREEN_DURATION);
|
true /* animate */, EXPAND_STACK_TO_FULLSCREEN_DURATION);
|
||||||
|
}
|
||||||
} catch (RemoteException e) {
|
} 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
|
@Override
|
||||||
public void onPinnedActivityRestartAttempt() {
|
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
|
||||||
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
|
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
|
||||||
if (!checkCurrentUserId(DEBUG)) {
|
if (!checkCurrentUserId(DEBUG)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ public class SystemServicesProxy {
|
|||||||
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
|
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
|
||||||
public void onActivityPinned(String packageName) { }
|
public void onActivityPinned(String packageName) { }
|
||||||
public void onActivityUnpinned() { }
|
public void onActivityUnpinned() { }
|
||||||
public void onPinnedActivityRestartAttempt() { }
|
public void onPinnedActivityRestartAttempt(boolean clearedTask) { }
|
||||||
public void onPinnedStackAnimationStarted() { }
|
public void onPinnedStackAnimationStarted() { }
|
||||||
public void onPinnedStackAnimationEnded() { }
|
public void onPinnedStackAnimationEnded() { }
|
||||||
public void onActivityForcedResizable(String packageName, int taskId, int reason) { }
|
public void onActivityForcedResizable(String packageName, int taskId, int reason) { }
|
||||||
@@ -223,10 +223,11 @@ public class SystemServicesProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPinnedActivityRestartAttempt()
|
public void onPinnedActivityRestartAttempt(boolean clearedTask)
|
||||||
throws RemoteException{
|
throws RemoteException{
|
||||||
mHandler.removeMessages(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT);
|
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
|
@Override
|
||||||
@@ -1294,7 +1295,8 @@ public class SystemServicesProxy {
|
|||||||
}
|
}
|
||||||
case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
|
case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
|
||||||
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
|
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
|
||||||
mTaskStackListeners.get(i).onPinnedActivityRestartAttempt();
|
mTaskStackListeners.get(i).onPinnedActivityRestartAttempt(
|
||||||
|
msg.arg1 != 0);
|
||||||
}
|
}
|
||||||
break;
|
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
|
* NOTE: For the pinned stack, this method is usually called after the bounds animation has
|
||||||
* animated the stack to the fullscreen.
|
* 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
|
@Override
|
||||||
public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
|
public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
|
||||||
|
|||||||
@@ -575,12 +575,15 @@ class ActivityStarter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startedActivityStackId == PINNED_STACK_ID
|
boolean clearedTask = (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
|
||||||
&& (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP)) {
|
== (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
|
// 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
|
// 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.
|
// front. Notify anyone interested in this piece of information.
|
||||||
mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt();
|
mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
|
||||||
|
clearedTask);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ class TaskChangeNotificationController {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private final TaskStackConsumer mNotifyPinnedActivityRestartAttempt = (l, m) -> {
|
private final TaskStackConsumer mNotifyPinnedActivityRestartAttempt = (l, m) -> {
|
||||||
l.onPinnedActivityRestartAttempt();
|
l.onPinnedActivityRestartAttempt(m.arg1 != 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
private final TaskStackConsumer mNotifyPinnedStackAnimationStarted = (l, m) -> {
|
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
|
* 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.
|
* 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);
|
mHandler.removeMessages(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
|
||||||
final Message 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);
|
forAllLocalListeners(mNotifyPinnedActivityRestartAttempt, msg);
|
||||||
msg.sendToTarget();
|
msg.sendToTarget();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user