Loading core/java/android/window/flags/windowing_frontend.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,17 @@ flag { } } flag { name: "use_visible_requested_for_process_tracker" namespace: "windowing_frontend" description: "Do not count closing activity as visible process" bug: "396653764" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } flag { name: "ensure_wallpaper_in_transitions" namespace: "windowing_frontend" Loading services/core/java/com/android/server/wm/WindowProcessController.java +21 −9 Original line number Diff line number Diff line Loading @@ -337,6 +337,11 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio public static final int ACTIVITY_STATE_FLAG_VISIBLE_MULTI_WINDOW_MODE = 1 << 25; public static final int ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER = 0x0000ffff; private static final int ACTIVITY_STATE_VISIBLE = com.android.window.flags.Flags.useVisibleRequestedForProcessTracker() ? ACTIVITY_STATE_FLAG_IS_VISIBLE : ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE; /** * The state for oom-adjustment calculation. The higher 16 bits are the activity states, and the * lower 16 bits are the task layer rank (see {@link Task#mLayerRank}). This field is written by Loading Loading @@ -1260,8 +1265,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio int nonOccludedRatio = 0; long perceptibleTaskStoppedTimeMillis = Long.MIN_VALUE; final boolean wasResumed = hasResumedActivity(); final boolean wasAnyVisible = (mActivityStateFlags & (ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE)) != 0; final boolean wasAnyVisible = (mActivityStateFlags & ACTIVITY_STATE_VISIBLE) != 0; for (int i = mActivities.size() - 1; i >= 0; i--) { final ActivityRecord r = mActivities.get(i); if (r.isVisible()) { Loading @@ -1275,8 +1279,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (task.mLayerRank != Task.LAYER_RANK_INVISIBLE) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK; } final ActivityRecord.State state = r.getState(); if (r.isVisibleRequested()) { if (r.isState(RESUMED)) { if (state == RESUMED) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_RESUMED; final int windowingMode = r.getWindowingMode(); if (windowingMode == WINDOWING_MODE_MULTI_WINDOW Loading @@ -1301,13 +1306,21 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // this process, we'd find out the one with the minimal layer, thus it'll // get a higher adj score. } else if (!visible && bestInvisibleState != PAUSING) { if (r.isState(PAUSING, PAUSED)) { if (state == PAUSING) { bestInvisibleState = PAUSING; } else if (r.isState(STOPPING)) { // Treat PAUSING as visible in case the next activity in the same process has // not yet been set as visible-requested. if (com.android.window.flags.Flags.useVisibleRequestedForProcessTracker() && r.isVisible()) { stateFlags |= ACTIVITY_STATE_FLAG_IS_VISIBLE; } } else if (state == PAUSED) { bestInvisibleState = PAUSED; } else if (state == STOPPING) { bestInvisibleState = STOPPING; // Not "finishing" if any of activity isn't finishing. allStoppingFinishing &= r.finishing; } else if (bestInvisibleState == DESTROYED && r.isState(STOPPED)) { } else if (bestInvisibleState == DESTROYED && state == STOPPED) { if (task.mIsPerceptible) { perceptibleTaskStoppedTimeMillis = Long.max(r.mStoppedTime, perceptibleTaskStoppedTimeMillis); Loading Loading @@ -1340,7 +1353,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio stateFlags |= minTaskLayer & ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER; if (visible) { stateFlags |= ACTIVITY_STATE_FLAG_IS_VISIBLE; } else if (bestInvisibleState == PAUSING) { } else if (bestInvisibleState == PAUSING || bestInvisibleState == PAUSED) { stateFlags |= ACTIVITY_STATE_FLAG_IS_PAUSING_OR_PAUSED; } else if (bestInvisibleState == STOPPING) { stateFlags |= ACTIVITY_STATE_FLAG_IS_STOPPING; Loading @@ -1351,8 +1364,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio mActivityStateFlags = stateFlags; mPerceptibleTaskStoppedTimeMillis = perceptibleTaskStoppedTimeMillis; final boolean anyVisible = (stateFlags & (ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE)) != 0; final boolean anyVisible = (stateFlags & ACTIVITY_STATE_VISIBLE) != 0; if (!wasAnyVisible && anyVisible) { mAtm.mVisibleActivityProcessTracker.onAnyActivityVisible(this); mAtm.mWindowManager.onProcessActivityVisibilityChanged(mUid, true /*visible*/); Loading services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +8 −3 Original line number Diff line number Diff line Loading @@ -382,12 +382,17 @@ public class WindowProcessControllerTests extends WindowTestsBase { assertFalse(tracker.hasResumedActivity(mWpc.mUid)); assertTrue(mWpc.hasForegroundActivities()); activity.setVisibility(false); activity.setVisibleRequested(false); activity.setState(STOPPED, "test"); if (com.android.window.flags.Flags.useVisibleRequestedForProcessTracker()) { assertTrue("PAUSING is visible", mWpc.hasVisibleActivities()); activity.setState(PAUSED, "test"); } else { activity.setVisible(false); } verify(tracker).onAllActivitiesInvisible(mWpc); assertFalse(mWpc.hasVisibleActivities()); activity.setState(STOPPED, "test"); assertFalse(mWpc.hasForegroundActivities()); } Loading Loading
core/java/android/window/flags/windowing_frontend.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,17 @@ flag { } } flag { name: "use_visible_requested_for_process_tracker" namespace: "windowing_frontend" description: "Do not count closing activity as visible process" bug: "396653764" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } flag { name: "ensure_wallpaper_in_transitions" namespace: "windowing_frontend" Loading
services/core/java/com/android/server/wm/WindowProcessController.java +21 −9 Original line number Diff line number Diff line Loading @@ -337,6 +337,11 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio public static final int ACTIVITY_STATE_FLAG_VISIBLE_MULTI_WINDOW_MODE = 1 << 25; public static final int ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER = 0x0000ffff; private static final int ACTIVITY_STATE_VISIBLE = com.android.window.flags.Flags.useVisibleRequestedForProcessTracker() ? ACTIVITY_STATE_FLAG_IS_VISIBLE : ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE; /** * The state for oom-adjustment calculation. The higher 16 bits are the activity states, and the * lower 16 bits are the task layer rank (see {@link Task#mLayerRank}). This field is written by Loading Loading @@ -1260,8 +1265,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio int nonOccludedRatio = 0; long perceptibleTaskStoppedTimeMillis = Long.MIN_VALUE; final boolean wasResumed = hasResumedActivity(); final boolean wasAnyVisible = (mActivityStateFlags & (ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE)) != 0; final boolean wasAnyVisible = (mActivityStateFlags & ACTIVITY_STATE_VISIBLE) != 0; for (int i = mActivities.size() - 1; i >= 0; i--) { final ActivityRecord r = mActivities.get(i); if (r.isVisible()) { Loading @@ -1275,8 +1279,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (task.mLayerRank != Task.LAYER_RANK_INVISIBLE) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK; } final ActivityRecord.State state = r.getState(); if (r.isVisibleRequested()) { if (r.isState(RESUMED)) { if (state == RESUMED) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_RESUMED; final int windowingMode = r.getWindowingMode(); if (windowingMode == WINDOWING_MODE_MULTI_WINDOW Loading @@ -1301,13 +1306,21 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // this process, we'd find out the one with the minimal layer, thus it'll // get a higher adj score. } else if (!visible && bestInvisibleState != PAUSING) { if (r.isState(PAUSING, PAUSED)) { if (state == PAUSING) { bestInvisibleState = PAUSING; } else if (r.isState(STOPPING)) { // Treat PAUSING as visible in case the next activity in the same process has // not yet been set as visible-requested. if (com.android.window.flags.Flags.useVisibleRequestedForProcessTracker() && r.isVisible()) { stateFlags |= ACTIVITY_STATE_FLAG_IS_VISIBLE; } } else if (state == PAUSED) { bestInvisibleState = PAUSED; } else if (state == STOPPING) { bestInvisibleState = STOPPING; // Not "finishing" if any of activity isn't finishing. allStoppingFinishing &= r.finishing; } else if (bestInvisibleState == DESTROYED && r.isState(STOPPED)) { } else if (bestInvisibleState == DESTROYED && state == STOPPED) { if (task.mIsPerceptible) { perceptibleTaskStoppedTimeMillis = Long.max(r.mStoppedTime, perceptibleTaskStoppedTimeMillis); Loading Loading @@ -1340,7 +1353,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio stateFlags |= minTaskLayer & ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER; if (visible) { stateFlags |= ACTIVITY_STATE_FLAG_IS_VISIBLE; } else if (bestInvisibleState == PAUSING) { } else if (bestInvisibleState == PAUSING || bestInvisibleState == PAUSED) { stateFlags |= ACTIVITY_STATE_FLAG_IS_PAUSING_OR_PAUSED; } else if (bestInvisibleState == STOPPING) { stateFlags |= ACTIVITY_STATE_FLAG_IS_STOPPING; Loading @@ -1351,8 +1364,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio mActivityStateFlags = stateFlags; mPerceptibleTaskStoppedTimeMillis = perceptibleTaskStoppedTimeMillis; final boolean anyVisible = (stateFlags & (ACTIVITY_STATE_FLAG_IS_VISIBLE | ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE)) != 0; final boolean anyVisible = (stateFlags & ACTIVITY_STATE_VISIBLE) != 0; if (!wasAnyVisible && anyVisible) { mAtm.mVisibleActivityProcessTracker.onAnyActivityVisible(this); mAtm.mWindowManager.onProcessActivityVisibilityChanged(mUid, true /*visible*/); Loading
services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +8 −3 Original line number Diff line number Diff line Loading @@ -382,12 +382,17 @@ public class WindowProcessControllerTests extends WindowTestsBase { assertFalse(tracker.hasResumedActivity(mWpc.mUid)); assertTrue(mWpc.hasForegroundActivities()); activity.setVisibility(false); activity.setVisibleRequested(false); activity.setState(STOPPED, "test"); if (com.android.window.flags.Flags.useVisibleRequestedForProcessTracker()) { assertTrue("PAUSING is visible", mWpc.hasVisibleActivities()); activity.setState(PAUSED, "test"); } else { activity.setVisible(false); } verify(tracker).onAllActivitiesInvisible(mWpc); assertFalse(mWpc.hasVisibleActivities()); activity.setState(STOPPED, "test"); assertFalse(mWpc.hasForegroundActivities()); } Loading