mirror of
https://github.com/fankes/termux-app.git
synced 2025-10-22 03:39:21 +08:00
Changed!: Move to package-by-feature hierarchy for classes not using it since termux-shared is growing too big and layers are getting out of hand
This commit is contained in:
@@ -1,552 +0,0 @@
|
||||
package com.termux.shared.models;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.termux.shared.data.IntentUtils;
|
||||
import com.termux.shared.models.errors.Error;
|
||||
import com.termux.shared.logger.Logger;
|
||||
import com.termux.shared.markdown.MarkdownUtils;
|
||||
import com.termux.shared.data.DataUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ExecutionCommand {
|
||||
|
||||
/*
|
||||
The {@link ExecutionState#SUCCESS} and {@link ExecutionState#FAILED} is defined based on
|
||||
successful execution of command without any internal errors or exceptions being raised.
|
||||
The shell command {@link #exitCode} being non-zero **does not** mean that execution command failed.
|
||||
Only the {@link #errCode} being non-zero means that execution command failed from the Termux app
|
||||
perspective.
|
||||
*/
|
||||
|
||||
/** The {@link Enum} that defines {@link ExecutionCommand} state. */
|
||||
public enum ExecutionState {
|
||||
|
||||
PRE_EXECUTION("Pre-Execution", 0),
|
||||
EXECUTING("Executing", 1),
|
||||
EXECUTED("Executed", 2),
|
||||
SUCCESS("Success", 3),
|
||||
FAILED("Failed", 4);
|
||||
|
||||
private final String name;
|
||||
private final int value;
|
||||
|
||||
ExecutionState(final String name, final int value) {
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** The optional unique id for the {@link ExecutionCommand}. */
|
||||
public Integer id;
|
||||
|
||||
|
||||
/** The current state of the {@link ExecutionCommand}. */
|
||||
private ExecutionState currentState = ExecutionState.PRE_EXECUTION;
|
||||
/** The previous state of the {@link ExecutionCommand}. */
|
||||
private ExecutionState previousState = ExecutionState.PRE_EXECUTION;
|
||||
|
||||
|
||||
/** The executable for the {@link ExecutionCommand}. */
|
||||
public String executable;
|
||||
/** The executable Uri for the {@link ExecutionCommand}. */
|
||||
public Uri executableUri;
|
||||
/** The executable arguments array for the {@link ExecutionCommand}. */
|
||||
public String[] arguments;
|
||||
/** The stdin string for the {@link ExecutionCommand}. */
|
||||
public String stdin;
|
||||
/** The current working directory for the {@link ExecutionCommand}. */
|
||||
public String workingDirectory;
|
||||
|
||||
|
||||
/** The terminal transcript rows for the {@link ExecutionCommand}. */
|
||||
public Integer terminalTranscriptRows;
|
||||
|
||||
|
||||
/** If the {@link ExecutionCommand} is a background or a foreground terminal session command. */
|
||||
public boolean inBackground;
|
||||
/** If the {@link ExecutionCommand} is meant to start a failsafe terminal session. */
|
||||
public boolean isFailsafe;
|
||||
|
||||
/**
|
||||
* The {@link ExecutionCommand} custom log level for background {@link com.termux.shared.shell.TermuxTask}
|
||||
* commands. By default, @link com.termux.shared.shell.StreamGobbler} only logs stdout and
|
||||
* stderr if {@link Logger} `CURRENT_LOG_LEVEL` is >= {@link Logger#LOG_LEVEL_VERBOSE} and
|
||||
* {@link com.termux.shared.shell.TermuxTask} only logs stdin if `CURRENT_LOG_LEVEL` is >=
|
||||
* {@link Logger#LOG_LEVEL_DEBUG}.
|
||||
*/
|
||||
public Integer backgroundCustomLogLevel;
|
||||
|
||||
/** The session action of foreground commands. */
|
||||
public String sessionAction;
|
||||
|
||||
|
||||
/** The command label for the {@link ExecutionCommand}. */
|
||||
public String commandLabel;
|
||||
/** The markdown text for the command description for the {@link ExecutionCommand}. */
|
||||
public String commandDescription;
|
||||
/** The markdown text for the help of command for the {@link ExecutionCommand}. This can be used
|
||||
* to provide useful info to the user if an internal error is raised. */
|
||||
public String commandHelp;
|
||||
|
||||
|
||||
/** Defines the markdown text for the help of the Termux plugin API that was used to start the
|
||||
* {@link ExecutionCommand}. This can be used to provide useful info to the user if an internal
|
||||
* error is raised. */
|
||||
public String pluginAPIHelp;
|
||||
|
||||
|
||||
/** Defines the {@link Intent} received which started the command. */
|
||||
public Intent commandIntent;
|
||||
|
||||
/** Defines if {@link ExecutionCommand} was started because of an external plugin request
|
||||
* like with an intent or from within Termux app itself. */
|
||||
public boolean isPluginExecutionCommand;
|
||||
|
||||
/** Defines the {@link ResultConfig} for the {@link ExecutionCommand} containing information
|
||||
* on how to handle the result. */
|
||||
public final ResultConfig resultConfig = new ResultConfig();
|
||||
|
||||
/** Defines the {@link ResultData} for the {@link ExecutionCommand} containing information
|
||||
* of the result. */
|
||||
public final ResultData resultData = new ResultData();
|
||||
|
||||
|
||||
/** Defines if processing results already called for this {@link ExecutionCommand}. */
|
||||
public boolean processingResultsAlreadyCalled;
|
||||
|
||||
private static final String LOG_TAG = "ExecutionCommand";
|
||||
|
||||
|
||||
public ExecutionCommand() {
|
||||
}
|
||||
|
||||
public ExecutionCommand(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public ExecutionCommand(Integer id, String executable, String[] arguments, String stdin, String workingDirectory, boolean inBackground, boolean isFailsafe) {
|
||||
this.id = id;
|
||||
this.executable = executable;
|
||||
this.arguments = arguments;
|
||||
this.stdin = stdin;
|
||||
this.workingDirectory = workingDirectory;
|
||||
this.inBackground = inBackground;
|
||||
this.isFailsafe = isFailsafe;
|
||||
}
|
||||
|
||||
|
||||
public boolean isPluginExecutionCommandWithPendingResult() {
|
||||
return isPluginExecutionCommand && resultConfig.isCommandWithPendingResult();
|
||||
}
|
||||
|
||||
|
||||
public synchronized boolean setState(ExecutionState newState) {
|
||||
// The state transition cannot go back or change if already at {@link ExecutionState#SUCCESS}
|
||||
if (newState.getValue() < currentState.getValue() || currentState == ExecutionState.SUCCESS) {
|
||||
Logger.logError(LOG_TAG, "Invalid "+ getCommandIdAndLabelLogString() + " state transition from \"" + currentState.getName() + "\" to " + "\"" + newState.getName() + "\"");
|
||||
return false;
|
||||
}
|
||||
|
||||
// The {@link ExecutionState#FAILED} can be set again, like to add more errors, but we don't update
|
||||
// {@link #previousState} with the {@link #currentState} value if its at {@link ExecutionState#FAILED} to
|
||||
// preserve the last valid state
|
||||
if (currentState != ExecutionState.FAILED)
|
||||
previousState = currentState;
|
||||
|
||||
currentState = newState;
|
||||
return true;
|
||||
}
|
||||
|
||||
public synchronized boolean hasExecuted() {
|
||||
return currentState.getValue() >= ExecutionState.EXECUTED.getValue();
|
||||
}
|
||||
|
||||
public synchronized boolean isExecuting() {
|
||||
return currentState == ExecutionState.EXECUTING;
|
||||
}
|
||||
|
||||
public synchronized boolean isSuccessful() {
|
||||
return currentState == ExecutionState.SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, Throwable throwable) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), Collections.singletonList(throwable));
|
||||
}
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, List<Throwable> throwablesList) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), throwablesList);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message) {
|
||||
return setStateFailed(null, code, message, null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, Throwable throwable) {
|
||||
return setStateFailed(null, code, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, List<Throwable> throwablesList) {
|
||||
return setStateFailed(null, code, message, throwablesList);
|
||||
}
|
||||
public synchronized boolean setStateFailed(String type, int code, String message, List<Throwable> throwablesList) {
|
||||
if (!this.resultData.setStateFailed(type, code, message, throwablesList)) {
|
||||
Logger.logWarn(LOG_TAG, "setStateFailed for " + getCommandIdAndLabelLogString() + " resultData encountered an error.");
|
||||
}
|
||||
|
||||
return setState(ExecutionState.FAILED);
|
||||
}
|
||||
|
||||
public synchronized boolean shouldNotProcessResults() {
|
||||
if (processingResultsAlreadyCalled) {
|
||||
return true;
|
||||
} else {
|
||||
processingResultsAlreadyCalled = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean isStateFailed() {
|
||||
if (currentState != ExecutionState.FAILED)
|
||||
return false;
|
||||
|
||||
if (!resultData.isStateFailed()) {
|
||||
Logger.logWarn(LOG_TAG, "The " + getCommandIdAndLabelLogString() + " has an invalid errCode value set in errors list while having ExecutionState.FAILED state.\n" + resultData.errorsList);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
if (!hasExecuted())
|
||||
return getExecutionInputLogString(this, true, true);
|
||||
else {
|
||||
return getExecutionOutputLogString(this, true, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link ExecutionCommand} execution input parameters.
|
||||
*
|
||||
* @param executionCommand The {@link ExecutionCommand} to convert.
|
||||
* @param ignoreNull Set to {@code true} if non-critical {@code null} values are to be ignored.
|
||||
* @param logStdin Set to {@code true} if {@link #stdin} should be logged.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getExecutionInputLogString(final ExecutionCommand executionCommand, boolean ignoreNull, boolean logStdin) {
|
||||
if (executionCommand == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append(executionCommand.getCommandIdAndLabelLogString()).append(":");
|
||||
|
||||
if (executionCommand.previousState != ExecutionState.PRE_EXECUTION)
|
||||
logString.append("\n").append(executionCommand.getPreviousStateLogString());
|
||||
logString.append("\n").append(executionCommand.getCurrentStateLogString());
|
||||
|
||||
logString.append("\n").append(executionCommand.getExecutableLogString());
|
||||
logString.append("\n").append(executionCommand.getArgumentsLogString());
|
||||
logString.append("\n").append(executionCommand.getWorkingDirectoryLogString());
|
||||
logString.append("\n").append(executionCommand.getInBackgroundLogString());
|
||||
logString.append("\n").append(executionCommand.getIsFailsafeLogString());
|
||||
|
||||
if (executionCommand.inBackground) {
|
||||
if (logStdin && (!ignoreNull || !DataUtils.isNullOrEmpty(executionCommand.stdin)))
|
||||
logString.append("\n").append(executionCommand.getStdinLogString());
|
||||
|
||||
if (!ignoreNull || executionCommand.backgroundCustomLogLevel != null)
|
||||
logString.append("\n").append(executionCommand.getBackgroundCustomLogLevelLogString());
|
||||
}
|
||||
|
||||
if (!ignoreNull || executionCommand.sessionAction != null)
|
||||
logString.append("\n").append(executionCommand.getSessionActionLogString());
|
||||
|
||||
if (!ignoreNull || executionCommand.commandIntent != null)
|
||||
logString.append("\n").append(executionCommand.getCommandIntentLogString());
|
||||
|
||||
logString.append("\n").append(executionCommand.getIsPluginExecutionCommandLogString());
|
||||
if (executionCommand.isPluginExecutionCommand)
|
||||
logString.append("\n").append(ResultConfig.getResultConfigLogString(executionCommand.resultConfig, ignoreNull));
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link ExecutionCommand} execution output parameters.
|
||||
*
|
||||
* @param executionCommand The {@link ExecutionCommand} to convert.
|
||||
* @param ignoreNull Set to {@code true} if non-critical {@code null} values are to be ignored.
|
||||
* @param logResultData Set to {@code true} if {@link #resultData} should be logged.
|
||||
* @param logStdoutAndStderr Set to {@code true} if {@link ResultData#stdout} and {@link ResultData#stderr} should be logged.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getExecutionOutputLogString(final ExecutionCommand executionCommand, boolean ignoreNull, boolean logResultData, boolean logStdoutAndStderr) {
|
||||
if (executionCommand == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append(executionCommand.getCommandIdAndLabelLogString()).append(":");
|
||||
|
||||
logString.append("\n").append(executionCommand.getPreviousStateLogString());
|
||||
logString.append("\n").append(executionCommand.getCurrentStateLogString());
|
||||
|
||||
if (logResultData)
|
||||
logString.append("\n").append(ResultData.getResultDataLogString(executionCommand.resultData, logStdoutAndStderr));
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link ExecutionCommand} with more details.
|
||||
*
|
||||
* @param executionCommand The {@link ExecutionCommand} to convert.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getDetailedLogString(final ExecutionCommand executionCommand) {
|
||||
if (executionCommand == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append(getExecutionInputLogString(executionCommand, false, true));
|
||||
logString.append(getExecutionOutputLogString(executionCommand, false, true, true));
|
||||
|
||||
logString.append("\n").append(executionCommand.getCommandDescriptionLogString());
|
||||
logString.append("\n").append(executionCommand.getCommandHelpLogString());
|
||||
logString.append("\n").append(executionCommand.getPluginAPIHelpLogString());
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a markdown {@link String} for {@link ExecutionCommand}.
|
||||
*
|
||||
* @param executionCommand The {@link ExecutionCommand} to convert.
|
||||
* @return Returns the markdown {@link String}.
|
||||
*/
|
||||
public static String getExecutionCommandMarkdownString(final ExecutionCommand executionCommand) {
|
||||
if (executionCommand == null) return "null";
|
||||
|
||||
if (executionCommand.commandLabel == null) executionCommand.commandLabel = "Execution Command";
|
||||
|
||||
StringBuilder markdownString = new StringBuilder();
|
||||
|
||||
markdownString.append("## ").append(executionCommand.commandLabel).append("\n");
|
||||
|
||||
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Previous State", executionCommand.previousState.getName(), "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Current State", executionCommand.currentState.getName(), "-"));
|
||||
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Executable", executionCommand.executable, "-"));
|
||||
markdownString.append("\n").append(getArgumentsMarkdownString(executionCommand.arguments));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Working Directory", executionCommand.workingDirectory, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("inBackground", executionCommand.inBackground, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("isFailsafe", executionCommand.isFailsafe, "-"));
|
||||
|
||||
if (executionCommand.inBackground) {
|
||||
if (!DataUtils.isNullOrEmpty(executionCommand.stdin))
|
||||
markdownString.append("\n").append(MarkdownUtils.getMultiLineMarkdownStringEntry("Stdin", executionCommand.stdin, "-"));
|
||||
if (executionCommand.backgroundCustomLogLevel != null)
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Background Custom Log Level", executionCommand.backgroundCustomLogLevel, "-"));
|
||||
}
|
||||
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Session Action", executionCommand.sessionAction, "-"));
|
||||
|
||||
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("isPluginExecutionCommand", executionCommand.isPluginExecutionCommand, "-"));
|
||||
|
||||
markdownString.append("\n\n").append(ResultConfig.getResultConfigMarkdownString(executionCommand.resultConfig));
|
||||
|
||||
markdownString.append("\n\n").append(ResultData.getResultDataMarkdownString(executionCommand.resultData));
|
||||
|
||||
if (executionCommand.commandDescription != null || executionCommand.commandHelp != null) {
|
||||
if (executionCommand.commandDescription != null)
|
||||
markdownString.append("\n\n### Command Description\n\n").append(executionCommand.commandDescription).append("\n");
|
||||
if (executionCommand.commandHelp != null)
|
||||
markdownString.append("\n\n### Command Help\n\n").append(executionCommand.commandHelp).append("\n");
|
||||
markdownString.append("\n##\n");
|
||||
}
|
||||
|
||||
if (executionCommand.pluginAPIHelp != null) {
|
||||
markdownString.append("\n\n### Plugin API Help\n\n").append(executionCommand.pluginAPIHelp);
|
||||
markdownString.append("\n##\n");
|
||||
}
|
||||
|
||||
return markdownString.toString();
|
||||
}
|
||||
|
||||
|
||||
public String getIdLogString() {
|
||||
if (id != null)
|
||||
return "(" + id + ") ";
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
public String getCurrentStateLogString() {
|
||||
return "Current State: `" + currentState.getName() + "`";
|
||||
}
|
||||
|
||||
public String getPreviousStateLogString() {
|
||||
return "Previous State: `" + previousState.getName() + "`";
|
||||
}
|
||||
|
||||
public String getCommandLabelLogString() {
|
||||
if (commandLabel != null && !commandLabel.isEmpty())
|
||||
return commandLabel;
|
||||
else
|
||||
return "Execution Command";
|
||||
}
|
||||
|
||||
public String getCommandIdAndLabelLogString() {
|
||||
return getIdLogString() + getCommandLabelLogString();
|
||||
}
|
||||
|
||||
public String getExecutableLogString() {
|
||||
return "Executable: `" + executable + "`";
|
||||
}
|
||||
|
||||
public String getArgumentsLogString() {
|
||||
return getArgumentsLogString(arguments);
|
||||
}
|
||||
|
||||
public String getWorkingDirectoryLogString() {
|
||||
return "Working Directory: `" + workingDirectory + "`";
|
||||
}
|
||||
|
||||
public String getInBackgroundLogString() {
|
||||
return "inBackground: `" + inBackground + "`";
|
||||
}
|
||||
|
||||
public String getIsFailsafeLogString() {
|
||||
return "isFailsafe: `" + isFailsafe + "`";
|
||||
}
|
||||
|
||||
public String getStdinLogString() {
|
||||
if (DataUtils.isNullOrEmpty(stdin))
|
||||
return "Stdin: -";
|
||||
else
|
||||
return Logger.getMultiLineLogStringEntry("Stdin", stdin, "-");
|
||||
}
|
||||
|
||||
public String getBackgroundCustomLogLevelLogString() {
|
||||
return "Background Custom Log Level: `" + backgroundCustomLogLevel + "`";
|
||||
}
|
||||
|
||||
public String getSessionActionLogString() {
|
||||
return Logger.getSingleLineLogStringEntry("Session Action", sessionAction, "-");
|
||||
}
|
||||
|
||||
public String getCommandDescriptionLogString() {
|
||||
return Logger.getSingleLineLogStringEntry("Command Description", commandDescription, "-");
|
||||
}
|
||||
|
||||
public String getCommandHelpLogString() {
|
||||
return Logger.getSingleLineLogStringEntry("Command Help", commandHelp, "-");
|
||||
}
|
||||
|
||||
public String getPluginAPIHelpLogString() {
|
||||
return Logger.getSingleLineLogStringEntry("Plugin API Help", pluginAPIHelp, "-");
|
||||
}
|
||||
|
||||
public String getCommandIntentLogString() {
|
||||
if (commandIntent == null)
|
||||
return "Command Intent: -";
|
||||
else
|
||||
return Logger.getMultiLineLogStringEntry("Command Intent", IntentUtils.getIntentString(commandIntent), "-");
|
||||
}
|
||||
|
||||
public String getIsPluginExecutionCommandLogString() {
|
||||
return "isPluginExecutionCommand: `" + isPluginExecutionCommand + "`";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link List<String>} argumentsArray.
|
||||
* If argumentsArray are null or of size 0, then `Arguments: -` is returned. Otherwise
|
||||
* following format is returned:
|
||||
*
|
||||
* Arguments:
|
||||
* ```
|
||||
* Arg 1: `value`
|
||||
* Arg 2: 'value`
|
||||
* ```
|
||||
*
|
||||
* @param argumentsArray The {@link String[]} argumentsArray to convert.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getArgumentsLogString(final String[] argumentsArray) {
|
||||
StringBuilder argumentsString = new StringBuilder("Arguments:");
|
||||
|
||||
if (argumentsArray != null && argumentsArray.length != 0) {
|
||||
argumentsString.append("\n```\n");
|
||||
for (int i = 0; i != argumentsArray.length; i++) {
|
||||
argumentsString.append(Logger.getSingleLineLogStringEntry("Arg " + (i + 1),
|
||||
DataUtils.getTruncatedCommandOutput(argumentsArray[i], Logger.LOGGER_ENTRY_MAX_SAFE_PAYLOAD / 5, true, false, true),
|
||||
"-")).append("\n");
|
||||
}
|
||||
argumentsString.append("```");
|
||||
} else{
|
||||
argumentsString.append(" -");
|
||||
}
|
||||
|
||||
return argumentsString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a markdown {@link String} for {@link String[]} argumentsArray.
|
||||
* If argumentsArray are null or of size 0, then `**Arguments:** -` is returned. Otherwise
|
||||
* following format is returned:
|
||||
*
|
||||
* **Arguments:**
|
||||
*
|
||||
* **Arg 1:**
|
||||
* ```
|
||||
* value
|
||||
* ```
|
||||
* **Arg 2:**
|
||||
* ```
|
||||
* value
|
||||
*```
|
||||
*
|
||||
* @param argumentsArray The {@link String[]} argumentsArray to convert.
|
||||
* @return Returns the markdown {@link String}.
|
||||
*/
|
||||
public static String getArgumentsMarkdownString(final String[] argumentsArray) {
|
||||
StringBuilder argumentsString = new StringBuilder("**Arguments:**");
|
||||
|
||||
if (argumentsArray != null && argumentsArray.length != 0) {
|
||||
argumentsString.append("\n");
|
||||
for (int i = 0; i != argumentsArray.length; i++) {
|
||||
argumentsString.append(MarkdownUtils.getMultiLineMarkdownStringEntry("Arg " + (i + 1), argumentsArray[i], "-")).append("\n");
|
||||
}
|
||||
} else{
|
||||
argumentsString.append(" - ");
|
||||
}
|
||||
|
||||
return argumentsString.toString();
|
||||
}
|
||||
|
||||
}
|
@@ -1,170 +0,0 @@
|
||||
package com.termux.shared.models;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.termux.shared.logger.Logger;
|
||||
import com.termux.shared.markdown.MarkdownUtils;
|
||||
|
||||
import java.util.Formatter;
|
||||
|
||||
public class ResultConfig {
|
||||
|
||||
/** Defines {@link PendingIntent} that should be sent with the result of the command. We cannot
|
||||
* implement {@link java.io.Serializable} because {@link PendingIntent} cannot be serialized. */
|
||||
public PendingIntent resultPendingIntent;
|
||||
/** The key with which to send result {@link android.os.Bundle} in {@link #resultPendingIntent}. */
|
||||
public String resultBundleKey;
|
||||
/** The key with which to send {@link ResultData#stdout} in {@link #resultPendingIntent}. */
|
||||
public String resultStdoutKey;
|
||||
/** The key with which to send {@link ResultData#stderr} in {@link #resultPendingIntent}. */
|
||||
public String resultStderrKey;
|
||||
/** The key with which to send {@link ResultData#exitCode} in {@link #resultPendingIntent}. */
|
||||
public String resultExitCodeKey;
|
||||
/** The key with which to send {@link ResultData#errorsList} errCode in {@link #resultPendingIntent}. */
|
||||
public String resultErrCodeKey;
|
||||
/** The key with which to send {@link ResultData#errorsList} errmsg in {@link #resultPendingIntent}. */
|
||||
public String resultErrmsgKey;
|
||||
/** The key with which to send original length of {@link ResultData#stdout} in {@link #resultPendingIntent}. */
|
||||
public String resultStdoutOriginalLengthKey;
|
||||
/** The key with which to send original length of {@link ResultData#stderr} in {@link #resultPendingIntent}. */
|
||||
public String resultStderrOriginalLengthKey;
|
||||
|
||||
|
||||
/** Defines the directory path in which to write the result of the command. */
|
||||
public String resultDirectoryPath;
|
||||
/** Defines the directory path under which {@link #resultDirectoryPath} can exist. */
|
||||
public String resultDirectoryAllowedParentPath;
|
||||
/** Defines whether the result should be written to a single file or multiple files
|
||||
* (err, error, stdout, stderr, exit_code) in {@link #resultDirectoryPath}. */
|
||||
public boolean resultSingleFile;
|
||||
/** Defines the basename of the result file that should be created in {@link #resultDirectoryPath}
|
||||
* if {@link #resultSingleFile} is {@code true}. */
|
||||
public String resultFileBasename;
|
||||
/** Defines the output {@link Formatter} format of the {@link #resultFileBasename} result file. */
|
||||
public String resultFileOutputFormat;
|
||||
/** Defines the error {@link Formatter} format of the {@link #resultFileBasename} result file. */
|
||||
public String resultFileErrorFormat;
|
||||
/** Defines the suffix of the result files that should be created in {@link #resultDirectoryPath}
|
||||
* if {@link #resultSingleFile} is {@code true}. */
|
||||
public String resultFilesSuffix;
|
||||
|
||||
|
||||
public ResultConfig() {
|
||||
}
|
||||
|
||||
|
||||
public boolean isCommandWithPendingResult() {
|
||||
return resultPendingIntent != null || resultDirectoryPath != null;
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return getResultConfigLogString(this, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link ResultConfig} parameters.
|
||||
*
|
||||
* @param resultConfig The {@link ResultConfig} to convert.
|
||||
* @param ignoreNull Set to {@code true} if non-critical {@code null} values are to be ignored.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getResultConfigLogString(final ResultConfig resultConfig, boolean ignoreNull) {
|
||||
if (resultConfig == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append("Result Pending: `").append(resultConfig.isCommandWithPendingResult()).append("`\n");
|
||||
|
||||
if (resultConfig.resultPendingIntent != null) {
|
||||
logString.append(resultConfig.getResultPendingIntentVariablesLogString(ignoreNull));
|
||||
if (resultConfig.resultDirectoryPath != null)
|
||||
logString.append("\n");
|
||||
}
|
||||
|
||||
if (resultConfig.resultDirectoryPath != null && !resultConfig.resultDirectoryPath.isEmpty())
|
||||
logString.append(resultConfig.getResultDirectoryVariablesLogString(ignoreNull));
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
public String getResultPendingIntentVariablesLogString(boolean ignoreNull) {
|
||||
if (resultPendingIntent == null) return "Result PendingIntent Creator: -";
|
||||
|
||||
StringBuilder resultPendingIntentVariablesString = new StringBuilder();
|
||||
|
||||
resultPendingIntentVariablesString.append("Result PendingIntent Creator: `").append(resultPendingIntent.getCreatorPackage()).append("`");
|
||||
|
||||
if (!ignoreNull || resultBundleKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Bundle Key", resultBundleKey, "-"));
|
||||
if (!ignoreNull || resultStdoutKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stdout Key", resultStdoutKey, "-"));
|
||||
if (!ignoreNull || resultStderrKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stderr Key", resultStderrKey, "-"));
|
||||
if (!ignoreNull || resultExitCodeKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Exit Code Key", resultExitCodeKey, "-"));
|
||||
if (!ignoreNull || resultErrCodeKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Err Code Key", resultErrCodeKey, "-"));
|
||||
if (!ignoreNull || resultErrmsgKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Error Key", resultErrmsgKey, "-"));
|
||||
if (!ignoreNull || resultStdoutOriginalLengthKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stdout Original Length Key", resultStdoutOriginalLengthKey, "-"));
|
||||
if (!ignoreNull || resultStderrOriginalLengthKey != null)
|
||||
resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stderr Original Length Key", resultStderrOriginalLengthKey, "-"));
|
||||
|
||||
return resultPendingIntentVariablesString.toString();
|
||||
}
|
||||
|
||||
public String getResultDirectoryVariablesLogString(boolean ignoreNull) {
|
||||
if (resultDirectoryPath == null) return "Result Directory Path: -";
|
||||
|
||||
StringBuilder resultDirectoryVariablesString = new StringBuilder();
|
||||
|
||||
resultDirectoryVariablesString.append(Logger.getSingleLineLogStringEntry("Result Directory Path", resultDirectoryPath, "-"));
|
||||
|
||||
resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Single File", resultSingleFile, "-"));
|
||||
if (!ignoreNull || resultFileBasename != null)
|
||||
resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Basename", resultFileBasename, "-"));
|
||||
if (!ignoreNull || resultFileOutputFormat != null)
|
||||
resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Output Format", resultFileOutputFormat, "-"));
|
||||
if (!ignoreNull || resultFileErrorFormat != null)
|
||||
resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Error Format", resultFileErrorFormat, "-"));
|
||||
if (!ignoreNull || resultFilesSuffix != null)
|
||||
resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Files Suffix", resultFilesSuffix, "-"));
|
||||
|
||||
return resultDirectoryVariablesString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a markdown {@link String} for {@link ResultConfig}.
|
||||
*
|
||||
* @param resultConfig The {@link ResultConfig} to convert.
|
||||
* @return Returns the markdown {@link String}.
|
||||
*/
|
||||
public static String getResultConfigMarkdownString(final ResultConfig resultConfig) {
|
||||
if (resultConfig == null) return "null";
|
||||
|
||||
StringBuilder markdownString = new StringBuilder();
|
||||
|
||||
if (resultConfig.resultPendingIntent != null)
|
||||
markdownString.append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result PendingIntent Creator", resultConfig.resultPendingIntent.getCreatorPackage(), "-"));
|
||||
else
|
||||
markdownString.append("**Result PendingIntent Creator:** - ");
|
||||
|
||||
if (resultConfig.resultDirectoryPath != null) {
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Directory Path", resultConfig.resultDirectoryPath, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Single File", resultConfig.resultSingleFile, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Basename", resultConfig.resultFileBasename, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Output Format", resultConfig.resultFileOutputFormat, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Error Format", resultConfig.resultFileErrorFormat, "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Files Suffix", resultConfig.resultFilesSuffix, "-"));
|
||||
}
|
||||
|
||||
return markdownString.toString();
|
||||
}
|
||||
|
||||
}
|
@@ -1,258 +0,0 @@
|
||||
package com.termux.shared.models;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.termux.shared.data.DataUtils;
|
||||
import com.termux.shared.logger.Logger;
|
||||
import com.termux.shared.markdown.MarkdownUtils;
|
||||
import com.termux.shared.models.errors.Errno;
|
||||
import com.termux.shared.models.errors.Error;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ResultData implements Serializable {
|
||||
|
||||
/** The stdout of command. */
|
||||
public final StringBuilder stdout = new StringBuilder();
|
||||
/** The stderr of command. */
|
||||
public final StringBuilder stderr = new StringBuilder();
|
||||
/** The exit code of command. */
|
||||
public Integer exitCode;
|
||||
|
||||
/** The internal errors list of command. */
|
||||
public List<Error> errorsList = new ArrayList<>();
|
||||
|
||||
|
||||
public ResultData() {
|
||||
}
|
||||
|
||||
|
||||
public void clearStdout() {
|
||||
stdout.setLength(0);
|
||||
}
|
||||
|
||||
public StringBuilder prependStdout(String message) {
|
||||
return stdout.insert(0, message);
|
||||
}
|
||||
|
||||
public StringBuilder prependStdoutLn(String message) {
|
||||
return stdout.insert(0, message + "\n");
|
||||
}
|
||||
|
||||
public StringBuilder appendStdout(String message) {
|
||||
return stdout.append(message);
|
||||
}
|
||||
|
||||
public StringBuilder appendStdoutLn(String message) {
|
||||
return stdout.append(message).append("\n");
|
||||
}
|
||||
|
||||
|
||||
public void clearStderr() {
|
||||
stderr.setLength(0);
|
||||
}
|
||||
|
||||
public StringBuilder prependStderr(String message) {
|
||||
return stderr.insert(0, message);
|
||||
}
|
||||
|
||||
public StringBuilder prependStderrLn(String message) {
|
||||
return stderr.insert(0, message + "\n");
|
||||
}
|
||||
|
||||
public StringBuilder appendStderr(String message) {
|
||||
return stderr.append(message);
|
||||
}
|
||||
|
||||
public StringBuilder appendStderrLn(String message) {
|
||||
return stderr.append(message).append("\n");
|
||||
}
|
||||
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, Throwable throwable) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), Collections.singletonList(throwable));
|
||||
}
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, List<Throwable> throwablesList) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), throwablesList);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message) {
|
||||
return setStateFailed(null, code, message, null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, Throwable throwable) {
|
||||
return setStateFailed(null, code, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, List<Throwable> throwablesList) {
|
||||
return setStateFailed(null, code, message, throwablesList);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(String type, int code, String message, List<Throwable> throwablesList) {
|
||||
if (errorsList == null)
|
||||
errorsList = new ArrayList<>();
|
||||
|
||||
Error error = new Error();
|
||||
errorsList.add(error);
|
||||
|
||||
return error.setStateFailed(type, code, message, throwablesList);
|
||||
}
|
||||
|
||||
public boolean isStateFailed() {
|
||||
if (errorsList != null) {
|
||||
for (Error error : errorsList)
|
||||
if (error.isStateFailed())
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getErrCode() {
|
||||
if (errorsList != null && errorsList.size() > 0)
|
||||
return errorsList.get(errorsList.size() - 1).getCode();
|
||||
else
|
||||
return Errno.ERRNO_SUCCESS.getCode();
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return getResultDataLogString(this, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link ResultData} parameters.
|
||||
*
|
||||
* @param resultData The {@link ResultData} to convert.
|
||||
* @param logStdoutAndStderr Set to {@code true} if {@link #stdout} and {@link #stderr} should be logged.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getResultDataLogString(final ResultData resultData, boolean logStdoutAndStderr) {
|
||||
if (resultData == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
if (logStdoutAndStderr) {
|
||||
logString.append("\n").append(resultData.getStdoutLogString());
|
||||
logString.append("\n").append(resultData.getStderrLogString());
|
||||
}
|
||||
logString.append("\n").append(resultData.getExitCodeLogString());
|
||||
|
||||
logString.append("\n\n").append(getErrorsListLogString(resultData));
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getStdoutLogString() {
|
||||
if (stdout.toString().isEmpty())
|
||||
return Logger.getSingleLineLogStringEntry("Stdout", null, "-");
|
||||
else
|
||||
return Logger.getMultiLineLogStringEntry("Stdout", DataUtils.getTruncatedCommandOutput(stdout.toString(), Logger.LOGGER_ENTRY_MAX_SAFE_PAYLOAD / 5, false, false, true), "-");
|
||||
}
|
||||
|
||||
public String getStderrLogString() {
|
||||
if (stderr.toString().isEmpty())
|
||||
return Logger.getSingleLineLogStringEntry("Stderr", null, "-");
|
||||
else
|
||||
return Logger.getMultiLineLogStringEntry("Stderr", DataUtils.getTruncatedCommandOutput(stderr.toString(), Logger.LOGGER_ENTRY_MAX_SAFE_PAYLOAD / 5, false, false, true), "-");
|
||||
}
|
||||
|
||||
public String getExitCodeLogString() {
|
||||
return Logger.getSingleLineLogStringEntry("Exit Code", exitCode, "-");
|
||||
}
|
||||
|
||||
public static String getErrorsListLogString(final ResultData resultData) {
|
||||
if (resultData == null) return "null";
|
||||
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
if (resultData.errorsList != null) {
|
||||
for (Error error : resultData.errorsList) {
|
||||
if (error.isStateFailed()) {
|
||||
if (!logString.toString().isEmpty())
|
||||
logString.append("\n");
|
||||
logString.append(Error.getErrorLogString(error));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a markdown {@link String} for {@link ResultData}.
|
||||
*
|
||||
* @param resultData The {@link ResultData} to convert.
|
||||
* @return Returns the markdown {@link String}.
|
||||
*/
|
||||
public static String getResultDataMarkdownString(final ResultData resultData) {
|
||||
if (resultData == null) return "null";
|
||||
|
||||
StringBuilder markdownString = new StringBuilder();
|
||||
|
||||
if (resultData.stdout.toString().isEmpty())
|
||||
markdownString.append(MarkdownUtils.getSingleLineMarkdownStringEntry("Stdout", null, "-"));
|
||||
else
|
||||
markdownString.append(MarkdownUtils.getMultiLineMarkdownStringEntry("Stdout", resultData.stdout.toString(), "-"));
|
||||
|
||||
if (resultData.stderr.toString().isEmpty())
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Stderr", null, "-"));
|
||||
else
|
||||
markdownString.append("\n").append(MarkdownUtils.getMultiLineMarkdownStringEntry("Stderr", resultData.stderr.toString(), "-"));
|
||||
|
||||
markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Exit Code", resultData.exitCode, "-"));
|
||||
|
||||
markdownString.append("\n\n").append(getErrorsListMarkdownString(resultData));
|
||||
|
||||
|
||||
return markdownString.toString();
|
||||
}
|
||||
|
||||
public static String getErrorsListMarkdownString(final ResultData resultData) {
|
||||
if (resultData == null) return "null";
|
||||
|
||||
StringBuilder markdownString = new StringBuilder();
|
||||
|
||||
if (resultData.errorsList != null) {
|
||||
for (Error error : resultData.errorsList) {
|
||||
if (error.isStateFailed()) {
|
||||
if (!markdownString.toString().isEmpty())
|
||||
markdownString.append("\n");
|
||||
markdownString.append(Error.getErrorMarkdownString(error));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return markdownString.toString();
|
||||
}
|
||||
|
||||
public static String getErrorsListMinimalString(final ResultData resultData) {
|
||||
if (resultData == null) return "null";
|
||||
|
||||
StringBuilder minimalString = new StringBuilder();
|
||||
|
||||
if (resultData.errorsList != null) {
|
||||
for (Error error : resultData.errorsList) {
|
||||
if (error.isStateFailed()) {
|
||||
if (!minimalString.toString().isEmpty())
|
||||
minimalString.append("\n");
|
||||
minimalString.append(Error.getMinimalErrorString(error));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return minimalString.toString();
|
||||
}
|
||||
|
||||
}
|
@@ -1,110 +0,0 @@
|
||||
package com.termux.shared.models.errors;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.termux.shared.logger.Logger;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/** The {@link Class} that defines error messages and codes. */
|
||||
public class Errno {
|
||||
|
||||
private static final HashMap<String, Errno> map = new HashMap<>();
|
||||
|
||||
public static final String TYPE = "Error";
|
||||
|
||||
|
||||
public static final Errno ERRNO_SUCCESS = new Errno(TYPE, Activity.RESULT_OK, "Success");
|
||||
public static final Errno ERRNO_CANCELLED = new Errno(TYPE, Activity.RESULT_CANCELED, "Cancelled");
|
||||
public static final Errno ERRNO_MINOR_FAILURES = new Errno(TYPE, Activity.RESULT_FIRST_USER, "Minor failure");
|
||||
public static final Errno ERRNO_FAILED = new Errno(TYPE, Activity.RESULT_FIRST_USER + 1, "Failed");
|
||||
|
||||
/** The errno type. */
|
||||
protected String type;
|
||||
/** The errno code. */
|
||||
protected final int code;
|
||||
/** The errno message. */
|
||||
protected final String message;
|
||||
|
||||
private static final String LOG_TAG = "Errno";
|
||||
|
||||
|
||||
public Errno(final String type, final int code, final String message) {
|
||||
this.type = type;
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
map.put(type + ":" + code, this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return "type=" + type + ", code=" + code + ", message=\"" + message + "\"";
|
||||
}
|
||||
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the {@link Errno} of a specific type and code.
|
||||
*
|
||||
* @param type The unique type of the {@link Errno}.
|
||||
* @param code The unique code of the {@link Errno}.
|
||||
*/
|
||||
public static Errno valueOf(String type, Integer code) {
|
||||
if (type == null || type.isEmpty() || code == null) return null;
|
||||
return map.get(type + ":" + code);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Error getError() {
|
||||
return new Error(getType(), getCode(), getMessage());
|
||||
}
|
||||
|
||||
public Error getError(Object... args) {
|
||||
try {
|
||||
return new Error(getType(), getCode(), String.format(getMessage(), args));
|
||||
} catch (Exception e) {
|
||||
Logger.logWarn(LOG_TAG, "Exception raised while calling String.format() for error message of errno " + this + " with args" + Arrays.toString(args) + "\n" + e.getMessage());
|
||||
// Return unformatted message as a backup
|
||||
return new Error(getType(), getCode(), getMessage() + ": " + Arrays.toString(args));
|
||||
}
|
||||
}
|
||||
|
||||
public Error getError(Throwable throwable, Object... args) {
|
||||
if (throwable == null)
|
||||
return getError(args);
|
||||
else
|
||||
return getError(Collections.singletonList(throwable), args);
|
||||
}
|
||||
|
||||
public Error getError(List<Throwable> throwablesList, Object... args) {
|
||||
try {
|
||||
if (throwablesList == null)
|
||||
return new Error(getType(), getCode(), String.format(getMessage(), args));
|
||||
else
|
||||
return new Error(getType(), getCode(), String.format(getMessage(), args), throwablesList);
|
||||
} catch (Exception e) {
|
||||
Logger.logWarn(LOG_TAG, "Exception raised while calling String.format() for error message of errno " + this + " with args" + Arrays.toString(args) + "\n" + e.getMessage());
|
||||
// Return unformatted message as a backup
|
||||
return new Error(getType(), getCode(), getMessage() + ": " + Arrays.toString(args), throwablesList);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,297 +0,0 @@
|
||||
package com.termux.shared.models.errors;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.termux.shared.logger.Logger;
|
||||
import com.termux.shared.markdown.MarkdownUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class Error implements Serializable {
|
||||
|
||||
/** The optional error label. */
|
||||
private String label;
|
||||
/** The error type. */
|
||||
private String type;
|
||||
/** The error code. */
|
||||
private int code;
|
||||
/** The error message. */
|
||||
private String message;
|
||||
/** The error exceptions. */
|
||||
private List<Throwable> throwablesList = new ArrayList<>();
|
||||
|
||||
private static final String LOG_TAG = "Error";
|
||||
|
||||
|
||||
public Error() {
|
||||
InitError(null, null, null, null);
|
||||
}
|
||||
|
||||
public Error(String type, Integer code, String message, List<Throwable> throwablesList) {
|
||||
InitError(type, code, message, throwablesList);
|
||||
}
|
||||
|
||||
public Error(String type, Integer code, String message, Throwable throwable) {
|
||||
InitError(type, code, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public Error(String type, Integer code, String message) {
|
||||
InitError(type, code, message, null);
|
||||
}
|
||||
|
||||
public Error(Integer code, String message, List<Throwable> throwablesList) {
|
||||
InitError(null, code, message, throwablesList);
|
||||
}
|
||||
|
||||
public Error(Integer code, String message, Throwable throwable) {
|
||||
InitError(null, code, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public Error(Integer code, String message) {
|
||||
InitError(null, code, message, null);
|
||||
}
|
||||
|
||||
public Error(String message, Throwable throwable) {
|
||||
InitError(null, null, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public Error(String message, List<Throwable> throwablesList) {
|
||||
InitError(null, null, message, throwablesList);
|
||||
}
|
||||
|
||||
public Error(String message) {
|
||||
InitError(null, null, message, null);
|
||||
}
|
||||
|
||||
private void InitError(String type, Integer code, String message, List<Throwable> throwablesList) {
|
||||
if (type != null && !type.isEmpty())
|
||||
this.type = type;
|
||||
else
|
||||
this.type = Errno.TYPE;
|
||||
|
||||
if (code != null && code > Errno.ERRNO_SUCCESS.getCode())
|
||||
this.code = code;
|
||||
else
|
||||
this.code = Errno.ERRNO_SUCCESS.getCode();
|
||||
|
||||
this.message = message;
|
||||
|
||||
if (throwablesList != null)
|
||||
this.throwablesList = throwablesList;
|
||||
}
|
||||
|
||||
public Error setLabel(String label) {
|
||||
this.label = label;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void prependMessage(String message) {
|
||||
if (message != null && isStateFailed())
|
||||
this.message = message + this.message;
|
||||
}
|
||||
|
||||
public void appendMessage(String message) {
|
||||
if (message != null && isStateFailed())
|
||||
this.message = this.message + message;
|
||||
}
|
||||
|
||||
public List<Throwable> getThrowablesList() {
|
||||
return Collections.unmodifiableList(throwablesList);
|
||||
}
|
||||
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, Throwable throwable) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), Collections.singletonList(throwable));
|
||||
}
|
||||
public synchronized boolean setStateFailed(@NonNull Error error, List<Throwable> throwablesList) {
|
||||
return setStateFailed(error.getType(), error.getCode(), error.getMessage(), throwablesList);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message) {
|
||||
return setStateFailed(this.type, code, message, null);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, Throwable throwable) {
|
||||
return setStateFailed(this.type, code, message, Collections.singletonList(throwable));
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(int code, String message, List<Throwable> throwablesList) {
|
||||
return setStateFailed(this.type, code, message, throwablesList);
|
||||
}
|
||||
|
||||
public synchronized boolean setStateFailed(String type, int code, String message, List<Throwable> throwablesList) {
|
||||
this.message = message;
|
||||
this.throwablesList = throwablesList;
|
||||
|
||||
if (type != null && !type.isEmpty())
|
||||
this.type = type;
|
||||
|
||||
if (code > Errno.ERRNO_SUCCESS.getCode()) {
|
||||
this.code = code;
|
||||
return true;
|
||||
} else {
|
||||
Logger.logWarn(LOG_TAG, "Ignoring invalid error code value \"" + code + "\". Force setting it to RESULT_CODE_FAILED \"" + Errno.ERRNO_FAILED.getCode() + "\"");
|
||||
this.code = Errno.ERRNO_FAILED.getCode();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isStateFailed() {
|
||||
return code > Errno.ERRNO_SUCCESS.getCode();
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return getErrorLogString(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Log the {@link Error} and show a toast for the minimal {@link String} for the {@link Error}.
|
||||
*
|
||||
* @param context The {@link Context} for operations.
|
||||
* @param logTag The log tag to use for logging.
|
||||
* @param error The {@link Error} to convert.
|
||||
*/
|
||||
public static void logErrorAndShowToast(Context context, String logTag, Error error) {
|
||||
if (error == null) return;
|
||||
error.logErrorAndShowToast(context, logTag);
|
||||
}
|
||||
|
||||
public void logErrorAndShowToast(Context context, String logTag) {
|
||||
Logger.logErrorExtended(logTag, getErrorLogString());
|
||||
Logger.showToast(context, getMinimalErrorLogString(), true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a log friendly {@link String} for {@link Error} error parameters.
|
||||
*
|
||||
* @param error The {@link Error} to convert.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getErrorLogString(final Error error) {
|
||||
if (error == null) return "null";
|
||||
return error.getErrorLogString();
|
||||
}
|
||||
|
||||
public String getErrorLogString() {
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append(getCodeString());
|
||||
logString.append("\n").append(getTypeAndMessageLogString());
|
||||
if (this.throwablesList != null)
|
||||
logString.append("\n").append(geStackTracesLogString());
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a minimal log friendly {@link String} for {@link Error} error parameters.
|
||||
*
|
||||
* @param error The {@link Error} to convert.
|
||||
* @return Returns the log friendly {@link String}.
|
||||
*/
|
||||
public static String getMinimalErrorLogString(final Error error) {
|
||||
if (error == null) return "null";
|
||||
return error.getMinimalErrorLogString();
|
||||
}
|
||||
|
||||
public String getMinimalErrorLogString() {
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append(getCodeString());
|
||||
logString.append(getTypeAndMessageLogString());
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a minimal {@link String} for {@link Error} error parameters.
|
||||
*
|
||||
* @param error The {@link Error} to convert.
|
||||
* @return Returns the {@link String}.
|
||||
*/
|
||||
public static String getMinimalErrorString(final Error error) {
|
||||
if (error == null) return "null";
|
||||
return error.getMinimalErrorString();
|
||||
}
|
||||
|
||||
public String getMinimalErrorString() {
|
||||
StringBuilder logString = new StringBuilder();
|
||||
|
||||
logString.append("(").append(getCode()).append(") ");
|
||||
logString.append(getType()).append(": ").append(getMessage());
|
||||
|
||||
return logString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a markdown {@link String} for {@link Error}.
|
||||
*
|
||||
* @param error The {@link Error} to convert.
|
||||
* @return Returns the markdown {@link String}.
|
||||
*/
|
||||
public static String getErrorMarkdownString(final Error error) {
|
||||
if (error == null) return "null";
|
||||
return error.getErrorMarkdownString();
|
||||
}
|
||||
|
||||
public String getErrorMarkdownString() {
|
||||
StringBuilder markdownString = new StringBuilder();
|
||||
|
||||
markdownString.append(MarkdownUtils.getSingleLineMarkdownStringEntry("Error Code", getCode(), "-"));
|
||||
markdownString.append("\n").append(MarkdownUtils.getMultiLineMarkdownStringEntry(
|
||||
(Errno.TYPE.equals(getType()) ? "Error Message" : "Error Message (" + getType() + ")"), message, "-"));
|
||||
markdownString.append("\n\n").append(geStackTracesMarkdownString());
|
||||
|
||||
return markdownString.toString();
|
||||
}
|
||||
|
||||
|
||||
public String getCodeString() {
|
||||
return Logger.getSingleLineLogStringEntry("Error Code", code, "-");
|
||||
}
|
||||
|
||||
public String getTypeAndMessageLogString() {
|
||||
return Logger.getMultiLineLogStringEntry(Errno.TYPE.equals(type) ? "Error Message" : "Error Message (" + type + ")", message, "-");
|
||||
}
|
||||
|
||||
public String geStackTracesLogString() {
|
||||
return Logger.getStackTracesString("StackTraces:", Logger.getStackTracesStringArray(throwablesList));
|
||||
}
|
||||
|
||||
public String geStackTracesMarkdownString() {
|
||||
return Logger.getStackTracesMarkdownString("StackTraces", Logger.getStackTracesStringArray(throwablesList));
|
||||
}
|
||||
|
||||
}
|
@@ -1,106 +0,0 @@
|
||||
package com.termux.shared.models.errors;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/** The {@link Class} that defines FileUtils error messages and codes. */
|
||||
public class FileUtilsErrno extends Errno {
|
||||
|
||||
public static final String TYPE = "FileUtils Error";
|
||||
|
||||
|
||||
/* Errors for null or empty paths (100-150) */
|
||||
public static final Errno ERRNO_EXECUTABLE_REQUIRED = new Errno(TYPE, 100, "Executable required.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_REGULAR_FILE_PATH = new Errno(TYPE, 101, "The regular file path is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_REGULAR_FILE = new Errno(TYPE, 102, "The regular file is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_EXECUTABLE_FILE_PATH = new Errno(TYPE, 103, "The executable file path is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_EXECUTABLE_FILE = new Errno(TYPE, 104, "The executable file is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_DIRECTORY_FILE_PATH = new Errno(TYPE, 105, "The directory file path is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_DIRECTORY_FILE = new Errno(TYPE, 106, "The directory file is null or empty.");
|
||||
|
||||
|
||||
|
||||
/* Errors for invalid or not found files at path (150-200) */
|
||||
public static final Errno ERRNO_FILE_NOT_FOUND_AT_PATH = new Errno(TYPE, 150, "The %1$s not found at path \"%2$s\".");
|
||||
public static final Errno ERRNO_FILE_NOT_FOUND_AT_PATH_SHORT = new Errno(TYPE, 151, "The %1$s not found at path.");
|
||||
|
||||
public static final Errno ERRNO_NON_REGULAR_FILE_FOUND = new Errno(TYPE, 152, "Non-regular file found at %1$s path \"%2$s\".");
|
||||
public static final Errno ERRNO_NON_REGULAR_FILE_FOUND_SHORT = new Errno(TYPE, 153, "Non-regular file found at %1$s path.");
|
||||
public static final Errno ERRNO_NON_DIRECTORY_FILE_FOUND = new Errno(TYPE, 154, "Non-directory file found at %1$s path \"%2$s\".");
|
||||
public static final Errno ERRNO_NON_DIRECTORY_FILE_FOUND_SHORT = new Errno(TYPE, 155, "Non-directory file found at %1$s path.");
|
||||
public static final Errno ERRNO_NON_SYMLINK_FILE_FOUND = new Errno(TYPE, 156, "Non-symlink file found at %1$s path \"%2$s\".");
|
||||
public static final Errno ERRNO_NON_SYMLINK_FILE_FOUND_SHORT = new Errno(TYPE, 157, "Non-symlink file found at %1$s path.");
|
||||
|
||||
public static final Errno ERRNO_FILE_NOT_AN_ALLOWED_FILE_TYPE = new Errno(TYPE, 158, "The %1$s found at path \"%2$s\" is not one of allowed file types \"%3$s\".");
|
||||
|
||||
public static final Errno ERRNO_VALIDATE_FILE_EXISTENCE_AND_PERMISSIONS_FAILED_WITH_EXCEPTION = new Errno(TYPE, 159, "Validating file existence and permissions of %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_VALIDATE_DIRECTORY_EXISTENCE_AND_PERMISSIONS_FAILED_WITH_EXCEPTION = new Errno(TYPE, 160, "Validating directory existence and permissions of %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
|
||||
|
||||
|
||||
/* Errors for file creation (200-250) */
|
||||
public static final Errno ERRNO_CREATING_FILE_FAILED = new Errno(TYPE, 200, "Creating %1$s at path \"%2$s\" failed.");
|
||||
public static final Errno ERRNO_CREATING_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 201, "Creating %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
|
||||
public static final Errno ERRNO_CANNOT_OVERWRITE_A_NON_SYMLINK_FILE_TYPE = new Errno(TYPE, 202, "Cannot overwrite %1$s while creating symlink at \"%2$s\" to \"%3$s\" since destination file type \"%4$s\" is not a symlink.");
|
||||
public static final Errno ERRNO_CREATING_SYMLINK_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 203, "Creating %1$s at path \"%2$s\" to \"%3$s\" failed.\nException: %4$s");
|
||||
|
||||
|
||||
|
||||
/* Errors for file copying and moving (250-300) */
|
||||
public static final Errno ERRNO_COPYING_OR_MOVING_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 250, "%1$s from \"%2$s\" to \"%3$s\" failed.\nException: %4$s");
|
||||
public static final Errno ERRNO_COPYING_OR_MOVING_FILE_TO_SAME_PATH = new Errno(TYPE, 251, "%1$s from \"%2$s\" to \"%3$s\" cannot be done since they point to the same path.");
|
||||
public static final Errno ERRNO_CANNOT_OVERWRITE_A_DIFFERENT_FILE_TYPE = new Errno(TYPE, 252, "Cannot overwrite %1$s while %2$s it from \"%3$s\" to \"%4$s\" since destination file type \"%5$s\" is different from source file type \"%6$s\".");
|
||||
public static final Errno ERRNO_CANNOT_MOVE_DIRECTORY_TO_SUB_DIRECTORY_OF_ITSELF = new Errno(TYPE, 253, "Cannot move %1$s from \"%2$s\" to \"%3$s\" since destination is a subdirectory of the source.");
|
||||
|
||||
|
||||
|
||||
/* Errors for file deletion (300-350) */
|
||||
public static final Errno ERRNO_DELETING_FILE_FAILED = new Errno(TYPE, 300, "Deleting %1$s at path \"%2$s\" failed.");
|
||||
public static final Errno ERRNO_DELETING_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 301, "Deleting %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_CLEARING_DIRECTORY_FAILED_WITH_EXCEPTION = new Errno(TYPE, 302, "Clearing %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_FILE_STILL_EXISTS_AFTER_DELETING = new Errno(TYPE, 303, "The %1$s still exists after deleting it from \"%2$s\".");
|
||||
public static final Errno ERRNO_DELETING_FILES_OLDER_THAN_X_DAYS_FAILED_WITH_EXCEPTION = new Errno(TYPE, 304, "Deleting %1$s under directory at path \"%2$s\" old than %3$s days failed.\nException: %4$s");
|
||||
|
||||
|
||||
|
||||
/* Errors for file reading and writing (350-400) */
|
||||
public static final Errno ERRNO_READING_TEXT_FROM_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 350, "Reading text from %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_WRITING_TEXT_TO_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 351, "Writing text to %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_UNSUPPORTED_CHARSET = new Errno(TYPE, 352, "Unsupported charset \"%1$s\"");
|
||||
public static final Errno ERRNO_CHECKING_IF_CHARSET_SUPPORTED_FAILED = new Errno(TYPE, 353, "Checking if charset \"%1$s\" is supported failed.\nException: %2$s");
|
||||
public static final Errno ERRNO_READING_SERIALIZABLE_OBJECT_TO_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 354, "Reading serializable object from %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
public static final Errno ERRNO_WRITING_SERIALIZABLE_OBJECT_TO_FILE_FAILED_WITH_EXCEPTION = new Errno(TYPE, 355, "Writing serializable object to %1$s at path \"%2$s\" failed.\nException: %3$s");
|
||||
|
||||
|
||||
|
||||
/* Errors for invalid file permissions (400-450) */
|
||||
public static final Errno ERRNO_INVALID_FILE_PERMISSIONS_STRING_TO_CHECK = new Errno(TYPE, 400, "The file permission string to check is invalid.");
|
||||
public static final Errno ERRNO_FILE_NOT_READABLE = new Errno(TYPE, 401, "The %1$s at path \"%2$s\" is not readable. Permission Denied.");
|
||||
public static final Errno ERRNO_FILE_NOT_READABLE_SHORT = new Errno(TYPE, 402, "The %1$s at path is not readable. Permission Denied.");
|
||||
public static final Errno ERRNO_FILE_NOT_WRITABLE = new Errno(TYPE, 403, "The %1$s at path \"%2$s\" is not writable. Permission Denied.");
|
||||
public static final Errno ERRNO_FILE_NOT_WRITABLE_SHORT = new Errno(TYPE, 404, "The %1$s at path is not writable. Permission Denied.");
|
||||
public static final Errno ERRNO_FILE_NOT_EXECUTABLE = new Errno(TYPE, 405, "The %1$s at path \"%2$s\" is not executable. Permission Denied.");
|
||||
public static final Errno ERRNO_FILE_NOT_EXECUTABLE_SHORT = new Errno(TYPE, 406, "The %1$s at path is not executable. Permission Denied.");
|
||||
|
||||
|
||||
FileUtilsErrno(final String type, final int code, final String message) {
|
||||
super(type, code, message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Defines the {@link Errno} mapping to get a shorter version of {@link FileUtilsErrno}. */
|
||||
public static Map<Errno, Errno> ERRNO_SHORT_MAPPING = new HashMap<Errno, Errno>() {{
|
||||
put(ERRNO_FILE_NOT_FOUND_AT_PATH, ERRNO_FILE_NOT_FOUND_AT_PATH_SHORT);
|
||||
|
||||
put(ERRNO_NON_REGULAR_FILE_FOUND, ERRNO_NON_REGULAR_FILE_FOUND_SHORT);
|
||||
put(ERRNO_NON_DIRECTORY_FILE_FOUND, ERRNO_NON_DIRECTORY_FILE_FOUND_SHORT);
|
||||
put(ERRNO_NON_SYMLINK_FILE_FOUND, ERRNO_NON_SYMLINK_FILE_FOUND_SHORT);
|
||||
|
||||
put(ERRNO_FILE_NOT_READABLE, ERRNO_FILE_NOT_READABLE_SHORT);
|
||||
put(ERRNO_FILE_NOT_WRITABLE, ERRNO_FILE_NOT_WRITABLE_SHORT);
|
||||
put(ERRNO_FILE_NOT_EXECUTABLE, ERRNO_FILE_NOT_EXECUTABLE_SHORT);
|
||||
}};
|
||||
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
package com.termux.shared.models.errors;
|
||||
|
||||
/** The {@link Class} that defines function error messages and codes. */
|
||||
public class FunctionErrno extends Errno {
|
||||
|
||||
public static final String TYPE = "Function Error";
|
||||
|
||||
|
||||
/* Errors for null or empty parameters (100-150) */
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_PARAMETER = new Errno(TYPE, 100, "The %1$s parameter passed to \"%2$s\" is null or empty.");
|
||||
public static final Errno ERRNO_NULL_OR_EMPTY_PARAMETERS = new Errno(TYPE, 101, "The %1$s parameters passed to \"%2$s\" are null or empty.");
|
||||
public static final Errno ERRNO_UNSET_PARAMETER = new Errno(TYPE, 102, "The %1$s parameter passed to \"%2$s\" must be set.");
|
||||
public static final Errno ERRNO_UNSET_PARAMETERS = new Errno(TYPE, 103, "The %1$s parameters passed to \"%2$s\" must be set.");
|
||||
public static final Errno ERRNO_INVALID_PARAMETER = new Errno(TYPE, 104, "The %1$s parameter passed to \"%2$s\" is invalid.\"%3$s\"");
|
||||
public static final Errno ERRNO_PARAMETER_NOT_INSTANCE_OF = new Errno(TYPE, 104, "The %1$s parameter passed to \"%2$s\" is not an instance of %3$s.");
|
||||
|
||||
|
||||
FunctionErrno(final String type, final int code, final String message) {
|
||||
super(type, code, message);
|
||||
}
|
||||
|
||||
}
|
@@ -1,20 +0,0 @@
|
||||
package com.termux.shared.models.errors;
|
||||
|
||||
/** The {@link Class} that defines ResultSender error messages and codes. */
|
||||
public class ResultSenderErrno extends Errno {
|
||||
|
||||
public static final String TYPE = "ResultSender Error";
|
||||
|
||||
|
||||
/* Errors for null or empty parameters (100-150) */
|
||||
public static final Errno ERROR_RESULT_FILE_BASENAME_NULL_OR_INVALID = new Errno(TYPE, 100, "The result file basename \"%1$s\" is null, empty or contains forward slashes \"/\".");
|
||||
public static final Errno ERROR_RESULT_FILES_SUFFIX_INVALID = new Errno(TYPE, 101, "The result files suffix \"%1$s\" contains forward slashes \"/\".");
|
||||
public static final Errno ERROR_FORMAT_RESULT_ERROR_FAILED_WITH_EXCEPTION = new Errno(TYPE, 102, "Formatting result error failed.\nException: %1$s");
|
||||
public static final Errno ERROR_FORMAT_RESULT_OUTPUT_FAILED_WITH_EXCEPTION = new Errno(TYPE, 103, "Formatting result output failed.\nException: %1$s");
|
||||
|
||||
|
||||
ResultSenderErrno(final String type, final int code, final String message) {
|
||||
super(type, code, message);
|
||||
}
|
||||
|
||||
}
|
@@ -1,28 +0,0 @@
|
||||
package com.termux.shared.models.net;
|
||||
|
||||
import android.net.Uri;
|
||||
|
||||
/**
|
||||
* The {@link Uri} schemes.
|
||||
*
|
||||
* https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
|
||||
* https://en.wikipedia.org/wiki/List_of_URI_schemes
|
||||
*/
|
||||
public class UriScheme {
|
||||
|
||||
/** Android app resource. */
|
||||
public static final String SCHEME_ANDROID_RESOURCE = "android.resource";
|
||||
|
||||
/** Android content provider. https://www.iana.org/assignments/uri-schemes/prov/content. */
|
||||
public static final String SCHEME_CONTENT = "content";
|
||||
|
||||
/** Filesystem or android app asset. https://www.rfc-editor.org/rfc/rfc8089.html. */
|
||||
public static final String SCHEME_FILE = "file";
|
||||
|
||||
/* Hypertext Transfer Protocol. */
|
||||
public static final String SCHEME_HTTP = "http";
|
||||
|
||||
/* Hypertext Transfer Protocol Secure. */
|
||||
public static final String SCHEME_HTTPS = "https";
|
||||
|
||||
}
|
@@ -1,48 +0,0 @@
|
||||
package com.termux.shared.models.theme;
|
||||
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
|
||||
/** The modes used by to decide night mode for themes. */
|
||||
public enum NightMode {
|
||||
|
||||
/** Night theme should be enabled. */
|
||||
TRUE("true", AppCompatDelegate.MODE_NIGHT_YES),
|
||||
|
||||
/** Dark theme should be enabled. */
|
||||
FALSE("false", AppCompatDelegate.MODE_NIGHT_NO),
|
||||
|
||||
/**
|
||||
* Use night or dark theme depending on system night mode.
|
||||
* https://developer.android.com/guide/topics/resources/providing-resources#NightQualifier
|
||||
*/
|
||||
SYSTEM("system", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
|
||||
|
||||
private final String name;
|
||||
private final int mode;
|
||||
|
||||
NightMode(final String name, int mode) {
|
||||
this.name = name;
|
||||
this.mode = mode;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getMode() {
|
||||
return mode;
|
||||
}
|
||||
|
||||
public static Integer modeOf(String name) {
|
||||
if (TRUE.name.equals(name))
|
||||
return TRUE.mode;
|
||||
else if (FALSE.name.equals(name))
|
||||
return FALSE.mode;
|
||||
else if (SYSTEM.name.equals(name)) {
|
||||
return SYSTEM.mode;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user