diff options
| author | 2024-02-02 16:56:13 +0000 | |
|---|---|---|
| committer | 2024-02-02 16:56:13 +0000 | |
| commit | 53e9688c2dbe2bddcfd2af1b226f30f6517248b4 (patch) | |
| tree | c954d3a5ea7bcb56ed394f69c306b656b40e75b0 | |
| parent | e64360e19e94303ea7dda5fc93c6bc1e085bb285 (diff) | |
| parent | bdb6c422e9d8ca09dbd5cadcd6298aa5c3a44a83 (diff) | |
Merge "Call setFrameRate in TextureView to set frame rate properly." into main
| -rw-r--r-- | core/java/android/view/TextureView.java | 6 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 14 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 27 | ||||
| -rw-r--r-- | graphics/java/android/graphics/SurfaceTexture.java | 2 |
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; |