summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jian-Syuan (Shane) Wong <shanewong@google.com> 2024-02-08 17:52:32 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-02-08 17:52:32 +0000
commit93ec56c950f3fd183ca1541630cd60c86f94445c (patch)
tree3174c748cf76ca75b927afcf6cc683e40f10cb6c
parent35b4fe3e753eba6af1888699bde062fcd33ec1fb (diff)
parentd602aa4dcb4446594778bba00200fd8b1947ffe6 (diff)
Merge "View should either call setFrameRate or setFrameRateCategory" into main
-rw-r--r--core/java/android/view/View.java34
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java28
2 files changed, 46 insertions, 16 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5c5817feb23b..a9f189700789 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5543,7 +5543,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// The preferred frame rate of the view that is mainly used for
// touch boosting, view velocity handling, and TextureView.
- private float mPreferredFrameRate = REQUESTED_FRAME_RATE_CATEGORY_DEFAULT;
+ private float mPreferredFrameRate = Float.NaN;
private int mInfrequentUpdateCount = 0;
private long mLastUpdateTimeMillis = 0;
@@ -33186,25 +33186,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
float sizePercentage = getSizePercentage();
int frameRateCateogry = calculateFrameRateCategory(sizePercentage);
if (viewRootImpl != null && sizePercentage > 0) {
- if (mPreferredFrameRate < 0) {
- if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE) {
- frameRateCateogry = FRAME_RATE_CATEGORY_NO_PREFERENCE;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_LOW) {
- frameRateCateogry = FRAME_RATE_CATEGORY_LOW;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NORMAL) {
- frameRateCateogry = FRAME_RATE_CATEGORY_NORMAL;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_HIGH) {
- frameRateCateogry = FRAME_RATE_CATEGORY_HIGH;
+ if (sToolkitMetricsForFrameRateDecisionFlagValue) {
+ viewRootImpl.recordViewPercentage(sizePercentage);
+ }
+ if (!Float.isNaN(mPreferredFrameRate)) {
+ if (mPreferredFrameRate < 0) {
+ if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE) {
+ frameRateCateogry = FRAME_RATE_CATEGORY_NO_PREFERENCE;
+ } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_LOW) {
+ frameRateCateogry = FRAME_RATE_CATEGORY_LOW;
+ } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NORMAL) {
+ frameRateCateogry = FRAME_RATE_CATEGORY_NORMAL;
+ } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_HIGH) {
+ frameRateCateogry = FRAME_RATE_CATEGORY_HIGH;
+ }
+ } else {
+ viewRootImpl.votePreferredFrameRate(mPreferredFrameRate);
+ return;
}
- } else {
- viewRootImpl.votePreferredFrameRate(mPreferredFrameRate);
}
viewRootImpl.votePreferredFrameRateCategory(frameRateCateogry);
mLastFrameRateCategory = frameRateCateogry;
-
- if (sToolkitMetricsForFrameRateDecisionFlagValue) {
- viewRootImpl.recordViewPercentage(sizePercentage);
- }
}
}
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index 52e996cab3ed..2d117f7217f5 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -829,6 +829,34 @@ public class ViewRootImplTest {
}
/**
+ * A View should either vote a frame rate or a frame rate category instead of both.
+ */
+ @Test
+ @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ public void votePreferredFrameRate_voteFrameRateOnly() {
+ View view = new View(sContext);
+ float frameRate = 20;
+ attachViewToWindow(view);
+ sInstrumentation.waitForIdleSync();
+
+ ViewRootImpl viewRootImpl = view.getViewRootImpl();
+ sInstrumentation.runOnMainSync(() -> {
+ assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_NO_PREFERENCE);
+
+ view.setRequestedFrameRate(frameRate);
+ view.invalidate();
+ assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_NO_PREFERENCE);
+ assertEquals(viewRootImpl.getPreferredFrameRate(), frameRate, 0.1);
+
+ view.setRequestedFrameRate(view.REQUESTED_FRAME_RATE_CATEGORY_LOW);
+ view.invalidate();
+ assertEquals(viewRootImpl.getPreferredFrameRateCategory(), FRAME_RATE_CATEGORY_LOW);
+ });
+ }
+
+ /**
* Test the logic of infrequent layer:
* - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100.
* - HIGH/NORMAL based on size for frequent update: (FT3-FT2) + (FT2 - FT1) < 100.