Allow stacks behind a translucent fullscreen stack to be visible

Stacks behind the fullscreen stack with a translucent activity
are always visible so they can act as a backdrop to the translucent
activity.

Bug: 23626353
Change-Id: I3d76ae6bedbba90736706474dcab53d75b60304a
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index ee4dbd4..a42fbfe 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1335,17 +1335,28 @@
             return topHomeActivity == null || !topHomeActivity.isHomeActivity();
         }
 
-        if (focusedStackId == DOCKED_STACK_ID
-                && stackIndex == (mStacks.indexOf(focusedStack) - 1)) {
+        final int belowFocusedIndex = mStacks.indexOf(focusedStack) - 1;
+        if (focusedStackId == DOCKED_STACK_ID && stackIndex == belowFocusedIndex) {
             // Stacks directly behind the docked stack are always visible.
             return true;
         }
 
-        if (mStackId == HOME_STACK_ID && focusedStackId == FULLSCREEN_WORKSPACE_STACK_ID) {
-            // Home stack is always visible behind the fullscreen stack with a translucent activity.
-            // This is done so that the home stack can act as a background to the translucent
-            // activity.
-            return hasTranslucentActivity(focusedStack);
+        if (focusedStackId == FULLSCREEN_WORKSPACE_STACK_ID
+                && hasTranslucentActivity(focusedStack)) {
+            // Stacks behind the fullscreen stack with a translucent activity are always
+            // visible so they can act as a backdrop to the translucent activity.
+            // For example, dialog activities
+            if (stackIndex == belowFocusedIndex) {
+                return true;
+            }
+            if (belowFocusedIndex >= 0) {
+                final ActivityStack stack = mStacks.get(belowFocusedIndex);
+                if (stack.mStackId == DOCKED_STACK_ID && stackIndex == (belowFocusedIndex - 1)) {
+                    // The stack behind the docked stack is also visible so we can have a complete
+                    // backdrop to the translucent activity when the docked stack is up.
+                    return true;
+                }
+            }
         }
 
         if (mStackId >= FIRST_STATIC_STACK_ID && mStackId <= LAST_STATIC_STACK_ID) {