diff options
| author | 2020-06-25 04:23:11 +0000 | |
|---|---|---|
| committer | 2020-06-25 04:23:11 +0000 | |
| commit | 90f5f87e702af0ca5bf87de1e79e025c7c215f2a (patch) | |
| tree | a62ee2ebe3d53f10e0ead72efc21c8c12a7d7468 | |
| parent | 65690bd9c9c6b7e049fcfc80948ecef079b4daf1 (diff) | |
| parent | 1f7c4db51364a3f1185937eb3cb8a99ecb03240e (diff) | |
Merge "Respect the orientation of a home activity in the process of launching when split-screen enabled." into rvc-dev am: 1f7c4db513
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11959749
Change-Id: I39995aa05edda08e983ed51c12b030ef16fd4051
| -rw-r--r-- | services/core/java/com/android/server/wm/TaskDisplayArea.java | 17 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java | 37 |
2 files changed, 49 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 7b690383f5f9..e23080724000 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -564,16 +564,23 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { // Apps and their containers are not allowed to specify an orientation while using // root tasks...except for the home stack if it is not resizable and currently // visible (top of) its root task. - if (mRootHomeTask != null && mRootHomeTask.isVisible() - && !mRootHomeTask.isResizeable()) { + if (mRootHomeTask != null && !mRootHomeTask.isResizeable()) { // Manually nest one-level because because getOrientation() checks fillsParent() // which checks that requestedOverrideBounds() is empty. However, in this case, // it is not empty because it's been overridden to maintain the fullscreen size // within a smaller split-root. final Task topHomeTask = mRootHomeTask.getTopMostTask(); - final int orientation = topHomeTask.getOrientation(); - if (orientation != SCREEN_ORIENTATION_UNSET) { - return orientation; + final ActivityRecord topHomeActivity = topHomeTask.getTopNonFinishingActivity(); + // If a home activity is in the process of launching and isn't yet visible we + // should still respect the stack's preferred orientation to ensure rotation occurs + // before the home activity finishes launching. + final boolean isHomeActivityLaunching = topHomeActivity != null + && topHomeActivity.mVisibleRequested; + if (topHomeTask.isVisible() || isHomeActivityLaunching) { + final int orientation = topHomeTask.getOrientation(); + if (orientation != SCREEN_ORIENTATION_UNSET) { + return orientation; + } } } return SCREEN_ORIENTATION_UNSPECIFIED; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index 786f8d8af024..8c3661b409f4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -28,14 +28,17 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; +import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.wm.ActivityStack.ActivityState.RESUMED; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -207,6 +210,40 @@ public class TaskDisplayAreaTests extends WindowTestsBase { false /* reuseCandidate */); } + @Test + public void testGetOrientation_nonResizableHomeStackWithHomeActivityPendingVisibilityChange() { + final RootWindowContainer rootWindowContainer = mWm.mAtmService.mRootWindowContainer; + final TaskDisplayArea defaultTaskDisplayArea = + rootWindowContainer.getDefaultTaskDisplayArea(); + + final ActivityStack rootHomeTask = defaultTaskDisplayArea.getRootHomeTask(); + rootHomeTask.mResizeMode = RESIZE_MODE_UNRESIZEABLE; + + final ActivityStack primarySplitTask = + new ActivityTestsBase.StackBuilder(rootWindowContainer) + .setTaskDisplayArea(defaultTaskDisplayArea) + .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) + .setActivityType(ACTIVITY_TYPE_STANDARD) + .setOnTop(true) + .setCreateActivity(true) + .build(); + ActivityRecord primarySplitActivity = primarySplitTask.getTopNonFinishingActivity(); + assertNotNull(primarySplitActivity); + primarySplitActivity.setState(RESUMED, + "testGetOrientation_nonResizableHomeStackWithHomeActivityPendingVisibilityChange"); + + ActivityRecord homeActivity = rootHomeTask.getTopNonFinishingActivity(); + if (homeActivity == null) { + homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService) + .setStack(rootHomeTask).setCreateTask(true).build(); + } + homeActivity.setVisible(false); + homeActivity.mVisibleRequested = true; + assertFalse(rootHomeTask.isVisible()); + + assertEquals(rootWindowContainer.getOrientation(), rootHomeTask.getOrientation()); + } + private void assertGetOrCreateStack(int windowingMode, int activityType, Task candidateTask, boolean reuseCandidate) { final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea(); |