From dd73d5b048f08397e95ea14decb98f47669d37ab Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Thu, 14 Dec 2023 13:33:19 -0500 Subject: [PATCH] DeadSystemException on getNotificationChannels Handle DeadSystemException that can be thrown from getNotificationChannels --- .../onesignal/NotificationChannelManager.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/NotificationChannelManager.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/NotificationChannelManager.java index 57307a85f5..ab0ad74409 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/NotificationChannelManager.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/NotificationChannelManager.java @@ -34,6 +34,7 @@ import android.content.Context; import android.net.Uri; import android.os.Build; +import android.os.DeadSystemException; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -47,7 +48,6 @@ import org.json.JSONObject; import java.math.BigInteger; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -239,14 +239,9 @@ static void processChannelList(@NonNull Context context, @Nullable JSONArray lis if (syncedChannelSet.isEmpty()) return; - List existingChannels = new ArrayList<>(); - - try { - existingChannels = notificationManager.getNotificationChannels(); - } catch (NullPointerException e) { - // Catch issue caused by "Attempt to invoke virtual method 'boolean android.app.NotificationChannel.isDeleted()' on a null object reference" - // https://github.com/OneSignal/OneSignal-Android-SDK/issues/1291 - OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR, "Error when trying to delete notification channel: " + e.getMessage()); + List existingChannels = getChannelList(notificationManager); + if (existingChannels == null) { + return; } // Delete old channels - Payload will include all changes for the app. Any extra OS_ ones must @@ -257,7 +252,29 @@ static void processChannelList(@NonNull Context context, @Nullable JSONArray lis notificationManager.deleteNotificationChannel(id); } } - + + @RequiresApi(api = Build.VERSION_CODES.O) + private static List getChannelList(NotificationManager notificationManager) { + try { + return notificationManager.getNotificationChannels(); + } catch (NullPointerException e) { + // Catching known Android bug, Sometimes throws, + // "Attempt to invoke virtual method 'boolean android.app.NotificationChannel.isDeleted()' on a null object reference" + // https://github.com/OneSignal/OneSignal-Android-SDK/issues/1291 + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR, "Error when trying to delete notification channel: " + e.getMessage()); + } + catch (Exception e) { + // Suppressing DeadSystemException as the app is already dying for + // another reason and allowing this exception to bubble up would + // create a red herring for app developers. We still re-throw + // others, as we don't want to silently hide other issues. + if (!(e instanceof DeadSystemException)) { + throw e; + } + } + return null; + } + private static int priorityToImportance(int priority) { if (priority > 9) return NotificationManagerCompat.IMPORTANCE_MAX;