Merge "Fix NPE when starting activity while no focused task" into rvc-qpr-dev
This commit is contained in:
@@ -1990,7 +1990,7 @@ class ActivityStack extends Task {
|
||||
return mRootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea());
|
||||
}
|
||||
|
||||
void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
|
||||
void startActivityLocked(ActivityRecord r, @Nullable ActivityRecord focusedTopActivity,
|
||||
boolean newTask, boolean keepCurTransition, ActivityOptions options) {
|
||||
Task rTask = r.getTask();
|
||||
final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront();
|
||||
@@ -3336,7 +3336,11 @@ class ActivityStack extends Task {
|
||||
// Do not sleep activities in this stack if we're marked as focused and the keyguard
|
||||
// is in the process of going away.
|
||||
if (isFocusedStackOnDisplay()
|
||||
&& mStackSupervisor.getKeyguardController().isKeyguardGoingAway()) {
|
||||
&& mStackSupervisor.getKeyguardController().isKeyguardGoingAway()
|
||||
// Avoid resuming activities on secondary displays since we don't want bubble
|
||||
// activities to be resumed while bubble is still collapsed.
|
||||
// TODO(b/113840485): Having keyguard going away state for secondary displays.
|
||||
&& display.isDefaultDisplay) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1697,8 +1697,9 @@ class ActivityStarter {
|
||||
mRootWindowContainer.sendPowerHintForLaunchStartIfNeeded(
|
||||
false /* forceSend */, mStartActivity);
|
||||
|
||||
mTargetStack.startActivityLocked(mStartActivity, topStack.getTopNonFinishingActivity(),
|
||||
newTask, mKeepCurTransition, mOptions);
|
||||
mTargetStack.startActivityLocked(mStartActivity,
|
||||
topStack != null ? topStack.getTopNonFinishingActivity() : null, newTask,
|
||||
mKeepCurTransition, mOptions);
|
||||
if (mDoResume) {
|
||||
final ActivityRecord topTaskActivity =
|
||||
mStartActivity.getTask().topRunningActivityLocked();
|
||||
|
||||
@@ -2305,10 +2305,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
||||
|
||||
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
|
||||
final DisplayContent display = getChildAt(displayNdx);
|
||||
if (display.shouldSleep()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean resumedOnDisplay = false;
|
||||
for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
|
||||
final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx);
|
||||
|
||||
@@ -1206,19 +1206,22 @@ public class ActivityStackTests extends ActivityTestsBase {
|
||||
@Test
|
||||
public void testShouldSleepActivities() {
|
||||
// When focused activity and keyguard is going away, we should not sleep regardless
|
||||
// of the display state
|
||||
// of the display state, but keyguard-going-away should only take effects on default
|
||||
// display since there is no keyguard on secondary displays (yet).
|
||||
verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
|
||||
true /* displaySleeping */, false /* expected*/);
|
||||
true /* displaySleeping */, true /* isDefaultDisplay */, false /* expected */);
|
||||
verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
|
||||
true /* displaySleeping */, false /* isDefaultDisplay */, true /* expected */);
|
||||
|
||||
// When not the focused stack, defer to display sleeping state.
|
||||
verifyShouldSleepActivities(false /* focusedStack */, true /*keyguardGoingAway*/,
|
||||
true /* displaySleeping */, true /* expected*/);
|
||||
true /* displaySleeping */, true /* isDefaultDisplay */, true /* expected */);
|
||||
|
||||
// If keyguard is going away, defer to the display sleeping state.
|
||||
verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
|
||||
true /* displaySleeping */, true /* expected*/);
|
||||
true /* displaySleeping */, true /* isDefaultDisplay */, true /* expected */);
|
||||
verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
|
||||
false /* displaySleeping */, false /* expected*/);
|
||||
false /* displaySleeping */, true /* isDefaultDisplay */, false /* expected */);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1428,9 +1431,11 @@ public class ActivityStackTests extends ActivityTestsBase {
|
||||
}
|
||||
|
||||
private void verifyShouldSleepActivities(boolean focusedStack,
|
||||
boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
|
||||
boolean keyguardGoingAway, boolean displaySleeping, boolean isDefaultDisplay,
|
||||
boolean expected) {
|
||||
final DisplayContent display = mock(DisplayContent.class);
|
||||
final KeyguardController keyguardController = mSupervisor.getKeyguardController();
|
||||
display.isDefaultDisplay = isDefaultDisplay;
|
||||
|
||||
doReturn(display).when(mStack).getDisplay();
|
||||
doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway();
|
||||
|
||||
@@ -896,24 +896,6 @@ public class RootActivityContainerTests extends ActivityTestsBase {
|
||||
assertEquals(taskDisplayArea.getTopStack(), taskDisplayArea.getRootHomeTask());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResumeFocusedStackOnSleepingDisplay() {
|
||||
// Create an activity on secondary display.
|
||||
final TestDisplayContent secondDisplay = addNewDisplayContentAt(
|
||||
DisplayContent.POSITION_TOP);
|
||||
final ActivityStack stack = secondDisplay.getDefaultTaskDisplayArea()
|
||||
.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
|
||||
final ActivityRecord activity = new ActivityBuilder(mService).setStack(stack).build();
|
||||
spyOn(activity);
|
||||
spyOn(stack);
|
||||
|
||||
// Cannot resumed activities on secondary display if the display should sleep.
|
||||
doReturn(true).when(secondDisplay).shouldSleep();
|
||||
mRootWindowContainer.resumeFocusedStacksTopActivities();
|
||||
verify(stack, never()).resumeTopActivityUncheckedLocked(any(), any());
|
||||
verify(activity, never()).makeActiveIfNeeded(any());
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock {@link RootWindowContainer#resolveHomeActivity} for returning consistent activity
|
||||
* info for test cases.
|
||||
|
||||
Reference in New Issue
Block a user