summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Garfield Tan <xutan@google.com> 2018-10-15 11:33:02 -0700
committer Garfield Tan <xutan@google.com> 2018-10-15 15:21:31 -0700
commit706dbcbb6d406b38936cc3127c0c4074e5d368d0 (patch)
tree37ee86f7581287eefe40a21bb07003e75539f81e
parent03fc4a7f68142013aa1dfa80dfe6abc93622af42 (diff)
Pass in window layout when setting initial state.
The bounds returned here may affect result later, but we didn't pass in all information we have at this moment. Also stop inferring freeform windowing mode if activity is resizeable and specified layout bounds or activity option bounds, because these activities may be launched in freeform mode accidentally on primary displays. Bug: 113252871 Test: Apps with layout can be launched correct on external displays, e.g. Calculator. It still launches in fullscreen on primary display. atest FrameworksServicesTests:TaskLaunchParamsModifierTests atest FrameworksServicesTests:ActivityStarterTests go/wm-smoke. Change-Id: If19122c1c0d010df5d69a14a867c7bb2f37bd461
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java4
-rw-r--r--services/core/java/com/android/server/am/TaskLaunchParamsModifier.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java21
4 files changed, 20 insertions, 30 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 33f949fccfb0..fcaced2536a9 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1608,8 +1608,8 @@ class ActivityStarter {
mLaunchParams.reset();
- mSupervisor.getLaunchParamsController().calculate(inTask, null /*layout*/, r, sourceRecord,
- options, mLaunchParams);
+ mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r,
+ sourceRecord, options, mLaunchParams);
if (mLaunchParams.hasPreferredDisplay()) {
mPreferredDisplayId = mLaunchParams.mPreferredDisplayId;
diff --git a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
index fd34d180ebc0..04f4facfbf15 100644
--- a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
@@ -131,16 +131,16 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
}
// STEP 2: Resolve launch windowing mode.
// STEP 2.1: Determine if any parameter has specified initial bounds. That might be the
- // launch bounds from activity options, or size/gravity passed in layout. It also treat the
+ // launch bounds from activity options, or size/gravity passed in layout. It also treats the
// launch windowing mode in options as a suggestion for future resolution.
int launchMode = options != null ? options.getLaunchWindowingMode()
: WINDOWING_MODE_UNDEFINED;
// hasInitialBounds is set if either activity options or layout has specified bounds. If
// that's set we'll skip some adjustments later to avoid overriding the initial bounds.
boolean hasInitialBounds = false;
- final boolean canApplyFreeformPolicy =
- canApplyFreeformWindowPolicy(display, root, launchMode);
- if (mSupervisor.canUseActivityOptionsLaunchBounds(options) && canApplyFreeformPolicy) {
+ final boolean canApplyFreeformPolicy = canApplyFreeformWindowPolicy(display, launchMode);
+ if (mSupervisor.canUseActivityOptionsLaunchBounds(options)
+ && (canApplyFreeformPolicy || canApplyPipWindowPolicy(launchMode))) {
hasInitialBounds = true;
launchMode = launchMode == WINDOWING_MODE_UNDEFINED
? WINDOWING_MODE_FREEFORM
@@ -279,10 +279,14 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
return displayId;
}
- private boolean canApplyFreeformWindowPolicy(@NonNull ActivityDisplay display,
- @NonNull ActivityRecord root, int launchMode) {
- return display.inFreeformWindowingMode() || launchMode == WINDOWING_MODE_FREEFORM
- || root.isResizeable();
+ private boolean canApplyFreeformWindowPolicy(@NonNull ActivityDisplay display, int launchMode) {
+ return mSupervisor.mService.mSupportsFreeformWindowManagement
+ && (display.inFreeformWindowingMode() || launchMode == WINDOWING_MODE_FREEFORM);
+ }
+
+ private boolean canApplyPipWindowPolicy(int launchMode) {
+ return mSupervisor.mService.mSupportsPictureInPicture
+ && launchMode == WINDOWING_MODE_PINNED;
}
private void getLayoutBounds(@NonNull ActivityDisplay display, @NonNull ActivityRecord root,
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index bac4a525b9ea..5c01fac8be21 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -408,8 +408,9 @@ public class ActivityStarterTests extends ActivityTestsBase {
.setActivityOptions(new SafeActivityOptions(options))
.execute();
- // verify that values are passed to the modifier.
- verify(modifier, times(1)).onCalculate(any(), eq(windowLayout), any(), any(), eq(options),
+ // verify that values are passed to the modifier. Values are passed twice -- once for
+ // setting initial state, another when task is created.
+ verify(modifier, times(2)).onCalculate(any(), eq(windowLayout), any(), any(), eq(options),
any(), any());
}
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
index 0d1302f78316..ea1320ce3b83 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
@@ -189,7 +189,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
mActivity, /* source */ null, options, mCurrent, mResult));
- assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode,
+ assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode,
WINDOWING_MODE_FULLSCREEN);
}
@@ -277,7 +277,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
}
@Test
- public void testNonEmptyLayoutInfersFreeformWithResizeableActivity() {
+ public void testNonEmptyLayoutUsesFullscreenWithResizeableActivity() {
final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
.setWidth(120).setHeight(80).build();
@@ -286,7 +286,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, layout, mActivity,
/* source */ null, /* options */ null, mCurrent, mResult));
- assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode,
+ assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode,
WINDOWING_MODE_FULLSCREEN);
}
@@ -713,21 +713,6 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
}
@Test
- public void testNonEmptyLayoutBoundsWithResizeableActivity() {
- final ActivityDisplay display = mSupervisor.getActivityDisplay(DEFAULT_DISPLAY);
- display.setBounds(new Rect(0, 0, 1920, 1080));
- final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
- .setWidth(120).setHeight(80).build();
-
- mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY;
-
- assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, layout, mActivity,
- /* source */ null, /* options */ null, mCurrent, mResult));
-
- assertEquals(new Rect(900, 500, 1020, 580), mResult.mBounds);
- }
-
- @Test
public void testRespectBoundsFromFullyResolvedCurrentParam_NonEmptyBounds() {
final TestActivityDisplay freeformDisplay = createNewActivityDisplay(
WINDOWING_MODE_FREEFORM);