diff options
| -rw-r--r-- | core/java/android/view/View.java | 10 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewFrameRateTest.java | 27 | 
2 files changed, 34 insertions, 3 deletions
| diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6d03c5498dff..4a9aa54dc4f1 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -33990,7 +33990,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,                      && ((View) parent).mFrameContentVelocity <= 0) {                  viewRootImpl.votePreferredFrameRate(MAX_FRAME_RATE, FRAME_RATE_COMPATIBILITY_GTE);              } -            if (!willNotDraw() && viewRootImpl.shouldCheckFrameRateCategory()) { +            if (viewRootImpl.shouldCheckFrameRateCategory()) {                  int frameRateCategory = calculateFrameRateCategory();                  int category = frameRateCategory & ~FRAME_RATE_CATEGORY_REASON_MASK;                  int reason = frameRateCategory & FRAME_RATE_CATEGORY_REASON_MASK; @@ -34032,7 +34032,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,              }          } -        if (!willNotDraw() && viewRootImpl.shouldCheckFrameRateCategory()) { +        if (viewRootImpl.shouldCheckFrameRateCategory()) {              if (sToolkitMetricsForFrameRateDecisionFlagValue) {                  int width = mRight - mLeft;                  int height = mBottom - mTop; @@ -34040,7 +34040,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,                  viewRootImpl.recordViewPercentage(sizePercentage);              } -            int frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE; +            int frameRateCategory;              if (Float.isNaN(frameRate)) {                  frameRateCategory = calculateFrameRateCategory();              } else if (frameRate < 0) { @@ -34065,6 +34065,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,                                  | FRAME_RATE_CATEGORY_REASON_INVALID;                      }                  } +            } else { +                // Category doesn't control it. It is directly controlled by frame rate +                frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE +                        | FRAME_RATE_CATEGORY_REASON_REQUESTED;              }              int category = frameRateCategory & ~FRAME_RATE_CATEGORY_REASON_MASK; diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java index c4ac98b8abf7..f885e31ed270 100644 --- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java +++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java @@ -436,6 +436,33 @@ public class ViewFrameRateTest {          waitForAfterDraw();      } +    @Test +    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, +            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY +    }) +    public void willNotDrawUsesCategory() throws Throwable { +        mActivityRule.runOnUiThread(() -> { +            mMovingView.setWillNotDraw(true); +            mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_LOW); +        }); +        waitForFrameRateCategoryToSettle(); +        mActivityRule.runOnUiThread(() -> { +            mMovingView.invalidate(); +            runAfterDraw(() -> assertEquals(FRAME_RATE_CATEGORY_LOW, +                    mViewRoot.getLastPreferredFrameRateCategory())); +        }); +        waitForAfterDraw(); +        mActivityRule.runOnUiThread(() -> { +            mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL); +            mMovingView.setAlpha(0.9f); +            runAfterDraw(() -> { +                assertEquals(FRAME_RATE_CATEGORY_NORMAL, +                        mViewRoot.getLastPreferredFrameRateCategory()); +            }); +        }); +        waitForAfterDraw(); +    } +      /**       * A common behavior is for two different views to be invalidated in succession, but       * intermittently. We want to treat this as an intermittent invalidation. |