Loading core/api/current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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); core/java/android/view/ViewRootImpl.java +11 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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(); } /** Loading Loading @@ -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); Loading core/java/android/view/Window.java +36 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -1372,6 +1375,39 @@ public abstract class Window { return getAttributes().getDesiredHdrHeadroom(); } /** * 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 Loading core/java/android/view/WindowManager.java +50 −0 Original line number Diff line number Diff line Loading @@ -4331,6 +4331,13 @@ public interface WindowManager extends ViewManager { /** @hide */ 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. Loading Loading @@ -4765,6 +4772,32 @@ public interface WindowManager extends ViewManager { return mDesiredHdrHeadroom; } /** * 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}, Loading Loading @@ -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 Loading Loading @@ -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"}) Loading Loading @@ -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; } Loading Loading @@ -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:"); Loading core/tests/coretests/src/android/view/ViewRootImplTest.java +31 −2 Original line number Diff line number Diff line Loading @@ -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(); }); Loading @@ -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); Loading Loading
core/api/current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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);
core/java/android/view/ViewRootImpl.java +11 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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(); } /** Loading Loading @@ -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); Loading
core/java/android/view/Window.java +36 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -1372,6 +1375,39 @@ public abstract class Window { return getAttributes().getDesiredHdrHeadroom(); } /** * 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 Loading
core/java/android/view/WindowManager.java +50 −0 Original line number Diff line number Diff line Loading @@ -4331,6 +4331,13 @@ public interface WindowManager extends ViewManager { /** @hide */ 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. Loading Loading @@ -4765,6 +4772,32 @@ public interface WindowManager extends ViewManager { return mDesiredHdrHeadroom; } /** * 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}, Loading Loading @@ -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 Loading Loading @@ -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"}) Loading Loading @@ -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; } Loading Loading @@ -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:"); Loading
core/tests/coretests/src/android/view/ViewRootImplTest.java +31 −2 Original line number Diff line number Diff line Loading @@ -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(); }); Loading @@ -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); Loading