summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jian-Syuan (Shane) Wong <shanewong@google.com> 2023-12-19 23:29:00 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-12-19 23:29:00 +0000
commit050378c4d082d0ed3752d90a19b13fa12b4a1ad7 (patch)
tree64b5f04fae81e655c21b5fa286d8b8d79315b4d0
parent8a83c56fa33b2282089dafb57629bf3699c870eb (diff)
parent3acb890713b9fbc3435253240abc060aed5308d3 (diff)
Merge "Add FrameRateBoostOnTouch API to WindowManager.LayoutParams" into main
-rw-r--r--core/api/current.txt4
-rw-r--r--core/java/android/view/ViewRootImpl.java13
-rw-r--r--core/java/android/view/Window.java36
-rw-r--r--core/java/android/view/WindowManager.java50
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java33
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);