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