summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jian-Syuan (Shane) Wong <shanewong@google.com> 2024-02-02 16:56:13 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-02-02 16:56:13 +0000
commit53e9688c2dbe2bddcfd2af1b226f30f6517248b4 (patch)
treec954d3a5ea7bcb56ed394f69c306b656b40e75b0
parente64360e19e94303ea7dda5fc93c6bc1e085bb285 (diff)
parentbdb6c422e9d8ca09dbd5cadcd6298aa5c3a44a83 (diff)
Merge "Call setFrameRate in TextureView to set frame rate properly." into main
-rw-r--r--core/java/android/view/TextureView.java6
-rw-r--r--core/java/android/view/ViewRootImpl.java14
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java27
-rw-r--r--graphics/java/android/graphics/SurfaceTexture.java2
4 files changed, 42 insertions, 7 deletions
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 163dfa21c3ef..021bbf7b9c9f 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -16,7 +16,6 @@
package android.view;
-import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
@@ -197,7 +196,6 @@ public class TextureView extends View {
private Canvas mCanvas;
private int mSaveCount;
- @FloatRange(from = 0.0) float mFrameRate;
@Surface.FrameRateCompatibility int mFrameRateCompatibility;
private final Object[] mNativeWindowLock = new Object[0];
@@ -473,13 +471,13 @@ public class TextureView extends View {
mLayer.setSurfaceTexture(mSurface);
mSurface.setDefaultBufferSize(getWidth(), getHeight());
mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler);
- if (Flags.toolkitSetFrameRate()) {
+ if (Flags.toolkitSetFrameRateReadOnly()) {
mSurface.setOnSetFrameRateListener(
(surfaceTexture, frameRate, compatibility, strategy) -> {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, "setFrameRate: " + frameRate);
}
- mFrameRate = frameRate;
+ setRequestedFrameRate(frameRate);
mFrameRateCompatibility = compatibility;
}, mAttachInfo.mHandler);
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 49400aff0762..efc3e25a9c44 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1027,6 +1027,9 @@ public final class ViewRootImpl implements ViewParent,
private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500;
// time for revaluating the idle status before lowering the frame rate.
private static final int FRAME_RATE_IDLENESS_REEVALUATE_TIME = 500;
+ // time for evaluating the interval between current time and
+ // the time when frame rate was set previously.
+ private static final int FRAME_RATE_SETTING_REEVALUATE_TIME = 100;
/*
* the variables below are used to determine whther a dVRR feature should be enabled
@@ -4083,7 +4086,6 @@ public final class ViewRootImpl implements ViewParent,
setPreferredFrameRate(mPreferredFrameRate);
setPreferredFrameRateCategory(mPreferredFrameRateCategory);
mPreferredFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE;
- mPreferredFrameRate = 0;
}
private void createSyncIfNeeded() {
@@ -6137,6 +6139,7 @@ public final class ViewRootImpl implements ViewParent,
private static final int MSG_TOUCH_BOOST_TIMEOUT = 39;
private static final int MSG_CHECK_INVALIDATION_IDLE = 40;
private static final int MSG_REFRESH_POINTER_ICON = 41;
+ private static final int MSG_FRAME_RATE_SETTING = 42;
final class ViewRootHandler extends Handler {
@Override
@@ -6476,6 +6479,10 @@ public final class ViewRootImpl implements ViewParent,
}
updatePointerIcon(mPointerIconEvent);
break;
+ case MSG_FRAME_RATE_SETTING:
+ mPreferredFrameRate = 0;
+ setPreferredFrameRate(mPreferredFrameRate);
+ break;
}
}
}
@@ -12297,7 +12304,7 @@ public final class ViewRootImpl implements ViewParent,
private boolean shouldSetFrameRate() {
// use toolkitSetFrameRate flag to gate the change
- return mPreferredFrameRate > 0 && sToolkitSetFrameRateReadOnlyFlagValue;
+ return sToolkitSetFrameRateReadOnlyFlagValue;
}
private boolean shouldTouchBoost(int motionEventAction, int windowType) {
@@ -12348,6 +12355,9 @@ public final class ViewRootImpl implements ViewParent,
}
mHasInvalidation = true;
+ mHandler.removeMessages(MSG_FRAME_RATE_SETTING);
+ mHandler.sendEmptyMessageDelayed(MSG_FRAME_RATE_SETTING,
+ FRAME_RATE_SETTING_REEVALUATE_TIME);
}
/**
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index b19cd8dafcab..52e996cab3ed 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -802,6 +802,33 @@ public class ViewRootImplTest {
}
/**
+ * Test votePreferredFrameRate_voteFrameRateTimeOut
+ * If no frame rate is voted in 100 milliseconds, the value of
+ * mPreferredFrameRate should be set to 0.
+ */
+ @Test
+ @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ public void votePreferredFrameRate_voteFrameRateTimeOut() throws InterruptedException {
+ final long delay = 200L;
+
+ View view = new View(sContext);
+ attachViewToWindow(view);
+ sInstrumentation.waitForIdleSync();
+ ViewRootImpl viewRootImpl = view.getViewRootImpl();
+
+ sInstrumentation.runOnMainSync(() -> {
+ assertEquals(viewRootImpl.getPreferredFrameRate(), 0, 0.1);
+ viewRootImpl.votePreferredFrameRate(24);
+ assertEquals(viewRootImpl.getPreferredFrameRate(), 24, 0.1);
+ view.invalidate();
+ assertEquals(viewRootImpl.getPreferredFrameRate(), 24, 0.1);
+ });
+
+ Thread.sleep(delay);
+ assertEquals(viewRootImpl.getPreferredFrameRate(), 0, 0.1);
+ }
+
+ /**
* Test the logic of infrequent layer:
* - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100.
* - HIGH/NORMAL based on size for frequent update: (FT3-FT2) + (FT2 - FT1) < 100.
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index dd82fed03087..50b167ef9f46 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -489,7 +489,7 @@ public class SurfaceTexture {
@Surface.ChangeFrameRateStrategy int changeFrameRateStrategy) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "postOnSetFrameRateEventFromNative");
try {
- if (Flags.toolkitSetFrameRate()) {
+ if (Flags.toolkitSetFrameRateReadOnly()) {
SurfaceTexture st = weakSelf.get();
if (st != null) {
Handler handler = st.mOnSetFrameRateHandler;