From ceed101fdfa076a72e58eb713a5ab474b49e0d95 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 4 Jan 2023 16:05:41 +0000 Subject: [PATCH] Respect the preferred refresh rate This was mistakenly removed in ag/16792104. Fixes: 264672007 Test: manually check that when UDFPS is enrolled, the preferred refresh rate is used on keyguard Test: atest NotificationShadeWindowControllerImplTest Change-Id: I6e98bf8f889c24d7da04fe0a7f4c93ab394b8032 --- ...NotificationShadeWindowControllerImpl.java | 3 + ...ficationShadeWindowControllerImplTest.java | 71 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java index 8698c0462e8d8..21d58cacb8b43 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java @@ -319,9 +319,12 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW && !state.mKeyguardFadingAway && !state.mKeyguardGoingAway; if (onKeyguard && mAuthController.isUdfpsEnrolled(KeyguardUpdateMonitor.getCurrentUser())) { + // both max and min display refresh rate must be set to take effect: mLpChanged.preferredMaxDisplayRefreshRate = mKeyguardPreferredRefreshRate; + mLpChanged.preferredMinDisplayRefreshRate = mKeyguardPreferredRefreshRate; } else { mLpChanged.preferredMaxDisplayRefreshRate = 0; + mLpChanged.preferredMinDisplayRefreshRate = 0; } Trace.setCounter("display_set_preferred_refresh_rate", (long) mKeyguardPreferredRefreshRate); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index d7d17b5132cb5..12be76bc3fad0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -46,11 +46,14 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; import com.android.internal.colorextraction.ColorExtractor; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardViewMediator; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -68,6 +71,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; +import java.util.List; + @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest @@ -90,13 +95,21 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { @Mock private AuthController mAuthController; @Mock private ShadeExpansionStateManager mShadeExpansionStateManager; @Captor private ArgumentCaptor mLayoutParameters; + @Captor private ArgumentCaptor mStateListener; private NotificationShadeWindowControllerImpl mNotificationShadeWindowController; - + private float mPreferredRefreshRate = -1; @Before public void setUp() { MockitoAnnotations.initMocks(this); + // Preferred refresh rate is equal to the first displayMode's refresh rate + mPreferredRefreshRate = mContext.getDisplay().getSupportedModes()[0].getRefreshRate(); + overrideResource( + R.integer.config_keyguardRefreshRate, + (int) mPreferredRefreshRate + ); + when(mDozeParameters.getAlwaysOn()).thenReturn(true); when(mColorExtractor.getNeutralColors()).thenReturn(mGradientColors); @@ -115,6 +128,7 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { mNotificationShadeWindowController.attach(); verify(mWindowManager).addView(eq(mNotificationShadeWindowView), any()); + verify(mStatusBarStateController).addCallback(mStateListener.capture(), anyInt()); } @Test @@ -332,4 +346,59 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { assertThat(mLayoutParameters.getValue().screenOrientation) .isEqualTo(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); } + + @Test + public void udfpsEnrolled_minAndMaxRefreshRateSetToPreferredRefreshRate() { + // GIVEN udfps is enrolled + when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(true); + + // WHEN keyguard is showing + setKeyguardShowing(); + + // THEN min and max refresh rate is set to the preferredRefreshRate + verify(mWindowManager, atLeastOnce()).updateViewLayout(any(), mLayoutParameters.capture()); + final List lpList = mLayoutParameters.getAllValues(); + final WindowManager.LayoutParams lp = lpList.get(lpList.size() - 1); + assertThat(lp.preferredMaxDisplayRefreshRate).isEqualTo(mPreferredRefreshRate); + assertThat(lp.preferredMinDisplayRefreshRate).isEqualTo(mPreferredRefreshRate); + } + + @Test + public void udfpsNotEnrolled_refreshRateUnset() { + // GIVEN udfps is NOT enrolled + when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); + + // WHEN keyguard is showing + setKeyguardShowing(); + + // THEN min and max refresh rate aren't set (set to 0) + verify(mWindowManager, atLeastOnce()).updateViewLayout(any(), mLayoutParameters.capture()); + final List lpList = mLayoutParameters.getAllValues(); + final WindowManager.LayoutParams lp = lpList.get(lpList.size() - 1); + assertThat(lp.preferredMaxDisplayRefreshRate).isEqualTo(0); + assertThat(lp.preferredMinDisplayRefreshRate).isEqualTo(0); + } + + @Test + public void keyguardNotShowing_refreshRateUnset() { + // GIVEN UDFPS is enrolled + when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(true); + + // WHEN keyguard is NOT showing + mNotificationShadeWindowController.setKeyguardShowing(false); + + // THEN min and max refresh rate aren't set (set to 0) + verify(mWindowManager, atLeastOnce()).updateViewLayout(any(), mLayoutParameters.capture()); + final List lpList = mLayoutParameters.getAllValues(); + final WindowManager.LayoutParams lp = lpList.get(lpList.size() - 1); + assertThat(lp.preferredMaxDisplayRefreshRate).isEqualTo(0); + assertThat(lp.preferredMinDisplayRefreshRate).isEqualTo(0); + } + + private void setKeyguardShowing() { + mNotificationShadeWindowController.setKeyguardShowing(true); + mNotificationShadeWindowController.setKeyguardGoingAway(false); + mNotificationShadeWindowController.setKeyguardFadingAway(false); + mStateListener.getValue().onStateChanged(StatusBarState.KEYGUARD); + } }