Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bf4990b authored by George Mount's avatar George Mount Committed by Android (Google) Code Review
Browse files

Merge changes I97df4fd7,Ifee3b9a1 into main

* changes:
  Support LOW refresh rate for small Views
  Enable default NORMAL refresh rate
parents fa0bb0ab 60e9272c
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.flags.Flags.enableUseMeasureCacheDuringForceLayout;
import static android.view.flags.Flags.sensitiveContentAppProtection;
import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.viewVelocityApi;
@@ -33796,9 +33798,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                    || heightDp <= FRAME_RATE_NARROW_THRESHOLD
                    || (widthDp <= FRAME_RATE_SMALL_SIZE_THRESHOLD
                    && heightDp <= FRAME_RATE_SMALL_SIZE_THRESHOLD)) {
                return FRAME_RATE_CATEGORY_NORMAL | FRAME_RATE_CATEGORY_REASON_SMALL;
                int category = toolkitFrameRateBySizeReadOnly()
                        ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
                return category | FRAME_RATE_CATEGORY_REASON_SMALL;
            } else {
                return FRAME_RATE_CATEGORY_HIGH | FRAME_RATE_CATEGORY_REASON_LARGE;
                int category = toolkitFrameRateDefaultNormalReadOnly()
                        ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
                return category | FRAME_RATE_CATEGORY_REASON_LARGE;
            }
        }
@@ -33846,8 +33852,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                    frameRateCategory = FRAME_RATE_CATEGORY_HIGH
                            | FRAME_RATE_CATEGORY_REASON_REQUESTED;
                } else {
                    // invalid frame rate, default to HIGH
                    frameRateCategory = FRAME_RATE_CATEGORY_HIGH
                    // invalid frame rate, use default
                    int category = toolkitFrameRateDefaultNormalReadOnly()
                            ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
                    frameRateCategory = category
                            | FRAME_RATE_CATEGORY_REASON_INVALID;
                }
            } else {
+38 −9
Original line number Diff line number Diff line
@@ -16,7 +16,14 @@

package android.view;

import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.Surface.FRAME_RATE_CATEGORY_LOW;
import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL;
import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_DEFAULT_NORMAL_READ_ONLY;
import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;

import static junit.framework.Assert.assertEquals;

@@ -124,6 +131,7 @@ public class ViewFrameRateTest {
    }

    @Test
    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
    public void noVelocityUsesCategorySmall() throws Throwable {
        final CountDownLatch drawLatch1 = new CountDownLatch(1);
        mActivityRule.runOnUiThread(() -> {
@@ -141,12 +149,14 @@ public class ViewFrameRateTest {
        // Now that it is small, any invalidation should have a normal category
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
                    mViewRoot.getPreferredFrameRateCategory());
            int expected = toolkitFrameRateBySizeReadOnly()
                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
        });
    }

    @Test
    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
    public void noVelocityUsesCategoryNarrowWidth() throws Throwable {
        final CountDownLatch drawLatch1 = new CountDownLatch(1);
        mActivityRule.runOnUiThread(() -> {
@@ -164,12 +174,14 @@ public class ViewFrameRateTest {
        // Now that it is small, any invalidation should have a normal category
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
                    mViewRoot.getPreferredFrameRateCategory());
            int expected = toolkitFrameRateBySizeReadOnly()
                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
        });
    }

    @Test
    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
    public void noVelocityUsesCategoryNarrowHeight() throws Throwable {
        final CountDownLatch drawLatch1 = new CountDownLatch(1);
        mActivityRule.runOnUiThread(() -> {
@@ -187,12 +199,14 @@ public class ViewFrameRateTest {
        // Now that it is small, any invalidation should have a normal category
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
                    mViewRoot.getPreferredFrameRateCategory());
            int expected = toolkitFrameRateBySizeReadOnly()
                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
        });
    }

    @Test
    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
    public void noVelocityUsesCategoryLargeWidth() throws Throwable {
        final CountDownLatch drawLatch1 = new CountDownLatch(1);
        mActivityRule.runOnUiThread(() -> {
@@ -210,12 +224,14 @@ public class ViewFrameRateTest {
        // Now that it is small, any invalidation should have a high category
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(Surface.FRAME_RATE_CATEGORY_HIGH,
                    mViewRoot.getPreferredFrameRateCategory());
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
        });
    }

    @Test
    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
    public void noVelocityUsesCategoryLargeHeight() throws Throwable {
        final CountDownLatch drawLatch1 = new CountDownLatch(1);
        mActivityRule.runOnUiThread(() -> {
@@ -233,7 +249,20 @@ public class ViewFrameRateTest {
        // Now that it is small, any invalidation should have a high category
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(Surface.FRAME_RATE_CATEGORY_HIGH,
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
        });
    }

    @Test
    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
            FLAG_TOOLKIT_FRAME_RATE_DEFAULT_NORMAL_READ_ONLY})
    public void defaultNormal() throws Throwable {
        waitForFrameRateCategoryToSettle();
        mActivityRule.runOnUiThread(() -> {
            mMovingView.invalidate();
            assertEquals(FRAME_RATE_CATEGORY_NORMAL,
                    mViewRoot.getPreferredFrameRateCategory());
        });
    }
+15 −8
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -593,8 +594,9 @@ public class ViewRootImplTest {
        sInstrumentation.runOnMainSync(() -> {
            view.setVisibility(View.VISIBLE);
            view.invalidate();
            assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
                    FRAME_RATE_CATEGORY_HIGH);
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
        });
        sInstrumentation.waitForIdleSync();

@@ -658,7 +660,9 @@ public class ViewRootImplTest {
        ViewRootImpl viewRootImpl = view.getViewRootImpl();
        sInstrumentation.runOnMainSync(() -> {
            view.invalidate();
            assertEquals(viewRootImpl.getPreferredFrameRateCategory(), FRAME_RATE_CATEGORY_HIGH);
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
        });
    }

@@ -1017,11 +1021,13 @@ public class ViewRootImplTest {

        ViewRootImpl viewRootImpl = view.getViewRootImpl();

        // In transistion from frequent update to infrequent update
        // In transition from frequent update to infrequent update
        Thread.sleep(delay);
        sInstrumentation.runOnMainSync(() -> {
            view.invalidate();
            assertEquals(viewRootImpl.getPreferredFrameRateCategory(), FRAME_RATE_CATEGORY_HIGH);
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
        });

        // reset the frame rate category counts
@@ -1033,7 +1039,7 @@ public class ViewRootImplTest {
            sInstrumentation.waitForIdleSync();
        }

        // In transistion from frequent update to infrequent update
        // In transition from frequent update to infrequent update
        Thread.sleep(delay);
        sInstrumentation.runOnMainSync(() -> {
            view.setRequestedFrameRate(view.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
@@ -1107,8 +1113,9 @@ public class ViewRootImplTest {
            assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
                    FRAME_RATE_CATEGORY_NO_PREFERENCE);
            view.invalidate();
            assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
                    FRAME_RATE_CATEGORY_HIGH);
            int expected = toolkitFrameRateDefaultNormalReadOnly()
                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
        });

         // reset the frame rate category counts