From 5290ce1f7745a4c47f88f22b4fb19de2acc10988 Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Tue, 26 Apr 2022 02:40:12 +0500 Subject: [PATCH] Added|Fixed: Add `TermuxNotificationUtils.getTermuxOrPluginAppNotificationBuilder()` helper function and fix notification icon drawable resource id issue on Android 5 --- .../notification/NotificationUtils.java | 2 + .../shared/termux/crash/TermuxCrashUtils.java | 22 +----- .../notification/TermuxNotificationUtils.java | 71 +++++++++++++++++++ .../termux/plugins/TermuxPluginUtils.java | 20 +----- 4 files changed, 77 insertions(+), 38 deletions(-) diff --git a/termux-shared/src/main/java/com/termux/shared/notification/NotificationUtils.java b/termux-shared/src/main/java/com/termux/shared/notification/NotificationUtils.java index 25597a20..e21a83f4 100644 --- a/termux-shared/src/main/java/com/termux/shared/notification/NotificationUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/notification/NotificationUtils.java @@ -51,6 +51,8 @@ public class NotificationUtils { * * @param context The {@link Context} for operations. * @param title The title for the notification. + * @param channelId The channel id for the notification. + * @param priority The priority for the notification. * @param notificationText The second line text of the notification. * @param notificationBigText The full text of the notification that may optionally be styled. * @param contentIntent The {@link PendingIntent} which should be sent when notification is clicked. diff --git a/termux-shared/src/main/java/com/termux/shared/termux/crash/TermuxCrashUtils.java b/termux-shared/src/main/java/com/termux/shared/termux/crash/TermuxCrashUtils.java index 5d551a97..a3455707 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/crash/TermuxCrashUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/crash/TermuxCrashUtils.java @@ -5,13 +5,11 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.graphics.drawable.Icon; import android.os.Environment; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.termux.shared.R; import com.termux.shared.activities.ReportActivity; import com.termux.shared.android.AndroidUtils; import com.termux.shared.crash.CrashHandler; @@ -391,26 +389,10 @@ public class TermuxCrashUtils implements CrashHandler.CrashHandlerClient { final PendingIntent contentIntent, final PendingIntent deleteIntent, final int notificationMode) { - - Notification.Builder builder = NotificationUtils.geNotificationBuilder(termuxPackageContext, + return TermuxNotificationUtils.getTermuxOrPluginAppNotificationBuilder( + currentPackageContext, termuxPackageContext, TermuxConstants.TERMUX_CRASH_REPORTS_NOTIFICATION_CHANNEL_ID, Notification.PRIORITY_HIGH, title, notificationText, notificationBigText, contentIntent, deleteIntent, notificationMode); - - if (builder == null) return null; - - // Enable timestamp - builder.setShowWhen(true); - - // Set notification icon - builder.setSmallIcon(Icon.createWithResource(currentPackageContext, R.drawable.ic_error_notification)); - - // Set background color for small notification icon - builder.setColor(0xFF607D8B); - - // Dismiss on click - builder.setAutoCancel(true); - - return builder; } /** diff --git a/termux-shared/src/main/java/com/termux/shared/termux/notification/TermuxNotificationUtils.java b/termux-shared/src/main/java/com/termux/shared/termux/notification/TermuxNotificationUtils.java index eb0b5062..19c7c02b 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/notification/TermuxNotificationUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/notification/TermuxNotificationUtils.java @@ -1,7 +1,16 @@ package com.termux.shared.termux.notification; +import android.app.Notification; +import android.app.PendingIntent; import android.content.Context; +import android.graphics.drawable.Icon; +import android.os.Build; +import androidx.annotation.Nullable; + +import com.termux.shared.R; +import com.termux.shared.android.resource.ResourceUtils; +import com.termux.shared.notification.NotificationUtils; import com.termux.shared.termux.settings.preferences.TermuxAppSharedPreferences; import com.termux.shared.termux.settings.preferences.TermuxPreferenceConstants; import com.termux.shared.termux.TermuxConstants; @@ -35,4 +44,66 @@ public class TermuxNotificationUtils { preferences.setLastNotificationId(nextNotificationId); return nextNotificationId; } + + /** + * Get {@link Notification.Builder} for termux app or its plugin. + * + * @param currentPackageContext The {@link Context} of current package. + * @param termuxPackageContext The {@link Context} of termux package. + * @param channelId The channel id for the notification. + * @param priority The priority for the notification. + * @param title The title for the notification. + * @param notificationText The second line text of the notification. + * @param notificationBigText The full text of the notification that may optionally be styled. + * @param contentIntent The {@link PendingIntent} which should be sent when notification is clicked. + * @param deleteIntent The {@link PendingIntent} which should be sent when notification is deleted. + * @param notificationMode The notification mode. It must be one of {@code NotificationUtils.NOTIFICATION_MODE_*}. + * @return Returns the {@link Notification.Builder}. + */ + @Nullable + public static Notification.Builder getTermuxOrPluginAppNotificationBuilder(final Context currentPackageContext, + final Context termuxPackageContext, + final String channelId, + final int priority, + final CharSequence title, + final CharSequence notificationText, + final CharSequence notificationBigText, + final PendingIntent contentIntent, + final PendingIntent deleteIntent, + final int notificationMode) { + Notification.Builder builder = NotificationUtils.geNotificationBuilder(termuxPackageContext, + channelId, priority, + title, notificationText, notificationBigText, contentIntent, deleteIntent, notificationMode); + + if (builder == null) return null; + + // Enable timestamp + builder.setShowWhen(true); + + // Set notification icon + // If a notification is to be shown by a termux plugin app, then we can't use the drawable + // resource id for the plugin app with setSmallIcon(@DrawableRes int icon) since notification + // is shown with termuxPackageContext and termux-app package would have a different id and + // when android tries to load the drawable an exception would be thrown and notification will + // not be thrown. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // Set Icon instead of drawable resource id + builder.setSmallIcon(Icon.createWithResource(currentPackageContext, R.drawable.ic_error_notification)); + } else { + // Set drawable resource id used by termux-app package + Integer iconResId = ResourceUtils.getDrawableResourceId(termuxPackageContext, "ic_error_notification", + termuxPackageContext.getPackageName(), true); + if (iconResId != null) + builder.setSmallIcon(iconResId); + } + + // Set background color for small notification icon + builder.setColor(0xFF607D8B); + + // Dismiss on click + builder.setAutoCancel(true); + + return builder; + } + } diff --git a/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java b/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java index ed2d9a20..1ab482e5 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java @@ -4,7 +4,6 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; -import android.graphics.drawable.Icon; import android.os.Environment; import androidx.annotation.Nullable; @@ -403,25 +402,10 @@ public class TermuxPluginUtils { final PendingIntent contentIntent, final PendingIntent deleteIntent, final int notificationMode) { - Notification.Builder builder = NotificationUtils.geNotificationBuilder(termuxPackageContext, + return TermuxNotificationUtils.getTermuxOrPluginAppNotificationBuilder( + currentPackageContext, termuxPackageContext, TermuxConstants.TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID, Notification.PRIORITY_HIGH, title, notificationText, notificationBigText, contentIntent, deleteIntent, notificationMode); - - if (builder == null) return null; - - // Enable timestamp - builder.setShowWhen(true); - - // Set notification icon - builder.setSmallIcon(Icon.createWithResource(currentPackageContext, R.drawable.ic_error_notification)); - - // Set background color for small notification icon - builder.setColor(0xFF607D8B); - - // Dismiss on click - builder.setAutoCancel(true); - - return builder; } /**