summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/RefreshRatePolicy.java35
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java183
2 files changed, 153 insertions, 65 deletions
diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
index a7c1b578700e..b63843dd20d4 100644
--- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java
+++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
@@ -89,18 +89,13 @@ class RefreshRatePolicy {
}
int getPreferredModeId(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)) {
return 0;
}
- if (w.mAttrs.preferredRefreshRate != 0 || w.mAttrs.preferredDisplayModeId != 0) {
- return w.mAttrs.preferredDisplayModeId;
- }
-
- return 0;
+ return w.mAttrs.preferredDisplayModeId;
}
/**
@@ -134,12 +129,9 @@ class RefreshRatePolicy {
return 0;
}
- final String packageName = w.getOwningPackage();
- if (mHighRefreshRateDenylist.isDenylisted(packageName)) {
- return mLowRefreshRateMode.getRefreshRate();
- }
-
- final int preferredModeId = getPreferredModeId(w);
+ // If the app set a preferredDisplayModeId, the preferred refresh rate is the refresh rate
+ // of that mode id.
+ final int preferredModeId = w.mAttrs.preferredDisplayModeId;
if (preferredModeId > 0) {
DisplayInfo info = w.getDisplayInfo();
if (info != null) {
@@ -151,10 +143,17 @@ class RefreshRatePolicy {
}
}
- if (w.mAttrs.preferredRefreshRate != 0) {
+ if (w.mAttrs.preferredRefreshRate > 0) {
return w.mAttrs.preferredRefreshRate;
}
+ // If the app didn't set a preferred mode id or refresh rate, but it is part of the deny
+ // list, we return the low refresh rate as the preferred one.
+ final String packageName = w.getOwningPackage();
+ if (mHighRefreshRateDenylist.isDenylisted(packageName)) {
+ return mLowRefreshRateMode.getRefreshRate();
+ }
+
return 0;
}
@@ -165,11 +164,6 @@ class RefreshRatePolicy {
return 0;
}
- // If app requests a certain refresh rate or mode, don't override it.
- if (w.mAttrs.preferredDisplayModeId != 0) {
- return 0;
- }
-
return w.mAttrs.preferredMinDisplayRefreshRate;
}
@@ -180,11 +174,6 @@ class RefreshRatePolicy {
return 0;
}
- // If app requests a certain refresh rate or mode, don't override it.
- if (w.mAttrs.preferredDisplayModeId != 0) {
- return 0;
- }
-
if (w.mAttrs.preferredMaxDisplayRefreshRate > 0) {
return w.mAttrs.preferredMaxDisplayRefreshRate;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
index b41872bfa45f..c4cccf022322 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
@@ -27,7 +27,6 @@ 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;
@@ -47,7 +46,14 @@ import org.junit.runner.RunWith;
@FlakyTest
public class RefreshRatePolicyTest extends WindowTestsBase {
private static final float FLOAT_TOLERANCE = 0.01f;
+ private static final int HI_MODE_ID = 1;
+ private static final float HI_REFRESH_RATE = 90;
+
+ private static final int MID_MODE_ID = 2;
+ private static final float MID_REFRESH_RATE = 70;
+
private static final int LOW_MODE_ID = 3;
+ private static final float LOW_REFRESH_RATE = 60;
private RefreshRatePolicy mPolicy;
private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class);
@@ -64,22 +70,31 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
@Before
public void setUp() {
- DisplayInfo di = new DisplayInfo(mDisplayInfo);
- Mode defaultMode = di.getDefaultMode();
- di.supportedModes = new Mode[] {
- new Mode(1, defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 90),
- new Mode(2, defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 70),
+ Mode defaultMode = mDisplayInfo.getDefaultMode();
+ mDisplayInfo.supportedModes = new Mode[] {
+ new Mode(HI_MODE_ID,
+ defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+ HI_REFRESH_RATE),
+ new Mode(MID_MODE_ID,
+ defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+ MID_REFRESH_RATE),
new Mode(LOW_MODE_ID,
- defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 60),
+ defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+ LOW_REFRESH_RATE),
};
- di.defaultModeId = 1;
- mPolicy = new RefreshRatePolicy(mWm, di, mDenylist);
+ mDisplayInfo.defaultModeId = HI_MODE_ID;
+ mPolicy = new RefreshRatePolicy(mWm, mDisplayInfo, mDenylist);
+ }
+
+ WindowState createWindow(String name) {
+ WindowState window = createWindow(null, TYPE_BASE_APPLICATION, name);
+ when(window.getDisplayInfo()).thenReturn(mDisplayInfo);
+ return window;
}
@Test
public void testCamera() {
- final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "cameraUsingWindow");
+ final WindowState cameraUsingWindow = createWindow("cameraUsingWindow");
cameraUsingWindow.mAttrs.packageName = "com.android.test";
parcelLayoutParams(cameraUsingWindow);
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
@@ -90,60 +105,122 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
- assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
mPolicy.removeNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
}
@Test
public void testDenyList() {
- final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "denylistedWindow");
+ final WindowState denylistedWindow = createWindow("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);
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
}
@Test
- public void testAppOverride_blacklist() {
- final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "overrideWindow");
+ public void testAppOverridePreferredModeId_denylist() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
- overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ overrideWindow.mAttrs.preferredDisplayModeId = HI_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);
+ assertEquals(HI_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(HI_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
}
@Test
- public void testAppOverride_camera() {
- final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "overrideWindow");
+ public void testAppOverridePreferredRefreshRate_denylist() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
- overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ overrideWindow.mAttrs.preferredRefreshRate = HI_REFRESH_RATE;
+ parcelLayoutParams(overrideWindow);
+ when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
+ assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(HI_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ }
+
+ @Test
+ public void testAppOverridePreferredModeId_camera() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
+ overrideWindow.mAttrs.packageName = "com.android.test";
+ overrideWindow.mAttrs.preferredDisplayModeId = HI_MODE_ID;
+ parcelLayoutParams(overrideWindow);
+ mPolicy.addNonHighRefreshRatePackage("com.android.test");
+ assertEquals(HI_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(HI_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ }
+
+ @Test
+ public void testAppOverridePreferredRefreshRate_camera() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
+ overrideWindow.mAttrs.packageName = "com.android.test";
+ overrideWindow.mAttrs.preferredRefreshRate = HI_REFRESH_RATE;
parcelLayoutParams(overrideWindow);
mPolicy.addNonHighRefreshRatePackage("com.android.test");
+ assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(HI_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ }
+
+ @Test
+ public void testAnimatingAppOverridePreferredModeId() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
+ overrideWindow.mAttrs.packageName = "com.android.test";
+ overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ parcelLayoutParams(overrideWindow);
assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+
+ overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
+ overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
+ false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
+ assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
}
@Test
- public void testAnimatingAppOverride() {
- final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "overrideWindow");
+ public void testAnimatingAppOverridePreferredRefreshRate() {
+ final WindowState overrideWindow = createWindow("overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
- overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ overrideWindow.mAttrs.preferredRefreshRate = LOW_REFRESH_RATE;
parcelLayoutParams(overrideWindow);
+ assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+
overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
- mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -151,9 +228,29 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
}
@Test
+ public void testAnimatingDenylist() {
+ final WindowState window = createWindow("overrideWindow");
+ window.mAttrs.packageName = "com.android.test";
+ parcelLayoutParams(window);
+ when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
+ assertEquals(0, mPolicy.getPreferredModeId(window));
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+
+ window.mActivityRecord.mSurfaceAnimator.startAnimation(
+ window.getPendingTransaction(), mock(AnimationAdapter.class),
+ false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
+ assertEquals(0, mPolicy.getPreferredModeId(window));
+ assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+ }
+
+ @Test
public void testAnimatingCamera() {
- final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
- "cameraUsingWindow");
+ final WindowState cameraUsingWindow = createWindow("cameraUsingWindow");
cameraUsingWindow.mAttrs.packageName = "com.android.test";
parcelLayoutParams(cameraUsingWindow);
@@ -161,7 +258,8 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
- assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE,
+ mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
cameraUsingWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
cameraUsingWindow.getPendingTransaction(), mock(AnimationAdapter.class),
@@ -174,13 +272,13 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
@Test
public void testAppMaxRefreshRate() {
- final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
- window.mAttrs.preferredMaxDisplayRefreshRate = 60f;
+ final WindowState window = createWindow("window");
+ window.mAttrs.preferredMaxDisplayRefreshRate = LOW_REFRESH_RATE;
parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
- assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
window.mActivityRecord.mSurfaceAnimator.startAnimation(
window.getPendingTransaction(), mock(AnimationAdapter.class),
@@ -193,12 +291,12 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
@Test
public void testAppMinRefreshRate() {
- final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
- window.mAttrs.preferredMinDisplayRefreshRate = 60f;
+ final WindowState window = createWindow("window");
+ window.mAttrs.preferredMinDisplayRefreshRate = LOW_REFRESH_RATE;
parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
- assertEquals(60, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
window.mActivityRecord.mSurfaceAnimator.startAnimation(
@@ -206,16 +304,17 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
}
@Test
public void testAppPreferredRefreshRate() {
- final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
- window.mAttrs.preferredRefreshRate = 60f;
+ final WindowState window = createWindow("window");
+ window.mAttrs.preferredRefreshRate = LOW_REFRESH_RATE;
parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
- assertEquals(60, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+ assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
}