Keep interrupts on when in battery saver mode
Battery saver was completely aborting the doze service, disabling all interrupts. This is not ideal since it impacts the user journey, especially when using face auth. From now on the screen will still be off, but DozeService will be retained, in order to receive sensor events. Test: w/ battery saver: lift, tap, and observe aod being off Test: w/ battery saver: receive notification, no HUN. Test: w/o battery saver: lift, tap, and observe aod being on Test: w/o battery saver: receive notification, HUN is received. Fixes: 134157254 Change-Id: I9b713c78857c4e4c22d8d9bfff165b1b51dfd804 Merged-In: I9b713c78857c4e4c22d8d9bfff165b1b51dfd804
This commit is contained in:
@@ -22,6 +22,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.notification.NotificationFilter;
|
||||
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
@@ -34,8 +35,9 @@ public class CarNotificationInterruptionStateProvider extends
|
||||
@Inject
|
||||
public CarNotificationInterruptionStateProvider(Context context,
|
||||
NotificationFilter filter,
|
||||
StatusBarStateController stateController) {
|
||||
super(context, filter, stateController);
|
||||
StatusBarStateController stateController,
|
||||
BatteryController batteryController) {
|
||||
super(context, filter, stateController, batteryController);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -257,6 +257,11 @@ public class CarBatteryController extends BroadcastReceiver implements BatteryCo
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAodPowerSave() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void notifyBatteryLevelChanged() {
|
||||
for (int i = 0, size = mChangeCallbacks.size(); i < size; i++) {
|
||||
mChangeCallbacks.get(i)
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.statusbar.phone.BiometricUnlockController;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.util.AsyncSensorManager;
|
||||
import com.android.systemui.util.wakelock.DelayedWakeLock;
|
||||
import com.android.systemui.util.wakelock.WakeLock;
|
||||
@@ -64,7 +65,7 @@ public class DozeFactory {
|
||||
params);
|
||||
|
||||
DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock,
|
||||
wakefulnessLifecycle);
|
||||
wakefulnessLifecycle, Dependency.get(BatteryController.class));
|
||||
machine.setParts(new DozeMachine.Part[]{
|
||||
new DozePauser(handler, machine, alarmManager, params.getPolicy()),
|
||||
new DozeFalsingManagerAdapter(falsingManager),
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.android.internal.util.Preconditions;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle.Wakefulness;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.util.Assert;
|
||||
import com.android.systemui.util.wakelock.WakeLock;
|
||||
|
||||
@@ -121,6 +122,7 @@ public class DozeMachine {
|
||||
private final WakeLock mWakeLock;
|
||||
private final AmbientDisplayConfiguration mConfig;
|
||||
private final WakefulnessLifecycle mWakefulnessLifecycle;
|
||||
private final BatteryController mBatteryController;
|
||||
private Part[] mParts;
|
||||
|
||||
private final ArrayList<State> mQueuedRequests = new ArrayList<>();
|
||||
@@ -129,11 +131,13 @@ public class DozeMachine {
|
||||
private boolean mWakeLockHeldForCurrentState = false;
|
||||
|
||||
public DozeMachine(Service service, AmbientDisplayConfiguration config,
|
||||
WakeLock wakeLock, WakefulnessLifecycle wakefulnessLifecycle) {
|
||||
WakeLock wakeLock, WakefulnessLifecycle wakefulnessLifecycle,
|
||||
BatteryController batteryController) {
|
||||
mDozeService = service;
|
||||
mConfig = config;
|
||||
mWakefulnessLifecycle = wakefulnessLifecycle;
|
||||
mWakeLock = wakeLock;
|
||||
mBatteryController = batteryController;
|
||||
}
|
||||
|
||||
/** Initializes the set of {@link Part}s. Must be called exactly once after construction. */
|
||||
@@ -316,6 +320,9 @@ public class DozeMachine {
|
||||
Log.i(TAG, "Dropping pulse done because current state is already done: " + mState);
|
||||
return mState;
|
||||
}
|
||||
if (requestedState == State.DOZE_AOD && mBatteryController.isAodPowerSave()) {
|
||||
return State.DOZE;
|
||||
}
|
||||
if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) {
|
||||
Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState);
|
||||
return mState;
|
||||
|
||||
@@ -345,7 +345,6 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
|
||||
private void checkTriggersAtInit() {
|
||||
if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR
|
||||
|| mDozeHost.isPowerSaveActive()
|
||||
|| mDozeHost.isBlockingDoze()
|
||||
|| !mDozeHost.isProvisioned()) {
|
||||
mMachine.requestState(DozeMachine.State.FINISH);
|
||||
@@ -574,8 +573,8 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
|
||||
@Override
|
||||
public void onPowerSaveChanged(boolean active) {
|
||||
if (active) {
|
||||
mMachine.requestState(DozeMachine.State.FINISH);
|
||||
if (mDozeHost.isPowerSaveActive()) {
|
||||
mMachine.requestState(DozeMachine.State.DOZE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -83,7 +83,8 @@ public class DozeUi implements DozeMachine.Part {
|
||||
*/
|
||||
private void updateAnimateScreenOff() {
|
||||
if (mCanAnimateTransition) {
|
||||
final boolean controlScreenOff = mDozeParameters.getAlwaysOn() && mKeyguardShowing;
|
||||
final boolean controlScreenOff = mDozeParameters.getAlwaysOn() && mKeyguardShowing
|
||||
&& !mHost.isPowerSaveActive();
|
||||
mDozeParameters.setControlScreenOffAnimation(controlScreenOff);
|
||||
mHost.setAnimateScreenOff(controlScreenOff);
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.NotificationPresenter;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.HeadsUpManager;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -63,6 +64,7 @@ public class NotificationInterruptionStateProvider {
|
||||
private final Context mContext;
|
||||
private final PowerManager mPowerManager;
|
||||
private final IDreamManager mDreamManager;
|
||||
private final BatteryController mBatteryController;
|
||||
|
||||
private NotificationPresenter mPresenter;
|
||||
private HeadsUpManager mHeadsUpManager;
|
||||
@@ -75,13 +77,14 @@ public class NotificationInterruptionStateProvider {
|
||||
|
||||
@Inject
|
||||
public NotificationInterruptionStateProvider(Context context, NotificationFilter filter,
|
||||
StatusBarStateController stateController) {
|
||||
StatusBarStateController stateController, BatteryController batteryController) {
|
||||
this(context,
|
||||
(PowerManager) context.getSystemService(Context.POWER_SERVICE),
|
||||
IDreamManager.Stub.asInterface(
|
||||
ServiceManager.checkService(DreamService.DREAM_SERVICE)),
|
||||
new AmbientDisplayConfiguration(context),
|
||||
filter,
|
||||
batteryController,
|
||||
stateController);
|
||||
}
|
||||
|
||||
@@ -92,10 +95,12 @@ public class NotificationInterruptionStateProvider {
|
||||
IDreamManager dreamManager,
|
||||
AmbientDisplayConfiguration ambientDisplayConfiguration,
|
||||
NotificationFilter notificationFilter,
|
||||
BatteryController batteryController,
|
||||
StatusBarStateController statusBarStateController) {
|
||||
mContext = context;
|
||||
mPowerManager = powerManager;
|
||||
mDreamManager = dreamManager;
|
||||
mBatteryController = batteryController;
|
||||
mAmbientDisplayConfiguration = ambientDisplayConfiguration;
|
||||
mNotificationFilter = notificationFilter;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
@@ -293,6 +298,13 @@ public class NotificationInterruptionStateProvider {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mBatteryController.isAodPowerSave()) {
|
||||
if (DEBUG_HEADS_UP) {
|
||||
Log.d(TAG, "No pulsing: disabled by battery saver: " + sbn.getKey());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!canAlertCommon(entry)) {
|
||||
if (DEBUG_HEADS_UP) {
|
||||
Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey());
|
||||
|
||||
@@ -45,9 +45,7 @@ public interface BatteryController extends DemoMode, Dumpable,
|
||||
/**
|
||||
* Returns {@code true} if AOD was disabled by power saving policies.
|
||||
*/
|
||||
default boolean isAodPowerSave() {
|
||||
return isPowerSave();
|
||||
}
|
||||
boolean isAodPowerSave();
|
||||
|
||||
/**
|
||||
* A listener that will be notified whenever a change in battery level or power save mode has
|
||||
|
||||
@@ -74,6 +74,7 @@ import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.NotificationGroupManager;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarWindowController;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.HeadsUpManager;
|
||||
import com.android.systemui.statusbar.policy.ZenModeController;
|
||||
@@ -173,7 +174,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
||||
TestableNotificationInterruptionStateProvider interruptionStateProvider =
|
||||
new TestableNotificationInterruptionStateProvider(mContext,
|
||||
mock(NotificationFilter.class),
|
||||
mock(StatusBarStateController.class));
|
||||
mock(StatusBarStateController.class),
|
||||
mock(BatteryController.class));
|
||||
interruptionStateProvider.setUpWithPresenter(
|
||||
mock(NotificationPresenter.class),
|
||||
mock(HeadsUpManager.class),
|
||||
@@ -659,8 +661,9 @@ public class BubbleControllerTest extends SysuiTestCase {
|
||||
NotificationInterruptionStateProvider {
|
||||
|
||||
TestableNotificationInterruptionStateProvider(Context context,
|
||||
NotificationFilter filter, StatusBarStateController controller) {
|
||||
super(context, filter, controller);
|
||||
NotificationFilter filter, StatusBarStateController controller,
|
||||
BatteryController batteryController) {
|
||||
super(context, filter, controller, batteryController);
|
||||
mUseHeadsUp = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.util.wakelock.WakeLockFake;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -76,8 +77,8 @@ public class DozeMachineTest extends SysuiTestCase {
|
||||
mConfigMock = mock(AmbientDisplayConfiguration.class);
|
||||
mPartMock = mock(DozeMachine.Part.class);
|
||||
|
||||
mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake, mWakefulnessLifecycle);
|
||||
|
||||
mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake,
|
||||
mWakefulnessLifecycle, mock(BatteryController.class));
|
||||
mMachine.setParts(new DozeMachine.Part[]{mPartMock});
|
||||
}
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.notification.NotificationFilter;
|
||||
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.HeadsUpManager;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -85,6 +86,8 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase {
|
||||
HeadsUpManager mHeadsUpManager;
|
||||
@Mock
|
||||
NotificationInterruptionStateProvider.HeadsUpSuppressor mHeadsUpSuppressor;
|
||||
@Mock
|
||||
BatteryController mBatteryController;
|
||||
|
||||
private NotificationInterruptionStateProvider mNotifInterruptionStateProvider;
|
||||
|
||||
@@ -98,7 +101,8 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase {
|
||||
mDreamManager,
|
||||
mAmbientDisplayConfiguration,
|
||||
mNotificationFilter,
|
||||
mStatusBarStateController);
|
||||
mStatusBarStateController,
|
||||
mBatteryController);
|
||||
|
||||
mNotifInterruptionStateProvider.setUpWithPresenter(
|
||||
mPresenter,
|
||||
@@ -573,17 +577,17 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase {
|
||||
/**
|
||||
* Testable class overriding constructor.
|
||||
*/
|
||||
public class TestableNotificationInterruptionStateProvider extends
|
||||
public static class TestableNotificationInterruptionStateProvider extends
|
||||
NotificationInterruptionStateProvider {
|
||||
|
||||
TestableNotificationInterruptionStateProvider(Context context,
|
||||
PowerManager powerManager, IDreamManager dreamManager,
|
||||
AmbientDisplayConfiguration ambientDisplayConfiguration,
|
||||
NotificationFilter notificationFilter,
|
||||
StatusBarStateController statusBarStateController) {
|
||||
StatusBarStateController statusBarStateController,
|
||||
BatteryController batteryController) {
|
||||
super(context, powerManager, dreamManager, ambientDisplayConfiguration,
|
||||
notificationFilter,
|
||||
statusBarStateController);
|
||||
notificationFilter, batteryController, statusBarStateController);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,6 +110,7 @@ import com.android.systemui.statusbar.notification.logging.NotificationLogger;
|
||||
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardMonitor;
|
||||
import com.android.systemui.statusbar.policy.UserSwitcherController;
|
||||
@@ -156,6 +157,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
@Mock private NotificationRemoteInputManager mRemoteInputManager;
|
||||
@Mock private RemoteInputController mRemoteInputController;
|
||||
@Mock private StatusBarStateControllerImpl mStatusBarStateController;
|
||||
@Mock private BatteryController mBatteryController;
|
||||
@Mock private DeviceProvisionedController mDeviceProvisionedController;
|
||||
@Mock private StatusBarNotificationPresenter mNotificationPresenter;
|
||||
@Mock
|
||||
@@ -209,7 +211,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
mNotificationInterruptionStateProvider =
|
||||
new TestableNotificationInterruptionStateProvider(mContext, mPowerManager,
|
||||
mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter,
|
||||
mStatusBarStateController);
|
||||
mStatusBarStateController, mBatteryController);
|
||||
mDependency.injectTestDependency(NotificationInterruptionStateProvider.class,
|
||||
mNotificationInterruptionStateProvider);
|
||||
mDependency.injectMockDependency(NavigationBarController.class);
|
||||
@@ -873,9 +875,10 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
IDreamManager dreamManager,
|
||||
AmbientDisplayConfiguration ambientDisplayConfiguration,
|
||||
NotificationFilter filter,
|
||||
StatusBarStateController controller) {
|
||||
StatusBarStateController controller,
|
||||
BatteryController batteryController) {
|
||||
super(context, powerManager, dreamManager, ambientDisplayConfiguration, filter,
|
||||
controller);
|
||||
batteryController, controller);
|
||||
mUseHeadsUp = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,4 +48,9 @@ public class FakeBatteryController extends BaseLeakChecker<BatteryStateChangeCal
|
||||
public boolean isPowerSave() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAodPowerSave() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user