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

Commit adc6f3b8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "adding new refresh rate priority"

parents c5a0fb51 c9a0088e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -39,5 +39,15 @@ oneway interface IUdfpsRefreshRateRequestCallback {
     *        {@link android.view.Display#getDisplayId()}.
     */
    void onRequestDisabled(int displayId);

    /**
     * To avoid delay in switching refresh rate when activating LHBM, allow screens to request
     * higher refersh rate if auth is possible on particular screen
     *
     * @param displayId The displayId for which the refresh rate should be unset. See
     *        {@link android.view.Display#getDisplayId()}.
     * @param isPossible If authentication is possible on particualr screen
     */
    void onAuthenticationPossible(int displayId, boolean isPossible);
}
+49 −23
Original line number Diff line number Diff line
@@ -733,7 +733,7 @@ public class DisplayModeDirector {

    /**
     * Sets the display mode switching type.
     * @param newType
     * @param newType new mode switching type
     */
    public void setModeSwitchingType(@DisplayManager.SwitchingType int newType) {
        synchronized (mLock) {
@@ -850,6 +850,18 @@ public class DisplayModeDirector {
        notifyDesiredDisplayModeSpecsChangedLocked();
    }

    @GuardedBy("mLock")
    private float getMaxRefreshRateLocked(int displayId) {
        Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
        float maxRefreshRate = 0f;
        for (Display.Mode mode : modes) {
            if (mode.getRefreshRate() > maxRefreshRate) {
                maxRefreshRate = mode.getRefreshRate();
            }
        }
        return maxRefreshRate;
    }

    private void notifyDesiredDisplayModeSpecsChangedLocked() {
        if (mDesiredDisplayModeSpecsListener != null
                && !mHandler.hasMessages(MSG_REFRESH_RATE_RANGE_CHANGED)) {
@@ -1186,29 +1198,33 @@ public class DisplayModeDirector {
        // rest of low priority voters. It votes [0, max(PEAK, MIN)]
        public static final int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 7;

        // To avoid delay in switching between 60HZ -> 90HZ when activating LHBM, set refresh
        // rate to max value (same as for PRIORITY_UDFPS) on lock screen
        public static final int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 8;

        // For concurrent displays we want to limit refresh rate on all displays
        public static final int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 8;
        public static final int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 9;

        // LOW_POWER_MODE force the render frame rate to [0, 60HZ] if
        // Settings.Global.LOW_POWER_MODE is on.
        public static final int PRIORITY_LOW_POWER_MODE = 9;
        public static final int PRIORITY_LOW_POWER_MODE = 10;

        // PRIORITY_FLICKER_REFRESH_RATE_SWITCH votes for disabling refresh rate switching. If the
        // higher priority voters' result is a range, it will fix the rate to a single choice.
        // It's used to avoid refresh rate switches in certain conditions which may result in the
        // user seeing the display flickering when the switches occur.
        public static final int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 10;
        public static final int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 11;

        // Force display to [0, 60HZ] if skin temperature is at or above CRITICAL.
        public static final int PRIORITY_SKIN_TEMPERATURE = 11;
        public static final int PRIORITY_SKIN_TEMPERATURE = 12;

        // The proximity sensor needs the refresh rate to be locked in order to function, so this is
        // set to a high priority.
        public static final int PRIORITY_PROXIMITY = 12;
        public static final int PRIORITY_PROXIMITY = 13;

        // The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order
        // to function, so this needs to be the highest priority of all votes.
        public static final int PRIORITY_UDFPS = 13;
        public static final int PRIORITY_UDFPS = 14;

        // Whenever a new priority is added, remember to update MIN_PRIORITY, MAX_PRIORITY, and
        // APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF, as well as priorityToString.
@@ -1325,6 +1341,8 @@ public class DisplayModeDirector {
                    return "PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE";
                case PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE:
                    return "PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE";
                case PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE:
                    return "PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE";
                default:
                    return Integer.toString(priority);
            }
@@ -2564,6 +2582,7 @@ public class DisplayModeDirector {

    private class UdfpsObserver extends IUdfpsRefreshRateRequestCallback.Stub {
        private final SparseBooleanArray mUdfpsRefreshRateEnabled = new SparseBooleanArray();
        private final SparseBooleanArray mAuthenticationPossible = new SparseBooleanArray();

        public void observe() {
            StatusBarManagerInternal statusBar =
@@ -2576,38 +2595,38 @@ public class DisplayModeDirector {
        @Override
        public void onRequestEnabled(int displayId) {
            synchronized (mLock) {
                updateRefreshRateStateLocked(displayId, true /*enabled*/);
                mUdfpsRefreshRateEnabled.put(displayId, true);
                updateVoteLocked(displayId, true, Vote.PRIORITY_UDFPS);
            }
        }

        @Override
        public void onRequestDisabled(int displayId) {
            synchronized (mLock) {
                updateRefreshRateStateLocked(displayId, false /*enabled*/);
                mUdfpsRefreshRateEnabled.put(displayId, false);
                updateVoteLocked(displayId, false, Vote.PRIORITY_UDFPS);
            }
        }

        private void updateRefreshRateStateLocked(int displayId, boolean enabled) {
            mUdfpsRefreshRateEnabled.put(displayId, enabled);
            updateVoteLocked(displayId);
        @Override
        public void onAuthenticationPossible(int displayId, boolean isPossible) {
            synchronized (mLock) {
                mAuthenticationPossible.put(displayId, isPossible);
                updateVoteLocked(displayId, isPossible,
                        Vote.PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE);
            }
        }

        private void updateVoteLocked(int displayId) {
        @GuardedBy("mLock")
        private void updateVoteLocked(int displayId, boolean enabled, int votePriority) {
            final Vote vote;
            if (mUdfpsRefreshRateEnabled.get(displayId)) {
                Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
                float maxRefreshRate = 0f;
                for (Display.Mode mode : modes) {
                    if (mode.getRefreshRate() > maxRefreshRate) {
                        maxRefreshRate = mode.getRefreshRate();
                    }
                }
            if (enabled) {
                float maxRefreshRate = DisplayModeDirector.this.getMaxRefreshRateLocked(displayId);
                vote = Vote.forPhysicalRefreshRates(maxRefreshRate, maxRefreshRate);
            } else {
                vote = null;
            }

            DisplayModeDirector.this.updateVoteLocked(displayId, Vote.PRIORITY_UDFPS, vote);
            DisplayModeDirector.this.updateVoteLocked(displayId, votePriority, vote);
        }

        void dumpLocked(PrintWriter pw) {
@@ -2618,6 +2637,13 @@ public class DisplayModeDirector {
                final String enabled = mUdfpsRefreshRateEnabled.valueAt(i) ? "enabled" : "disabled";
                pw.println("      Display " + displayId + ": " + enabled);
            }
            pw.println("    mAuthenticationPossible: ");
            for (int i = 0; i < mAuthenticationPossible.size(); i++) {
                final int displayId = mAuthenticationPossible.keyAt(i);
                final String isPossible = mAuthenticationPossible.valueAt(i) ? "possible"
                        : "impossible";
                pw.println("      Display " + displayId + ": " + isPossible);
            }
        }
    }

+68 −0
Original line number Diff line number Diff line
@@ -2402,6 +2402,74 @@ public class DisplayModeDirectorTest {
                eq(lightSensorTwo), anyInt(), any(Handler.class));
    }

    @Test
    public void testAuthenticationPossibleSetsPhysicalRateRangesToMax() throws RemoteException {
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[]{60.0f, 90.0f}, 0);
        // don't call director.start(createMockSensorManager());
        // DisplayObserver will reset mSupportedModesByDisplay
        director.onBootCompleted();
        ArgumentCaptor<IUdfpsRefreshRateRequestCallback> captor =
                ArgumentCaptor.forClass(IUdfpsRefreshRateRequestCallback.class);
        verify(mStatusBarMock).setUdfpsRefreshRateCallback(captor.capture());

        captor.getValue().onAuthenticationPossible(DISPLAY_ID, true);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE);
        assertThat(vote.refreshRateRanges.physical.min).isWithin(FLOAT_TOLERANCE).of(90);
        assertThat(vote.refreshRateRanges.physical.max).isWithin(FLOAT_TOLERANCE).of(90);
    }

    @Test
    public void testAuthenticationPossibleUnsetsVote() throws RemoteException {
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[]{60.0f, 90.0f}, 0);
        director.start(createMockSensorManager());
        director.onBootCompleted();
        ArgumentCaptor<IUdfpsRefreshRateRequestCallback> captor =
                ArgumentCaptor.forClass(IUdfpsRefreshRateRequestCallback.class);
        verify(mStatusBarMock).setUdfpsRefreshRateCallback(captor.capture());
        captor.getValue().onAuthenticationPossible(DISPLAY_ID, true);
        captor.getValue().onAuthenticationPossible(DISPLAY_ID, false);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE);
        assertNull(vote);
    }

    @Test
    public void testUdfpsRequestSetsPhysicalRateRangesToMax() throws RemoteException {
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[]{60.0f, 90.0f}, 0);
        // don't call director.start(createMockSensorManager());
        // DisplayObserver will reset mSupportedModesByDisplay
        director.onBootCompleted();
        ArgumentCaptor<IUdfpsRefreshRateRequestCallback> captor =
                ArgumentCaptor.forClass(IUdfpsRefreshRateRequestCallback.class);
        verify(mStatusBarMock).setUdfpsRefreshRateCallback(captor.capture());

        captor.getValue().onRequestEnabled(DISPLAY_ID);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
        assertThat(vote.refreshRateRanges.physical.min).isWithin(FLOAT_TOLERANCE).of(90);
        assertThat(vote.refreshRateRanges.physical.max).isWithin(FLOAT_TOLERANCE).of(90);
    }

    @Test
    public void testUdfpsRequestUnsetsUnsetsVote() throws RemoteException {
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[]{60.0f, 90.0f}, 0);
        director.start(createMockSensorManager());
        director.onBootCompleted();
        ArgumentCaptor<IUdfpsRefreshRateRequestCallback> captor =
                ArgumentCaptor.forClass(IUdfpsRefreshRateRequestCallback.class);
        verify(mStatusBarMock).setUdfpsRefreshRateCallback(captor.capture());
        captor.getValue().onRequestEnabled(DISPLAY_ID);
        captor.getValue().onRequestDisabled(DISPLAY_ID);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
        assertNull(vote);
    }

    private Temperature getSkinTemp(@Temperature.ThrottlingStatus int status) {
        return new Temperature(30.0f, Temperature.TYPE_SKIN, "test_skin_temp", status);
    }