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

Commit 98f24f63 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[ARR] Make the scroll frame rate always Max" into main

parents 624bcf60 edb7ffda
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ 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.toolkitMetricsForFrameRateDecision;
import static android.view.flags.Flags.toolkitScrollMaxFrameRate;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.toolkitViewgroupSetRequestedFrameRateApi;
import static android.view.flags.Flags.viewVelocityApi;
@@ -2467,6 +2468,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
            toolkitFrameRateBySizeReadOnly();
    private static boolean sToolkitViewGroupFrameRateApiFlagValue =
            toolkitViewgroupSetRequestedFrameRateApi();
    private static boolean sToolkitScrollMaxFrameRateFlagValue =
            toolkitScrollMaxFrameRate();
    // Used to set frame rate compatibility.
    @Surface.FrameRateCompatibility int mFrameRateCompatibility =
@@ -34411,6 +34414,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    }
    private float convertVelocityToFrameRate(float velocityPps) {
        // b/404936438 Remove this logic when 240 TE is re-enabled
        // or sysprop is available for scrolling
        if (sToolkitScrollMaxFrameRateFlagValue) {
            boolean has80Hz = false;
            if (getDisplay() != null) {
                for (float rate : getDisplay().getSupportedRefreshRates()) {
                    if (Math.abs(rate - 80.0f) < 0.1f) {
                        has80Hz = true;
                        break;
                    }
                }
            }
            if (!has80Hz) {
                return MAX_FRAME_RATE;
            }
        }
        // Internal testing has shown that this gives a premium experience:
        // above 300dp/s => 120fps
        // between 300dp/s and 125fps => 80fps
+10 −0
Original line number Diff line number Diff line
@@ -95,3 +95,13 @@ flag {
    description: "Feature flag to ennable ARR debug message"
    bug: "394614443"
}

flag {
    name: "toolkit_scroll_max_frame_rate"
    namespace: "toolkit"
    description: "Feature flag to always return max frame rate for scrolling"
    bug: "404936438"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file
+42 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import static android.view.flags.Flags.FLAG_TOOLKIT_INITIAL_TOUCH_BOOST;
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.toolkitScrollMaxFrameRate;

import static junit.framework.Assert.assertEquals;

@@ -415,9 +416,22 @@ public class ViewFrameRateTest {
        });
        waitForFrameRateCategoryToSettle();
        mActivityRule.runOnUiThread(() -> {
            Display display = mMovingView.getDisplay();
            boolean has80Hz = false;
            if (display != null) {
                for (float rate : display.getSupportedRefreshRates()) {
                    if (Math.abs(rate - 80.0f) < 0.1f) {
                        has80Hz = true;
                        break;
                    }
                }
            }
            float expectedFrameRate = (toolkitScrollMaxFrameRate() && !has80Hz) ? 120f : 60f;

            mMovingView.setFrameContentVelocity(1f);
            mMovingView.invalidate();
            runAfterDraw(() -> assertEquals(60f, mViewRoot.getLastPreferredFrameRate(), 0f));
            runAfterDraw(() -> assertEquals(expectedFrameRate,
                    mViewRoot.getLastPreferredFrameRate(), 0f));
        });
        waitForAfterDraw();
    }
@@ -436,11 +450,23 @@ public class ViewFrameRateTest {
        });
        waitForFrameRateCategoryToSettle();
        mActivityRule.runOnUiThread(() -> {
            Display display = mMovingView.getDisplay();
            boolean has80Hz = false;
            if (display != null) {
                for (float rate : display.getSupportedRefreshRates()) {
                    if (Math.abs(rate - 80.0f) < 0.1f) {
                        has80Hz = true;
                        break;
                    }
                }
            }
            float expectedFrameRate = (toolkitScrollMaxFrameRate() && !has80Hz) ? 120f : 80f;
            float midSpeed =
                    200f * mMovingView.getContext().getResources().getDisplayMetrics().density;
            mMovingView.setFrameContentVelocity(midSpeed);
            mMovingView.invalidate();
            runAfterDraw(() -> assertEquals(80f, mViewRoot.getLastPreferredFrameRate(), 0f));
            runAfterDraw(() -> assertEquals(expectedFrameRate,
                    mViewRoot.getLastPreferredFrameRate(), 0f));
        });
        waitForAfterDraw();
    }
@@ -464,10 +490,23 @@ public class ViewFrameRateTest {
        });
        waitForFrameRateCategoryToSettle();
        mActivityRule.runOnUiThread(() -> {
            Display display = mMovingView.getDisplay();
            boolean has80Hz = false;
            if (display != null) {
                for (float rate : display.getSupportedRefreshRates()) {
                    if (Math.abs(rate - 80.0f) < 0.1f) {
                        has80Hz = true;
                        break;
                    }
                }
            }
            float expectedFrameRate = (toolkitScrollMaxFrameRate() && !has80Hz) ? 120f : 60f;

            frameLayout.setFrameContentVelocity(1f);
            mMovingView.offsetTopAndBottom(100);
            frameLayout.invalidate();
            runAfterDraw(() -> assertEquals(60f, mViewRoot.getLastPreferredFrameRate(), 0f));
            runAfterDraw(() -> assertEquals(expectedFrameRate,
                    mViewRoot.getLastPreferredFrameRate(), 0f));
        });
        waitForAfterDraw();
    }