Loading core/java/android/view/TextureView.java +2 −4 Original line number Original line Diff line number Diff line Loading @@ -16,7 +16,6 @@ package android.view; package android.view; import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; Loading Loading @@ -197,7 +196,6 @@ public class TextureView extends View { private Canvas mCanvas; private Canvas mCanvas; private int mSaveCount; private int mSaveCount; @FloatRange(from = 0.0) float mFrameRate; @Surface.FrameRateCompatibility int mFrameRateCompatibility; @Surface.FrameRateCompatibility int mFrameRateCompatibility; private final Object[] mNativeWindowLock = new Object[0]; private final Object[] mNativeWindowLock = new Object[0]; Loading Loading @@ -473,13 +471,13 @@ public class TextureView extends View { mLayer.setSurfaceTexture(mSurface); mLayer.setSurfaceTexture(mSurface); mSurface.setDefaultBufferSize(getWidth(), getHeight()); mSurface.setDefaultBufferSize(getWidth(), getHeight()); mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler); mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler); if (Flags.toolkitSetFrameRate()) { if (Flags.toolkitSetFrameRateReadOnly()) { mSurface.setOnSetFrameRateListener( mSurface.setOnSetFrameRateListener( (surfaceTexture, frameRate, compatibility, strategy) -> { (surfaceTexture, frameRate, compatibility, strategy) -> { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { Trace.instant(Trace.TRACE_TAG_VIEW, "setFrameRate: " + frameRate); Trace.instant(Trace.TRACE_TAG_VIEW, "setFrameRate: " + frameRate); } } mFrameRate = frameRate; setRequestedFrameRate(frameRate); mFrameRateCompatibility = compatibility; mFrameRateCompatibility = compatibility; }, mAttachInfo.mHandler); }, mAttachInfo.mHandler); } } Loading core/java/android/view/ViewRootImpl.java +12 −2 Original line number Original line Diff line number Diff line Loading @@ -1027,6 +1027,9 @@ public final class ViewRootImpl implements ViewParent, private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500; private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500; // time for revaluating the idle status before lowering the frame rate. // time for revaluating the idle status before lowering the frame rate. private static final int FRAME_RATE_IDLENESS_REEVALUATE_TIME = 500; 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 * the variables below are used to determine whther a dVRR feature should be enabled Loading Loading @@ -4083,7 +4086,6 @@ public final class ViewRootImpl implements ViewParent, setPreferredFrameRate(mPreferredFrameRate); setPreferredFrameRate(mPreferredFrameRate); setPreferredFrameRateCategory(mPreferredFrameRateCategory); setPreferredFrameRateCategory(mPreferredFrameRateCategory); mPreferredFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE; mPreferredFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE; mPreferredFrameRate = 0; } } private void createSyncIfNeeded() { private void createSyncIfNeeded() { Loading Loading @@ -6137,6 +6139,7 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_TOUCH_BOOST_TIMEOUT = 39; private static final int MSG_TOUCH_BOOST_TIMEOUT = 39; private static final int MSG_CHECK_INVALIDATION_IDLE = 40; private static final int MSG_CHECK_INVALIDATION_IDLE = 40; private static final int MSG_REFRESH_POINTER_ICON = 41; private static final int MSG_REFRESH_POINTER_ICON = 41; private static final int MSG_FRAME_RATE_SETTING = 42; final class ViewRootHandler extends Handler { final class ViewRootHandler extends Handler { @Override @Override Loading Loading @@ -6476,6 +6479,10 @@ public final class ViewRootImpl implements ViewParent, } } updatePointerIcon(mPointerIconEvent); updatePointerIcon(mPointerIconEvent); break; break; case MSG_FRAME_RATE_SETTING: mPreferredFrameRate = 0; setPreferredFrameRate(mPreferredFrameRate); break; } } } } } } Loading Loading @@ -12297,7 +12304,7 @@ public final class ViewRootImpl implements ViewParent, private boolean shouldSetFrameRate() { private boolean shouldSetFrameRate() { // use toolkitSetFrameRate flag to gate the change // use toolkitSetFrameRate flag to gate the change return mPreferredFrameRate > 0 && sToolkitSetFrameRateReadOnlyFlagValue; return sToolkitSetFrameRateReadOnlyFlagValue; } } private boolean shouldTouchBoost(int motionEventAction, int windowType) { private boolean shouldTouchBoost(int motionEventAction, int windowType) { Loading Loading @@ -12348,6 +12355,9 @@ public final class ViewRootImpl implements ViewParent, } } mHasInvalidation = true; mHasInvalidation = true; mHandler.removeMessages(MSG_FRAME_RATE_SETTING); mHandler.sendEmptyMessageDelayed(MSG_FRAME_RATE_SETTING, FRAME_RATE_SETTING_REEVALUATE_TIME); } } /** /** core/tests/coretests/src/android/view/ViewRootImplTest.java +27 −0 Original line number Original line Diff line number Diff line Loading @@ -801,6 +801,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: * Test the logic of infrequent layer: * - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100. * - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100. Loading graphics/java/android/graphics/SurfaceTexture.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -489,7 +489,7 @@ public class SurfaceTexture { @Surface.ChangeFrameRateStrategy int changeFrameRateStrategy) { @Surface.ChangeFrameRateStrategy int changeFrameRateStrategy) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "postOnSetFrameRateEventFromNative"); Trace.traceBegin(Trace.TRACE_TAG_VIEW, "postOnSetFrameRateEventFromNative"); try { try { if (Flags.toolkitSetFrameRate()) { if (Flags.toolkitSetFrameRateReadOnly()) { SurfaceTexture st = weakSelf.get(); SurfaceTexture st = weakSelf.get(); if (st != null) { if (st != null) { Handler handler = st.mOnSetFrameRateHandler; Handler handler = st.mOnSetFrameRateHandler; Loading Loading
core/java/android/view/TextureView.java +2 −4 Original line number Original line Diff line number Diff line Loading @@ -16,7 +16,6 @@ package android.view; package android.view; import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; Loading Loading @@ -197,7 +196,6 @@ public class TextureView extends View { private Canvas mCanvas; private Canvas mCanvas; private int mSaveCount; private int mSaveCount; @FloatRange(from = 0.0) float mFrameRate; @Surface.FrameRateCompatibility int mFrameRateCompatibility; @Surface.FrameRateCompatibility int mFrameRateCompatibility; private final Object[] mNativeWindowLock = new Object[0]; private final Object[] mNativeWindowLock = new Object[0]; Loading Loading @@ -473,13 +471,13 @@ public class TextureView extends View { mLayer.setSurfaceTexture(mSurface); mLayer.setSurfaceTexture(mSurface); mSurface.setDefaultBufferSize(getWidth(), getHeight()); mSurface.setDefaultBufferSize(getWidth(), getHeight()); mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler); mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler); if (Flags.toolkitSetFrameRate()) { if (Flags.toolkitSetFrameRateReadOnly()) { mSurface.setOnSetFrameRateListener( mSurface.setOnSetFrameRateListener( (surfaceTexture, frameRate, compatibility, strategy) -> { (surfaceTexture, frameRate, compatibility, strategy) -> { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { Trace.instant(Trace.TRACE_TAG_VIEW, "setFrameRate: " + frameRate); Trace.instant(Trace.TRACE_TAG_VIEW, "setFrameRate: " + frameRate); } } mFrameRate = frameRate; setRequestedFrameRate(frameRate); mFrameRateCompatibility = compatibility; mFrameRateCompatibility = compatibility; }, mAttachInfo.mHandler); }, mAttachInfo.mHandler); } } Loading
core/java/android/view/ViewRootImpl.java +12 −2 Original line number Original line Diff line number Diff line Loading @@ -1027,6 +1027,9 @@ public final class ViewRootImpl implements ViewParent, private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500; private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500; // time for revaluating the idle status before lowering the frame rate. // time for revaluating the idle status before lowering the frame rate. private static final int FRAME_RATE_IDLENESS_REEVALUATE_TIME = 500; 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 * the variables below are used to determine whther a dVRR feature should be enabled Loading Loading @@ -4083,7 +4086,6 @@ public final class ViewRootImpl implements ViewParent, setPreferredFrameRate(mPreferredFrameRate); setPreferredFrameRate(mPreferredFrameRate); setPreferredFrameRateCategory(mPreferredFrameRateCategory); setPreferredFrameRateCategory(mPreferredFrameRateCategory); mPreferredFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE; mPreferredFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE; mPreferredFrameRate = 0; } } private void createSyncIfNeeded() { private void createSyncIfNeeded() { Loading Loading @@ -6137,6 +6139,7 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_TOUCH_BOOST_TIMEOUT = 39; private static final int MSG_TOUCH_BOOST_TIMEOUT = 39; private static final int MSG_CHECK_INVALIDATION_IDLE = 40; private static final int MSG_CHECK_INVALIDATION_IDLE = 40; private static final int MSG_REFRESH_POINTER_ICON = 41; private static final int MSG_REFRESH_POINTER_ICON = 41; private static final int MSG_FRAME_RATE_SETTING = 42; final class ViewRootHandler extends Handler { final class ViewRootHandler extends Handler { @Override @Override Loading Loading @@ -6476,6 +6479,10 @@ public final class ViewRootImpl implements ViewParent, } } updatePointerIcon(mPointerIconEvent); updatePointerIcon(mPointerIconEvent); break; break; case MSG_FRAME_RATE_SETTING: mPreferredFrameRate = 0; setPreferredFrameRate(mPreferredFrameRate); break; } } } } } } Loading Loading @@ -12297,7 +12304,7 @@ public final class ViewRootImpl implements ViewParent, private boolean shouldSetFrameRate() { private boolean shouldSetFrameRate() { // use toolkitSetFrameRate flag to gate the change // use toolkitSetFrameRate flag to gate the change return mPreferredFrameRate > 0 && sToolkitSetFrameRateReadOnlyFlagValue; return sToolkitSetFrameRateReadOnlyFlagValue; } } private boolean shouldTouchBoost(int motionEventAction, int windowType) { private boolean shouldTouchBoost(int motionEventAction, int windowType) { Loading Loading @@ -12348,6 +12355,9 @@ public final class ViewRootImpl implements ViewParent, } } mHasInvalidation = true; mHasInvalidation = true; mHandler.removeMessages(MSG_FRAME_RATE_SETTING); mHandler.sendEmptyMessageDelayed(MSG_FRAME_RATE_SETTING, FRAME_RATE_SETTING_REEVALUATE_TIME); } } /** /**
core/tests/coretests/src/android/view/ViewRootImplTest.java +27 −0 Original line number Original line Diff line number Diff line Loading @@ -801,6 +801,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: * Test the logic of infrequent layer: * - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100. * - NORMAL for infrequent update: FT2-FT1 > 100 && FT3-FT2 > 100. Loading
graphics/java/android/graphics/SurfaceTexture.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -489,7 +489,7 @@ public class SurfaceTexture { @Surface.ChangeFrameRateStrategy int changeFrameRateStrategy) { @Surface.ChangeFrameRateStrategy int changeFrameRateStrategy) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "postOnSetFrameRateEventFromNative"); Trace.traceBegin(Trace.TRACE_TAG_VIEW, "postOnSetFrameRateEventFromNative"); try { try { if (Flags.toolkitSetFrameRate()) { if (Flags.toolkitSetFrameRateReadOnly()) { SurfaceTexture st = weakSelf.get(); SurfaceTexture st = weakSelf.get(); if (st != null) { if (st != null) { Handler handler = st.mOnSetFrameRateHandler; Handler handler = st.mOnSetFrameRateHandler; Loading