diff options
| author | 2017-05-05 16:29:37 +0000 | |
|---|---|---|
| committer | 2017-05-05 16:29:46 +0000 | |
| commit | a087127e77dafb49c89de85549e1a61723cec6a7 (patch) | |
| tree | a71e5958b72ec01c51e816591df6812ca7cc6733 | |
| parent | 2d2689add79f451be39613898c8e1599a4f5e2c9 (diff) | |
| parent | 943ebe705cece8f643d9d7ace005322ddf114d86 (diff) | |
Merge "Prevent NPE in ActivityStack#shouldbeVisible." into oc-dev
3 files changed, 28 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index d348224df377..c5d5867633a9 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -232,7 +232,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai static final int STACK_VISIBLE = 1; // Stack is considered visible, but only becuase it has activity that is visible behind other // activities and there is a specific combination of stacks. - private static final int STACK_VISIBLE_ACTIVITY_BEHIND = 2; + static final int STACK_VISIBLE_ACTIVITY_BEHIND = 2; @VisibleForTesting /* The various modes for the method {@link #removeTask}. */ @@ -1652,7 +1652,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (StackId.isBackdropToTranslucentActivity(mStackId) && hasVisibleBehindActivity() && StackId.isHomeOrRecentsStack(topStackId) - && !topStack.topActivity().fullscreen) { + && (topStack.topActivity() == null || !topStack.topActivity().fullscreen)) { // The fullscreen or assistant stack should be visible if it has a visible behind // activity behind the home or recents stack that is translucent. return STACK_VISIBLE_ACTIVITY_BEHIND; diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java index c87eaed5c954..711c36b8b1d4 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.app.ActivityManager; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.platform.test.annotations.Presubmit; @@ -97,4 +98,25 @@ public class ActivityStackTests extends ActivityTestsBase { testStack.stopActivityLocked(activityRecord); } + + /** + * This test verifies that {@link ActivityStack#STACK_VISIBLE_ACTIVITY_BEHIND} is returned from + * {@link ActivityStack#shouldBeVisible(ActivityRecord)} from a fullscreen workspace stack with + * a visible behind activity when top focused stack is the home stack. + */ + @Test + public void testShouldBeVisibleWithVisibleBehindActivity() throws Exception { + final ActivityManagerService service = createActivityManagerService(); + final TaskRecord task = createTask(service, testActivityComponent, + ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID); + final ActivityStack fullscreenWorkspaceStackId = task.getStack(); + final ActivityStack homeStack = service.mStackSupervisor.getStack( + ActivityManager.StackId.HOME_STACK_ID, true /*createStaticStackIfNeeded*/, + true /*onTop*/); + final ActivityRecord activityRecord = createActivity(service, testActivityComponent, task); + service.mStackSupervisor.setFocusStackUnchecked("testEmptyStackShouldBeVisible", homeStack); + service.mStackSupervisor.requestVisibleBehindLocked(activityRecord, true); + assertEquals(ActivityStack.STACK_VISIBLE_ACTIVITY_BEHIND, + fullscreenWorkspaceStackId.shouldBeVisible(null /*starting*/)); + } } diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 28051f9b2f8c..9cfa542da9d1 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -151,9 +151,12 @@ public class ActivityTestsBase { * setup not available in the test environment. Also specifies an injector for */ protected static class TestActivityStackSupervisor extends ActivityStackSupervisor { + private final ActivityDisplay mDisplay; + public TestActivityStackSupervisor(ActivityManagerService service, Looper looper) { super(service, looper); mWindowManager = prepareMockWindowManager(); + mDisplay = new ActivityDisplay(); } // No home stack is set. @@ -185,9 +188,8 @@ public class ActivityTestsBase { public <T extends ActivityStack> T createTestStack(ActivityManagerService service, int stackId, boolean onTop) { - final ActivityDisplay display = new ActivityDisplay(); final TestActivityContainer container = - new TestActivityContainer(service, stackId, display, onTop); + new TestActivityContainer(service, stackId, mDisplay, onTop); mActivityContainers.put(stackId, container); return (T) container.getStack(); } |