diff options
| -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. |