Merge "Add preferredMinDisplayRefreshRate" into sc-dev

This commit is contained in:
Ady Abraham
2021-07-01 17:58:23 +00:00
committed by Android (Google) Code Review
8 changed files with 286 additions and 77 deletions

View File

@@ -207,6 +207,8 @@ public abstract class DisplayManagerInternal {
* has a preference. * has a preference.
* @param requestedModeId The preferred mode id for the top-most visible window that has a * @param requestedModeId The preferred mode id for the top-most visible window that has a
* preference. * preference.
* @param requestedMinRefreshRate The preferred lowest refresh rate for the top-most visible
* window that has a preference.
* @param requestedMaxRefreshRate The preferred highest refresh rate for the top-most visible * @param requestedMaxRefreshRate The preferred highest refresh rate for the top-most visible
* window that has a preference. * window that has a preference.
* @param requestedMinimalPostProcessing The preferred minimal post processing setting for the * @param requestedMinimalPostProcessing The preferred minimal post processing setting for the
@@ -216,8 +218,9 @@ public abstract class DisplayManagerInternal {
* prior to call to performTraversalInTransactionFromWindowManager. * prior to call to performTraversalInTransactionFromWindowManager.
*/ */
public abstract void setDisplayProperties(int displayId, boolean hasContent, public abstract void setDisplayProperties(int displayId, boolean hasContent,
float requestedRefreshRate, int requestedModeId, float requestedMaxRefreshRate, float requestedRefreshRate, int requestedModeId, float requestedMinRefreshRate,
boolean requestedMinimalPostProcessing, boolean inTraversal); float requestedMaxRefreshRate, boolean requestedMinimalPostProcessing,
boolean inTraversal);
/** /**
* Applies an offset to the contents of a display, for example to avoid burn-in. * Applies an offset to the contents of a display, for example to avoid burn-in.

View File

@@ -3022,6 +3022,14 @@ public interface WindowManager extends ViewManager {
*/ */
public int preferredDisplayModeId; public int preferredDisplayModeId;
/**
* The min display refresh rate while the window is in focus.
*
* This value is ignored if {@link #preferredDisplayModeId} is set.
* @hide
*/
public float preferredMinDisplayRefreshRate;
/** /**
* The max display refresh rate while the window is in focus. * The max display refresh rate while the window is in focus.
* *
@@ -3781,6 +3789,7 @@ public interface WindowManager extends ViewManager {
out.writeInt(screenOrientation); out.writeInt(screenOrientation);
out.writeFloat(preferredRefreshRate); out.writeFloat(preferredRefreshRate);
out.writeInt(preferredDisplayModeId); out.writeInt(preferredDisplayModeId);
out.writeFloat(preferredMinDisplayRefreshRate);
out.writeFloat(preferredMaxDisplayRefreshRate); out.writeFloat(preferredMaxDisplayRefreshRate);
out.writeInt(systemUiVisibility); out.writeInt(systemUiVisibility);
out.writeInt(subtreeSystemUiVisibility); out.writeInt(subtreeSystemUiVisibility);
@@ -3852,6 +3861,7 @@ public interface WindowManager extends ViewManager {
screenOrientation = in.readInt(); screenOrientation = in.readInt();
preferredRefreshRate = in.readFloat(); preferredRefreshRate = in.readFloat();
preferredDisplayModeId = in.readInt(); preferredDisplayModeId = in.readInt();
preferredMinDisplayRefreshRate = in.readFloat();
preferredMaxDisplayRefreshRate = in.readFloat(); preferredMaxDisplayRefreshRate = in.readFloat();
systemUiVisibility = in.readInt(); systemUiVisibility = in.readInt();
subtreeSystemUiVisibility = in.readInt(); subtreeSystemUiVisibility = in.readInt();
@@ -3931,7 +3941,9 @@ public interface WindowManager extends ViewManager {
/** {@hide} */ /** {@hide} */
public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29; public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29;
/** {@hide} */ /** {@hide} */
public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 30; public static final int PREFERRED_MIN_DISPLAY_REFRESH_RATE = 1 << 30;
/** {@hide} */
public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 31;
// internal buffer to backup/restore parameters under compatibility mode. // internal buffer to backup/restore parameters under compatibility mode.
private int[] mCompatibilityParamsBackup = null; private int[] mCompatibilityParamsBackup = null;
@@ -4063,6 +4075,11 @@ public interface WindowManager extends ViewManager {
changes |= PREFERRED_DISPLAY_MODE_ID; changes |= PREFERRED_DISPLAY_MODE_ID;
} }
if (preferredMinDisplayRefreshRate != o.preferredMinDisplayRefreshRate) {
preferredMinDisplayRefreshRate = o.preferredMinDisplayRefreshRate;
changes |= PREFERRED_MIN_DISPLAY_REFRESH_RATE;
}
if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) { if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) {
preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate; preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate;
changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE; changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE;
@@ -4272,6 +4289,10 @@ public interface WindowManager extends ViewManager {
sb.append(" preferredDisplayMode="); sb.append(" preferredDisplayMode=");
sb.append(preferredDisplayModeId); sb.append(preferredDisplayModeId);
} }
if (preferredMinDisplayRefreshRate != 0) {
sb.append(" preferredMinDisplayRefreshRate=");
sb.append(preferredMinDisplayRefreshRate);
}
if (preferredMaxDisplayRefreshRate != 0) { if (preferredMaxDisplayRefreshRate != 0) {
sb.append(" preferredMaxDisplayRefreshRate="); sb.append(" preferredMaxDisplayRefreshRate=");
sb.append(preferredMaxDisplayRefreshRate); sb.append(preferredMaxDisplayRefreshRate);

View File

@@ -1506,8 +1506,9 @@ public final class DisplayManagerService extends SystemService {
} }
private void setDisplayPropertiesInternal(int displayId, boolean hasContent, private void setDisplayPropertiesInternal(int displayId, boolean hasContent,
float requestedRefreshRate, int requestedModeId, float requestedMaxRefreshRate, float requestedRefreshRate, int requestedModeId, float requestedMinRefreshRate,
boolean preferMinimalPostProcessing, boolean inTraversal) { float requestedMaxRefreshRate, boolean preferMinimalPostProcessing,
boolean inTraversal) {
synchronized (mSyncRoot) { synchronized (mSyncRoot) {
final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId); final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId);
if (display == null) { if (display == null) {
@@ -1538,7 +1539,7 @@ public final class DisplayManagerService extends SystemService {
} }
} }
mDisplayModeDirector.getAppRequestObserver().setAppRequest( mDisplayModeDirector.getAppRequestObserver().setAppRequest(
displayId, requestedModeId, requestedMaxRefreshRate); displayId, requestedModeId, requestedMinRefreshRate, requestedMaxRefreshRate);
if (display.getDisplayInfoLocked().minimalPostProcessingSupported) { if (display.getDisplayInfoLocked().minimalPostProcessingSupported) {
boolean mppRequest = mMinimalPostProcessingAllowed && preferMinimalPostProcessing; boolean mppRequest = mMinimalPostProcessingAllowed && preferMinimalPostProcessing;
@@ -3208,11 +3209,12 @@ public final class DisplayManagerService extends SystemService {
@Override @Override
public void setDisplayProperties(int displayId, boolean hasContent, public void setDisplayProperties(int displayId, boolean hasContent,
float requestedRefreshRate, int requestedMode, float requestedMaxRefreshRate, float requestedRefreshRate, int requestedMode, float requestedMinRefreshRate,
boolean requestedMinimalPostProcessing, boolean inTraversal) { float requestedMaxRefreshRate, boolean requestedMinimalPostProcessing,
boolean inTraversal) {
setDisplayPropertiesInternal(displayId, hasContent, requestedRefreshRate, setDisplayPropertiesInternal(displayId, hasContent, requestedRefreshRate,
requestedMode, requestedMaxRefreshRate, requestedMinimalPostProcessing, requestedMode, requestedMinRefreshRate, requestedMaxRefreshRate,
inTraversal); requestedMinimalPostProcessing, inTraversal);
} }
@Override @Override

View File

@@ -913,10 +913,12 @@ public class DisplayModeDirector {
// It votes [MIN_REFRESH_RATE, Float.POSITIVE_INFINITY] // It votes [MIN_REFRESH_RATE, Float.POSITIVE_INFINITY]
public static final int PRIORITY_USER_SETTING_MIN_REFRESH_RATE = 2; public static final int PRIORITY_USER_SETTING_MIN_REFRESH_RATE = 2;
// APP_REQUEST_MAX_REFRESH_RATE is used to for internal apps to limit the refresh // APP_REQUEST_REFRESH_RATE_RANGE is used to for internal apps to limit the refresh
// rate in certain cases, mostly to preserve power. // rate in certain cases, mostly to preserve power.
// It votes to [0, APP_REQUEST_MAX_REFRESH_RATE]. // @see android.view.WindowManager.LayoutParams#preferredMinRefreshRate
public static final int PRIORITY_APP_REQUEST_MAX_REFRESH_RATE = 3; // @see android.view.WindowManager.LayoutParams#preferredMaxRefreshRate
// It votes to [preferredMinRefreshRate, preferredMaxRefreshRate].
public static final int PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE = 3;
// We split the app request into different priorities in case we can satisfy one desire // We split the app request into different priorities in case we can satisfy one desire
// without the other. // without the other.
@@ -967,7 +969,7 @@ public class DisplayModeDirector {
// The cutoff for the app request refresh rate range. Votes with priorities lower than this // The cutoff for the app request refresh rate range. Votes with priorities lower than this
// value will not be considered when constructing the app request refresh rate range. // value will not be considered when constructing the app request refresh rate range.
public static final int APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF = public static final int APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF =
PRIORITY_APP_REQUEST_MAX_REFRESH_RATE; PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE;
/** /**
* A value signifying an invalid width or height in a vote. * A value signifying an invalid width or height in a vote.
@@ -1035,8 +1037,8 @@ public class DisplayModeDirector {
switch (priority) { switch (priority) {
case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE: case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE:
return "PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE"; return "PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE";
case PRIORITY_APP_REQUEST_MAX_REFRESH_RATE: case PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE:
return "PRIORITY_APP_REQUEST_MAX_REFRESH_RATE"; return "PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE";
case PRIORITY_APP_REQUEST_SIZE: case PRIORITY_APP_REQUEST_SIZE:
return "PRIORITY_APP_REQUEST_SIZE"; return "PRIORITY_APP_REQUEST_SIZE";
case PRIORITY_DEFAULT_REFRESH_RATE: case PRIORITY_DEFAULT_REFRESH_RATE:
@@ -1233,17 +1235,19 @@ public class DisplayModeDirector {
final class AppRequestObserver { final class AppRequestObserver {
private final SparseArray<Display.Mode> mAppRequestedModeByDisplay; private final SparseArray<Display.Mode> mAppRequestedModeByDisplay;
private final SparseArray<Float> mAppPreferredMaxRefreshRateByDisplay; private final SparseArray<RefreshRateRange> mAppPreferredRefreshRateRangeByDisplay;
AppRequestObserver() { AppRequestObserver() {
mAppRequestedModeByDisplay = new SparseArray<>(); mAppRequestedModeByDisplay = new SparseArray<>();
mAppPreferredMaxRefreshRateByDisplay = new SparseArray<>(); mAppPreferredRefreshRateRangeByDisplay = new SparseArray<>();
} }
public void setAppRequest(int displayId, int modeId, float requestedMaxRefreshRate) { public void setAppRequest(int displayId, int modeId, float requestedMinRefreshRateRange,
float requestedMaxRefreshRateRange) {
synchronized (mLock) { synchronized (mLock) {
setAppRequestedModeLocked(displayId, modeId); setAppRequestedModeLocked(displayId, modeId);
setAppPreferredMaxRefreshRateLocked(displayId, requestedMaxRefreshRate); setAppPreferredRefreshRateRangeLocked(displayId, requestedMinRefreshRateRange,
requestedMaxRefreshRateRange);
} }
} }
@@ -1272,26 +1276,36 @@ public class DisplayModeDirector {
updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote); updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
} }
private void setAppPreferredMaxRefreshRateLocked(int displayId, private void setAppPreferredRefreshRateRangeLocked(int displayId,
float requestedMaxRefreshRate) { float requestedMinRefreshRateRange, float requestedMaxRefreshRateRange) {
final Vote vote; final Vote vote;
final Float requestedMaxRefreshRateVote =
requestedMaxRefreshRate > 0 RefreshRateRange refreshRateRange = null;
? new Float(requestedMaxRefreshRate) : null; if (requestedMinRefreshRateRange > 0 || requestedMaxRefreshRateRange > 0) {
if (Objects.equals(requestedMaxRefreshRateVote, float min = requestedMinRefreshRateRange;
mAppPreferredMaxRefreshRateByDisplay.get(displayId))) { float max = requestedMaxRefreshRateRange > 0
? requestedMaxRefreshRateRange : Float.POSITIVE_INFINITY;
refreshRateRange = new RefreshRateRange(min, max);
if (refreshRateRange.min == 0 && refreshRateRange.max == 0) {
// requestedMinRefreshRateRange/requestedMaxRefreshRateRange were invalid
refreshRateRange = null;
}
}
if (Objects.equals(refreshRateRange,
mAppPreferredRefreshRateRangeByDisplay.get(displayId))) {
return; return;
} }
if (requestedMaxRefreshRate > 0) { if (refreshRateRange != null) {
mAppPreferredMaxRefreshRateByDisplay.put(displayId, requestedMaxRefreshRateVote); mAppPreferredRefreshRateRangeByDisplay.put(displayId, refreshRateRange);
vote = Vote.forRefreshRates(0, requestedMaxRefreshRate); vote = Vote.forRefreshRates(refreshRateRange.min, refreshRateRange.max);
} else { } else {
mAppPreferredMaxRefreshRateByDisplay.remove(displayId); mAppPreferredRefreshRateRangeByDisplay.remove(displayId);
vote = null; vote = null;
} }
synchronized (mLock) { synchronized (mLock) {
updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE, vote); updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE, vote);
} }
} }
@@ -1316,11 +1330,12 @@ public class DisplayModeDirector {
final Display.Mode mode = mAppRequestedModeByDisplay.valueAt(i); final Display.Mode mode = mAppRequestedModeByDisplay.valueAt(i);
pw.println(" " + id + " -> " + mode); pw.println(" " + id + " -> " + mode);
} }
pw.println(" mAppPreferredMaxRefreshRateByDisplay:"); pw.println(" mAppPreferredRefreshRateRangeByDisplay:");
for (int i = 0; i < mAppPreferredMaxRefreshRateByDisplay.size(); i++) { for (int i = 0; i < mAppPreferredRefreshRateRangeByDisplay.size(); i++) {
final int id = mAppPreferredMaxRefreshRateByDisplay.keyAt(i); final int id = mAppPreferredRefreshRateRangeByDisplay.keyAt(i);
final Float refreshRate = mAppPreferredMaxRefreshRateByDisplay.valueAt(i); final RefreshRateRange refreshRateRange =
pw.println(" " + id + " -> " + refreshRate); mAppPreferredRefreshRateRangeByDisplay.valueAt(i);
pw.println(" " + id + " -> " + refreshRateRange);
} }
} }
} }

View File

@@ -914,6 +914,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mTmpApplySurfaceChangesTransactionState.preferredModeId = preferredModeId; mTmpApplySurfaceChangesTransactionState.preferredModeId = preferredModeId;
} }
final float preferredMinRefreshRate = getDisplayPolicy().getRefreshRatePolicy()
.getPreferredMinRefreshRate(w);
if (mTmpApplySurfaceChangesTransactionState.preferredMinRefreshRate == 0
&& preferredMinRefreshRate != 0) {
mTmpApplySurfaceChangesTransactionState.preferredMinRefreshRate =
preferredMinRefreshRate;
}
final float preferredMaxRefreshRate = getDisplayPolicy().getRefreshRatePolicy() final float preferredMaxRefreshRate = getDisplayPolicy().getRefreshRatePolicy()
.getPreferredMaxRefreshRate(w); .getPreferredMaxRefreshRate(w);
if (mTmpApplySurfaceChangesTransactionState.preferredMaxRefreshRate == 0 if (mTmpApplySurfaceChangesTransactionState.preferredMaxRefreshRate == 0
@@ -4321,6 +4329,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mLastHasContent, mLastHasContent,
mTmpApplySurfaceChangesTransactionState.preferredRefreshRate, mTmpApplySurfaceChangesTransactionState.preferredRefreshRate,
mTmpApplySurfaceChangesTransactionState.preferredModeId, mTmpApplySurfaceChangesTransactionState.preferredModeId,
mTmpApplySurfaceChangesTransactionState.preferredMinRefreshRate,
mTmpApplySurfaceChangesTransactionState.preferredMaxRefreshRate, mTmpApplySurfaceChangesTransactionState.preferredMaxRefreshRate,
mTmpApplySurfaceChangesTransactionState.preferMinimalPostProcessing, mTmpApplySurfaceChangesTransactionState.preferMinimalPostProcessing,
true /* inTraversal, must call performTraversalInTrans... below */); true /* inTraversal, must call performTraversalInTrans... below */);
@@ -4611,6 +4620,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
public boolean preferMinimalPostProcessing; public boolean preferMinimalPostProcessing;
public float preferredRefreshRate; public float preferredRefreshRate;
public int preferredModeId; public int preferredModeId;
public float preferredMinRefreshRate;
public float preferredMaxRefreshRate; public float preferredMaxRefreshRate;
void reset() { void reset() {
@@ -4620,6 +4630,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
preferMinimalPostProcessing = false; preferMinimalPostProcessing = false;
preferredRefreshRate = 0; preferredRefreshRate = 0;
preferredModeId = 0; preferredModeId = 0;
preferredMinRefreshRate = 0;
preferredMaxRefreshRate = 0; preferredMaxRefreshRate = 0;
} }
} }

View File

@@ -154,6 +154,21 @@ class RefreshRatePolicy {
return 0; return 0;
} }
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)) {
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;
}
float getPreferredMaxRefreshRate(WindowState w) { float getPreferredMaxRefreshRate(WindowState w) {
// If app is animating, it's not able to control refresh rate because we want the animation // If app is animating, it's not able to control refresh rate because we want the animation
// to run in default refresh rate. // to run in default refresh rate.

View File

@@ -900,10 +900,10 @@ public class DisplayModeDirectorTest {
} }
@Test @Test
public void testAppRequestMaxRefreshRate() { public void testAppRequestMinRefreshRate() {
// Confirm that the app max request range doesn't include flicker or min refresh rate // Confirm that the app min request range doesn't include flicker or min refresh rate
// settings but does include everything else. // settings but does include everything else.
assertTrue(Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE
>= Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); >= Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF);
Display.Mode[] modes = new Display.Mode[3]; Display.Mode[] modes = new Display.Mode[3];
@@ -936,7 +936,54 @@ public class DisplayModeDirectorTest {
assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f); assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f);
assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f); assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f);
votes.put(Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE, Vote.forRefreshRates(0, 75)); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE,
Vote.forRefreshRates(75, Float.POSITIVE_INFINITY));
director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID);
assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90);
assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90);
assertThat(desiredSpecs.appRequestRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(75);
assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f);
}
@Test
public void testAppRequestMaxRefreshRate() {
// Confirm that the app max request range doesn't include flicker or min refresh rate
// settings but does include everything else.
assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE
>= Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF);
Display.Mode[] modes = new Display.Mode[3];
modes[0] = new Display.Mode(
/*modeId=*/60, /*width=*/1000, /*height=*/1000, 60);
modes[1] = new Display.Mode(
/*modeId=*/75, /*width=*/1000, /*height=*/1000, 75);
modes[2] = new Display.Mode(
/*modeId=*/90, /*width=*/1000, /*height=*/1000, 90);
DisplayModeDirector director = createDirectorFromModeArray(modes, modes[1]);
SparseArray<Vote> votes = new SparseArray<>();
SparseArray<SparseArray<Vote>> votesByDisplay = new SparseArray<>();
votesByDisplay.put(DISPLAY_ID, votes);
votes.put(Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH, Vote.forDisableRefreshRateSwitching());
votes.put(Vote.PRIORITY_FLICKER_REFRESH_RATE, Vote.forRefreshRates(60, 60));
director.injectVotesByDisplay(votesByDisplay);
DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID);
assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60);
assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60);
assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f);
assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f);
votes.put(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE,
Vote.forRefreshRates(90, Float.POSITIVE_INFINITY));
director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID);
assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90);
assertThat(desiredSpecs.primaryRefreshRateRange.max).isAtLeast(90f);
assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f);
assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f);
votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE, Vote.forRefreshRates(0, 75));
director.injectVotesByDisplay(votesByDisplay); director.injectVotesByDisplay(votesByDisplay);
desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID); desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID);
assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(75); assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(75);
@@ -948,7 +995,7 @@ public class DisplayModeDirectorTest {
@Test @Test
public void testAppRequestObserver_modeId() { public void testAppRequestObserver_modeId() {
DisplayModeDirector director = createDirectorFromFpsRange(60, 90); DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 60, 0); director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 60, 0, 0);
Vote appRequestRefreshRate = Vote appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
@@ -969,11 +1016,11 @@ public class DisplayModeDirectorTest {
assertThat(appRequestSize.height).isEqualTo(1000); assertThat(appRequestSize.height).isEqualTo(1000);
assertThat(appRequestSize.width).isEqualTo(1000); assertThat(appRequestSize.width).isEqualTo(1000);
Vote appRequestMaxRefreshRate = Vote appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNull(appRequestMaxRefreshRate); assertNull(appRequestRefreshRateRange);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 90, 0); director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 90, 0, 0);
appRequestRefreshRate = appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
@@ -992,15 +1039,15 @@ public class DisplayModeDirectorTest {
assertThat(appRequestSize.height).isEqualTo(1000); assertThat(appRequestSize.height).isEqualTo(1000);
assertThat(appRequestSize.width).isEqualTo(1000); assertThat(appRequestSize.width).isEqualTo(1000);
appRequestMaxRefreshRate = appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNull(appRequestMaxRefreshRate); assertNull(appRequestRefreshRateRange);
} }
@Test @Test
public void testAppRequestObserver_maxRefreshRate() { public void testAppRequestObserver_minRefreshRate() {
DisplayModeDirector director = createDirectorFromFpsRange(60, 90); DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 90); director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 60, 0);
Vote appRequestRefreshRate = Vote appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
assertNull(appRequestRefreshRate); assertNull(appRequestRefreshRate);
@@ -1008,15 +1055,16 @@ public class DisplayModeDirectorTest {
Vote appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE); Vote appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE);
assertNull(appRequestSize); assertNull(appRequestSize);
Vote appRequestMaxRefreshRate = Vote appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNotNull(appRequestMaxRefreshRate); assertNotNull(appRequestRefreshRateRange);
assertThat(appRequestMaxRefreshRate.refreshRateRange.min).isZero(); assertThat(appRequestRefreshRateRange.refreshRateRange.min)
assertThat(appRequestMaxRefreshRate.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); .isWithin(FLOAT_TOLERANCE).of(60);
assertThat(appRequestMaxRefreshRate.height).isEqualTo(INVALID_SIZE); assertThat(appRequestRefreshRateRange.refreshRateRange.max).isAtLeast(90);
assertThat(appRequestMaxRefreshRate.width).isEqualTo(INVALID_SIZE); assertThat(appRequestRefreshRateRange.height).isEqualTo(INVALID_SIZE);
assertThat(appRequestRefreshRateRange.width).isEqualTo(INVALID_SIZE);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 60); director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 90, 0);
appRequestRefreshRate = appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
assertNull(appRequestRefreshRate); assertNull(appRequestRefreshRate);
@@ -1024,19 +1072,74 @@ public class DisplayModeDirectorTest {
appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE); appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE);
assertNull(appRequestSize); assertNull(appRequestSize);
appRequestMaxRefreshRate = appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNotNull(appRequestMaxRefreshRate); assertNotNull(appRequestRefreshRateRange);
assertThat(appRequestMaxRefreshRate.refreshRateRange.min).isZero(); assertThat(appRequestRefreshRateRange.refreshRateRange.min)
assertThat(appRequestMaxRefreshRate.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); .isWithin(FLOAT_TOLERANCE).of(90);
assertThat(appRequestMaxRefreshRate.height).isEqualTo(INVALID_SIZE); assertThat(appRequestRefreshRateRange.refreshRateRange.max).isAtLeast(90);
assertThat(appRequestMaxRefreshRate.width).isEqualTo(INVALID_SIZE); assertThat(appRequestRefreshRateRange.height).isEqualTo(INVALID_SIZE);
assertThat(appRequestRefreshRateRange.width).isEqualTo(INVALID_SIZE);
} }
@Test @Test
public void testAppRequestObserver_modeIdAndMaxRefreshRate() { public void testAppRequestObserver_maxRefreshRate() {
DisplayModeDirector director = createDirectorFromFpsRange(60, 90); DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 60, 90); director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 0, 90);
Vote appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
assertNull(appRequestRefreshRate);
Vote appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE);
assertNull(appRequestSize);
Vote appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNotNull(appRequestRefreshRateRange);
assertThat(appRequestRefreshRateRange.refreshRateRange.min).isZero();
assertThat(appRequestRefreshRateRange.refreshRateRange.max)
.isWithin(FLOAT_TOLERANCE).of(90);
assertThat(appRequestRefreshRateRange.height).isEqualTo(INVALID_SIZE);
assertThat(appRequestRefreshRateRange.width).isEqualTo(INVALID_SIZE);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 0, 60);
appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
assertNull(appRequestRefreshRate);
appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE);
assertNull(appRequestSize);
appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNotNull(appRequestRefreshRateRange);
assertThat(appRequestRefreshRateRange.refreshRateRange.min).isZero();
assertThat(appRequestRefreshRateRange.refreshRateRange.max)
.isWithin(FLOAT_TOLERANCE).of(60);
assertThat(appRequestRefreshRateRange.height).isEqualTo(INVALID_SIZE);
assertThat(appRequestRefreshRateRange.width).isEqualTo(INVALID_SIZE);
}
@Test
public void testAppRequestObserver_invalidRefreshRateRange() {
DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, -1, 90, 60);
Vote appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
assertNull(appRequestRefreshRate);
Vote appRequestSize = director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_SIZE);
assertNull(appRequestSize);
Vote appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNull(appRequestRefreshRateRange);
}
@Test
public void testAppRequestObserver_modeIdAndRefreshRateRange() {
DisplayModeDirector director = createDirectorFromFpsRange(60, 90);
director.getAppRequestObserver().setAppRequest(DISPLAY_ID, 60, 90, 90);
Vote appRequestRefreshRate = Vote appRequestRefreshRate =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE);
@@ -1056,13 +1159,15 @@ public class DisplayModeDirectorTest {
assertThat(appRequestSize.height).isEqualTo(1000); assertThat(appRequestSize.height).isEqualTo(1000);
assertThat(appRequestSize.width).isEqualTo(1000); assertThat(appRequestSize.width).isEqualTo(1000);
Vote appRequestMaxRefreshRate = Vote appRequestRefreshRateRange =
director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE); director.getVote(DISPLAY_ID, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE);
assertNotNull(appRequestMaxRefreshRate); assertNotNull(appRequestRefreshRateRange);
assertThat(appRequestMaxRefreshRate.refreshRateRange.min).isZero(); assertThat(appRequestRefreshRateRange.refreshRateRange.max)
assertThat(appRequestMaxRefreshRate.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); .isWithin(FLOAT_TOLERANCE).of(90);
assertThat(appRequestMaxRefreshRate.height).isEqualTo(INVALID_SIZE); assertThat(appRequestRefreshRateRange.refreshRateRange.max)
assertThat(appRequestMaxRefreshRate.width).isEqualTo(INVALID_SIZE); .isWithin(FLOAT_TOLERANCE).of(90);
assertThat(appRequestRefreshRateRange.height).isEqualTo(INVALID_SIZE);
assertThat(appRequestRefreshRateRange.width).isEqualTo(INVALID_SIZE);
} }
@Test @Test
@@ -1161,7 +1266,7 @@ public class DisplayModeDirectorTest {
assertThat(desiredSpecs.baseModeId).isEqualTo(55); assertThat(desiredSpecs.baseModeId).isEqualTo(55);
votes.clear(); votes.clear();
votes.put(Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE, Vote.forRefreshRates(0, 52)); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE, Vote.forRefreshRates(0, 52));
votes.put(Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE, votes.put(Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE,
Vote.forBaseModeRefreshRate(55)); Vote.forBaseModeRefreshRate(55));
votes.put(Vote.PRIORITY_LOW_POWER_MODE, Vote.forRefreshRates(0, 60)); votes.put(Vote.PRIORITY_LOW_POWER_MODE, Vote.forRefreshRates(0, 60));
@@ -1172,7 +1277,7 @@ public class DisplayModeDirectorTest {
assertThat(desiredSpecs.baseModeId).isEqualTo(55); assertThat(desiredSpecs.baseModeId).isEqualTo(55);
votes.clear(); votes.clear();
votes.put(Vote.PRIORITY_APP_REQUEST_MAX_REFRESH_RATE, Vote.forRefreshRates(0, 58)); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE_RANGE, Vote.forRefreshRates(0, 58));
votes.put(Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE, votes.put(Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE,
Vote.forBaseModeRefreshRate(55)); Vote.forBaseModeRefreshRate(55));
votes.put(Vote.PRIORITY_LOW_POWER_MODE, Vote.forRefreshRates(0, 60)); votes.put(Vote.PRIORITY_LOW_POWER_MODE, Vote.forRefreshRates(0, 60));

