diff options
| author | 2024-02-08 17:52:32 +0000 | |
|---|---|---|
| committer | 2024-02-08 17:52:32 +0000 | |
| commit | 93ec56c950f3fd183ca1541630cd60c86f94445c (patch) | |
| tree | 3174c748cf76ca75b927afcf6cc683e40f10cb6c | |
| parent | 35b4fe3e753eba6af1888699bde062fcd33ec1fb (diff) | |
| parent | d602aa4dcb4446594778bba00200fd8b1947ffe6 (diff) | |
Merge "View should either call setFrameRate or setFrameRateCategory" into main
| -rw-r--r-- | core/java/android/view/View.java | 34 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 28 |
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. |