Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c6907db authored by Louis Chang's avatar Louis Chang Committed by Android (Google) Code Review
Browse files

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

parents ea029eeb 75cf7679
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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;
        }

+3 −2
Original line number Diff line number Diff line
@@ -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();
+0 −4
Original line number Diff line number Diff line
@@ -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);
+11 −6
Original line number Diff line number Diff line
@@ -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();
+0 −18
Original line number Diff line number Diff line
@@ -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.