diff --git a/Android.bp b/Android.bp index af312bf833e5..2becf0763239 100644 --- a/Android.bp +++ b/Android.bp @@ -404,6 +404,7 @@ java_defaults { "android.hardware.common.fmq-V1-java", "bouncycastle-repackaged-unbundled", "com.android.sysprop.foldlockbehavior", + "com.android.sysprop.view", "framework-internal-utils", // If MimeMap ever becomes its own APEX, then this dependency would need to be removed // in favor of an API stubs dependency in java_library "framework" below. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index db072330ef36..b013b682e67a 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -201,6 +201,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.sysprop.DisplayProperties; +import android.sysprop.ViewProperties; import android.text.TextUtils; import android.util.AndroidRuntimeException; import android.util.DisplayMetrics; @@ -1198,6 +1199,7 @@ public void onTransactionHang(String reason) { Flags.enableInvalidateCheckThread(); private static boolean sSurfaceFlingerBugfixFlagValue = com.android.graphics.surfaceflinger.flags.Flags.vrrBugfix24q4(); + private static final boolean sEnableVrr = ViewProperties.vrr_enabled().orElse(true); static { sToolkitSetFrameRateReadOnlyFlagValue = toolkitSetFrameRateReadOnly(); @@ -12853,13 +12855,13 @@ private void setPreferredFrameRate(float preferredFrameRate) { private boolean shouldSetFrameRateCategory() { // use toolkitSetFrameRate flag to gate the change - return mSurface.isValid() && shouldEnableDvrr(); + return shouldEnableDvrr() && mSurface.isValid() && shouldEnableDvrr(); } private boolean shouldSetFrameRate() { // use toolkitSetFrameRate flag to gate the change - return mSurface.isValid() && mPreferredFrameRate >= 0 - && shouldEnableDvrr() && !mIsFrameRateConflicted; + return shouldEnableDvrr() && mSurface.isValid() && mPreferredFrameRate >= 0 + && !mIsFrameRateConflicted; } private boolean shouldTouchBoost(int motionEventAction, int windowType) { @@ -12894,7 +12896,7 @@ public void votePreferredFrameRateCategory(int frameRateCategory, int reason, Vi * @param view The View with the ThreadedRenderer animation that started. */ public void addThreadedRendererView(View view) { - if (!mThreadedRendererViews.contains(view)) { + if (shouldEnableDvrr() && !mThreadedRendererViews.contains(view)) { mThreadedRendererViews.add(view); } } @@ -12906,7 +12908,8 @@ public void addThreadedRendererView(View view) { */ public void removeThreadedRendererView(View view) { mThreadedRendererViews.remove(view); - if (!mInvalidationIdleMessagePosted && sSurfaceFlingerBugfixFlagValue) { + if (shouldEnableDvrr() + && !mInvalidationIdleMessagePosted && sSurfaceFlingerBugfixFlagValue) { mInvalidationIdleMessagePosted = true; mHandler.sendEmptyMessageDelayed(MSG_CHECK_INVALIDATION_IDLE, IDLE_TIME_MILLIS); } @@ -13127,7 +13130,7 @@ public boolean isFrameRateConflicted() { private boolean shouldEnableDvrr() { // uncomment this when we are ready for enabling dVRR - if (sToolkitFrameRateViewEnablingReadOnlyFlagValue) { + if (sEnableVrr && sToolkitFrameRateViewEnablingReadOnlyFlagValue) { return sToolkitSetFrameRateReadOnlyFlagValue && isFrameRatePowerSavingsBalanced(); } return false; diff --git a/core/sysprop/Android.bp b/core/sysprop/Android.bp index 512a2eb20abb..ed827656d679 100644 --- a/core/sysprop/Android.bp +++ b/core/sysprop/Android.bp @@ -43,3 +43,10 @@ sysprop_library { property_owner: "Platform", api_packages: ["android.sysprop"], } + +sysprop_library { + name: "com.android.sysprop.view", + srcs: ["ViewProperties.sysprop"], + property_owner: "Platform", + api_packages: ["android.sysprop"], +} diff --git a/core/sysprop/ViewProperties.sysprop b/core/sysprop/ViewProperties.sysprop new file mode 100644 index 000000000000..e8016432efad --- /dev/null +++ b/core/sysprop/ViewProperties.sysprop @@ -0,0 +1,29 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +module: "android.sysprop.ViewProperties" +owner: Platform + +# On low-end devices, the cost of calculating frame rate can +# have noticeable overhead. These devices don't benefit from +# reduced frame rate as much as they benefit from reduced +# work. By setting this to false, the device won't do any +# VRR frame rate calculation for Views. +prop { + api_name: "vrr_enabled" + type: Boolean + prop_name: "ro.view.vrr.enabled" + scope: Internal + access: Readonly +} diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java index 1491d77b020b..19d289433b6a 100644 --- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java +++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java @@ -45,6 +45,7 @@ import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; +import android.sysprop.ViewProperties; import android.util.DisplayMetrics; import android.widget.FrameLayout; import android.widget.ProgressBar; @@ -101,6 +102,9 @@ public void setUp() throws Throwable { @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void frameRateChangesWhenContentMoves() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } waitForFrameRateCategoryToSettle(); mActivityRule.runOnUiThread(() -> { mMovingView.offsetLeftAndRight(100); @@ -127,6 +131,9 @@ public void firstFrameNoMovement() { @Test @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API) public void frameBoostDisable() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { long now = SystemClock.uptimeMillis(); MotionEvent down = MotionEvent.obtain( @@ -155,6 +162,9 @@ public void frameBoostDisable() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void lowVelocity60() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; @@ -175,6 +185,9 @@ public void lowVelocity60() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void velocityWithChildMovement() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } FrameLayout frameLayout = new FrameLayout(mActivity); mActivityRule.runOnUiThread(() -> { ViewGroup.LayoutParams fullSize = new ViewGroup.LayoutParams( @@ -201,6 +214,9 @@ public void velocityWithChildMovement() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void highVelocity120() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; @@ -222,6 +238,9 @@ public void highVelocity120() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void noVelocityUsesCategorySmall() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final CountDownLatch drawLatch1 = new CountDownLatch(1); mActivityRule.runOnUiThread(() -> { DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics(); @@ -259,6 +278,9 @@ public void noVelocityUsesCategorySmall() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void noVelocityUsesCategoryNarrowWidth() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final CountDownLatch drawLatch1 = new CountDownLatch(1); mActivityRule.runOnUiThread(() -> { DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics(); @@ -295,6 +317,9 @@ public void noVelocityUsesCategoryNarrowWidth() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void noVelocityUsesCategoryNarrowHeight() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final CountDownLatch drawLatch1 = new CountDownLatch(1); mActivityRule.runOnUiThread(() -> { DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics(); @@ -331,6 +356,9 @@ public void noVelocityUsesCategoryNarrowHeight() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void noVelocityUsesCategoryLargeWidth() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final CountDownLatch drawLatch1 = new CountDownLatch(1); mActivityRule.runOnUiThread(() -> { DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics(); @@ -367,6 +395,9 @@ public void noVelocityUsesCategoryLargeWidth() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void noVelocityUsesCategoryLargeHeight() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final CountDownLatch drawLatch1 = new CountDownLatch(1); mActivityRule.runOnUiThread(() -> { DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics(); @@ -403,6 +434,9 @@ public void noVelocityUsesCategoryLargeHeight() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void defaultNormal() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { View parent = (View) mMovingView.getParent(); ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams(); @@ -427,6 +461,9 @@ public void defaultNormal() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY }) public void frameRateAndCategory() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE); waitForFrameRateCategoryToSettle(); mActivityRule.runOnUiThread(() -> { @@ -447,6 +484,9 @@ public void frameRateAndCategory() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY }) public void willNotDrawUsesCategory() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { mMovingView.setWillNotDraw(true); mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_LOW); @@ -480,6 +520,9 @@ public void willNotDrawUsesCategory() throws Throwable { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void intermittentDoubleInvalidate() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } View parent = (View) mMovingView.getParent(); mActivityRule.runOnUiThread(() -> { parent.setWillNotDraw(false); @@ -529,6 +572,9 @@ public void intermittentDoubleInvalidate() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY }) public void sameFrameMotion() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE); waitForFrameRateCategoryToSettle(); @@ -552,6 +598,9 @@ public void sameFrameMotion() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY }) public void frameRateReset() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(120f); waitForFrameRateCategoryToSettle(); mActivityRule.runOnUiThread(() -> mMovingView.setVisibility(View.INVISIBLE)); @@ -573,6 +622,9 @@ public void frameRateReset() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY }) public void frameRateResetWithInvalidations() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(120f); waitForFrameRateCategoryToSettle(); mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL); @@ -593,6 +645,9 @@ public void frameRateResetWithInvalidations() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY }) public void testQuickTouchBoost() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mActivityRule.runOnUiThread(() -> { mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_LOW); ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams(); @@ -633,6 +688,9 @@ public void testQuickTouchBoost() throws Throwable { com.android.graphics.surfaceflinger.flags.Flags.FLAG_VRR_BUGFIX_24Q4 }) public void idleDetected() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } waitForFrameRateCategoryToSettle(); mActivityRule.runOnUiThread(() -> { mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH); @@ -657,6 +715,9 @@ public void idleDetected() throws Throwable { com.android.graphics.surfaceflinger.flags.Flags.FLAG_VRR_BUGFIX_24Q4 }) public void vectorDrawableFrameRate() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final ProgressBar[] progressBars = new ProgressBar[3]; final ViewGroup[] parents = new ViewGroup[1]; mActivityRule.runOnUiThread(() -> { @@ -714,6 +775,9 @@ public void vectorDrawableFrameRate() throws Throwable { com.android.graphics.surfaceflinger.flags.Flags.FLAG_VRR_BUGFIX_24Q4 }) public void renderNodeAnimatorFrameRateCanceled() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE); waitForFrameRateCategoryToSettle(); @@ -751,6 +815,9 @@ public void renderNodeAnimatorFrameRateCanceled() throws Throwable { com.android.graphics.surfaceflinger.flags.Flags.FLAG_VRR_BUGFIX_24Q4 }) public void renderNodeAnimatorFrameRateRemoved() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE); waitForFrameRateCategoryToSettle(); diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java index 94e187aed698..5d52da157e34 100644 --- a/core/tests/coretests/src/android/view/ViewRootImplTest.java +++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java @@ -72,6 +72,7 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; +import android.sysprop.ViewProperties; import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowInsets.Side; @@ -503,6 +504,9 @@ public void performHapticFeedback_touchFeedbackDisabled_doNothing() { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_getDefaultValues() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } ViewRootImpl viewRootImpl = new ViewRootImpl(sContext, sContext.getDisplayNoVerify()); assertEquals(FRAME_RATE_CATEGORY_DEFAULT, @@ -521,6 +525,9 @@ public void votePreferredFrameRate_getDefaultValues() { FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_visibility_bySize() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); mViewRootImpl = mView.getViewRootImpl(); @@ -558,6 +565,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_visibility_bySize() thr FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_smallSize_bySize() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -590,6 +600,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_smallSize_bySize() thro FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_normalSize_bySize() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -627,6 +640,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_normalSize_bySize() thr FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_visibility_defaultHigh() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -688,6 +704,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_visibility_defaultHigh( FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_smallSize_defaultHigh() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -723,6 +742,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_smallSize_defaultHigh() FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_normalSize_defaultHigh() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -758,6 +780,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_normalSize_defaultHigh( @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_aggregate() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); mViewRootImpl = mView.getViewRootImpl(); @@ -804,6 +829,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_aggregate() { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRate_aggregate() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); mViewRootImpl = mView.getViewRootImpl(); @@ -876,6 +904,9 @@ public void votePreferredFrameRate_voteFrameRate_aggregate() { FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRate_category() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); sInstrumentation.waitForIdleSync(); @@ -930,6 +961,9 @@ public void votePreferredFrameRate_voteFrameRate_category() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateCategory_velocityToHigh() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -973,6 +1007,9 @@ public void votePreferredFrameRate_voteFrameRateCategory_velocityToHigh() throws @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_insetsAnimation() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check @@ -1010,6 +1047,9 @@ public void votePreferredFrameRate_insetsAnimation() { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_frameRateBoostOnTouch() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); sInstrumentation.waitForIdleSync(); @@ -1043,6 +1083,9 @@ public void votePreferredFrameRate_frameRateBoostOnTouch() { @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateTimeOut() throws InterruptedException { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final long delay = 200L; mView = new View(sContext); @@ -1082,6 +1125,9 @@ public void votePreferredFrameRate_voteFrameRateTimeOut() throws InterruptedExce FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_voteFrameRateOnly() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); float frameRate = 20; attachViewToWindow(mView); @@ -1133,6 +1179,9 @@ public void votePreferredFrameRate_voteFrameRateOnly() throws Throwable { FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_infrequentLayer_defaultHigh() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final long delay = 200L; mView = new View(sContext); @@ -1211,6 +1260,9 @@ public void votePreferredFrameRate_infrequentLayer_defaultHigh() throws Throwabl @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_isFrameRatePowerSavingsBalanced() { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); attachViewToWindow(mView); sInstrumentation.waitForIdleSync(); @@ -1245,6 +1297,9 @@ public void votePreferredFrameRate_isFrameRatePowerSavingsBalanced() { FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY, FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY}) public void votePreferredFrameRate_applyTextureViewHeuristic() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } final long delay = 30L; mView = new TextureView(sContext); @@ -1289,6 +1344,9 @@ public void votePreferredFrameRate_applyTextureViewHeuristic() throws Throwable @Test @RequiresFlagsEnabled(FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY) public void votePreferredFrameRate_velocityVotedAfterOnDraw() throws Throwable { + if (!ViewProperties.vrr_enabled().orElse(true)) { + return; + } mView = new View(sContext); double delta = 0.1; float pixelsPerSecond = 1000_000;