Loading core/java/android/view/View.java +81 −91 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ import static android.view.flags.Flags.sensitiveContentAppProtection; import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly; import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision; import static android.view.flags.Flags.toolkitSetFrameRateReadOnly; import static android.view.flags.Flags.toolkitVelocityMapSysprop; import static android.view.flags.Flags.toolkitViewgroupSetRequestedFrameRateApi; import static android.view.flags.Flags.viewVelocityApi; import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR; Loading Loading @@ -2477,18 +2476,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static boolean sToolkitViewGroupFrameRateApiFlagValue = toolkitViewgroupSetRequestedFrameRateApi(); // The read-write flag toolkitVelocityMapSysprop() cannot be initialized at Zygote. To prevent // this, initialize inside this class with special name NoPreloadHolder which prevents // initialization at Zygote. /** @hide */ @VisibleForTesting static final class NoPreloadHolder { private static boolean sToolkitVelocityMapSyspropFlagValue = toolkitVelocityMapSysprop(); private static String sFrameRateSysProp = ViewProperties.vrr_velocity_threshold().orElse(""); static { if (sToolkitVelocityMapSyspropFlagValue && !sFrameRateSysProp.isEmpty()) { if (!sFrameRateSysProp.isEmpty()) { sFrameRateMappings = parseFrameRateMapping(sFrameRateSysProp); } } Loading @@ -2499,7 +2491,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ @VisibleForTesting static int[][] parseFrameRateMapping(String mappings) { public static int[][] parseFrameRateMapping(String mappings) { if (mappings.isEmpty()) { return null; } Loading Loading @@ -2582,7 +2574,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Arrays.sort(mappingArray, Comparator.comparingInt(pair -> -pair[0])); return mappingArray; } } // Used to set frame rate compatibility. @Surface.FrameRateCompatibility int mFrameRateCompatibility = Loading Loading @@ -34687,8 +34678,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private float convertVelocityToFrameRate(float velocityPps) { if (NoPreloadHolder.sToolkitVelocityMapSyspropFlagValue && sFrameRateMappings != null && sFrameRateMappings.length > 0) { if (sFrameRateMappings != null && sFrameRateMappings.length > 0) { return getFrameRateByVelocity(sFrameRateMappings, (int) velocityPps); } // Internal testing has shown that this gives a premium experience: core/java/android/view/flags/refresh_rate_flags.aconfig +0 −10 Original line number Diff line number Diff line Loading @@ -95,13 +95,3 @@ flag { description: "Feature flag to ennable ARR debug message" bug: "394614443" } flag { name: "toolkit_velocity_map_sysprop" namespace: "toolkit" description: "Feature flag to map velocity to frame rate using sysprop" bug: "404936438" metadata { purpose: PURPOSE_BUGFIX } } core/tests/coretests/src/android/view/ViewFrameRateTest.java +7 −7 Original line number Diff line number Diff line Loading @@ -1246,33 +1246,33 @@ public class ViewFrameRateTest { int[] twoPairs = {800, 80, 300, 30}; int[] threePairs = {1000, 120, 800, 80, 600, 60}; int[][] mappings = View.NoPreloadHolder.parseFrameRateMapping(""); int[][] mappings = View.parseFrameRateMapping(""); assertTrue(mappings == null); mappings = View.NoPreloadHolder.parseFrameRateMapping("::"); mappings = View.parseFrameRateMapping("::"); assertTrue(mappings == null); mappings = View.NoPreloadHolder.parseFrameRateMapping("80@800:30@300"); mappings = View.parseFrameRateMapping("80@800:30@300"); for (int i = 0; i < twoPairs.length; i++) { assertEquals(twoPairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping("80@800:60@600:120@1000"); mappings = View.parseFrameRateMapping("80@800:60@600:120@1000"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping("80@@800:60@@@600:120@1000"); mappings = View.parseFrameRateMapping("80@@800:60@@@600:120@1000"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping(":120@1000:::60@600::80@800:"); mappings = View.parseFrameRateMapping(":120@1000:::60@600::80@800:"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping(":120@@1000:::60@600::80@@@800:"); mappings = View.parseFrameRateMapping(":120@@1000:::60@600::80@@@800:"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } Loading Loading
core/java/android/view/View.java +81 −91 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ import static android.view.flags.Flags.sensitiveContentAppProtection; import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly; import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision; import static android.view.flags.Flags.toolkitSetFrameRateReadOnly; import static android.view.flags.Flags.toolkitVelocityMapSysprop; import static android.view.flags.Flags.toolkitViewgroupSetRequestedFrameRateApi; import static android.view.flags.Flags.viewVelocityApi; import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR; Loading Loading @@ -2477,18 +2476,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static boolean sToolkitViewGroupFrameRateApiFlagValue = toolkitViewgroupSetRequestedFrameRateApi(); // The read-write flag toolkitVelocityMapSysprop() cannot be initialized at Zygote. To prevent // this, initialize inside this class with special name NoPreloadHolder which prevents // initialization at Zygote. /** @hide */ @VisibleForTesting static final class NoPreloadHolder { private static boolean sToolkitVelocityMapSyspropFlagValue = toolkitVelocityMapSysprop(); private static String sFrameRateSysProp = ViewProperties.vrr_velocity_threshold().orElse(""); static { if (sToolkitVelocityMapSyspropFlagValue && !sFrameRateSysProp.isEmpty()) { if (!sFrameRateSysProp.isEmpty()) { sFrameRateMappings = parseFrameRateMapping(sFrameRateSysProp); } } Loading @@ -2499,7 +2491,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ @VisibleForTesting static int[][] parseFrameRateMapping(String mappings) { public static int[][] parseFrameRateMapping(String mappings) { if (mappings.isEmpty()) { return null; } Loading Loading @@ -2582,7 +2574,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Arrays.sort(mappingArray, Comparator.comparingInt(pair -> -pair[0])); return mappingArray; } } // Used to set frame rate compatibility. @Surface.FrameRateCompatibility int mFrameRateCompatibility = Loading Loading @@ -34687,8 +34678,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private float convertVelocityToFrameRate(float velocityPps) { if (NoPreloadHolder.sToolkitVelocityMapSyspropFlagValue && sFrameRateMappings != null && sFrameRateMappings.length > 0) { if (sFrameRateMappings != null && sFrameRateMappings.length > 0) { return getFrameRateByVelocity(sFrameRateMappings, (int) velocityPps); } // Internal testing has shown that this gives a premium experience:
core/java/android/view/flags/refresh_rate_flags.aconfig +0 −10 Original line number Diff line number Diff line Loading @@ -95,13 +95,3 @@ flag { description: "Feature flag to ennable ARR debug message" bug: "394614443" } flag { name: "toolkit_velocity_map_sysprop" namespace: "toolkit" description: "Feature flag to map velocity to frame rate using sysprop" bug: "404936438" metadata { purpose: PURPOSE_BUGFIX } }
core/tests/coretests/src/android/view/ViewFrameRateTest.java +7 −7 Original line number Diff line number Diff line Loading @@ -1246,33 +1246,33 @@ public class ViewFrameRateTest { int[] twoPairs = {800, 80, 300, 30}; int[] threePairs = {1000, 120, 800, 80, 600, 60}; int[][] mappings = View.NoPreloadHolder.parseFrameRateMapping(""); int[][] mappings = View.parseFrameRateMapping(""); assertTrue(mappings == null); mappings = View.NoPreloadHolder.parseFrameRateMapping("::"); mappings = View.parseFrameRateMapping("::"); assertTrue(mappings == null); mappings = View.NoPreloadHolder.parseFrameRateMapping("80@800:30@300"); mappings = View.parseFrameRateMapping("80@800:30@300"); for (int i = 0; i < twoPairs.length; i++) { assertEquals(twoPairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping("80@800:60@600:120@1000"); mappings = View.parseFrameRateMapping("80@800:60@600:120@1000"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping("80@@800:60@@@600:120@1000"); mappings = View.parseFrameRateMapping("80@@800:60@@@600:120@1000"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping(":120@1000:::60@600::80@800:"); mappings = View.parseFrameRateMapping(":120@1000:::60@600::80@800:"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } mappings = View.NoPreloadHolder.parseFrameRateMapping(":120@@1000:::60@600::80@@@800:"); mappings = View.parseFrameRateMapping(":120@@1000:::60@600::80@@@800:"); for (int i = 0; i < threePairs.length; i++) { assertEquals(threePairs[i], mappings[i / 2][i % 2]); } Loading