summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/View.java10
-rw-r--r--core/tests/coretests/src/android/view/ViewFrameRateTest.java27
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.