Merge "Consider LaunchParams when creating new stack."
This commit is contained in:
committed by
Android (Google) Code Review
commit
8c33a54824
@@ -121,6 +121,7 @@ import android.app.AppOpsManager;
|
||||
import android.app.ProfilerInfo;
|
||||
import android.app.ResultInfo;
|
||||
import android.app.WaitResult;
|
||||
import android.app.WindowConfiguration;
|
||||
import android.app.WindowConfiguration.ActivityType;
|
||||
import android.app.WindowConfiguration.WindowingMode;
|
||||
import android.app.servertransaction.ActivityLifecycleItem;
|
||||
@@ -2405,7 +2406,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
|
||||
<T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r,
|
||||
@Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop) {
|
||||
return getLaunchStack(r, options, candidateTask, onTop, INVALID_DISPLAY);
|
||||
return getLaunchStack(r, options, candidateTask, onTop, null /* launchParams */);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2414,12 +2415,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
* @param r The activity we are trying to launch. Can be null.
|
||||
* @param options The activity options used to the launch. Can be null.
|
||||
* @param candidateTask The possible task the activity might be launched in. Can be null.
|
||||
* @params launchParams The resolved launch params to use.
|
||||
*
|
||||
* @return The stack to use for the launch or INVALID_STACK_ID.
|
||||
*/
|
||||
<T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r,
|
||||
@Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop,
|
||||
int candidateDisplayId) {
|
||||
@Nullable LaunchParamsController.LaunchParams launchParams) {
|
||||
int taskId = INVALID_TASK_ID;
|
||||
int displayId = INVALID_DISPLAY;
|
||||
//Rect bounds = null;
|
||||
@@ -2427,9 +2429,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
// We give preference to the launch preference in activity options.
|
||||
if (options != null) {
|
||||
taskId = options.getLaunchTaskId();
|
||||
displayId = options.getLaunchDisplayId();
|
||||
// TODO: Need to work this into the equation...
|
||||
//bounds = options.getLaunchBounds();
|
||||
}
|
||||
|
||||
// First preference for stack goes to the task Id set in the activity options. Use the stack
|
||||
@@ -2446,16 +2445,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
}
|
||||
|
||||
final int activityType = resolveActivityType(r, options, candidateTask);
|
||||
T stack = null;
|
||||
T stack;
|
||||
|
||||
// Next preference for stack goes to the display Id set in the activity options or the
|
||||
// candidate display.
|
||||
if (displayId == INVALID_DISPLAY) {
|
||||
displayId = candidateDisplayId;
|
||||
// Next preference for stack goes to the display Id set the candidate display.
|
||||
if (launchParams != null) {
|
||||
displayId = launchParams.mPreferredDisplayId;
|
||||
}
|
||||
if (displayId != INVALID_DISPLAY && canLaunchOnDisplay(r, displayId)) {
|
||||
if (r != null) {
|
||||
stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options);
|
||||
stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options,
|
||||
launchParams);
|
||||
if (stack != null) {
|
||||
return stack;
|
||||
}
|
||||
@@ -2482,8 +2481,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
if (stack != null) {
|
||||
display = stack.getDisplay();
|
||||
if (display != null && canLaunchOnDisplay(r, display.mDisplayId)) {
|
||||
final int windowingMode =
|
||||
display.resolveWindowingMode(r, options, candidateTask, activityType);
|
||||
int windowingMode = launchParams != null ? launchParams.mWindowingMode
|
||||
: WindowConfiguration.WINDOWING_MODE_UNDEFINED;
|
||||
if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) {
|
||||
windowingMode = display.resolveWindowingMode(r, options, candidateTask,
|
||||
activityType);
|
||||
}
|
||||
if (stack.isCompatible(windowingMode, activityType)) {
|
||||
return stack;
|
||||
}
|
||||
@@ -2523,8 +2526,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
* @param candidateTask The possible task the activity might be put in.
|
||||
* @return Existing stack if there is a valid one, new dynamic stack if it is valid or null.
|
||||
*/
|
||||
ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r,
|
||||
@Nullable TaskRecord candidateTask, @Nullable ActivityOptions options) {
|
||||
private ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r,
|
||||
@Nullable TaskRecord candidateTask, @Nullable ActivityOptions options,
|
||||
@Nullable LaunchParamsController.LaunchParams launchParams) {
|
||||
final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
|
||||
if (activityDisplay == null) {
|
||||
throw new IllegalArgumentException(
|
||||
@@ -2552,8 +2556,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
|
||||
// If there is no valid stack on the external display - check if new dynamic stack will do.
|
||||
if (displayId != DEFAULT_DISPLAY) {
|
||||
final int windowingMode;
|
||||
if (launchParams != null) {
|
||||
// When launch params is not null, we always defer to its windowing mode. Sometimes
|
||||
// it could be unspecified, which indicates it should inherit windowing mode from
|
||||
// display.
|
||||
windowingMode = launchParams.mWindowingMode;
|
||||
} else {
|
||||
windowingMode = options != null ? options.getLaunchWindowingMode()
|
||||
: r.getWindowingMode();
|
||||
}
|
||||
return activityDisplay.createStack(
|
||||
options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(),
|
||||
windowingMode,
|
||||
options != null ? options.getLaunchActivityType() : r.getActivityType(),
|
||||
true /*onTop*/);
|
||||
}
|
||||
@@ -2563,8 +2577,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
}
|
||||
|
||||
ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r,
|
||||
@Nullable ActivityOptions options) {
|
||||
return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options);
|
||||
@Nullable ActivityOptions options,
|
||||
@Nullable LaunchParamsController.LaunchParams launchParams) {
|
||||
return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options,
|
||||
launchParams);
|
||||
}
|
||||
|
||||
// TODO: Can probably be consolidated into getLaunchStack()...
|
||||
@@ -2644,7 +2660,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|
||||
continue;
|
||||
}
|
||||
final ActivityStack stack = getValidLaunchStackOnDisplay(display.mDisplayId, r,
|
||||
null /* options */);
|
||||
null /* options */, null /* launchParams */);
|
||||
if (stack != null) {
|
||||
return stack;
|
||||
}
|
||||
|
||||
@@ -2145,7 +2145,7 @@ class ActivityStarter {
|
||||
if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) {
|
||||
// Can't use target display, lets find a stack on the source display.
|
||||
mTargetStack = mSupervisor.getValidLaunchStackOnDisplay(
|
||||
sourceStack.mDisplayId, mStartActivity, mOptions);
|
||||
sourceStack.mDisplayId, mStartActivity, mOptions, mLaunchParams);
|
||||
}
|
||||
if (mTargetStack == null) {
|
||||
// There are no suitable stacks on the target and source display(s). Look on all
|
||||
@@ -2368,7 +2368,8 @@ class ActivityStarter {
|
||||
|
||||
if (mPreferredDisplayId != DEFAULT_DISPLAY) {
|
||||
// Try to put the activity in a stack on a secondary display.
|
||||
stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions);
|
||||
stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions,
|
||||
mLaunchParams);
|
||||
if (stack == null) {
|
||||
// If source display is not suitable - look for topmost valid stack in the system.
|
||||
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS,
|
||||
@@ -2432,9 +2433,12 @@ class ActivityStarter {
|
||||
|| mPreferredDisplayId != DEFAULT_DISPLAY) {
|
||||
// We don't pass in the default display id into the get launch stack call so it can do a
|
||||
// full resolution.
|
||||
final int candidateDisplay =
|
||||
mLaunchParams.mPreferredDisplayId =
|
||||
mPreferredDisplayId != DEFAULT_DISPLAY ? mPreferredDisplayId : INVALID_DISPLAY;
|
||||
return mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, candidateDisplay);
|
||||
final ActivityStack stack = mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP,
|
||||
mLaunchParams);
|
||||
mLaunchParams.mPreferredDisplayId = mPreferredDisplayId;
|
||||
return stack;
|
||||
}
|
||||
// Otherwise handle adjacent launch.
|
||||
|
||||
|
||||
@@ -346,7 +346,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
|
||||
doReturn(stack).when(mService.mStackSupervisor)
|
||||
.getLaunchStack(any(), any(), any(), anyBoolean());
|
||||
doReturn(stack).when(mService.mStackSupervisor)
|
||||
.getLaunchStack(any(), any(), any(), anyBoolean(), anyInt());
|
||||
.getLaunchStack(any(), any(), any(), anyBoolean(), any());
|
||||
}
|
||||
|
||||
// Set up mock package manager internal and make sure no unmocked methods are called
|
||||
|
||||
Reference in New Issue
Block a user