Demote tryRemoveNotification crash to Log.wtf

We're ending up removing a notification twice -- probably a race
between clear all and dismissing or cancelling one of the notifications
hit by the clear all.

Short term, we don't want to bother our users with a crash, and we think
the end state is okay -- a notification removed twice will be removed the
first time, so the UI state should be okay -- so this changes the "throw
IllegalStateException" in tryRemoveNotification to a Log.wtf, which will
only crash *droidfood* builds.

Bug: 282945192
Test: presubmit
Change-Id: I65d7a9587946c51258263e5ea3069b4b5cdbc82e
This commit is contained in:
Julia Tuttle
2023-06-08 16:39:43 -04:00
parent 91821672fa
commit 89c150dac0

View File

@@ -61,6 +61,7 @@ import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.NotificationListenerService.RankingMap;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
@@ -513,10 +514,16 @@ public class NotifCollection implements Dumpable, PipelineDumpable {
* @return True if the notification was removed, false otherwise.
*/
private boolean tryRemoveNotification(NotificationEntry entry) {
if (mNotificationSet.get(entry.getKey()) != entry) {
final NotificationEntry storedEntry = mNotificationSet.get(entry.getKey());
if (storedEntry == null) {
Log.wtf(TAG, "TRY REMOVE non-existent notification " + logKey(entry));
return false;
} else if (storedEntry != entry) {
throw mEulogizer.record(
new IllegalStateException("No notification to remove with key "
+ logKey(entry)));
new IllegalStateException("Mismatched stored and tryRemoved entries"
+ " for key " + logKey(entry) + ":"
+ " stored=@" + Integer.toHexString(storedEntry.hashCode())
+ " tryRemoved=@" + Integer.toHexString(entry.hashCode())));
}
if (!entry.isCanceled()) {