diff --git a/app/src/main/java/com/termux/app/activities/ReportActivity.java b/app/src/main/java/com/termux/app/activities/ReportActivity.java index 2491005a..5f6b0b39 100644 --- a/app/src/main/java/com/termux/app/activities/ReportActivity.java +++ b/app/src/main/java/com/termux/app/activities/ReportActivity.java @@ -92,8 +92,8 @@ public class ReportActivity extends AppCompatActivity { final Markwon markwon = MarkdownUtils.getRecyclerMarkwonBuilder(this); - final MarkwonAdapter adapter = MarkwonAdapter.builderTextViewIsRoot(R.layout.activity_report_adapter_node_default) - .include(FencedCodeBlock.class, SimpleEntry.create(R.layout.activity_report_adapter_node_code_block, R.id.code_text_view)) + final MarkwonAdapter adapter = MarkwonAdapter.builderTextViewIsRoot(R.layout.markdown_adapter_node_default) + .include(FencedCodeBlock.class, SimpleEntry.create(R.layout.markdown_adapter_node_code_block, R.id.code_text_view)) .build(); recyclerView.setLayoutManager(new LinearLayoutManager(this)); diff --git a/app/src/main/java/com/termux/app/activities/SettingsActivity.java b/app/src/main/java/com/termux/app/activities/SettingsActivity.java index b30b1a57..afb7373e 100644 --- a/app/src/main/java/com/termux/app/activities/SettingsActivity.java +++ b/app/src/main/java/com/termux/app/activities/SettingsActivity.java @@ -1,12 +1,18 @@ package com.termux.app.activities; +import android.content.Context; import android.os.Bundle; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import com.termux.R; +import com.termux.app.models.ReportInfo; +import com.termux.app.models.UserAction; +import com.termux.shared.termux.TermuxConstants; +import com.termux.shared.termux.TermuxUtils; public class SettingsActivity extends AppCompatActivity { @@ -37,6 +43,32 @@ public class SettingsActivity extends AppCompatActivity { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.root_preferences, rootKey); + + setAboutOnPreferenceClickListener(); + } + + private void setAboutOnPreferenceClickListener() { + Context context = getContext(); + Preference about = findPreference("about"); + if (context != null && about != null) { + about.setOnPreferenceClickListener(preference -> { + String title = "About"; + + StringBuilder aboutString = new StringBuilder(); + aboutString.append(TermuxUtils.getAppInfoMarkdownString(context, false)); + + String termuxPluginAppsInfo = TermuxUtils.getTermuxPluginAppsInfoMarkdownString(context); + if (termuxPluginAppsInfo != null) + aboutString.append("\n\n").append(termuxPluginAppsInfo); + + aboutString.append("\n\n").append(TermuxUtils.getDeviceInfoMarkdownString(context)); + aboutString.append("\n\n").append(TermuxUtils.getImportantLinksMarkdownString(context)); + + ReportActivity.startReportActivity(context, new ReportInfo(UserAction.ABOUT, TermuxConstants.TERMUX_APP.TERMUX_SETTINGS_ACTIVITY_NAME, title, null, aboutString.toString(), null, false)); + + return true; + }); + } } } diff --git a/app/src/main/java/com/termux/app/fragments/settings/TermuxPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/TermuxPreferencesFragment.java new file mode 100644 index 00000000..67543f63 --- /dev/null +++ b/app/src/main/java/com/termux/app/fragments/settings/TermuxPreferencesFragment.java @@ -0,0 +1,46 @@ +package com.termux.app.fragments.settings; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.Keep; +import androidx.preference.PreferenceDataStore; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; + +import com.termux.R; +import com.termux.shared.settings.preferences.TermuxAppSharedPreferences; + +@Keep +public class TermuxPreferencesFragment extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + PreferenceManager preferenceManager = getPreferenceManager(); + preferenceManager.setPreferenceDataStore(TermuxPreferencesDataStore.getInstance(getContext())); + + setPreferencesFromResource(R.xml.termux_preferences, rootKey); + } + +} + +class TermuxPreferencesDataStore extends PreferenceDataStore { + + private final Context mContext; + private final TermuxAppSharedPreferences mPreferences; + + private static TermuxPreferencesDataStore mInstance; + + private TermuxPreferencesDataStore(Context context) { + mContext = context; + mPreferences = new TermuxAppSharedPreferences(context); + } + + public static synchronized TermuxPreferencesDataStore getInstance(Context context) { + if (mInstance == null) { + mInstance = new TermuxPreferencesDataStore(context.getApplicationContext()); + } + return mInstance; + } + +} diff --git a/app/src/main/java/com/termux/app/fragments/settings/DebuggingPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/termux/DebuggingPreferencesFragment.java similarity index 92% rename from app/src/main/java/com/termux/app/fragments/settings/DebuggingPreferencesFragment.java rename to app/src/main/java/com/termux/app/fragments/settings/termux/DebuggingPreferencesFragment.java index 814426b6..279cdc65 100644 --- a/app/src/main/java/com/termux/app/fragments/settings/DebuggingPreferencesFragment.java +++ b/app/src/main/java/com/termux/app/fragments/settings/termux/DebuggingPreferencesFragment.java @@ -1,4 +1,4 @@ -package com.termux.app.fragments.settings; +package com.termux.app.fragments.settings.termux; import android.content.Context; import android.os.Bundle; @@ -23,7 +23,7 @@ public class DebuggingPreferencesFragment extends PreferenceFragmentCompat { PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(DebuggingPreferencesDataStore.getInstance(getContext())); - setPreferencesFromResource(R.xml.debugging_preferences, rootKey); + setPreferencesFromResource(R.xml.termux_debugging_preferences, rootKey); PreferenceCategory loggingCategory = findPreference("logging"); @@ -125,11 +125,11 @@ class DebuggingPreferencesDataStore extends PreferenceDataStore { public boolean getBoolean(String key, boolean defValue) { switch (key) { case "terminal_view_key_logging_enabled": - return mPreferences.getTerminalViewKeyLoggingEnabled(); + return mPreferences.isTerminalViewKeyLoggingEnabled(); case "plugin_error_notifications_enabled": - return mPreferences.getPluginErrorNotificationsEnabled(); + return mPreferences.arePluginErrorNotificationsEnabled(); case "crash_report_notifications_enabled": - return mPreferences.getCrashReportNotificationsEnabled(); + return mPreferences.areCrashReportNotificationsEnabled(); default: return false; } diff --git a/app/src/main/java/com/termux/app/fragments/settings/TerminalIOPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java similarity index 88% rename from app/src/main/java/com/termux/app/fragments/settings/TerminalIOPreferencesFragment.java rename to app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java index d9500f84..2e750c85 100644 --- a/app/src/main/java/com/termux/app/fragments/settings/TerminalIOPreferencesFragment.java +++ b/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java @@ -1,4 +1,4 @@ -package com.termux.app.fragments.settings; +package com.termux.app.fragments.settings.termux; import android.content.Context; import android.os.Bundle; @@ -19,7 +19,7 @@ public class TerminalIOPreferencesFragment extends PreferenceFragmentCompat { PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(TerminalIOPreferencesDataStore.getInstance(getContext())); - setPreferencesFromResource(R.xml.terminal_io_preferences, rootKey); + setPreferencesFromResource(R.xml.termux_terminal_io_preferences, rootKey); } } @@ -65,9 +65,9 @@ class TerminalIOPreferencesDataStore extends PreferenceDataStore { public boolean getBoolean(String key, boolean defValue) { switch (key) { case "soft_keyboard_enabled": - return mPreferences.getSoftKeyboardEnabled(); + return mPreferences.isSoftKeyboardEnabled(); case "soft_keyboard_enabled_only_if_no_hardware": - return mPreferences.getSoftKeyboardEnabledOnlyIfNoHardware(); + return mPreferences.isSoftKeyboardEnabledOnlyIfNoHardware(); default: return false; } 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 ad56fbef..ee47605a 100644 --- a/app/src/main/java/com/termux/app/models/UserAction.java +++ b/app/src/main/java/com/termux/app/models/UserAction.java @@ -2,8 +2,9 @@ package com.termux.app.models; public enum UserAction { - PLUGIN_EXECUTION_COMMAND("plugin execution command"), + ABOUT("about"), CRASH_REPORT("crash report"), + 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/layout/activity_report_adapter_node_code_block.xml b/app/src/main/res/layout/markdown_adapter_node_code_block.xml similarity index 100% rename from app/src/main/res/layout/activity_report_adapter_node_code_block.xml rename to app/src/main/res/layout/markdown_adapter_node_code_block.xml diff --git a/app/src/main/res/layout/activity_report_adapter_node_default.xml b/app/src/main/res/layout/markdown_adapter_node_default.xml similarity index 100% rename from app/src/main/res/layout/activity_report_adapter_node_default.xml rename to app/src/main/res/layout/markdown_adapter_node_default.xml diff --git a/app/src/main/res/layout/preference_markdown_text.xml b/app/src/main/res/layout/preference_markdown_text.xml new file mode 100644 index 00000000..f77049e3 --- /dev/null +++ b/app/src/main/res/layout/preference_markdown_text.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b1252188..0c00943e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,42 +122,55 @@ &TERMUX_APP_NAME; Settings - - Debugging + + &TERMUX_APP_NAME; + Preferences for &TERMUX_APP_NAME; app - - Logging + + Debugging + Preferences for debugging - - Terminal View Key Logging - Logs will not have entries for terminal view keys. (Default) - Logcat logs will have entries for terminal view keys. These are very verbose and should be disabled under normal circumstances or will cause performance issues. + + Logging - - Plugin Error Notifications - Disable flashes and notifications for plugin errors. - Show flashes and notifications for plugin errors. (Default) + + Log Level - - Crash Report Notifications - Disable notifications for crash reports. - Show notifications for crash reports. (Default) + + Terminal View Key Logging + Logs will not have entries for terminal view keys. (Default) + Logcat logs will have entries for terminal view keys. These are very verbose and should be disabled under normal circumstances or will cause performance issues. + + + Plugin Error Notifications + Disable flashes and notifications for plugin errors. + Show flashes and notifications for plugin errors. (Default) + + + Crash Report Notifications + Disable notifications for crash reports. + Show notifications for crash reports. (Default) - - Terminal I/O + + Terminal I/O + Preferences for terminal I/O - - Keyboard + + Keyboard - - Soft Keyboard Enabled - Soft keyboard will be disabled. - Soft keyboard will be enabled. (Default) + + Soft Keyboard Enabled + Soft keyboard will be disabled. + Soft keyboard will be enabled. (Default) - - Soft Keyboard If No Hardware - Soft keyboard will be enabled even if hardware keyboard is connected. (Default) - Soft keyboard will be enabled only if no hardware keyboard is connected. + + Soft Keyboard Only If No Hardware + Soft keyboard will be enabled even if hardware keyboard is connected. (Default) + Soft keyboard will be enabled only if no hardware keyboard is connected. + + + + About diff --git a/app/src/main/res/xml/debugging_preferences.xml b/app/src/main/res/xml/debugging_preferences.xml deleted file mode 100644 index 48e44f98..00000000 --- a/app/src/main/res/xml/debugging_preferences.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 75dd8826..297b4903 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -1,13 +1,15 @@ + app:key="termux" + app:title="@string/termux_preferences_title" + app:summary="@string/termux_preferences_summary" + app:fragment="com.termux.app.fragments.settings.TermuxPreferencesFragment"/> + app:key="about" + app:title="@string/about_preferences_title" + app:persistent="false"/> + diff --git a/app/src/main/res/xml/terminal_io_preferences.xml b/app/src/main/res/xml/terminal_io_preferences.xml deleted file mode 100644 index 6aecbf48..00000000 --- a/app/src/main/res/xml/terminal_io_preferences.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/xml/termux_debugging_preferences.xml b/app/src/main/res/xml/termux_debugging_preferences.xml new file mode 100644 index 00000000..b59d931d --- /dev/null +++ b/app/src/main/res/xml/termux_debugging_preferences.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/termux_preferences.xml b/app/src/main/res/xml/termux_preferences.xml new file mode 100644 index 00000000..f28c775d --- /dev/null +++ b/app/src/main/res/xml/termux_preferences.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/app/src/main/res/xml/termux_terminal_io_preferences.xml b/app/src/main/res/xml/termux_terminal_io_preferences.xml new file mode 100644 index 00000000..ea9a0eb5 --- /dev/null +++ b/app/src/main/res/xml/termux_terminal_io_preferences.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/termux-shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java b/termux-shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java index 86ddd03f..470624de 100644 --- a/termux-shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java @@ -179,7 +179,7 @@ public class MarkdownUtils { .setFactory(Code.class, (configuration, props) -> new Object[]{ new BackgroundColorSpan(ContextCompat.getColor(context, R.color.background_markdown_code_inline)), new TypefaceSpan("monospace"), - new AbsoluteSizeSpan(8) + new AbsoluteSizeSpan(48) }) // NB! both ordered and bullet list items .setFactory(ListItem.class, (configuration, props) -> new BulletSpan()); diff --git a/termux-shared/src/main/java/com/termux/shared/termux/TermuxConstants.java b/termux-shared/src/main/java/com/termux/shared/termux/TermuxConstants.java index d0bcab1d..fe8c526d 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/TermuxConstants.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/TermuxConstants.java @@ -3,9 +3,11 @@ package com.termux.shared.termux; import android.annotation.SuppressLint; import java.io.File; +import java.util.Arrays; +import java.util.List; /* - * Version: v0.19.0 + * Version: v0.20.0 * * Changelog * @@ -135,6 +137,11 @@ import java.io.File; * - Added `TERMUX_SERVICE.EXTRA_STDIN`. * - Added `RUN_COMMAND_SERVICE.EXTRA_STDIN`. * - Deprecated `TERMUX_ACTIVITY.EXTRA_RELOAD_STYLE`. + * + * - 0.20.0 (2021-05-13) + * - Added `TERMUX_WIKI`, `TERMUX_WIKI_URL`, `TERMUX_PLUGIN_APP_NAMES_LIST`, `TERMUX_PLUGIN_APP_PACKAGE_NAMES_LIST`. + * - Added `TERMUX_SETTINGS_ACTIVITY_NAME`. + * */ /** @@ -194,6 +201,12 @@ public final class TermuxConstants { /** Termux support email mailto url */ public static final String TERMUX_SUPPORT_EMAIL_MAILTO_URL = "mailto:" + TERMUX_SUPPORT_EMAIL_URL; // Default: "mailto:termuxreports@groups.io" + /** Termux Wiki */ + public static final String TERMUX_WIKI = "Termux Wiki"; // Default: "Termux Wiki" + + /** Termux Wiki url */ + public static final String TERMUX_WIKI_URL = "https://wiki.termux.com"; // Default: "https://wiki.termux.com" + /** Termux Reddit subreddit */ public static final String TERMUX_REDDIT_SUBREDDIT = "r/termux"; // Default: "r/termux" @@ -314,6 +327,30 @@ public final class TermuxConstants { + /* + * Termux plugin apps lists. + */ + + public static final List TERMUX_PLUGIN_APP_NAMES_LIST = Arrays.asList( + TERMUX_API_APP_NAME, + TERMUX_BOOT_APP_NAME, + TERMUX_FLOAT_APP_NAME, + TERMUX_STYLING_APP_NAME, + TERMUX_TASKER_APP_NAME, + TERMUX_WIDGET_APP_NAME); + + public static final List TERMUX_PLUGIN_APP_PACKAGE_NAMES_LIST = Arrays.asList( + TERMUX_API_PACKAGE_NAME, + TERMUX_BOOT_PACKAGE_NAME, + TERMUX_FLOAT_PACKAGE_NAME, + TERMUX_STYLING_PACKAGE_NAME, + TERMUX_TASKER_PACKAGE_NAME, + TERMUX_WIDGET_PACKAGE_NAME); + + + + + /* * Termux packages urls. */ @@ -654,6 +691,13 @@ public final class TermuxConstants { + /** Termux app settings activity name. */ + public static final String TERMUX_SETTINGS_ACTIVITY_NAME = TERMUX_PACKAGE_NAME + ".app.activities.SettingsActivity"; // Default: "com.termux.app.activities.SettingsActivity" + + + + + /** Termux app core service name. */ public static final String TERMUX_SERVICE_NAME = TERMUX_PACKAGE_NAME + ".app.TermuxService"; // Default: "com.termux.app.TermuxService" diff --git a/termux-shared/src/main/java/com/termux/shared/termux/TermuxUtils.java b/termux-shared/src/main/java/com/termux/shared/termux/TermuxUtils.java index 3e08b9fe..545e1c24 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/TermuxUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/TermuxUtils.java @@ -132,6 +132,38 @@ public class TermuxUtils { } } + /** + * Get a markdown {@link String} for the apps info of all/any termux plugin apps installed. + * + * @param currentPackageContext The context of current package. + * @return Returns the markdown {@link String}. + */ + public static String getTermuxPluginAppsInfoMarkdownString(@NonNull final Context currentPackageContext) { + if (currentPackageContext == null) return "null"; + + StringBuilder markdownString = new StringBuilder(); + + List termuxPluginAppPackageNamesList = TermuxConstants.TERMUX_PLUGIN_APP_PACKAGE_NAMES_LIST; + + if (termuxPluginAppPackageNamesList != null) { + for (int i = 0; i < termuxPluginAppPackageNamesList.size(); i++) { + String termuxPluginAppPackageName = termuxPluginAppPackageNamesList.get(i); + Context termuxPluginAppContext = PackageUtils.getContextForPackage(currentPackageContext, termuxPluginAppPackageName); + // If the package context for the plugin app is not null, then assume its installed and get its info + if (termuxPluginAppContext != null) { + if (i != 0) + markdownString.append("\n\n"); + markdownString.append(TermuxUtils.getAppInfoMarkdownString(termuxPluginAppContext, false)); + } + } + } + + if (markdownString.toString().isEmpty()) + return null; + + return markdownString.toString(); + } + /** * Get a markdown {@link String} for the app info. If the {@code context} passed is different * from the {@link TermuxConstants#TERMUX_PACKAGE_NAME} package context, then this function @@ -291,6 +323,45 @@ public class TermuxUtils { return markdownString.toString(); } + /** + * Get a markdown {@link String} for important links. + * + * @param context The context for operations. + * @return Returns the markdown {@link String}. + */ + public static String getImportantLinksMarkdownString(@NonNull final Context context) { + if (context == null) return "null"; + + StringBuilder markdownString = new StringBuilder(); + + markdownString.append("## Important Links"); + + markdownString.append("\n\n### Github\n"); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_APP_NAME, TermuxConstants.TERMUX_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_API_APP_NAME, TermuxConstants.TERMUX_API_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_BOOT_APP_NAME, TermuxConstants.TERMUX_BOOT_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_FLOAT_APP_NAME, TermuxConstants.TERMUX_FLOAT_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_STYLING_APP_NAME, TermuxConstants.TERMUX_STYLING_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_TASKER_APP_NAME, TermuxConstants.TERMUX_TASKER_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_WIDGET_APP_NAME, TermuxConstants.TERMUX_WIDGET_GITHUB_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_PACKAGES_GITHUB_REPO_NAME, TermuxConstants.TERMUX_PACKAGES_GITHUB_REPO_URL)).append(" "); + + markdownString.append("\n\n### Email\n"); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_SUPPORT_EMAIL_URL, TermuxConstants.TERMUX_SUPPORT_EMAIL_MAILTO_URL)).append(" "); + + markdownString.append("\n\n### Reddit\n"); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_REDDIT_SUBREDDIT, TermuxConstants.TERMUX_REDDIT_SUBREDDIT_URL)).append(" "); + + markdownString.append("\n\n### Wiki\n"); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_WIKI, TermuxConstants.TERMUX_WIKI_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_APP_NAME, TermuxConstants.TERMUX_GITHUB_WIKI_REPO_URL)).append(" "); + markdownString.append("\n").append(MarkdownUtils.getLinkMarkdownString(TermuxConstants.TERMUX_PACKAGES_GITHUB_REPO_NAME, TermuxConstants.TERMUX_PACKAGES_GITHUB_WIKI_REPO_URL)).append(" "); + + markdownString.append("\n##\n"); + + return markdownString.toString(); + } + /**