RESTRICT AUTOMERGE Make task visible if activity launched behind
Activities were unable to be started while dream started and keyguard locked because the started activities were not on the top-most focused tasks (it was the dream task on top). Even the activities were set as launched behind, the visibilities of the belonging tasks were still invisible and aborted the launches. Making the task visible if the top activity is launched behind and also starting activities on all visible tasks for attached application. Bug: 168326273 Test: making phone call on Auto while Dream started on Phone Test: atest DreamManagerServiceTests Test: atest ActivityRecordTests Change-Id: I199435bcfc7593e6c58488cd6de7c2289d5d0e20
This commit is contained in:
@@ -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.RESUMED;
|
||||||
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
|
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.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.DEFER_RESUME;
|
||||||
import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
|
import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
|
||||||
import static com.android.server.wm.ActivityStackSupervisor.dumpHistoryList;
|
import static com.android.server.wm.ActivityStackSupervisor.dumpHistoryList;
|
||||||
@@ -1931,24 +1932,29 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean attachApplication(WindowProcessController app) throws RemoteException {
|
boolean attachApplication(WindowProcessController app) throws RemoteException {
|
||||||
final String processName = app.mName;
|
|
||||||
boolean didSomething = false;
|
boolean didSomething = false;
|
||||||
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
|
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
|
||||||
final DisplayContent display = getChildAt(displayNdx);
|
|
||||||
final ActivityStack stack = display.getFocusedStack();
|
|
||||||
if (stack == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
mTmpRemoteException = null;
|
mTmpRemoteException = null;
|
||||||
mTmpBoolean = false; // Set to true if an activity was started.
|
mTmpBoolean = false; // Set to true if an activity was started.
|
||||||
final PooledFunction c = PooledLambda.obtainFunction(
|
|
||||||
RootWindowContainer::startActivityForAttachedApplicationIfNeeded, this,
|
final DisplayContent display = getChildAt(displayNdx);
|
||||||
PooledLambda.__(ActivityRecord.class), app, stack.topRunningActivity());
|
for (int areaNdx = display.getTaskDisplayAreaCount() - 1; areaNdx >= 0; --areaNdx) {
|
||||||
stack.forAllActivities(c);
|
final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(areaNdx);
|
||||||
c.recycle();
|
for (int taskNdx = taskDisplayArea.getStackCount() - 1; taskNdx >= 0; --taskNdx) {
|
||||||
if (mTmpRemoteException != null) {
|
final ActivityStack rootTask = taskDisplayArea.getStackAt(taskNdx);
|
||||||
throw mTmpRemoteException;
|
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;
|
didSomething |= mTmpBoolean;
|
||||||
}
|
}
|
||||||
@@ -1966,8 +1972,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/,
|
if (mStackSupervisor.realStartActivityLocked(r, app,
|
||||||
true /*checkConfig*/)) {
|
top == r && r.isFocusable() /*andResume*/, true /*checkConfig*/)) {
|
||||||
mTmpBoolean = true;
|
mTmpBoolean = true;
|
||||||
}
|
}
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
|
|||||||
@@ -3671,6 +3671,10 @@ class Task extends WindowContainer<WindowContainer> {
|
|||||||
return STACK_VISIBILITY_INVISIBLE;
|
return STACK_VISIBILITY_INVISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isTopActivityLaunchedBehind()) {
|
||||||
|
return STACK_VISIBILITY_VISIBLE;
|
||||||
|
}
|
||||||
|
|
||||||
boolean gotSplitScreenStack = false;
|
boolean gotSplitScreenStack = false;
|
||||||
boolean gotOpaqueSplitScreenPrimary = false;
|
boolean gotOpaqueSplitScreenPrimary = false;
|
||||||
boolean gotOpaqueSplitScreenSecondary = false;
|
boolean gotOpaqueSplitScreenSecondary = false;
|
||||||
@@ -3788,6 +3792,14 @@ class Task extends WindowContainer<WindowContainer> {
|
|||||||
: STACK_VISIBILITY_VISIBLE;
|
: STACK_VISIBILITY_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isTopActivityLaunchedBehind() {
|
||||||
|
final ActivityRecord top = topRunningActivity();
|
||||||
|
if (top != null && top.mLaunchTaskBehind) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
ActivityRecord isInTask(ActivityRecord r) {
|
ActivityRecord isInTask(ActivityRecord r) {
|
||||||
if (r == null) {
|
if (r == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -548,7 +548,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
|
|||||||
final ActivityStack stack = new StackBuilder(mRootWindowContainer).build();
|
final ActivityStack stack = new StackBuilder(mRootWindowContainer).build();
|
||||||
try {
|
try {
|
||||||
doReturn(false).when(stack).isTranslucent(any());
|
doReturn(false).when(stack).isTranslucent(any());
|
||||||
assertFalse(mStack.shouldBeVisible(null /* starting */));
|
assertTrue(mStack.shouldBeVisible(null /* starting */));
|
||||||
|
|
||||||
mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
|
mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
|
||||||
mActivity.getConfiguration()));
|
mActivity.getConfiguration()));
|
||||||
|
|||||||
Reference in New Issue
Block a user