Loading services/core/java/com/android/server/wm/DisplayContent.java +1 −1 Original line number Diff line number Diff line Loading @@ -4919,7 +4919,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInsetsStateController.getImeSourceProvider().checkShowImePostLayout(); mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent; if (!mWmService.mDisplayFrozen && !mDisplayRotation.isRotatingSeamlessly()) { if (!inTransition() && !mDisplayRotation.isRotatingSeamlessly()) { mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId, mLastHasContent, mTmpApplySurfaceChangesTransactionState.preferredRefreshRate, Loading services/core/java/com/android/server/wm/RefreshRatePolicy.java +4 −7 Original line number Diff line number Diff line Loading @@ -19,9 +19,6 @@ package com.android.server.wm; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_NONE; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; import android.hardware.display.DisplayManager; import android.view.Display; import android.view.Display.Mode; Loading Loading @@ -140,7 +137,7 @@ class RefreshRatePolicy { // to run in default refresh rate. But if the display size of default mode is different // from the using preferred mode, then still keep the preferred mode to avoid disturbing // the animation. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { Display.Mode preferredMode = null; for (Display.Mode mode : mDisplayInfo.supportedModes) { if (preferredDisplayModeId == mode.getModeId()) { Loading Loading @@ -254,7 +251,7 @@ class RefreshRatePolicy { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return w.mFrameRateVote.reset(); } Loading Loading @@ -293,7 +290,7 @@ class RefreshRatePolicy { float getPreferredMinRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return 0; } Loading @@ -316,7 +313,7 @@ class RefreshRatePolicy { float getPreferredMaxRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return 0; } Loading services/core/java/com/android/server/wm/WindowState.java +5 −5 Original line number Diff line number Diff line Loading @@ -2084,7 +2084,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final ActivityRecord atoken = mActivityRecord; return isDrawn() && isVisibleByPolicy() && ((!isParentWindowHidden() && (atoken == null || atoken.isVisibleRequested())) || isAnimating(TRANSITION | PARENTS)); || isAnimationRunningSelfOrParent()); } /** Loading Loading @@ -2327,7 +2327,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean isObscuringDisplay() { Task task = getTask(); if (task != null && task.getRootTask() != null && !task.getRootTask().fillsParent()) { if (task != null && !task.fillsParent()) { return false; } return isOpaqueDrawn() && fillsDisplay(); Loading Loading @@ -2592,7 +2592,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } final boolean isAnimating = allowExitAnimation && (mAnimatingExit || isExitAnimationRunningSelfOrParent()); && (mAnimatingExit || isAnimationRunningSelfOrParent()); final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null && mActivityRecord.isLastWindow(this); // We delay the removal of a window if it has a showing surface that can be used to run Loading Loading @@ -4989,7 +4989,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return false; } boolean isExitAnimationRunningSelfOrParent() { boolean isAnimationRunningSelfOrParent() { return inTransitionSelfOrParent() || isAnimating(0 /* flags */, ANIMATION_TYPE_WINDOW_ANIMATION); } Loading @@ -5005,7 +5005,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } // Exit animation is running. if (isExitAnimationRunningSelfOrParent()) { if (isAnimationRunningSelfOrParent()) { ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "shouldWaitAnimatingExit: isAnimating: %s", this); return false; Loading services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Parcel; import android.platform.test.annotations.Presubmit; import android.view.Display.Mode; import android.view.Surface; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import androidx.test.filters.FlakyTest; Loading Loading @@ -292,6 +293,14 @@ public class RefreshRatePolicyTest extends WindowTestsBase { assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); // Use default mode if it is animating by shell transition. overrideWindow.mActivityRecord.mSurfaceAnimator.cancelAnimation(); registerTestTransitionPlayer(); final Transition transition = overrideWindow.mTransitionController.createTransition( WindowManager.TRANSIT_OPEN); transition.collect(overrideWindow.mActivityRecord); assertEquals(0, mPolicy.getPreferredModeId(overrideWindow)); // If there will be display size change when switching from preferred mode to default mode, // then keep the current preferred mode during animating. mDisplayInfo = spy(mDisplayInfo); Loading services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { final WindowSurfaceController surfaceController = mock(WindowSurfaceController.class); doReturn(true).when(surfaceController).hasSurface(); spyOn(win); doReturn(true).when(win).isExitAnimationRunningSelfOrParent(); doReturn(true).when(win).isAnimationRunningSelfOrParent(); win.mWinAnimator.mSurfaceController = surfaceController; win.mViewVisibility = View.VISIBLE; win.mHasSurface = true; Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +1 −1 Original line number Diff line number Diff line Loading @@ -4919,7 +4919,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInsetsStateController.getImeSourceProvider().checkShowImePostLayout(); mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent; if (!mWmService.mDisplayFrozen && !mDisplayRotation.isRotatingSeamlessly()) { if (!inTransition() && !mDisplayRotation.isRotatingSeamlessly()) { mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId, mLastHasContent, mTmpApplySurfaceChangesTransactionState.preferredRefreshRate, Loading
services/core/java/com/android/server/wm/RefreshRatePolicy.java +4 −7 Original line number Diff line number Diff line Loading @@ -19,9 +19,6 @@ package com.android.server.wm; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_NONE; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; import android.hardware.display.DisplayManager; import android.view.Display; import android.view.Display.Mode; Loading Loading @@ -140,7 +137,7 @@ class RefreshRatePolicy { // to run in default refresh rate. But if the display size of default mode is different // from the using preferred mode, then still keep the preferred mode to avoid disturbing // the animation. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { Display.Mode preferredMode = null; for (Display.Mode mode : mDisplayInfo.supportedModes) { if (preferredDisplayModeId == mode.getModeId()) { Loading Loading @@ -254,7 +251,7 @@ class RefreshRatePolicy { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return w.mFrameRateVote.reset(); } Loading Loading @@ -293,7 +290,7 @@ class RefreshRatePolicy { float getPreferredMinRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return 0; } Loading @@ -316,7 +313,7 @@ class RefreshRatePolicy { float getPreferredMaxRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. if (w.isAnimating(TRANSITION | PARENTS)) { if (w.isAnimationRunningSelfOrParent()) { return 0; } Loading
services/core/java/com/android/server/wm/WindowState.java +5 −5 Original line number Diff line number Diff line Loading @@ -2084,7 +2084,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final ActivityRecord atoken = mActivityRecord; return isDrawn() && isVisibleByPolicy() && ((!isParentWindowHidden() && (atoken == null || atoken.isVisibleRequested())) || isAnimating(TRANSITION | PARENTS)); || isAnimationRunningSelfOrParent()); } /** Loading Loading @@ -2327,7 +2327,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean isObscuringDisplay() { Task task = getTask(); if (task != null && task.getRootTask() != null && !task.getRootTask().fillsParent()) { if (task != null && !task.fillsParent()) { return false; } return isOpaqueDrawn() && fillsDisplay(); Loading Loading @@ -2592,7 +2592,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } final boolean isAnimating = allowExitAnimation && (mAnimatingExit || isExitAnimationRunningSelfOrParent()); && (mAnimatingExit || isAnimationRunningSelfOrParent()); final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null && mActivityRecord.isLastWindow(this); // We delay the removal of a window if it has a showing surface that can be used to run Loading Loading @@ -4989,7 +4989,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return false; } boolean isExitAnimationRunningSelfOrParent() { boolean isAnimationRunningSelfOrParent() { return inTransitionSelfOrParent() || isAnimating(0 /* flags */, ANIMATION_TYPE_WINDOW_ANIMATION); } Loading @@ -5005,7 +5005,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } // Exit animation is running. if (isExitAnimationRunningSelfOrParent()) { if (isAnimationRunningSelfOrParent()) { ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "shouldWaitAnimatingExit: isAnimating: %s", this); return false; Loading
services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Parcel; import android.platform.test.annotations.Presubmit; import android.view.Display.Mode; import android.view.Surface; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import androidx.test.filters.FlakyTest; Loading Loading @@ -292,6 +293,14 @@ public class RefreshRatePolicyTest extends WindowTestsBase { assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); // Use default mode if it is animating by shell transition. overrideWindow.mActivityRecord.mSurfaceAnimator.cancelAnimation(); registerTestTransitionPlayer(); final Transition transition = overrideWindow.mTransitionController.createTransition( WindowManager.TRANSIT_OPEN); transition.collect(overrideWindow.mActivityRecord); assertEquals(0, mPolicy.getPreferredModeId(overrideWindow)); // If there will be display size change when switching from preferred mode to default mode, // then keep the current preferred mode during animating. mDisplayInfo = spy(mDisplayInfo); Loading
services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { final WindowSurfaceController surfaceController = mock(WindowSurfaceController.class); doReturn(true).when(surfaceController).hasSurface(); spyOn(win); doReturn(true).when(win).isExitAnimationRunningSelfOrParent(); doReturn(true).when(win).isAnimationRunningSelfOrParent(); win.mWinAnimator.mSurfaceController = surfaceController; win.mViewVisibility = View.VISIBLE; win.mHasSurface = true; Loading