diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index 4862a476..26172915 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -12,6 +12,7 @@ import android.os.IBinder; import com.termux.R; import com.termux.shared.data.DataUtils; import com.termux.shared.data.IntentUtils; +import com.termux.shared.termux.plugins.TermuxPluginUtils; import com.termux.shared.termux.file.TermuxFileUtils; import com.termux.shared.file.filesystem.FileType; import com.termux.shared.errors.Errno; @@ -22,7 +23,6 @@ import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE; import com.termux.shared.file.FileUtils; import com.termux.shared.logger.Logger; import com.termux.shared.notification.NotificationUtils; -import com.termux.app.utils.PluginUtils; import com.termux.shared.shell.command.ExecutionCommand; import com.termux.shared.shell.command.ExecutionCommand.Runner; @@ -75,7 +75,7 @@ public class RunCommandService extends Service { if (!RUN_COMMAND_SERVICE.ACTION_RUN_COMMAND.equals(intent.getAction())) { errmsg = this.getString(R.string.error_run_command_service_invalid_intent_action, intent.getAction()); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return stopService(); } @@ -110,7 +110,7 @@ public class RunCommandService extends Service { if (Runner.runnerOf(executionCommand.runner) == null) { errmsg = this.getString(R.string.error_run_command_service_invalid_execution_command_runner, executionCommand.runner); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return stopService(); } @@ -137,10 +137,10 @@ public class RunCommandService extends Service { // user knows someone tried to run a command in termux context, since it may be malicious // app or imported (tasker) plugin project and not the user himself. If a pending intent is // also sent, then its creator is also logged and shown. - errmsg = PluginUtils.checkIfAllowExternalAppsPolicyIsViolated(this, LOG_TAG); + errmsg = TermuxPluginUtils.checkIfAllowExternalAppsPolicyIsViolated(this, LOG_TAG); if (errmsg != null) { executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, true); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, true); return stopService(); } @@ -150,7 +150,7 @@ public class RunCommandService extends Service { if (executionCommand.executable == null || executionCommand.executable.isEmpty()) { errmsg = this.getString(R.string.error_run_command_service_mandatory_extra_missing, RUN_COMMAND_SERVICE.EXTRA_COMMAND_PATH); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return stopService(); } @@ -164,7 +164,7 @@ public class RunCommandService extends Service { false); if (error != null) { executionCommand.setStateFailed(error); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return stopService(); } @@ -185,7 +185,7 @@ public class RunCommandService extends Service { false, true); if (error != null) { executionCommand.setStateFailed(error); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return stopService(); } } diff --git a/app/src/main/java/com/termux/app/TermuxOpenReceiver.java b/app/src/main/java/com/termux/app/TermuxOpenReceiver.java index 48f0607d..f8f21b5d 100644 --- a/app/src/main/java/com/termux/app/TermuxOpenReceiver.java +++ b/app/src/main/java/com/termux/app/TermuxOpenReceiver.java @@ -13,7 +13,7 @@ import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.webkit.MimeTypeMap; -import com.termux.app.utils.PluginUtils; +import com.termux.shared.termux.plugins.TermuxPluginUtils; import com.termux.shared.data.DataUtils; import com.termux.shared.data.IntentUtils; import com.termux.shared.net.uri.UriUtils; @@ -204,7 +204,7 @@ public class TermuxOpenReceiver extends BroadcastReceiver { } // If TermuxConstants.PROP_ALLOW_EXTERNAL_APPS property to not set to "true", then throw exception - String errmsg = PluginUtils.checkIfAllowExternalAppsPolicyIsViolated(getContext(), LOG_TAG); + String errmsg = TermuxPluginUtils.checkIfAllowExternalAppsPolicyIsViolated(getContext(), LOG_TAG); if (errmsg != null) { throw new IllegalArgumentException(errmsg); } diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index 52f0c6cd..0b713935 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -20,7 +20,7 @@ import androidx.annotation.Nullable; import com.termux.R; import com.termux.app.terminal.TermuxTerminalSessionClient; -import com.termux.app.utils.PluginUtils; +import com.termux.shared.termux.plugins.TermuxPluginUtils; import com.termux.shared.data.IntentUtils; import com.termux.shared.net.uri.UriUtils; import com.termux.shared.errors.Errno; @@ -286,7 +286,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli ExecutionCommand executionCommand = pendingPluginExecutionCommands.get(i); if (!executionCommand.shouldNotProcessResults() && executionCommand.isPluginExecutionCommandWithPendingResult()) { if (executionCommand.setStateFailed(Errno.ERRNO_CANCELLED.getCode(), this.getString(com.termux.shared.R.string.error_execution_cancelled))) { - PluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); + TermuxPluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); } } } @@ -367,7 +367,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli if (Runner.runnerOf(executionCommand.runner) == null) { String errmsg = this.getString(R.string.error_termux_service_invalid_execution_command_runner, executionCommand.runner); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return; } @@ -411,7 +411,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli else { String errmsg = getString(R.string.error_termux_service_unsupported_execution_command_runner, executionCommand.runner); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); } } @@ -454,7 +454,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli Logger.logError(LOG_TAG, "Failed to execute new TermuxTask command for:\n" + executionCommand.getCommandIdAndLabelLogString()); // If the execution command was started for a plugin, then process the error if (executionCommand.isPluginExecutionCommand) - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); else Logger.logErrorExtended(LOG_TAG, executionCommand.toString()); return null; @@ -483,7 +483,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli // If the execution command was started for a plugin, then process the results if (executionCommand != null && executionCommand.isPluginExecutionCommand) - PluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); + TermuxPluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); mTermuxTasks.remove(termuxTask); } @@ -517,7 +517,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli if (DataUtils.isNullOrEmpty(executionCommand.sessionName)) { String errmsg = getString(R.string.error_termux_service_execution_command_session_name_unset, executionCommand.sessionCreateMode); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return; } else { newTermuxSession = getTermuxSessionForName(executionCommand.sessionName); @@ -527,7 +527,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli else { String errmsg = getString(R.string.error_termux_service_unsupported_execution_command_session_create_mode, executionCommand.sessionCreateMode); executionCommand.setStateFailed(Errno.ERRNO_FAILED.getCode(), errmsg); - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); return; } @@ -575,7 +575,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli Logger.logError(LOG_TAG, "Failed to execute new TermuxSession command for:\n" + executionCommand.getCommandIdAndLabelLogString()); // If the execution command was started for a plugin, then process the error if (executionCommand.isPluginExecutionCommand) - PluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); + TermuxPluginUtils.processPluginExecutionCommandError(this, LOG_TAG, executionCommand, false); else Logger.logErrorExtended(LOG_TAG, executionCommand.toString()); return null; @@ -621,7 +621,7 @@ public final class TermuxService extends Service implements AppShell.AppShellCli // If the execution command was started for a plugin, then process the results if (executionCommand != null && executionCommand.isPluginExecutionCommand) - PluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); + TermuxPluginUtils.processPluginExecutionCommandResult(this, LOG_TAG, executionCommand); mTermuxSessions.remove(termuxSession); diff --git a/app/src/main/java/com/termux/app/models/UserAction.java b/app/src/main/java/com/termux/app/models/UserAction.java index d32005f2..1e82255e 100644 --- a/app/src/main/java/com/termux/app/models/UserAction.java +++ b/app/src/main/java/com/termux/app/models/UserAction.java @@ -3,7 +3,6 @@ package com.termux.app.models; public enum UserAction { ABOUT("about"), - PLUGIN_EXECUTION_COMMAND("plugin execution command"), REPORT_ISSUE_FROM_TRANSCRIPT("report issue from transcript"); private final String name; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e49b4e85..acc0f44b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -121,8 +121,6 @@ - %1$s requires `allow-external-apps` - property to be set to `true` in `%2$s` file. Failed to start TermuxService. Check logcat for exception message. Failed to start TermuxService while app is in background due to android bg restrictions. diff --git a/termux-shared/src/main/java/com/termux/shared/termux/models/UserAction.java b/termux-shared/src/main/java/com/termux/shared/termux/models/UserAction.java index fe89d0f8..b7e1c569 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/models/UserAction.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/models/UserAction.java @@ -2,7 +2,8 @@ package com.termux.shared.termux.models; public enum UserAction { - CRASH_REPORT("crash report"); + CRASH_REPORT("crash report"), + PLUGIN_EXECUTION_COMMAND("plugin execution command"); private final String name; diff --git a/app/src/main/java/com/termux/app/utils/PluginUtils.java b/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java similarity index 72% rename from app/src/main/java/com/termux/app/utils/PluginUtils.java rename to termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java index a407747f..28904e9f 100644 --- a/app/src/main/java/com/termux/app/utils/PluginUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/plugins/TermuxPluginUtils.java @@ -1,14 +1,15 @@ -package com.termux.app.utils; +package com.termux.shared.termux.plugins; 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; -import com.termux.R; +import com.termux.shared.R; import com.termux.shared.activities.ReportActivity; import com.termux.shared.file.FileUtils; import com.termux.shared.termux.file.TermuxFileUtils; @@ -17,6 +18,7 @@ import com.termux.shared.shell.command.result.ResultData; import com.termux.shared.errors.Errno; import com.termux.shared.errors.Error; import com.termux.shared.notification.NotificationUtils; +import com.termux.shared.termux.models.UserAction; import com.termux.shared.termux.notification.TermuxNotificationUtils; import com.termux.shared.termux.settings.preferences.TermuxPreferenceConstants; import com.termux.shared.shell.command.result.ResultSender; @@ -30,14 +32,13 @@ import com.termux.shared.termux.settings.preferences.TermuxPreferenceConstants.T import com.termux.shared.models.ReportInfo; import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; import com.termux.shared.shell.command.ExecutionCommand; -import com.termux.app.models.UserAction; import com.termux.shared.data.DataUtils; import com.termux.shared.markdown.MarkdownUtils; import com.termux.shared.termux.TermuxUtils; -public class PluginUtils { +public class TermuxPluginUtils { - private static final String LOG_TAG = "PluginUtils"; + private static final String LOG_TAG = "TermuxPluginUtils"; /** * Process {@link ExecutionCommand} result. @@ -92,9 +93,8 @@ public class PluginUtils { sendPluginCommandErrorNotification(context, logTag, null, ResultData.getErrorsListMinimalString(resultData), ExecutionCommand.getExecutionCommandMarkdownString(executionCommand), - false, true, TermuxUtils.AppInfoMode.TERMUX_AND_CALLING_PACKAGE, - executionCommand.resultConfig.resultPendingIntent != null ? executionCommand.resultConfig.resultPendingIntent.getCreatorPackage(): null, - true); + false, true, TermuxUtils.AppInfoMode.TERMUX_AND_CALLING_PACKAGE,true, + executionCommand.resultConfig.resultPendingIntent != null ? executionCommand.resultConfig.resultPendingIntent.getCreatorPackage(): null); } } @@ -173,9 +173,8 @@ public class PluginUtils { sendPluginCommandErrorNotification(context, logTag, null, ResultData.getErrorsListMinimalString(resultData), ExecutionCommand.getExecutionCommandMarkdownString(executionCommand), - forceNotification, true, TermuxUtils.AppInfoMode.TERMUX_AND_CALLING_PACKAGE, - executionCommand.resultConfig.resultPendingIntent != null ? executionCommand.resultConfig.resultPendingIntent.getCreatorPackage(): null, - true); + forceNotification, true, TermuxUtils.AppInfoMode.TERMUX_AND_CALLING_PACKAGE, true, + executionCommand.resultConfig.resultPendingIntent != null ? executionCommand.resultConfig.resultPendingIntent.getCreatorPackage(): null); } /** Set variables which will be used by {@link ResultSender#sendCommandResultData(Context, String, String, ResultConfig, ResultData, boolean)} @@ -208,11 +207,75 @@ public class PluginUtils { + /** - * Send an error notification for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} + * Send a plugin error report notification for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} * and {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_NAME}. * - * @param context The {@link Context} for operations. + * @param currentPackageContext The {@link Context} of current package. + * @param logTag The log tag to use for logging. + * @param title The title for the error report and notification. + * @param message The message for the error report. + * @param throwable The {@link Throwable} for the error report. + */ + public static void sendPluginCommandErrorNotification(final Context currentPackageContext, String logTag, + CharSequence title, String message, Throwable throwable) { + sendPluginCommandErrorNotification(currentPackageContext, logTag, + title, message, + MarkdownUtils.getMarkdownCodeForString(Logger.getMessageAndStackTraceString(message, throwable), true), + false, false, true); + } + + /** + * Send a plugin error report notification for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} + * and {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_NAME}. + * + * @param currentPackageContext The {@link Context} of current package. + * @param logTag The log tag to use for logging. + * @param title The title for the error report and notification. + * @param notificationTextString The text of the notification. + * @param message The message for the error report. + */ + public static void sendPluginCommandErrorNotification(final Context currentPackageContext, String logTag, + CharSequence title, String notificationTextString, + String message) { + sendPluginCommandErrorNotification(currentPackageContext, logTag, + title, notificationTextString, message, + false, false, true); + } + + /** + * Send a plugin error report notification for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} + * and {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_NAME}. + * + * @param currentPackageContext The {@link Context} of current package. + * @param logTag The log tag to use for logging. + * @param title The title for the error report and notification. + * @param notificationTextString The text of the notification. + * @param message The message for the error report. + * @param forceNotification If set to {@code true}, then a notification will be shown + * regardless of if pending intent is {@code null} or + * {@link TermuxPreferenceConstants.TERMUX_APP#KEY_PLUGIN_ERROR_NOTIFICATIONS_ENABLED} + * is {@code false}. + * @param showToast If set to {@code true}, then a toast will be shown for {@code notificationTextString}. + * @param addDeviceInfo If set to {@code true}, then device info should be appended to the message. + */ + public static void sendPluginCommandErrorNotification(final Context currentPackageContext, String logTag, + CharSequence title, String notificationTextString, + String message, boolean forceNotification, + boolean showToast, + boolean addDeviceInfo) { + sendPluginCommandErrorNotification(currentPackageContext, logTag, + title, notificationTextString, "## " + title + "\n\n" + message + "\n\n", + forceNotification, showToast, TermuxUtils.AppInfoMode.TERMUX_AND_PLUGIN_PACKAGE, addDeviceInfo, null); + } + + /** + * Send a plugin error notification for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} + * and {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_NAME}. + * + * @param currentPackageContext The {@link Context} of current package. + * @param logTag The log tag to use for logging. * @param title The title for the error report and notification. * @param notificationTextString The text of the notification. * @param message The message for the error report. @@ -223,21 +286,30 @@ public class PluginUtils { * @param showToast If set to {@code true}, then a toast will be shown for {@code notificationTextString}. * @param appInfoMode The {@link TermuxUtils.AppInfoMode} to use to add app info to the message. * Set to {@code null} if app info should not be appended to the message. + * @param addDeviceInfo If set to {@code true}, then device info should be appended to the message. * @param callingPackageName The optional package name of the app for which the plugin command * was run. - * @param addDeviceInfo If set to {@code true}, then device info should be appended to the message. */ - public static void sendPluginCommandErrorNotification(Context context, String logTag, + public static void sendPluginCommandErrorNotification(Context currentPackageContext, String logTag, CharSequence title, String notificationTextString, String message, boolean forceNotification, boolean showToast, TermuxUtils.AppInfoMode appInfoMode, - String callingPackageName, - boolean addDeviceInfo) { - if (context == null) return; + boolean addDeviceInfo, + String callingPackageName) { + // Note: Do not change currentPackageContext or termuxPackageContext passed to functions or things will break - TermuxAppSharedPreferences preferences = TermuxAppSharedPreferences.build(context); + if (currentPackageContext == null) return; + String currentPackageName = currentPackageContext.getPackageName(); + + final Context termuxPackageContext = TermuxUtils.getTermuxPackageContext(currentPackageContext); + if (termuxPackageContext == null) { + Logger.logWarn(LOG_TAG, "Ignoring call to sendPluginCommandErrorNotification() since failed to get \"" + TermuxConstants.TERMUX_PACKAGE_NAME + "\" package context from \"" + currentPackageName + "\" context"); + return; + } + + TermuxAppSharedPreferences preferences = TermuxAppSharedPreferences.build(termuxPackageContext); if (preferences == null) return; // If user has disabled notifications for plugin commands, then just return @@ -247,7 +319,7 @@ public class PluginUtils { logTag = DataUtils.getDefaultIfNull(logTag, LOG_TAG); if (showToast) - Logger.showToast(context, notificationTextString, true); + Logger.showToast(currentPackageContext, notificationTextString, true); // Send a notification to show the error which when clicked will open the ReportActivity // to show the details of the error @@ -259,48 +331,49 @@ public class PluginUtils { StringBuilder reportString = new StringBuilder(message); if (appInfoMode != null) - reportString.append("\n\n").append(TermuxUtils.getAppInfoMarkdownString(context, appInfoMode, callingPackageName)); + reportString.append("\n\n").append(TermuxUtils.getAppInfoMarkdownString(currentPackageContext, appInfoMode, + callingPackageName != null ? callingPackageName : currentPackageName)); if (addDeviceInfo) - reportString.append("\n\n").append(AndroidUtils.getDeviceInfoMarkdownString(context)); + reportString.append("\n\n").append(AndroidUtils.getDeviceInfoMarkdownString(currentPackageContext)); String userActionName = UserAction.PLUGIN_EXECUTION_COMMAND.getName(); ReportInfo reportInfo = new ReportInfo(userActionName, logTag, title.toString()); reportInfo.setReportString(reportString.toString()); - reportInfo.setReportStringSuffix("\n\n" + TermuxUtils.getReportIssueMarkdownString(context)); + reportInfo.setReportStringSuffix("\n\n" + TermuxUtils.getReportIssueMarkdownString(currentPackageContext)); reportInfo.setAddReportInfoHeaderToMarkdown(true); reportInfo.setReportSaveFileLabelAndPath(userActionName, Environment.getExternalStorageDirectory() + "/" + FileUtils.sanitizeFileName(TermuxConstants.TERMUX_APP_NAME + "-" + userActionName + ".log", true, true)); - ReportActivity.NewInstanceResult result = ReportActivity.newInstance(context, reportInfo); + ReportActivity.NewInstanceResult result = ReportActivity.newInstance(termuxPackageContext, reportInfo); if (result.contentIntent == null) return; // Must ensure result code for PendingIntents and id for notification are unique otherwise will override previous - int nextNotificationId = TermuxNotificationUtils.getNextNotificationId(context); + int nextNotificationId = TermuxNotificationUtils.getNextNotificationId(termuxPackageContext); - PendingIntent contentIntent = PendingIntent.getActivity(context, nextNotificationId, result.contentIntent, PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent contentIntent = PendingIntent.getActivity(termuxPackageContext, nextNotificationId, result.contentIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent deleteIntent = null; if (result.deleteIntent != null) - deleteIntent = PendingIntent.getBroadcast(context, nextNotificationId, result.deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT); + deleteIntent = PendingIntent.getBroadcast(termuxPackageContext, nextNotificationId, result.deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Setup the notification channel if not already set up - setupPluginCommandErrorsNotificationChannel(context); + setupPluginCommandErrorsNotificationChannel(termuxPackageContext); // Use markdown in notification - CharSequence notificationTextCharSequence = MarkdownUtils.getSpannedMarkdownText(context, notificationTextString); + CharSequence notificationTextCharSequence = MarkdownUtils.getSpannedMarkdownText(termuxPackageContext, notificationTextString); //CharSequence notificationTextCharSequence = notificationTextString; // Build the notification - Notification.Builder builder = getPluginCommandErrorsNotificationBuilder(context, title, - notificationTextCharSequence, notificationTextCharSequence, contentIntent, deleteIntent, + Notification.Builder builder = getPluginCommandErrorsNotificationBuilder(currentPackageContext, termuxPackageContext, + title, notificationTextCharSequence, notificationTextCharSequence, contentIntent, deleteIntent, NotificationUtils.NOTIFICATION_MODE_VIBRATE); if (builder == null) return; // Send the notification - NotificationManager notificationManager = NotificationUtils.getNotificationManager(context); + NotificationManager notificationManager = NotificationUtils.getNotificationManager(termuxPackageContext); if (notificationManager != null) notificationManager.notify(nextNotificationId, builder.build()); } @@ -309,7 +382,8 @@ public class PluginUtils { * Get {@link Notification.Builder} for {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID} * and {@link TermuxConstants#TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_NAME}. * - * @param context The {@link Context} for operations. + * @param currentPackageContext The {@link Context} of current package. + * @param termuxPackageContext The {@link Context} of termux package. * @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. @@ -319,11 +393,15 @@ public class PluginUtils { * @return Returns the {@link Notification.Builder}. */ @Nullable - public static Notification.Builder getPluginCommandErrorsNotificationBuilder( - final Context context, final CharSequence title, final CharSequence notificationText, - final CharSequence notificationBigText, final PendingIntent contentIntent, final PendingIntent deleteIntent, final int notificationMode) { - - Notification.Builder builder = NotificationUtils.geNotificationBuilder(context, + public static Notification.Builder getPluginCommandErrorsNotificationBuilder(final Context currentPackageContext, + final Context termuxPackageContext, + final CharSequence title, + final CharSequence notificationText, + final CharSequence notificationBigText, + final PendingIntent contentIntent, + final PendingIntent deleteIntent, + final int notificationMode) { + Notification.Builder builder = NotificationUtils.geNotificationBuilder(termuxPackageContext, TermuxConstants.TERMUX_PLUGIN_COMMAND_ERRORS_NOTIFICATION_CHANNEL_ID, Notification.PRIORITY_HIGH, title, notificationText, notificationBigText, contentIntent, deleteIntent, notificationMode); @@ -333,7 +411,7 @@ public class PluginUtils { builder.setShowWhen(true); // Set notification icon - builder.setSmallIcon(R.drawable.ic_error_notification); + builder.setSmallIcon(Icon.createWithResource(currentPackageContext, R.drawable.ic_error_notification)); // Set background color for small notification icon builder.setColor(0xFF607D8B); diff --git a/termux-shared/src/main/res/values/strings.xml b/termux-shared/src/main/res/values/strings.xml index 5a70aab4..a0111fc3 100644 --- a/termux-shared/src/main/res/values/strings.xml +++ b/termux-shared/src/main/res/values/strings.xml @@ -39,6 +39,12 @@ + + %1$s requires `allow-external-apps` + property to be set to `true` in `%2$s` file. + + + Report Text **Report Truncated**\n\nReport is too large to view here.