diff options
| author | 2023-12-19 23:29:00 +0000 | |
|---|---|---|
| committer | 2023-12-19 23:29:00 +0000 | |
| commit | 050378c4d082d0ed3752d90a19b13fa12b4a1ad7 (patch) | |
| tree | 64b5f04fae81e655c21b5fa286d8b8d79315b4d0 | |
| parent | 8a83c56fa33b2282089dafb57629bf3699c870eb (diff) | |
| parent | 3acb890713b9fbc3435253240abc060aed5308d3 (diff) | |
Merge "Add FrameRateBoostOnTouch API to WindowManager.LayoutParams" into main
| -rw-r--r-- | core/api/current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 13 | ||||
| -rw-r--r-- | core/java/android/view/Window.java | 36 | ||||
| -rw-r--r-- | core/java/android/view/WindowManager.java | 50 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 33 |
5 files changed, 132 insertions, 4 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 008521a0446a..2817e4b3bd49 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53525,6 +53525,7 @@ package android.view { method public android.transition.Transition getExitTransition(); method protected final int getFeatures(); method protected final int getForcedWindowFlags(); + method @FlaggedApi("android.view.flags.toolkit_set_frame_rate_read_only") public boolean getFrameRateBoostOnTouchEnabled(); method @Nullable public android.view.WindowInsetsController getInsetsController(); method @NonNull public abstract android.view.LayoutInflater getLayoutInflater(); method protected final int getLocalFeatures(); @@ -53602,6 +53603,7 @@ package android.view { method public abstract void setFeatureInt(int, int); method public void setFlags(int, int); method public void setFormat(int); + method @FlaggedApi("android.view.flags.toolkit_set_frame_rate_read_only") public void setFrameRateBoostOnTouchEnabled(boolean); method public void setGravity(int); method @RequiresPermission(android.Manifest.permission.HIDE_OVERLAY_WINDOWS) public final void setHideOverlayWindows(boolean); method public void setIcon(@DrawableRes int); @@ -53946,6 +53948,7 @@ package android.view { method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public float getDesiredHdrHeadroom(); method public int getFitInsetsSides(); method public int getFitInsetsTypes(); + method @FlaggedApi("android.view.flags.toolkit_set_frame_rate_read_only") public boolean getFrameRateBoostOnTouchEnabled(); method public final CharSequence getTitle(); method public boolean isFitInsetsIgnoringVisibility(); method public boolean isHdrConversionEnabled(); @@ -53957,6 +53960,7 @@ package android.view { method public void setFitInsetsIgnoringVisibility(boolean); method public void setFitInsetsSides(int); method public void setFitInsetsTypes(int); + method @FlaggedApi("android.view.flags.toolkit_set_frame_rate_read_only") public void setFrameRateBoostOnTouchEnabled(boolean); method public void setHdrConversionEnabled(boolean); method public final void setTitle(CharSequence); method public void setWallpaperTouchEventsEnabled(boolean); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9f6395e1aab4..185328277dfd 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -252,7 +252,6 @@ import java.util.Queue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.function.Predicate; - /** * The top of a view hierarchy, implementing the needed protocol between View * and the WindowManager. This is for the most part an internal implementation @@ -12148,7 +12147,8 @@ public final class ViewRootImpl implements ViewParent, || motionEventAction == MotionEvent.ACTION_UP; boolean undesiredType = windowType == TYPE_INPUT_METHOD; // use toolkitSetFrameRate flag to gate the change - return desiredAction && !undesiredType && sToolkitSetFrameRateReadOnlyFlagValue; + return desiredAction && !undesiredType && sToolkitSetFrameRateReadOnlyFlagValue + && getFrameRateBoostOnTouchEnabled(); } /** @@ -12223,6 +12223,15 @@ public final class ViewRootImpl implements ViewParent, return mIsFrameRateBoosting; } + /** + * Get the value of mFrameRateBoostOnTouchEnabled + * Can be used to checked if touch boost is enabled. The default value is true. + */ + @VisibleForTesting + public boolean getFrameRateBoostOnTouchEnabled() { + return mWindowAttributes.getFrameRateBoostOnTouchEnabled(); + } + private void boostFrameRate(int boostTimeOut) { mIsFrameRateBoosting = true; setPreferredFrameRateCategory(mPreferredFrameRateCategory); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 87537fbc9961..7bae7ec6559c 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -334,6 +334,9 @@ public abstract class Window { private boolean mOverlayWithDecorCaptionEnabled = true; private boolean mCloseOnSwipeEnabled = false; + private static boolean sToolkitSetFrameRateReadOnlyFlagValue = + android.view.flags.Flags.toolkitSetFrameRateReadOnly(); + // The current window attributes. @UnsupportedAppUsage private final WindowManager.LayoutParams mWindowAttributes = @@ -1373,6 +1376,39 @@ public abstract class Window { } /** + * Sets whether the frame rate touch boost is enabled for this Window. + * When enabled, the frame rate will be boosted when a user touches the Window. + * + * @param enabled whether the frame rate touch boost is enabled. + * @see #getFrameRateBoostOnTouchEnabled() + * @see WindowManager.LayoutParams#setFrameRateBoostOnTouchEnabled(boolean) + */ + @FlaggedApi(android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY) + public void setFrameRateBoostOnTouchEnabled(boolean enabled) { + if (sToolkitSetFrameRateReadOnlyFlagValue) { + final WindowManager.LayoutParams attrs = getAttributes(); + attrs.setFrameRateBoostOnTouchEnabled(enabled); + dispatchWindowAttributesChanged(attrs); + } + } + + /** + * Get whether frame rate touch boost is enabled + * {@link #setFrameRateBoostOnTouchEnabled(boolean)} + * + * @return whether the frame rate touch boost is enabled. + * @see #setFrameRateBoostOnTouchEnabled(boolean) + * @see WindowManager.LayoutParams#getFrameRateBoostOnTouchEnabled() + */ + @FlaggedApi(android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY) + public boolean getFrameRateBoostOnTouchEnabled() { + if (sToolkitSetFrameRateReadOnlyFlagValue) { + return getAttributes().getFrameRateBoostOnTouchEnabled(); + } + return true; + } + + /** * If {@code isPreferred} is true, this method requests that the connected display does minimal * post processing when this window is visible on the screen. Otherwise, it requests that the * display switches back to standard image processing. diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 07a347ace313..f76822f14189 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -4332,6 +4332,13 @@ public interface WindowManager extends ViewManager { private float mDesiredHdrHeadroom = 0; /** + * For variable refresh rate project. + */ + private boolean mFrameRateBoostOnTouch = true; + private static boolean sToolkitSetFrameRateReadOnlyFlagValue = + android.view.flags.Flags.toolkitSetFrameRateReadOnly(); + + /** * Carries the requests about {@link WindowInsetsController.Appearance} and * {@link WindowInsetsController.Behavior} to the system windows which can produce insets. * @@ -4766,6 +4773,32 @@ public interface WindowManager extends ViewManager { } /** + * Set the value whether we should enable Touch Boost + * + * @param enabled Whether we should enable Touch Boost + */ + @FlaggedApi(android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY) + public void setFrameRateBoostOnTouchEnabled(boolean enabled) { + if (sToolkitSetFrameRateReadOnlyFlagValue) { + mFrameRateBoostOnTouch = enabled; + } + } + + /** + * Get the value whether we should enable touch boost as set + * by {@link #setFrameRateBoostOnTouchEnabled(boolean)} + * + * @return A boolean value to indicate whether we should enable touch boost + */ + @FlaggedApi(android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY) + public boolean getFrameRateBoostOnTouchEnabled() { + if (sToolkitSetFrameRateReadOnlyFlagValue) { + return mFrameRateBoostOnTouch; + } + return true; + } + + /** * <p> * Blurs the screen behind the window. The effect is similar to that of {@link #dimAmount}, * but instead of dimmed, the content behind the window will be blurred (or combined with @@ -4916,6 +4949,9 @@ public interface WindowManager extends ViewManager { out.writeTypedArray(paramsForRotation, 0 /* parcelableFlags */); out.writeInt(mDisplayFlags); out.writeFloat(mDesiredHdrHeadroom); + if (sToolkitSetFrameRateReadOnlyFlagValue) { + out.writeBoolean(mFrameRateBoostOnTouch); + } } public static final @android.annotation.NonNull Parcelable.Creator<LayoutParams> CREATOR @@ -4988,6 +5024,9 @@ public interface WindowManager extends ViewManager { paramsForRotation = in.createTypedArray(LayoutParams.CREATOR); mDisplayFlags = in.readInt(); mDesiredHdrHeadroom = in.readFloat(); + if (sToolkitSetFrameRateReadOnlyFlagValue) { + mFrameRateBoostOnTouch = in.readBoolean(); + } } @SuppressWarnings({"PointlessBitwiseExpression"}) @@ -5324,6 +5363,12 @@ public interface WindowManager extends ViewManager { changes |= LAYOUT_CHANGED; } + if (sToolkitSetFrameRateReadOnlyFlagValue + && mFrameRateBoostOnTouch != o.mFrameRateBoostOnTouch) { + mFrameRateBoostOnTouch = o.mFrameRateBoostOnTouch; + changes |= LAYOUT_CHANGED; + } + return changes; } @@ -5546,6 +5591,11 @@ public interface WindowManager extends ViewManager { sb.append(prefix).append(" forciblyShownTypes=").append( WindowInsets.Type.toString(forciblyShownTypes)); } + if (sToolkitSetFrameRateReadOnlyFlagValue && mFrameRateBoostOnTouch) { + sb.append(System.lineSeparator()); + sb.append(prefix).append(" frameRateBoostOnTouch="); + sb.append(mFrameRateBoostOnTouch); + } if (paramsForRotation != null && paramsForRotation.length != 0) { sb.append(System.lineSeparator()); sb.append(prefix).append(" paramsForRotation:"); diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java index b30a0c8fbbd3..cf3eb12498ca 100644 --- a/core/tests/coretests/src/android/view/ViewRootImplTest.java +++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java @@ -659,8 +659,6 @@ public class ViewRootImplTest { ViewRootImpl viewRootImpl = view.getViewRootImpl(); sInstrumentation.runOnMainSync(() -> { view.invalidate(); - assertEquals(viewRootImpl.getLastPreferredFrameRateCategory(), - FRAME_RATE_CATEGORY_NORMAL); viewRootImpl.notifyInsetsAnimationRunningStateChanged(true); view.invalidate(); }); @@ -672,6 +670,37 @@ public class ViewRootImplTest { }); } + + /** + * Test FrameRateBoostOnTouchEnabled API + */ + @Test + @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY) + public void votePreferredFrameRate_frameRateBoostOnTouch() { + View view = new View(sContext); + attachViewToWindow(view); + sInstrumentation.waitForIdleSync(); + + ViewRootImpl viewRootImpl = view.getViewRootImpl(); + final WindowManager.LayoutParams attrs = viewRootImpl.mWindowAttributes; + assertEquals(attrs.getFrameRateBoostOnTouchEnabled(), true); + assertEquals(viewRootImpl.getFrameRateBoostOnTouchEnabled(), + attrs.getFrameRateBoostOnTouchEnabled()); + + sInstrumentation.runOnMainSync(() -> { + attrs.setFrameRateBoostOnTouchEnabled(false); + viewRootImpl.setLayoutParams(attrs, false); + }); + sInstrumentation.waitForIdleSync(); + + sInstrumentation.runOnMainSync(() -> { + final WindowManager.LayoutParams newAttrs = viewRootImpl.mWindowAttributes; + assertEquals(newAttrs.getFrameRateBoostOnTouchEnabled(), false); + assertEquals(viewRootImpl.getFrameRateBoostOnTouchEnabled(), + newAttrs.getFrameRateBoostOnTouchEnabled()); + }); + } + @Test public void forceInvertOffDarkThemeOff_forceDarkModeDisabled() { mSetFlagsRule.enableFlags(FLAG_FORCE_INVERT_COLOR); |