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());
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user