Merge "Fixes the animation and state when docking a task by drag" into oc-dev
am: 008e620153
Change-Id: Id626a44a564ae0811338bb04c3c6efb698d07b37
This commit is contained in:
@@ -2380,7 +2380,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
|||||||
}
|
}
|
||||||
|
|
||||||
void notifyAppTransitionDone() {
|
void notifyAppTransitionDone() {
|
||||||
continueUpdateBounds(HOME_STACK_ID);
|
continueUpdateBounds(RECENTS_STACK_ID);
|
||||||
for (int i = mResizingTasksDuringAnimation.size() - 1; i >= 0; i--) {
|
for (int i = mResizingTasksDuringAnimation.size() - 1; i >= 0; i--) {
|
||||||
final int taskId = mResizingTasksDuringAnimation.valueAt(i);
|
final int taskId = mResizingTasksDuringAnimation.valueAt(i);
|
||||||
final TaskRecord task =
|
final TaskRecord task =
|
||||||
@@ -5094,73 +5094,79 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
|||||||
+ taskId + " can't be launch in the home/recents stack.");
|
+ taskId + " can't be launch in the home/recents stack.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (launchStackId == DOCKED_STACK_ID) {
|
mWindowManager.deferSurfaceLayout();
|
||||||
mWindowManager.setDockedStackCreateState(
|
try {
|
||||||
activityOptions.getDockCreateMode(), null /* initialBounds */);
|
if (launchStackId == DOCKED_STACK_ID) {
|
||||||
|
mWindowManager.setDockedStackCreateState(
|
||||||
|
activityOptions.getDockCreateMode(), null /* initialBounds */);
|
||||||
|
|
||||||
// Defer updating the stack in which recents is until the app transition is done, to
|
// Defer updating the stack in which recents is until the app transition is done, to
|
||||||
// not run into issues where we still need to draw the task in recents but the
|
// not run into issues where we still need to draw the task in recents but the
|
||||||
// docked stack is already created.
|
// docked stack is already created.
|
||||||
deferUpdateBounds(HOME_STACK_ID);
|
deferUpdateBounds(RECENTS_STACK_ID);
|
||||||
mWindowManager.prepareAppTransition(TRANSIT_DOCK_TASK_FROM_RECENTS, false);
|
mWindowManager.prepareAppTransition(TRANSIT_DOCK_TASK_FROM_RECENTS, false);
|
||||||
}
|
|
||||||
|
|
||||||
task = anyTaskForIdLocked(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE,
|
|
||||||
launchStackId);
|
|
||||||
if (task == null) {
|
|
||||||
continueUpdateBounds(HOME_STACK_ID);
|
|
||||||
mWindowManager.executeAppTransition();
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"startActivityFromRecentsInner: Task " + taskId + " not found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since we don't have an actual source record here, we assume that the currently focused
|
|
||||||
// activity was the source.
|
|
||||||
final ActivityStack focusedStack = getFocusedStack();
|
|
||||||
final ActivityRecord sourceRecord =
|
|
||||||
focusedStack != null ? focusedStack.topActivity() : null;
|
|
||||||
|
|
||||||
if (launchStackId != INVALID_STACK_ID) {
|
|
||||||
if (task.getStackId() != launchStackId) {
|
|
||||||
task.reparent(launchStackId, ON_TOP, REPARENT_MOVE_STACK_TO_FRONT, ANIMATE,
|
|
||||||
DEFER_RESUME, "startActivityFromRecents");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// If the user must confirm credentials (e.g. when first launching a work app and the
|
task = anyTaskForIdLocked(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE,
|
||||||
// Work Challenge is present) let startActivityInPackage handle the intercepting.
|
launchStackId);
|
||||||
if (!mService.mUserController.shouldConfirmCredentials(task.userId)
|
if (task == null) {
|
||||||
&& task.getRootActivity() != null) {
|
continueUpdateBounds(RECENTS_STACK_ID);
|
||||||
mService.mActivityStarter.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */);
|
mWindowManager.executeAppTransition();
|
||||||
mActivityMetricsLogger.notifyActivityLaunching();
|
throw new IllegalArgumentException(
|
||||||
mService.moveTaskToFrontLocked(task.taskId, 0, bOptions);
|
"startActivityFromRecentsInner: Task " + taskId + " not found.");
|
||||||
mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT,
|
}
|
||||||
task.getTopActivity());
|
|
||||||
|
|
||||||
// If we are launching the task in the docked stack, put it into resizing mode so
|
// Since we don't have an actual source record here, we assume that the currently
|
||||||
// the window renders full-screen with the background filling the void. Also only
|
// focused activity was the source.
|
||||||
// call this at the end to make sure that tasks exists on the window manager side.
|
final ActivityStack focusedStack = getFocusedStack();
|
||||||
|
final ActivityRecord sourceRecord =
|
||||||
|
focusedStack != null ? focusedStack.topActivity() : null;
|
||||||
|
|
||||||
|
if (launchStackId != INVALID_STACK_ID) {
|
||||||
|
if (task.getStackId() != launchStackId) {
|
||||||
|
task.reparent(launchStackId, ON_TOP, REPARENT_MOVE_STACK_TO_FRONT, ANIMATE,
|
||||||
|
DEFER_RESUME, "startActivityFromRecents");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user must confirm credentials (e.g. when first launching a work app and the
|
||||||
|
// Work Challenge is present) let startActivityInPackage handle the intercepting.
|
||||||
|
if (!mService.mUserController.shouldConfirmCredentials(task.userId)
|
||||||
|
&& task.getRootActivity() != null) {
|
||||||
|
mService.mActivityStarter.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */);
|
||||||
|
mActivityMetricsLogger.notifyActivityLaunching();
|
||||||
|
mService.moveTaskToFrontLocked(task.taskId, 0, bOptions);
|
||||||
|
mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT,
|
||||||
|
task.getTopActivity());
|
||||||
|
|
||||||
|
// If we are launching the task in the docked stack, put it into resizing mode so
|
||||||
|
// the window renders full-screen with the background filling the void. Also only
|
||||||
|
// call this at the end to make sure that tasks exists on the window manager side.
|
||||||
|
if (launchStackId == DOCKED_STACK_ID) {
|
||||||
|
setResizingDuringAnimation(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
mService.mActivityStarter.postStartActivityProcessing(task.getTopActivity(),
|
||||||
|
ActivityManager.START_TASK_TO_FRONT,
|
||||||
|
sourceRecord != null
|
||||||
|
? sourceRecord.getTask().getStackId() : INVALID_STACK_ID,
|
||||||
|
sourceRecord, task.getStack());
|
||||||
|
return ActivityManager.START_TASK_TO_FRONT;
|
||||||
|
}
|
||||||
|
callingUid = task.mCallingUid;
|
||||||
|
callingPackage = task.mCallingPackage;
|
||||||
|
intent = task.intent;
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
|
||||||
|
userId = task.userId;
|
||||||
|
int result = mService.startActivityInPackage(callingUid, callingPackage, intent, null,
|
||||||
|
null, null, 0, 0, bOptions, userId, null, task);
|
||||||
if (launchStackId == DOCKED_STACK_ID) {
|
if (launchStackId == DOCKED_STACK_ID) {
|
||||||
setResizingDuringAnimation(task);
|
setResizingDuringAnimation(task);
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
mService.mActivityStarter.postStartActivityProcessing(task.getTopActivity(),
|
} finally {
|
||||||
ActivityManager.START_TASK_TO_FRONT,
|
mWindowManager.continueSurfaceLayout();
|
||||||
sourceRecord != null ? sourceRecord.getTask().getStackId() : INVALID_STACK_ID,
|
|
||||||
sourceRecord, task.getStack());
|
|
||||||
return ActivityManager.START_TASK_TO_FRONT;
|
|
||||||
}
|
}
|
||||||
callingUid = task.mCallingUid;
|
|
||||||
callingPackage = task.mCallingPackage;
|
|
||||||
intent = task.intent;
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
|
|
||||||
userId = task.userId;
|
|
||||||
int result = mService.startActivityInPackage(callingUid, callingPackage, intent, null,
|
|
||||||
null, null, 0, 0, bOptions, userId, null, task);
|
|
||||||
if (launchStackId == DOCKED_STACK_ID) {
|
|
||||||
setResizingDuringAnimation(task);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ package com.android.server.wm;
|
|||||||
|
|
||||||
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
|
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
|
||||||
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
|
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
|
||||||
|
|
||||||
|
import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS;
|
||||||
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
|
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
|
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
|
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
|
||||||
@@ -581,8 +583,12 @@ public class AppWindowContainerController
|
|||||||
|
|
||||||
private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning,
|
private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning,
|
||||||
boolean allowTaskSnapshot, boolean activityCreated) {
|
boolean allowTaskSnapshot, boolean activityCreated) {
|
||||||
if (newTask || !processRunning
|
if (mService.mAppTransition.getAppTransition() == TRANSIT_DOCK_TASK_FROM_RECENTS) {
|
||||||
|| (taskSwitch && !activityCreated)) {
|
// TODO(b/34099271): Remove this statement to add back the starting window and figure
|
||||||
|
// out why it causes flickering, the starting window appears over the thumbnail while
|
||||||
|
// the docked from recents transition occurs
|
||||||
|
return STARTING_WINDOW_TYPE_NONE;
|
||||||
|
} else if (newTask || !processRunning || (taskSwitch && !activityCreated)) {
|
||||||
return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
|
return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
|
||||||
} else if (taskSwitch && allowTaskSnapshot) {
|
} else if (taskSwitch && allowTaskSnapshot) {
|
||||||
return STARTING_WINDOW_TYPE_SNAPSHOT;
|
return STARTING_WINDOW_TYPE_SNAPSHOT;
|
||||||
|
|||||||
Reference in New Issue
Block a user