Showing the notification icon properly now when the pulse is suppressed

Previously the notification would be hidden so if the user would pull
out the phone from the pocket, they might not see what notification
actually alerted.

Bug: 138336424
Test: add notification while on AOD, block prox sensor, see icon
Change-Id: I8f7bd7a6a0562942ed3e12f28705043722d177e8
This commit is contained in:
Selim Cinek
2019-07-25 20:09:04 -07:00
parent 2738aa3f79
commit 65c96f2fd4
6 changed files with 48 additions and 15 deletions

View File

@@ -77,8 +77,10 @@ public interface DozeHost {
interface Callback {
/**
* Called when a high priority notification is added.
* @param onPulseSuppressedListener A listener that is invoked if the pulse is being
* supressed.
*/
default void onNotificationAlerted() {}
default void onNotificationAlerted(Runnable onPulseSuppressedListener) {}
/**
* Called when battery state or power save mode changes.

View File

@@ -106,22 +106,31 @@ public class DozeTriggers implements DozeMachine.Part {
mDockManager = dockManager;
}
private void onNotification() {
private void onNotification(Runnable onPulseSuppressedListener) {
if (DozeMachine.DEBUG) {
Log.d(TAG, "requestNotificationPulse");
}
if (!sWakeDisplaySensorState) {
Log.d(TAG, "Wake display false. Pulse denied.");
runIfNotNull(onPulseSuppressedListener);
return;
}
mNotificationPulseTime = SystemClock.elapsedRealtime();
if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) {
runIfNotNull(onPulseSuppressedListener);
return;
}
requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */);
requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */,
onPulseSuppressedListener);
DozeLog.traceNotificationPulse(mContext);
}
private static void runIfNotNull(Runnable runnable) {
if (runnable != null) {
runnable.run();
}
}
private void proximityCheckThenCall(IntConsumer callback,
boolean alreadyPerformedProxCheck,
int reason) {
@@ -158,10 +167,11 @@ public class DozeTriggers implements DozeMachine.Part {
if (isWakeDisplay) {
onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState());
} else if (isLongPress) {
requestPulse(pulseReason, sensorPerformedProxCheck);
requestPulse(pulseReason, sensorPerformedProxCheck, null /* onPulseSupressedListener */);
} else if (isWakeLockScreen) {
if (wakeEvent) {
requestPulse(pulseReason, sensorPerformedProxCheck);
requestPulse(pulseReason, sensorPerformedProxCheck,
null /* onPulseSupressedListener */);
}
} else {
proximityCheckThenCall((result) -> {
@@ -340,7 +350,8 @@ public class DozeTriggers implements DozeMachine.Part {
}
}
private void requestPulse(final int reason, boolean performedProxCheck) {
private void requestPulse(final int reason, boolean performedProxCheck,
Runnable onPulseSuppressedListener) {
Assert.isMainThread();
mDozeHost.extendPulse(reason);
@@ -357,6 +368,7 @@ public class DozeTriggers implements DozeMachine.Part {
DozeLog.tracePulseDropped(mContext, mPulsePending, mMachine.getState(),
mDozeHost.isPulsingBlocked());
}
runIfNotNull(onPulseSuppressedListener);
return;
}
@@ -365,6 +377,7 @@ public class DozeTriggers implements DozeMachine.Part {
if (result == ProximityCheck.RESULT_NEAR) {
// in pocket, abort pulse
mPulsePending = false;
runIfNotNull(onPulseSuppressedListener);
} else {
// not in pocket, continue pulsing
continuePulseRequest(reason);
@@ -482,7 +495,8 @@ public class DozeTriggers implements DozeMachine.Part {
public void onReceive(Context context, Intent intent) {
if (PULSE_ACTION.equals(intent.getAction())) {
if (DozeMachine.DEBUG) Log.d(TAG, "Received pulse intent");
requestPulse(DozeLog.PULSE_REASON_INTENT, false /* performedProxCheck */);
requestPulse(DozeLog.PULSE_REASON_INTENT, false, /* performedProxCheck */
null /* onPulseSupressedListener */);
}
if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) {
mMachine.requestState(DozeMachine.State.FINISH);
@@ -532,8 +546,8 @@ public class DozeTriggers implements DozeMachine.Part {
private DozeHost.Callback mHostCallback = new DozeHost.Callback() {
@Override
public void onNotificationAlerted() {
onNotification();
public void onNotificationAlerted(Runnable onPulseSuppressedListener) {
onNotification(onPulseSuppressedListener);
}
@Override

View File

@@ -176,6 +176,7 @@ public final class NotificationEntry {
private boolean mSensitive = true;
private Runnable mOnSensitiveChangedListener;
private boolean mAutoHeadsUp;
private boolean mPulseSupressed;
public NotificationEntry(StatusBarNotification n) {
this(n, null);
@@ -900,6 +901,14 @@ public final class NotificationEntry {
mOnSensitiveChangedListener = listener;
}
public boolean isPulseSuppressed() {
return mPulseSupressed;
}
public void setPulseSuppressed(boolean suppressed) {
mPulseSupressed = suppressed;
}
/** Information about a suggestion that is being edited. */
public static class EditedSuggestionInfo {

View File

@@ -78,6 +78,7 @@ public class NotificationIconAreaController implements DarkReceiver,
private int mAodIconTint;
private boolean mFullyHidden;
private boolean mAodIconsVisible;
private boolean mIsPulsing;
public NotificationIconAreaController(Context context, StatusBar statusBar,
StatusBarStateController statusBarStateController,
@@ -265,7 +266,9 @@ public class NotificationIconAreaController implements DarkReceiver,
if (!showAmbient && entry.shouldSuppressStatusBar()) {
return false;
}
if (hidePulsing && entry.showingPulsing()) {
if (hidePulsing && entry.showingPulsing()
&& (!mWakeUpCoordinator.getNotificationsFullyHidden()
|| !entry.isPulseSuppressed())) {
return false;
}
return true;

View File

@@ -1578,7 +1578,8 @@ public class StatusBar extends SystemUI implements DemoMode,
public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
mEntryManager.updateNotifications();
if (isDozing() && isHeadsUp) {
mDozeServiceHost.fireNotificationPulse();
entry.setPulseSuppressed(false);
mDozeServiceHost.fireNotificationPulse(entry);
if (mPulsing) {
mDozeScrimController.cancelPendingPulseTimeout();
}
@@ -3920,9 +3921,13 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
public void fireNotificationPulse() {
public void fireNotificationPulse(NotificationEntry entry) {
Runnable pulseSupressedListener = () -> {
entry.setPulseSuppressed(true);
mNotificationIconAreaController.updateAodNotificationIcons();
};
for (Callback callback : mCallbacks) {
callback.onNotificationAlerted();
callback.onNotificationAlerted(pulseSupressedListener);
}
}

View File

@@ -95,13 +95,13 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
clearInvocations(mMachine);
mHost.callback.onNotificationAlerted();
mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */);
mSensors.getMockProximitySensor().sendProximityResult(false); /* Near */
verify(mMachine, never()).requestState(any());
verify(mMachine, never()).requestPulse(anyInt());
mHost.callback.onNotificationAlerted();
mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */);
mSensors.getMockProximitySensor().sendProximityResult(true); /* Far */
verify(mMachine).requestPulse(anyInt());