Merge "Fix NPE when starting activity while no focused task" into rvc-qpr-dev

This commit is contained in:
Louis Chang
2020-09-15 00:38:58 +00:00
committed by Android (Google) Code Review
5 changed files with 20 additions and 32 deletions

View File

@@ -1990,7 +1990,7 @@ class ActivityStack extends Task {
return mRootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea()); 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) { boolean newTask, boolean keepCurTransition, ActivityOptions options) {
Task rTask = r.getTask(); Task rTask = r.getTask();
final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); 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 // Do not sleep activities in this stack if we're marked as focused and the keyguard
// is in the process of going away. // is in the process of going away.
if (isFocusedStackOnDisplay() 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; return false;
} }

View File

@@ -1697,8 +1697,9 @@ class ActivityStarter {
mRootWindowContainer.sendPowerHintForLaunchStartIfNeeded( mRootWindowContainer.sendPowerHintForLaunchStartIfNeeded(
false /* forceSend */, mStartActivity); false /* forceSend */, mStartActivity);
mTargetStack.startActivityLocked(mStartActivity, topStack.getTopNonFinishingActivity(), mTargetStack.startActivityLocked(mStartActivity,
newTask, mKeepCurTransition, mOptions); topStack != null ? topStack.getTopNonFinishingActivity() : null, newTask,
mKeepCurTransition, mOptions);
if (mDoResume) { if (mDoResume) {
final ActivityRecord topTaskActivity = final ActivityRecord topTaskActivity =
mStartActivity.getTask().topRunningActivityLocked(); mStartActivity.getTask().topRunningActivityLocked();

View File

@@ -2305,10 +2305,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
final DisplayContent display = getChildAt(displayNdx); final DisplayContent display = getChildAt(displayNdx);
if (display.shouldSleep()) {
continue;
}
boolean resumedOnDisplay = false; boolean resumedOnDisplay = false;
for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx);

View File

@@ -1206,19 +1206,22 @@ public class ActivityStackTests extends ActivityTestsBase {
@Test @Test
public void testShouldSleepActivities() { public void testShouldSleepActivities() {
// When focused activity and keyguard is going away, we should not sleep regardless // 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*/, 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. // When not the focused stack, defer to display sleeping state.
verifyShouldSleepActivities(false /* focusedStack */, true /*keyguardGoingAway*/, 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. // If keyguard is going away, defer to the display sleeping state.
verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/, verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
true /* displaySleeping */, true /* expected*/); true /* displaySleeping */, true /* isDefaultDisplay */, true /* expected */);
verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/, verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
false /* displaySleeping */, false /* expected*/); false /* displaySleeping */, true /* isDefaultDisplay */, false /* expected */);
} }
@Test @Test
@@ -1428,9 +1431,11 @@ public class ActivityStackTests extends ActivityTestsBase {
} }
private void verifyShouldSleepActivities(boolean focusedStack, 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 DisplayContent display = mock(DisplayContent.class);
final KeyguardController keyguardController = mSupervisor.getKeyguardController(); final KeyguardController keyguardController = mSupervisor.getKeyguardController();
display.isDefaultDisplay = isDefaultDisplay;
doReturn(display).when(mStack).getDisplay(); doReturn(display).when(mStack).getDisplay();
doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway(); doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway();

View File

@@ -896,24 +896,6 @@ public class RootActivityContainerTests extends ActivityTestsBase {
assertEquals(taskDisplayArea.getTopStack(), taskDisplayArea.getRootHomeTask()); 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 * Mock {@link RootWindowContainer#resolveHomeActivity} for returning consistent activity
* info for test cases. * info for test cases.