From 43896cffe69ffb70ed4d8248c81c9c25f69a7540 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Sat, 16 Apr 2016 10:54:30 -0700 Subject: [PATCH] Don't allow pinned activities to request visible behind Also, release visible behind when pinning a visible behind activity. Bug: 28042883 Change-Id: I1162d7639626f669f648ff82f5c367cb7b3fe6e6 --- core/java/android/app/ActivityManager.java | 8 ++++++++ .../android/server/am/ActivityStackSupervisor.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 631a1293cdc0e..424d3557a5aaa 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -675,6 +675,14 @@ public class ActivityManager { 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 ab3a0b3c1e40f..15400a80e4a0b 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 @@ public final class ActivityStackSupervisor implements DisplayListener { 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 @@ public final class ActivityStackSupervisor implements DisplayListener { "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);