summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Louis Chang <louischang@google.com> 2020-09-25 06:38:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-09-25 06:38:33 +0000
commit28c7e80a3048ae42eea8efde147cc9796cfd9700 (patch)
tree338ba981f827c82603950ac787f701f0720ae8c6
parent97b367c2d7028f838a530f0d7bc145c09c79a5cf (diff)
parent0f26f573f5f79970a99b46c0b55b8c1d4e106ae5 (diff)
Merge "RESTRICT AUTOMERGE Make task visible if activity launched behind" into rvc-qpr-dev
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java38
-rw-r--r--services/core/java/com/android/server/wm/Task.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java2
3 files changed, 35 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index a65eca832f48..72cd32f8d057 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -48,6 +48,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
+import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE;
import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
import static com.android.server.wm.ActivityStackSupervisor.dumpHistoryList;
@@ -1931,24 +1932,29 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
boolean attachApplication(WindowProcessController app) throws RemoteException {
- final String processName = app.mName;
boolean didSomething = false;
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
- final DisplayContent display = getChildAt(displayNdx);
- final ActivityStack stack = display.getFocusedStack();
- if (stack == null) {
- continue;
- }
-
mTmpRemoteException = null;
mTmpBoolean = false; // Set to true if an activity was started.
- final PooledFunction c = PooledLambda.obtainFunction(
- RootWindowContainer::startActivityForAttachedApplicationIfNeeded, this,
- PooledLambda.__(ActivityRecord.class), app, stack.topRunningActivity());
- stack.forAllActivities(c);
- c.recycle();
- if (mTmpRemoteException != null) {
- throw mTmpRemoteException;
+
+ final DisplayContent display = getChildAt(displayNdx);
+ for (int areaNdx = display.getTaskDisplayAreaCount() - 1; areaNdx >= 0; --areaNdx) {
+ final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(areaNdx);
+ for (int taskNdx = taskDisplayArea.getStackCount() - 1; taskNdx >= 0; --taskNdx) {
+ final ActivityStack rootTask = taskDisplayArea.getStackAt(taskNdx);
+ if (rootTask.getVisibility(null /*starting*/) == STACK_VISIBILITY_INVISIBLE) {
+ break;
+ }
+ final PooledFunction c = PooledLambda.obtainFunction(
+ RootWindowContainer::startActivityForAttachedApplicationIfNeeded, this,
+ PooledLambda.__(ActivityRecord.class), app,
+ rootTask.topRunningActivity());
+ rootTask.forAllActivities(c);
+ c.recycle();
+ if (mTmpRemoteException != null) {
+ throw mTmpRemoteException;
+ }
+ }
}
didSomething |= mTmpBoolean;
}
@@ -1966,8 +1972,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
try {
- if (mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/,
- true /*checkConfig*/)) {
+ if (mStackSupervisor.realStartActivityLocked(r, app,
+ top == r && r.isFocusable() /*andResume*/, true /*checkConfig*/)) {
mTmpBoolean = true;
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 3a750f2c9da3..db3c74fc94af 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3671,6 +3671,10 @@ class Task extends WindowContainer<WindowContainer> {
return STACK_VISIBILITY_INVISIBLE;
}
+ if (isTopActivityLaunchedBehind()) {
+ return STACK_VISIBILITY_VISIBLE;
+ }
+
boolean gotSplitScreenStack = false;
boolean gotOpaqueSplitScreenPrimary = false;
boolean gotOpaqueSplitScreenSecondary = false;
@@ -3788,6 +3792,14 @@ class Task extends WindowContainer<WindowContainer> {
: STACK_VISIBILITY_VISIBLE;
}
+ private boolean isTopActivityLaunchedBehind() {
+ final ActivityRecord top = topRunningActivity();
+ if (top != null && top.mLaunchTaskBehind) {
+ return true;
+ }
+ return false;
+ }
+
ActivityRecord isInTask(ActivityRecord r) {
if (r == null) {
return null;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 02a3bb1f5632..a37f4be506e5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -548,7 +548,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
final ActivityStack stack = new StackBuilder(mRootWindowContainer).build();
try {
doReturn(false).when(stack).isTranslucent(any());
- assertFalse(mStack.shouldBeVisible(null /* starting */));
+ assertTrue(mStack.shouldBeVisible(null /* starting */));
mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
mActivity.getConfiguration()));