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 2e8121eb..3ffbaad9 100644
--- a/app/src/main/java/com/termux/app/activities/SettingsActivity.java
+++ b/app/src/main/java/com/termux/app/activities/SettingsActivity.java
@@ -20,6 +20,7 @@ import com.termux.shared.packages.PackageUtils;
import com.termux.shared.settings.preferences.TermuxAPIAppSharedPreferences;
import com.termux.shared.settings.preferences.TermuxFloatAppSharedPreferences;
import com.termux.shared.settings.preferences.TermuxTaskerAppSharedPreferences;
+import com.termux.shared.settings.preferences.TermuxWidgetAppSharedPreferences;
import com.termux.shared.termux.AndroidUtils;
import com.termux.shared.termux.TermuxConstants;
import com.termux.shared.termux.TermuxUtils;
@@ -60,6 +61,7 @@ public class SettingsActivity extends AppCompatActivity {
configureTermuxAPIPreference(context);
configureTermuxFloatPreference(context);
configureTermuxTaskerPreference(context);
+ configureTermuxWidgetPreference(context);
configureAboutPreference(context);
configureDonatePreference(context);
}
@@ -91,6 +93,15 @@ public class SettingsActivity extends AppCompatActivity {
}
}
+ private void configureTermuxWidgetPreference(@NonNull Context context) {
+ Preference termuxWidgetPreference = findPreference("termux_widget");
+ if (termuxWidgetPreference != null) {
+ TermuxWidgetAppSharedPreferences preferences = TermuxWidgetAppSharedPreferences.build(context, false);
+ // If failed to get app preferences, then likely app is not installed, so do not show its preference
+ termuxWidgetPreference.setVisible(preferences != null);
+ }
+ }
+
private void configureAboutPreference(@NonNull Context context) {
Preference aboutPreference = findPreference("about");
if (aboutPreference != null) {
diff --git a/app/src/main/java/com/termux/app/fragments/settings/TermuxWidgetPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/TermuxWidgetPreferencesFragment.java
new file mode 100644
index 00000000..b87e93e5
--- /dev/null
+++ b/app/src/main/java/com/termux/app/fragments/settings/TermuxWidgetPreferencesFragment.java
@@ -0,0 +1,49 @@
+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.TermuxWidgetAppSharedPreferences;
+
+@Keep
+public class TermuxWidgetPreferencesFragment extends PreferenceFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ Context context = getContext();
+ if (context == null) return;
+
+ PreferenceManager preferenceManager = getPreferenceManager();
+ preferenceManager.setPreferenceDataStore(TermuxWidgetPreferencesDataStore.getInstance(context));
+
+ setPreferencesFromResource(R.xml.termux_widget_preferences, rootKey);
+ }
+
+}
+
+class TermuxWidgetPreferencesDataStore extends PreferenceDataStore {
+
+ private final Context mContext;
+ private final TermuxWidgetAppSharedPreferences mPreferences;
+
+ private static TermuxWidgetPreferencesDataStore mInstance;
+
+ private TermuxWidgetPreferencesDataStore(Context context) {
+ mContext = context;
+ mPreferences = TermuxWidgetAppSharedPreferences.build(context, true);
+ }
+
+ public static synchronized TermuxWidgetPreferencesDataStore getInstance(Context context) {
+ if (mInstance == null) {
+ mInstance = new TermuxWidgetPreferencesDataStore(context);
+ }
+ return mInstance;
+ }
+
+}
diff --git a/app/src/main/java/com/termux/app/fragments/settings/termux_widget/DebuggingPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/termux_widget/DebuggingPreferencesFragment.java
new file mode 100644
index 00000000..919f159e
--- /dev/null
+++ b/app/src/main/java/com/termux/app/fragments/settings/termux_widget/DebuggingPreferencesFragment.java
@@ -0,0 +1,101 @@
+package com.termux.app.fragments.settings.termux_widget;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceDataStore;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
+
+import com.termux.R;
+import com.termux.shared.settings.preferences.TermuxWidgetAppSharedPreferences;
+
+@Keep
+public class DebuggingPreferencesFragment extends PreferenceFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ Context context = getContext();
+ if (context == null) return;
+
+ PreferenceManager preferenceManager = getPreferenceManager();
+ preferenceManager.setPreferenceDataStore(DebuggingPreferencesDataStore.getInstance(context));
+
+ setPreferencesFromResource(R.xml.termux_widget_debugging_preferences, rootKey);
+
+ configureLoggingPreferences(context);
+ }
+
+ private void configureLoggingPreferences(@NonNull Context context) {
+ PreferenceCategory loggingCategory = findPreference("logging");
+ if (loggingCategory == null) return;
+
+ ListPreference logLevelListPreference = findPreference("log_level");
+ if (logLevelListPreference != null) {
+ TermuxWidgetAppSharedPreferences preferences = TermuxWidgetAppSharedPreferences.build(context, true);
+ if (preferences == null) return;
+
+ com.termux.app.fragments.settings.termux.DebuggingPreferencesFragment.
+ setLogLevelListPreferenceData(logLevelListPreference, context, preferences.getLogLevel(true));
+ loggingCategory.addPreference(logLevelListPreference);
+ }
+ }
+}
+
+class DebuggingPreferencesDataStore extends PreferenceDataStore {
+
+ private final Context mContext;
+ private final TermuxWidgetAppSharedPreferences mPreferences;
+
+ private static DebuggingPreferencesDataStore mInstance;
+
+ private DebuggingPreferencesDataStore(Context context) {
+ mContext = context;
+ mPreferences = TermuxWidgetAppSharedPreferences.build(context, true);
+ }
+
+ public static synchronized DebuggingPreferencesDataStore getInstance(Context context) {
+ if (mInstance == null) {
+ mInstance = new DebuggingPreferencesDataStore(context);
+ }
+ return mInstance;
+ }
+
+
+
+ @Override
+ @Nullable
+ public String getString(String key, @Nullable String defValue) {
+ if (mPreferences == null) return null;
+ if (key == null) return null;
+
+ switch (key) {
+ case "log_level":
+ return String.valueOf(mPreferences.getLogLevel(true));
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void putString(String key, @Nullable String value) {
+ if (mPreferences == null) return;
+ if (key == null) return;
+
+ switch (key) {
+ case "log_level":
+ if (value != null) {
+ mPreferences.setLogLevel(mContext, Integer.parseInt(value), true);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5b27549d..204e3bcf 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -211,6 +211,12 @@
+
+ &TERMUX_WIDGET_APP_NAME;
+ Preferences for &TERMUX_WIDGET_APP_NAME; app
+
+
+
About
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 31b657a2..0ec8b14d 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -27,6 +27,13 @@
app:isPreferenceVisible="false"
app:fragment="com.termux.app.fragments.settings.TermuxTaskerPreferencesFragment"/>
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/termux_widget_preferences.xml b/app/src/main/res/xml/termux_widget_preferences.xml
new file mode 100644
index 00000000..aaf01953
--- /dev/null
+++ b/app/src/main/res/xml/termux_widget_preferences.xml
@@ -0,0 +1,8 @@
+
+
+
+
+