summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Bryce Lee <brycelee@google.com> 2017-05-05 16:29:37 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-05-05 16:29:46 +0000
commita087127e77dafb49c89de85549e1a61723cec6a7 (patch)
treea71e5958b72ec01c51e816591df6812ca7cc6733
parent2d2689add79f451be39613898c8e1599a4f5e2c9 (diff)
parent943ebe705cece8f643d9d7ace005322ddf114d86 (diff)
Merge "Prevent NPE in ActivityStack#shouldbeVisible." into oc-dev
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java6
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();
}