Fixed an issue where notifications weren't dismissed properly

Whenever the blocking helper was showing, the notification wasn't
actually dismissed in the notification manager and therefore the
notification dot and other visuals could be wrong as a result.
The reason was that we were lifetime extenders could even trigger
when the notification was dismissed.

Test: atest SystemUITest
Bug: 125799998
Change-Id: Iac7e690f609414de83eefcfeb38623d7668691c3
This commit is contained in:
Selim Cinek
2019-03-06 18:42:05 -08:00
parent 3d2a982fd1
commit 7bc9be7158
4 changed files with 19 additions and 31 deletions

View File

@@ -461,9 +461,6 @@ public class NotificationRemoteInputManager implements Dumpable {
}
public boolean shouldKeepForRemoteInputHistory(NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
if (!FORCE_REMOTE_INPUT_HISTORY) {
return false;
}
@@ -471,9 +468,6 @@ public class NotificationRemoteInputManager implements Dumpable {
}
public boolean shouldKeepForSmartReplyHistory(NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
if (!FORCE_REMOTE_INPUT_HISTORY) {
return false;
}
@@ -661,9 +655,6 @@ public class NotificationRemoteInputManager implements Dumpable {
protected class RemoteInputActiveExtender extends RemoteInputExtender {
@Override
public boolean shouldExtendLifetime(@NonNull NotificationEntry entry) {
if (entry.isDismissed()) {
return false;
}
return mRemoteInputController.isRemoteInputActive(entry);
}

View File

@@ -159,16 +159,19 @@ public class NotificationEntryManager implements
}
public void performRemoveNotification(StatusBarNotification n) {
final int rank = mNotificationData.getRank(n.getKey());
final int count = mNotificationData.getActiveNotifications().size();
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(getNotificationData().get(n.getKey()));
final NotificationVisibility nv = NotificationVisibility.obtain(n.getKey(), rank, count,
true, location);
final NotificationVisibility nv = obtainVisibility(n.getKey());
removeNotificationInternal(
n.getKey(), null, nv, false /* forceRemove */, true /* removedByUser */);
}
private NotificationVisibility obtainVisibility(String key) {
final int rank = mNotificationData.getRank(key);
final int count = mNotificationData.getActiveNotifications().size();
NotificationVisibility.NotificationLocation location =
NotificationLogger.getNotificationLocation(getNotificationData().get(key));
return NotificationVisibility.obtain(key, rank, count, true, location);
}
private void abortExistingInflation(String key) {
if (mPendingNotifications.containsKey(key)) {
NotificationEntry entry = mPendingNotifications.get(key);
@@ -226,8 +229,8 @@ public class NotificationEntryManager implements
@Override
public void removeNotification(String key, NotificationListenerService.RankingMap ranking) {
removeNotificationInternal(
key, ranking, null, false /* forceRemove */, false /* removedByUser */);
removeNotificationInternal(key, ranking, obtainVisibility(key), false /* forceRemove */,
false /* removedByUser */);
}
private void removeNotificationInternal(
@@ -245,7 +248,8 @@ public class NotificationEntryManager implements
if (entry != null) {
// If a manager needs to keep the notification around for whatever reason, we
// keep the notification
if (!forceRemove) {
boolean entryDismissed = entry.isRowDismissed();
if (!forceRemove && !entryDismissed) {
for (NotificationLifetimeExtender extender : mNotificationLifetimeExtenders) {
if (extender.shouldExtendLifetime(entry)) {
mLatestRankingMap = ranking;
@@ -272,6 +276,7 @@ public class NotificationEntryManager implements
mNotificationData.remove(key, ranking);
updateNotifications();
Dependency.get(LeakDetector.class).trackGarbage(entry);
removedByUser |= entryDismissed;
for (NotificationEntryListener listener : mNotificationEntryListeners) {
listener.onEntryRemoved(entry, visibility, removedByUser);

View File

@@ -543,14 +543,6 @@ public final class NotificationEntry {
return row == null || row.isRemoved();
}
/**
* @return {@code true} if the row is null or dismissed
*/
public boolean isDismissed() {
//TODO: recycling
return row == null || row.isDismissed();
}
public boolean isRowPinned() {
return row != null && row.isPinned();
}

View File

@@ -347,7 +347,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
verify(mPresenter).updateNotificationViews();
verify(mEntryListener).onEntryRemoved(
mEntry, null, false /* removedByUser */);
eq(mEntry), any(), eq(false) /* removedByUser */);
verify(mRow).setRemoved();
assertNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
@@ -360,7 +360,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
mEntryManager.removeNotification("not_a_real_key", mRankingMap);
verify(mEntryListener, never()).onEntryRemoved(
mEntry, null, false /* removedByUser */);
eq(mEntry), any(), eq(false) /* removedByUser */);
}
@Test
@@ -373,7 +373,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
mEntryManager.removeNotification(mSbn.getKey(), mRankingMap);
verify(mEntryListener, never()).onEntryRemoved(
mEntry, null, false /* removedByUser */);
eq(mEntry), any(), eq(false /* removedByUser */));
}
@Test
@@ -455,7 +455,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
verify(extender).setShouldManageLifetime(mEntry, true);
// THEN the notification is retained
assertNotNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
verify(mEntryListener, never()).onEntryRemoved(mEntry, null, false);
verify(mEntryListener, never()).onEntryRemoved(eq(mEntry), any(), eq(false));
}
@Test
@@ -474,7 +474,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
// THEN the notification is removed
assertNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
verify(mEntryListener).onEntryRemoved(mEntry, null, false);
verify(mEntryListener).onEntryRemoved(eq(mEntry), any(), eq(false));
}
@Test