diff options
| author | 2019-07-31 11:31:43 -0700 | |
|---|---|---|
| committer | 2019-07-31 11:31:43 -0700 | |
| commit | c8359c55271f3907df48ca26386a830b1288fd35 (patch) | |
| tree | ce4b89d25cc6a05224843fe5e8baaa5961865638 | |
| parent | 0d30d34576748953fd56714423ed5d8078695a38 (diff) | |
| parent | 311e1db11daebfb50b9e38bd6b579952b608fad0 (diff) | |
Merge "Switch preffered display mode on lock screen" into qt-r1-dev
am: 311e1db11d
Change-Id: Ie228bc6ab839464d46cff87f1821d18de1b31d16
5 files changed, 85 insertions, 10 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 861187fded15..340cb3ad7358 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -482,4 +482,7 @@ --> <string name="config_rounded_mask" translatable="false">"M8,0C3.6,0,0,3.6,0,8"</string> + <!-- Preferred refresh rate at keyguard, if supported by the display --> + <integer name="config_keyguardRefreshRate">-1</integer> + </resources> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 57bf53676a4a..e9f99acd8d46 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -90,6 +90,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.InjectionInflationController; import java.io.FileDescriptor; @@ -204,6 +205,8 @@ public class KeyguardViewMediator extends SystemUI { private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; + private final StatusBarWindowController mStatusBarWindowController = + Dependency.get(StatusBarWindowController.class); private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); private boolean mSystemReady; @@ -1779,6 +1782,7 @@ public class KeyguardViewMediator extends SystemUI { adjustStatusBarLocked(); userActivity(); mUpdateMonitor.setKeyguardGoingAway(false /* away */); + mStatusBarWindowController.setKeyguardGoingAway(false /* goingAway */); mShowKeyguardWakeLock.release(); } mKeyguardDisplayManager.show(); @@ -1811,6 +1815,7 @@ public class KeyguardViewMediator extends SystemUI { } mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */); + mStatusBarWindowController.setKeyguardGoingAway(true /* goingAway */); // Don't actually hide the Keyguard at the moment, wait for window // manager until it tells us it's safe to do so with diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index d9a9f7cbc2a8..ebac855825c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -29,7 +29,9 @@ import android.graphics.PixelFormat; import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; +import android.os.Trace; import android.util.Log; +import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -57,6 +59,7 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Arrays; import javax.inject.Inject; import javax.inject.Singleton; @@ -76,6 +79,8 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat private final WindowManager.LayoutParams mLpChanged; private final boolean mKeyguardScreenRotation; private final long mLockScreenDisplayTimeout; + private final Display.Mode mKeyguardDisplayMode; + private final KeyguardBypassController mKeyguardBypassController; private ViewGroup mStatusBarView; private WindowManager.LayoutParams mLp; private boolean mHasTopUi; @@ -91,14 +96,21 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class); @Inject - public StatusBarWindowController(Context context) { + public StatusBarWindowController(Context context, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController, + KeyguardBypassController keyguardBypassController) { this(context, context.getSystemService(WindowManager.class), ActivityManager.getService(), - DozeParameters.getInstance(context)); + DozeParameters.getInstance(context), statusBarStateController, + configurationController, keyguardBypassController); } @VisibleForTesting public StatusBarWindowController(Context context, WindowManager windowManager, - IActivityManager activityManager, DozeParameters dozeParameters) { + IActivityManager activityManager, DozeParameters dozeParameters, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController, + KeyguardBypassController keyguardBypassController) { mContext = context; mWindowManager = windowManager; mActivityManager = activityManager; @@ -106,12 +118,27 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat mDozeParameters = dozeParameters; mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze(); mLpChanged = new WindowManager.LayoutParams(); + mKeyguardBypassController = keyguardBypassController; mLockScreenDisplayTimeout = context.getResources() .getInteger(R.integer.config_lockScreenDisplayTimeout); - ((SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class)) + ((SysuiStatusBarStateController) statusBarStateController) .addCallback(mStateListener, SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER); - Dependency.get(ConfigurationController.class).addCallback(this); + configurationController.addCallback(this); + + Display.Mode[] supportedModes = context.getDisplay().getSupportedModes(); + Display.Mode currentMode = context.getDisplay().getMode(); + // Running on the highest frame rate available can be expensive. + // Let's specify a preferred refresh rate, and allow higher FPS only when we + // know that we're not falsing (because we unlocked.) + int keyguardRefreshRate = context.getResources() + .getInteger(R.integer.config_keyguardRefreshRate); + // Find supported display mode with the same resolution and requested refresh rate. + mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode -> + (int) mode.getRefreshRate() == keyguardRefreshRate + && mode.getPhysicalWidth() == currentMode.getPhysicalWidth() + && mode.getPhysicalHeight() == currentMode.getPhysicalHeight()) + .findFirst().orElse(null); } /** @@ -209,6 +236,18 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } else { mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; } + + if (mKeyguardDisplayMode != null) { + boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled() + && state.statusBarState == StatusBarState.KEYGUARD && !state.keyguardFadingAway + && !state.keyguardGoingAway; + if (state.dozing || bypassOnKeyguard) { + mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId(); + } else { + mLpChanged.preferredDisplayModeId = 0; + } + Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId); + } } private void adjustScreenOrientation(State state) { @@ -575,7 +614,8 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("StatusBarWindowController state:"); + pw.println("StatusBarWindowController:"); + pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode); pw.println(mCurrentState); } @@ -594,6 +634,14 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat setKeyguardDark(useDarkText); } + /** + * When keyguard will be dismissed but didn't start animation yet. + */ + public void setKeyguardGoingAway(boolean goingAway) { + mCurrentState.keyguardGoingAway = goingAway; + apply(mCurrentState); + } + private static class State { boolean keyguardShowing; boolean keyguardOccluded; @@ -603,6 +651,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat boolean statusBarFocusable; boolean bouncerShowing; boolean keyguardFadingAway; + boolean keyguardGoingAway; boolean qsExpanded; boolean headsUpShowing; boolean forceStatusBarVisible; diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index b3f6f4ecdf0c..2221915a627a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -60,6 +60,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoveInterceptor; import com.android.systemui.statusbar.NotificationTestHelper; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; @@ -67,6 +68,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -105,6 +107,10 @@ public class BubbleControllerTest extends SysuiTestCase { private ZenModeController mZenModeController; @Mock private ZenModeConfig mZenModeConfig; + @Mock + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private FrameLayout mStatusBarView; @Captor @@ -143,7 +149,8 @@ public class BubbleControllerTest extends SysuiTestCase { // Bubbles get added to status bar window view mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.add(mStatusBarView, 120 /* height */); // Need notifications for bubbles diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java index fea41a441065..4ffaeaef77b4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java @@ -33,6 +33,8 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; @@ -54,6 +56,12 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { private ViewGroup mStatusBarView; @Mock private IActivityManager mActivityManager; + @Mock + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private ConfigurationController mConfigurationController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private StatusBarWindowController mStatusBarWindowController; @@ -63,7 +71,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { when(mDozeParameters.getAlwaysOn()).thenReturn(true); mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.add(mStatusBarView, 100 /* height */); } @@ -88,7 +97,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { @Test public void testOnThemeChanged_doesntCrash() { mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.onThemeChanged(); } @@ -100,7 +110,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { @Test public void testSetForcePluginOpen_beforeStatusBarInitialization() { mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.setForcePluginOpen(true); } } |