Merge "Consider LaunchParams when creating new stack."

This commit is contained in:
TreeHugger Robot
2018-11-17 23:47:46 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 24 deletions

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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