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

Commit e23d2466 authored by Riddle Hsu's avatar Riddle Hsu Committed by Android (Google) Code Review
Browse files

Merge "Fix process state of top app while device is sleeping"

parents bcf16c15 a04091ab
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2040,6 +2040,11 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
        final ActivityRecord prevTopActivity = mTopResumedActivity;
        final Task topStack = mRootWindowContainer.getTopDisplayFocusedStack();
        if (topStack == null || topStack.mResumedActivity == prevTopActivity) {
            if (mService.isSleepingLocked()) {
                // There won't be a next resumed activity. The top process should still be updated
                // according to the current top focused activity.
                mService.updateTopApp(null /* topResumedActivity */);
            }
            return;
        }

+2 −5
Original line number Diff line number Diff line
@@ -5547,11 +5547,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    }

    void updateTopApp(ActivityRecord topResumedActivity) {
        // If system is sleeping, use the given record (it should be null) because there won't be
        // the next resumed activity. Otherwise the process of pausing activity will keep with top
        // state even the activity has paused and stopped.
        final ActivityRecord top = mSleeping || topResumedActivity != null ? topResumedActivity
                // If there is no resumed activity, it will choose the pausing activity.
        final ActivityRecord top = topResumedActivity != null ? topResumedActivity
                // If there is no resumed activity, it will choose the pausing or focused activity.
                : mRootWindowContainer.getTopResumedActivity();
        mTopApp = top != null ? top.app : null;
    }
+1 −6
Original line number Diff line number Diff line
@@ -511,6 +511,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
    void onChildPositionChanged(WindowContainer child) {
        mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
                !mWmService.mPerDisplayFocusEnabled /* updateInputWindows */);
        mStackSupervisor.updateTopResumedActivityIfNeeded();
    }

    /**
@@ -2626,12 +2627,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
                + " in=" + taskDisplayArea);
    }

    @Override
    void positionChildAt(int position, DisplayContent child, boolean includingParents) {
        super.positionChildAt(position, child, includingParents);
        mStackSupervisor.updateTopResumedActivityIfNeeded();
    }

    Configuration getDisplayOverrideConfiguration(int displayId) {
        final DisplayContent displayContent = getDisplayContentOrCreate(displayId);
        if (displayContent == null) {
+13 −5
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.MockitoSession;

import java.util.ArrayList;
import java.util.function.Consumer;

/**
 * Tests for the {@link ActivityTaskManagerService} class.
@@ -261,15 +262,17 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
    public void testUpdateSleep() {
        doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay();
        mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class);
        final ActivityRecord homeActivity = new ActivityBuilder(mAtm)
                .setTask(mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()).build();
        final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build();
        topActivity.setState(Task.ActivityState.RESUMED, "test");

        final Runnable assertTopNonSleeping = () -> {
        final Consumer<ActivityRecord> assertTopNonSleeping = activity -> {
            assertFalse(mAtm.mInternal.isSleeping());
            assertEquals(ActivityManager.PROCESS_STATE_TOP, mAtm.mInternal.getTopProcessState());
            assertEquals(topActivity.app, mAtm.mInternal.getTopApp());
            assertEquals(activity.app, mAtm.mInternal.getTopApp());
        };
        assertTopNonSleeping.run();
        assertTopNonSleeping.accept(topActivity);

        // Sleep all displays.
        mWm.mRoot.forAllDisplays(display -> doReturn(true).when(display).shouldSleep());
@@ -279,13 +282,18 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
        assertTrue(mAtm.mInternal.isSleeping());
        assertEquals(ActivityManager.PROCESS_STATE_TOP_SLEEPING,
                mAtm.mInternal.getTopProcessState());
        assertNull(mAtm.mInternal.getTopApp());
        // The top app should not change while sleeping.
        assertEquals(topActivity.app, mAtm.mInternal.getTopApp());

        // Move the current top to back, the top app should update to the next activity.
        topActivity.getRootTask().moveToBack("test", null /* self */);
        assertEquals(homeActivity.app, mAtm.mInternal.getTopApp());

        // Wake all displays.
        mWm.mRoot.forAllDisplays(display -> doReturn(false).when(display).shouldSleep());
        mAtm.updateSleepIfNeededLocked();

        assertTopNonSleeping.run();
        assertTopNonSleeping.accept(homeActivity);
    }
}