View File

@@ -84,10 +84,12 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
parcelLayoutParams(cameraUsingWindow); parcelLayoutParams(cameraUsingWindow);
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
mPolicy.addNonHighRefreshRatePackage("com.android.test"); mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
mPolicy.removeNonHighRefreshRatePackage("com.android.test"); mPolicy.removeNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
@@ -127,6 +129,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
mPolicy.addNonHighRefreshRatePackage("com.android.test"); mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
} }
@@ -143,6 +146,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
mPolicy.addNonHighRefreshRatePackage("com.android.test"); mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
} }
@@ -156,6 +160,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
mPolicy.addNonHighRefreshRatePackage("com.android.test"); mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
cameraUsingWindow.mActivityRecord.mSurfaceAnimator.startAnimation( cameraUsingWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
@@ -163,6 +168,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
false /* hidden */, ANIMATION_TYPE_APP_TRANSITION); false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
} }
@@ -173,8 +179,28 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
parcelLayoutParams(window); parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window)); assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE); assertEquals(60, 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 testAppMinRefreshRate() {
final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
window.mAttrs.preferredMinDisplayRefreshRate = 60f;
parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(60, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
window.mActivityRecord.mSurfaceAnimator.startAnimation( window.mActivityRecord.mSurfaceAnimator.startAnimation(
window.getPendingTransaction(), mock(AnimationAdapter.class), window.getPendingTransaction(), mock(AnimationAdapter.class),
false /* hidden */, ANIMATION_TYPE_APP_TRANSITION); false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
@@ -182,4 +208,15 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(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;
parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(60, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
}
} }