Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bee13b63 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Catch SecurityException from NoMan to workaround possible race condition

Bug: 63636581
Bug: 227445069
Test: n/a issue not reproducible
Change-Id: Ib3dcf013ba9220d3d2d59032163191f0aef5d062
parent cdcbebb7
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import android.util.Log;
import android.util.Pair;

import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;

@@ -154,14 +155,9 @@ public class NotificationListener extends NotificationListenerService {
            case MSG_NOTIFICATION_FULL_REFRESH:
                List<StatusBarNotification> activeNotifications = null;
                if (sIsConnected) {
                    try {
                        activeNotifications = Arrays.stream(getActiveNotifications())
                    activeNotifications = Arrays.stream(getActiveNotificationsSafely(null))
                            .filter(this::notificationIsValidForUI)
                            .collect(Collectors.toList());
                    } catch (SecurityException ex) {
                        Log.e(TAG, "SecurityException: failed to fetch notifications");
                        activeNotifications = new ArrayList<>();
                    }
                } else {
                    activeNotifications = new ArrayList<>();
                }
@@ -175,7 +171,7 @@ public class NotificationListener extends NotificationListenerService {
            }
            case MSG_RANKING_UPDATE: {
                String[] keys = ((RankingMap) message.obj).getOrderedKeys();
                for (StatusBarNotification sbn : getActiveNotifications(keys)) {
                for (StatusBarNotification sbn : getActiveNotificationsSafely(keys)) {
                    updateGroupKeyIfNecessary(sbn);
                }
                return true;
@@ -214,6 +210,16 @@ public class NotificationListener extends NotificationListenerService {
        return true;
    }

    private @NonNull StatusBarNotification[] getActiveNotificationsSafely(@Nullable String[] keys) {
        StatusBarNotification[] result = null;
        try {
            result = getActiveNotifications(keys);
        } catch (SecurityException e) {
            Log.e(TAG, "SecurityException: failed to fetch notifications");
        }
        return result == null ? new StatusBarNotification[0] : result;
    }

    @Override
    public void onListenerConnected() {
        super.onListenerConnected();
@@ -313,9 +319,8 @@ public class NotificationListener extends NotificationListenerService {
     */
    @WorkerThread
    public List<StatusBarNotification> getNotificationsForKeys(List<NotificationKeyData> keys) {
        StatusBarNotification[] notifications = getActiveNotifications(
                keys.stream().map(n -> n.notificationKey).toArray(String[]::new));
        return notifications == null ? Collections.emptyList() : Arrays.asList(notifications);
        return Arrays.asList(getActiveNotificationsSafely(
                keys.stream().map(n -> n.notificationKey).toArray(String[]::new)));
    }

    /**