Loading core/java/android/view/WindowManager.java +13 −0 Original line number Diff line number Diff line Loading @@ -3781,6 +3781,7 @@ public interface WindowManager extends ViewManager { out.writeInt(screenOrientation); out.writeFloat(preferredRefreshRate); out.writeInt(preferredDisplayModeId); out.writeFloat(preferredMaxDisplayRefreshRate); out.writeInt(systemUiVisibility); out.writeInt(subtreeSystemUiVisibility); out.writeBoolean(hasSystemUiListeners); Loading Loading @@ -3851,6 +3852,7 @@ public interface WindowManager extends ViewManager { screenOrientation = in.readInt(); preferredRefreshRate = in.readFloat(); preferredDisplayModeId = in.readInt(); preferredMaxDisplayRefreshRate = in.readFloat(); systemUiVisibility = in.readInt(); subtreeSystemUiVisibility = in.readInt(); hasSystemUiListeners = in.readBoolean(); Loading Loading @@ -3928,6 +3930,8 @@ public interface WindowManager extends ViewManager { public static final int MINIMAL_POST_PROCESSING_PREFERENCE_CHANGED = 1 << 28; /** {@hide} */ public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29; /** {@hide} */ public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 30; // internal buffer to backup/restore parameters under compatibility mode. private int[] mCompatibilityParamsBackup = null; Loading Loading @@ -4059,6 +4063,11 @@ public interface WindowManager extends ViewManager { changes |= PREFERRED_DISPLAY_MODE_ID; } if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) { preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate; changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE; } if (systemUiVisibility != o.systemUiVisibility || subtreeSystemUiVisibility != o.subtreeSystemUiVisibility) { systemUiVisibility = o.systemUiVisibility; Loading Loading @@ -4263,6 +4272,10 @@ public interface WindowManager extends ViewManager { sb.append(" preferredDisplayMode="); sb.append(preferredDisplayModeId); } if (preferredMaxDisplayRefreshRate != 0) { sb.append(" preferredMaxDisplayRefreshRate="); sb.append(preferredMaxDisplayRefreshRate); } if (hasSystemUiListeners) { sb.append(" sysuil="); sb.append(hasSystemUiListeners); Loading services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.Parcel; import android.platform.test.annotations.Presubmit; import android.view.Display.Mode; import android.view.DisplayInfo; import android.view.WindowManager.LayoutParams; import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; Loading @@ -50,6 +52,16 @@ public class RefreshRatePolicyTest extends WindowTestsBase { private RefreshRatePolicy mPolicy; private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class); // Parcel and Unparcel the LayoutParams in the window state to test the path the object // travels from the app's process to system server void parcelLayoutParams(WindowState window) { Parcel parcel = Parcel.obtain(); window.mAttrs.writeToParcel(parcel, 0); parcel.setDataPosition(0); window.mAttrs.copyFrom(new LayoutParams(parcel)); parcel.recycle(); } @Before public void setUp() { DisplayInfo di = new DisplayInfo(mDisplayInfo); Loading @@ -69,6 +81,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION, "cameraUsingWindow"); cameraUsingWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(cameraUsingWindow); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); Loading @@ -86,6 +99,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION, "denylistedWindow"); denylistedWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(denylistedWindow); when(mDenylist.isDenylisted("com.android.test")).thenReturn(true); assertEquals(0, mPolicy.getPreferredModeId(denylistedWindow)); assertEquals(60, mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE); Loading @@ -97,6 +111,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); when(mDenylist.isDenylisted("com.android.test")).thenReturn(true); assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(60, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); Loading @@ -108,6 +123,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); Loading @@ -120,6 +136,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation( overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class), false /* hidden */, ANIMATION_TYPE_APP_TRANSITION); Loading @@ -134,6 +151,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION, "cameraUsingWindow"); cameraUsingWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(cameraUsingWindow); mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); Loading @@ -152,6 +170,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { public void testAppMaxRefreshRate() { final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window"); window.mAttrs.preferredMaxDisplayRefreshRate = 60f; parcelLayoutParams(window); assertEquals(0, mPolicy.getPreferredModeId(window)); assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE); assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE); Loading Loading
core/java/android/view/WindowManager.java +13 −0 Original line number Diff line number Diff line Loading @@ -3781,6 +3781,7 @@ public interface WindowManager extends ViewManager { out.writeInt(screenOrientation); out.writeFloat(preferredRefreshRate); out.writeInt(preferredDisplayModeId); out.writeFloat(preferredMaxDisplayRefreshRate); out.writeInt(systemUiVisibility); out.writeInt(subtreeSystemUiVisibility); out.writeBoolean(hasSystemUiListeners); Loading Loading @@ -3851,6 +3852,7 @@ public interface WindowManager extends ViewManager { screenOrientation = in.readInt(); preferredRefreshRate = in.readFloat(); preferredDisplayModeId = in.readInt(); preferredMaxDisplayRefreshRate = in.readFloat(); systemUiVisibility = in.readInt(); subtreeSystemUiVisibility = in.readInt(); hasSystemUiListeners = in.readBoolean(); Loading Loading @@ -3928,6 +3930,8 @@ public interface WindowManager extends ViewManager { public static final int MINIMAL_POST_PROCESSING_PREFERENCE_CHANGED = 1 << 28; /** {@hide} */ public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29; /** {@hide} */ public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 30; // internal buffer to backup/restore parameters under compatibility mode. private int[] mCompatibilityParamsBackup = null; Loading Loading @@ -4059,6 +4063,11 @@ public interface WindowManager extends ViewManager { changes |= PREFERRED_DISPLAY_MODE_ID; } if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) { preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate; changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE; } if (systemUiVisibility != o.systemUiVisibility || subtreeSystemUiVisibility != o.subtreeSystemUiVisibility) { systemUiVisibility = o.systemUiVisibility; Loading Loading @@ -4263,6 +4272,10 @@ public interface WindowManager extends ViewManager { sb.append(" preferredDisplayMode="); sb.append(preferredDisplayModeId); } if (preferredMaxDisplayRefreshRate != 0) { sb.append(" preferredMaxDisplayRefreshRate="); sb.append(preferredMaxDisplayRefreshRate); } if (hasSystemUiListeners) { sb.append(" sysuil="); sb.append(hasSystemUiListeners); Loading
services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.Parcel; import android.platform.test.annotations.Presubmit; import android.view.Display.Mode; import android.view.DisplayInfo; import android.view.WindowManager.LayoutParams; import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; Loading @@ -50,6 +52,16 @@ public class RefreshRatePolicyTest extends WindowTestsBase { private RefreshRatePolicy mPolicy; private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class); // Parcel and Unparcel the LayoutParams in the window state to test the path the object // travels from the app's process to system server void parcelLayoutParams(WindowState window) { Parcel parcel = Parcel.obtain(); window.mAttrs.writeToParcel(parcel, 0); parcel.setDataPosition(0); window.mAttrs.copyFrom(new LayoutParams(parcel)); parcel.recycle(); } @Before public void setUp() { DisplayInfo di = new DisplayInfo(mDisplayInfo); Loading @@ -69,6 +81,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION, "cameraUsingWindow"); cameraUsingWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(cameraUsingWindow); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); Loading @@ -86,6 +99,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION, "denylistedWindow"); denylistedWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(denylistedWindow); when(mDenylist.isDenylisted("com.android.test")).thenReturn(true); assertEquals(0, mPolicy.getPreferredModeId(denylistedWindow)); assertEquals(60, mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE); Loading @@ -97,6 +111,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); when(mDenylist.isDenylisted("com.android.test")).thenReturn(true); assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(60, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); Loading @@ -108,6 +123,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); Loading @@ -120,6 +136,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { "overrideWindow"); overrideWindow.mAttrs.packageName = "com.android.test"; overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID; parcelLayoutParams(overrideWindow); overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation( overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class), false /* hidden */, ANIMATION_TYPE_APP_TRANSITION); Loading @@ -134,6 +151,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION, "cameraUsingWindow"); cameraUsingWindow.mAttrs.packageName = "com.android.test"; parcelLayoutParams(cameraUsingWindow); mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); Loading @@ -152,6 +170,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { public void testAppMaxRefreshRate() { final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window"); window.mAttrs.preferredMaxDisplayRefreshRate = 60f; parcelLayoutParams(window); assertEquals(0, mPolicy.getPreferredModeId(window)); assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE); assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE); Loading