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.