Merge "Don't allow pinned activities to request visible behind" into nyc-dev
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 631a129..424d355 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -675,6 +675,14 @@
             return isStaticStack(stackId) || stackId == PINNED_STACK_ID
                     || stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == DOCKED_STACK_ID;
         }
+
+        /**
+         * Returns true if activities contained in this stack can request visible behind by
+         * calling {@link Activity#requestVisibleBehind}.
+         */
+        public static boolean activitiesCanRequestVisibleBehind(int stackId) {
+            return stackId == FULLSCREEN_WORKSPACE_STACK_ID;
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 865ee09..6e2cebb 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2430,6 +2430,12 @@
         try {
             final TaskRecord task = r.task;
 
+            if (r == task.stack.getVisibleBehindActivity()) {
+                // An activity can't be pinned and visible behind at the same time. Go ahead and
+                // release it from been visible behind before pinning.
+                requestVisibleBehindLocked(r, false);
+            }
+
             // Need to make sure the pinned stack exist so we can resize it below...
             final ActivityStack stack = getStack(PINNED_STACK_ID, CREATE_IF_NEEDED, ON_TOP);
 
@@ -2689,6 +2695,14 @@
                     "requestVisibleBehind: r=" + r + " visible=" + visible + " stack is null");
             return false;
         }
+
+        if (visible && !StackId.activitiesCanRequestVisibleBehind(stack.mStackId)) {
+            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: r=" + r
+                    + " visible=" + visible + " stackId=" + stack.mStackId
+                    + " can't contain visible behind activities");
+            return false;
+        }
+
         final boolean isVisible = stack.hasVisibleBehindActivity();
         if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
                 "requestVisibleBehind r=" + r + " visible=" + visible + " isVisible=" + isVisible);