Merge "Switch preffered display mode on lock screen" into qt-r1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
311e1db11d
@@ -482,4 +482,7 @@
|
|||||||
-->
|
-->
|
||||||
<string name="config_rounded_mask" translatable="false">"M8,0C3.6,0,0,3.6,0,8"</string>
|
<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>
|
</resources>
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
|||||||
import com.android.systemui.statusbar.phone.NotificationPanelView;
|
import com.android.systemui.statusbar.phone.NotificationPanelView;
|
||||||
import com.android.systemui.statusbar.phone.StatusBar;
|
import com.android.systemui.statusbar.phone.StatusBar;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
|
import com.android.systemui.statusbar.phone.StatusBarWindowController;
|
||||||
import com.android.systemui.util.InjectionInflationController;
|
import com.android.systemui.util.InjectionInflationController;
|
||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
@@ -204,6 +205,8 @@ public class KeyguardViewMediator extends SystemUI {
|
|||||||
private AlarmManager mAlarmManager;
|
private AlarmManager mAlarmManager;
|
||||||
private AudioManager mAudioManager;
|
private AudioManager mAudioManager;
|
||||||
private StatusBarManager mStatusBarManager;
|
private StatusBarManager mStatusBarManager;
|
||||||
|
private final StatusBarWindowController mStatusBarWindowController =
|
||||||
|
Dependency.get(StatusBarWindowController.class);
|
||||||
private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
|
private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
|
||||||
|
|
||||||
private boolean mSystemReady;
|
private boolean mSystemReady;
|
||||||
@@ -1779,6 +1782,7 @@ public class KeyguardViewMediator extends SystemUI {
|
|||||||
adjustStatusBarLocked();
|
adjustStatusBarLocked();
|
||||||
userActivity();
|
userActivity();
|
||||||
mUpdateMonitor.setKeyguardGoingAway(false /* away */);
|
mUpdateMonitor.setKeyguardGoingAway(false /* away */);
|
||||||
|
mStatusBarWindowController.setKeyguardGoingAway(false /* goingAway */);
|
||||||
mShowKeyguardWakeLock.release();
|
mShowKeyguardWakeLock.release();
|
||||||
}
|
}
|
||||||
mKeyguardDisplayManager.show();
|
mKeyguardDisplayManager.show();
|
||||||
@@ -1811,6 +1815,7 @@ public class KeyguardViewMediator extends SystemUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */);
|
mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */);
|
||||||
|
mStatusBarWindowController.setKeyguardGoingAway(true /* goingAway */);
|
||||||
|
|
||||||
// Don't actually hide the Keyguard at the moment, wait for window
|
// Don't actually hide the Keyguard at the moment, wait for window
|
||||||
// manager until it tells us it's safe to do so with
|
// manager until it tells us it's safe to do so with
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ import android.graphics.PixelFormat;
|
|||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
import android.os.Trace;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.Display;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -57,6 +59,7 @@ import java.io.PrintWriter;
|
|||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
@@ -76,6 +79,8 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
|
|||||||
private final WindowManager.LayoutParams mLpChanged;
|
private final WindowManager.LayoutParams mLpChanged;
|
||||||
private final boolean mKeyguardScreenRotation;
|
private final boolean mKeyguardScreenRotation;
|
||||||
private final long mLockScreenDisplayTimeout;
|
private final long mLockScreenDisplayTimeout;
|
||||||
|
private final Display.Mode mKeyguardDisplayMode;
|
||||||
|
private final KeyguardBypassController mKeyguardBypassController;
|
||||||
private ViewGroup mStatusBarView;
|
private ViewGroup mStatusBarView;
|
||||||
private WindowManager.LayoutParams mLp;
|
private WindowManager.LayoutParams mLp;
|
||||||
private boolean mHasTopUi;
|
private boolean mHasTopUi;
|
||||||
@@ -91,14 +96,21 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
|
|||||||
private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class);
|
private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public StatusBarWindowController(Context context) {
|
public StatusBarWindowController(Context context,
|
||||||
|
StatusBarStateController statusBarStateController,
|
||||||
|
ConfigurationController configurationController,
|
||||||
|
KeyguardBypassController keyguardBypassController) {
|
||||||
this(context, context.getSystemService(WindowManager.class), ActivityManager.getService(),
|
this(context, context.getSystemService(WindowManager.class), ActivityManager.getService(),
|
||||||
DozeParameters.getInstance(context));
|
DozeParameters.getInstance(context), statusBarStateController,
|
||||||
|
configurationController, keyguardBypassController);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public StatusBarWindowController(Context context, WindowManager windowManager,
|
public StatusBarWindowController(Context context, WindowManager windowManager,
|
||||||
IActivityManager activityManager, DozeParameters dozeParameters) {
|
IActivityManager activityManager, DozeParameters dozeParameters,
|
||||||
|
StatusBarStateController statusBarStateController,
|
||||||
|
ConfigurationController configurationController,
|
||||||
|
KeyguardBypassController keyguardBypassController) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mWindowManager = windowManager;
|
mWindowManager = windowManager;
|
||||||
mActivityManager = activityManager;
|
mActivityManager = activityManager;
|
||||||
@@ -106,12 +118,27 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
|
|||||||
mDozeParameters = dozeParameters;
|
mDozeParameters = dozeParameters;
|
||||||
mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
|
mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
|
||||||
mLpChanged = new WindowManager.LayoutParams();
|
mLpChanged = new WindowManager.LayoutParams();
|
||||||
|
mKeyguardBypassController = keyguardBypassController;
|
||||||
mLockScreenDisplayTimeout = context.getResources()
|
mLockScreenDisplayTimeout = context.getResources()
|
||||||
.getInteger(R.integer.config_lockScreenDisplayTimeout);
|
.getInteger(R.integer.config_lockScreenDisplayTimeout);
|
||||||
((SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class))
|
((SysuiStatusBarStateController) statusBarStateController)
|
||||||
.addCallback(mStateListener,
|
.addCallback(mStateListener,
|
||||||
SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER);
|
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 {
|
} else {
|
||||||
mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
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) {
|
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) {
|
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
|
||||||
pw.println("StatusBarWindowController state:");
|
pw.println("StatusBarWindowController:");
|
||||||
|
pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode);
|
||||||
pw.println(mCurrentState);
|
pw.println(mCurrentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -594,6 +634,14 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
|
|||||||
setKeyguardDark(useDarkText);
|
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 {
|
private static class State {
|
||||||
boolean keyguardShowing;
|
boolean keyguardShowing;
|
||||||
boolean keyguardOccluded;
|
boolean keyguardOccluded;
|
||||||
@@ -603,6 +651,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
|
|||||||
boolean statusBarFocusable;
|
boolean statusBarFocusable;
|
||||||
boolean bouncerShowing;
|
boolean bouncerShowing;
|
||||||
boolean keyguardFadingAway;
|
boolean keyguardFadingAway;
|
||||||
|
boolean keyguardGoingAway;
|
||||||
boolean qsExpanded;
|
boolean qsExpanded;
|
||||||
boolean headsUpShowing;
|
boolean headsUpShowing;
|
||||||
boolean forceStatusBarVisible;
|
boolean forceStatusBarVisible;
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ import com.android.systemui.SysuiTestCase;
|
|||||||
import com.android.systemui.statusbar.NotificationPresenter;
|
import com.android.systemui.statusbar.NotificationPresenter;
|
||||||
import com.android.systemui.statusbar.NotificationRemoveInterceptor;
|
import com.android.systemui.statusbar.NotificationRemoveInterceptor;
|
||||||
import com.android.systemui.statusbar.NotificationTestHelper;
|
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.NotificationEntryListener;
|
||||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||||
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
|
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.collection.NotificationEntry;
|
||||||
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
|
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
|
||||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
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.phone.StatusBarWindowController;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.HeadsUpManager;
|
import com.android.systemui.statusbar.policy.HeadsUpManager;
|
||||||
@@ -105,6 +107,10 @@ public class BubbleControllerTest extends SysuiTestCase {
|
|||||||
private ZenModeController mZenModeController;
|
private ZenModeController mZenModeController;
|
||||||
@Mock
|
@Mock
|
||||||
private ZenModeConfig mZenModeConfig;
|
private ZenModeConfig mZenModeConfig;
|
||||||
|
@Mock
|
||||||
|
private SysuiStatusBarStateController mStatusBarStateController;
|
||||||
|
@Mock
|
||||||
|
private KeyguardBypassController mKeyguardBypassController;
|
||||||
|
|
||||||
private FrameLayout mStatusBarView;
|
private FrameLayout mStatusBarView;
|
||||||
@Captor
|
@Captor
|
||||||
@@ -143,7 +149,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
// Bubbles get added to status bar window view
|
// Bubbles get added to status bar window view
|
||||||
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
||||||
mActivityManager, mDozeParameters);
|
mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
|
mConfigurationController, mKeyguardBypassController);
|
||||||
mStatusBarWindowController.add(mStatusBarView, 120 /* height */);
|
mStatusBarWindowController.add(mStatusBarView, 120 /* height */);
|
||||||
|
|
||||||
// Need notifications for bubbles
|
// Need notifications for bubbles
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ import android.view.WindowManager;
|
|||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
import com.android.systemui.SysuiTestCase;
|
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.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -54,6 +56,12 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
|
|||||||
private ViewGroup mStatusBarView;
|
private ViewGroup mStatusBarView;
|
||||||
@Mock
|
@Mock
|
||||||
private IActivityManager mActivityManager;
|
private IActivityManager mActivityManager;
|
||||||
|
@Mock
|
||||||
|
private SysuiStatusBarStateController mStatusBarStateController;
|
||||||
|
@Mock
|
||||||
|
private ConfigurationController mConfigurationController;
|
||||||
|
@Mock
|
||||||
|
private KeyguardBypassController mKeyguardBypassController;
|
||||||
|
|
||||||
private StatusBarWindowController mStatusBarWindowController;
|
private StatusBarWindowController mStatusBarWindowController;
|
||||||
|
|
||||||
@@ -63,7 +71,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
|
|||||||
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
|
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
|
||||||
|
|
||||||
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
||||||
mActivityManager, mDozeParameters);
|
mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
|
mConfigurationController, mKeyguardBypassController);
|
||||||
mStatusBarWindowController.add(mStatusBarView, 100 /* height */);
|
mStatusBarWindowController.add(mStatusBarView, 100 /* height */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +97,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testOnThemeChanged_doesntCrash() {
|
public void testOnThemeChanged_doesntCrash() {
|
||||||
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
||||||
mActivityManager, mDozeParameters);
|
mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
|
mConfigurationController, mKeyguardBypassController);
|
||||||
mStatusBarWindowController.onThemeChanged();
|
mStatusBarWindowController.onThemeChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +110,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testSetForcePluginOpen_beforeStatusBarInitialization() {
|
public void testSetForcePluginOpen_beforeStatusBarInitialization() {
|
||||||
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
|
||||||
mActivityManager, mDozeParameters);
|
mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
|
mConfigurationController, mKeyguardBypassController);
|
||||||
mStatusBarWindowController.setForcePluginOpen(true);
|
mStatusBarWindowController.setForcePluginOpen(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user