diff options
| author | 2024-04-26 15:01:06 -0700 | |
|---|---|---|
| committer | 2024-04-26 15:54:07 -0700 | |
| commit | 371a1fe642cb16fc11f99fa65ec4bdec8b3d96e6 (patch) | |
| tree | 6b6c8451c632972376822ac8c42a269f50bf7b68 | |
| parent | c18024b308644f6820ca1585369923473002a53f (diff) | |
[VRR] Vote for category when view properties change
Fixes: 337337530
When a ViewGroup change alpha or other view property, it
should vote with its frame rate category.
Test: new test, existing tests
Change-Id: I83fbd0e253b63caadf97f50eb28758498241b618
| -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. |