From 9f1203f049c7ad7283a73b57a70e468e9699aeef Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Thu, 2 Sep 2021 06:40:02 +0500 Subject: [PATCH] Changed: Use multi-process SharedPrefernces for log level of plugin apps Since termux-app runs in a separate process from other apps, if a user sets log level in termux settings, then it would require exiting the `termux-app` completely since android caches `SharedPrefernces` in memory and only writes to the file on app exit. Now updated value will be instantly written to the file so that plugins can directly read at startup. If plugins are already running, they would need to be restarted since usually log levels are loaded at startup. --- .../DebuggingPreferencesFragment.java | 6 ++--- .../TermuxAPIAppSharedPreferences.java | 22 ++++++++++++++----- .../TermuxBootAppSharedPreferences.java | 22 ++++++++++++++----- .../TermuxStylingAppSharedPreferences.java | 22 ++++++++++++++----- .../TermuxWidgetAppSharedPreferences.java | 22 ++++++++++++++----- 5 files changed, 67 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/termux/app/fragments/settings/termux_api/DebuggingPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/termux_api/DebuggingPreferencesFragment.java index 0a4fee3f..6d09eae1 100644 --- a/app/src/main/java/com/termux/app/fragments/settings/termux_api/DebuggingPreferencesFragment.java +++ b/app/src/main/java/com/termux/app/fragments/settings/termux_api/DebuggingPreferencesFragment.java @@ -41,7 +41,7 @@ public class DebuggingPreferencesFragment extends PreferenceFragmentCompat { if (preferences == null) return; com.termux.app.fragments.settings.termux.DebuggingPreferencesFragment. - setLogLevelListPreferenceData(logLevelListPreference, context, preferences.getLogLevel()); + setLogLevelListPreferenceData(logLevelListPreference, context, preferences.getLogLevel(true)); loggingCategory.addPreference(logLevelListPreference); } } @@ -76,7 +76,7 @@ class DebuggingPreferencesDataStore extends PreferenceDataStore { switch (key) { case "log_level": - return String.valueOf(mPreferences.getLogLevel()); + return String.valueOf(mPreferences.getLogLevel(true)); default: return null; } @@ -90,7 +90,7 @@ class DebuggingPreferencesDataStore extends PreferenceDataStore { switch (key) { case "log_level": if (value != null) { - mPreferences.setLogLevel(mContext, Integer.parseInt(value)); + mPreferences.setLogLevel(mContext, Integer.parseInt(value), true); } break; default: diff --git a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxAPIAppSharedPreferences.java b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxAPIAppSharedPreferences.java index 7b720ac7..1862cce2 100644 --- a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxAPIAppSharedPreferences.java +++ b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxAPIAppSharedPreferences.java @@ -18,6 +18,7 @@ public class TermuxAPIAppSharedPreferences { private final Context mContext; private final SharedPreferences mSharedPreferences; + private final SharedPreferences mMultiProcessSharedPreferences; private static final String LOG_TAG = "TermuxAPIAppSharedPreferences"; @@ -25,6 +26,7 @@ public class TermuxAPIAppSharedPreferences { private TermuxAPIAppSharedPreferences(@Nonnull Context context) { mContext = context; mSharedPreferences = getPrivateSharedPreferences(mContext); + mMultiProcessSharedPreferences = getPrivateAndMultiProcessSharedPreferences(mContext); } /** @@ -65,15 +67,23 @@ public class TermuxAPIAppSharedPreferences { return SharedPreferenceUtils.getPrivateSharedPreferences(context, TermuxConstants.TERMUX_API_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - - - public int getLogLevel() { - return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_API_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + private static SharedPreferences getPrivateAndMultiProcessSharedPreferences(Context context) { + if (context == null) return null; + return SharedPreferenceUtils.getPrivateAndMultiProcessSharedPreferences(context, TermuxConstants.TERMUX_API_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - public void setLogLevel(Context context, int logLevel) { + + + public int getLogLevel(boolean readFromFile) { + if (readFromFile) + return SharedPreferenceUtils.getInt(mMultiProcessSharedPreferences, TERMUX_API_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + else + return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_API_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + } + + public void setLogLevel(Context context, int logLevel, boolean commitToFile) { logLevel = Logger.setLogLevel(context, logLevel); - SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_API_APP.KEY_LOG_LEVEL, logLevel, false); + SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_API_APP.KEY_LOG_LEVEL, logLevel, commitToFile); } } diff --git a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxBootAppSharedPreferences.java b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxBootAppSharedPreferences.java index 762740c9..8fa18374 100644 --- a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxBootAppSharedPreferences.java +++ b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxBootAppSharedPreferences.java @@ -18,6 +18,7 @@ public class TermuxBootAppSharedPreferences { private final Context mContext; private final SharedPreferences mSharedPreferences; + private final SharedPreferences mMultiProcessSharedPreferences; private static final String LOG_TAG = "TermuxBootAppSharedPreferences"; @@ -25,6 +26,7 @@ public class TermuxBootAppSharedPreferences { private TermuxBootAppSharedPreferences(@Nonnull Context context) { mContext = context; mSharedPreferences = getPrivateSharedPreferences(mContext); + mMultiProcessSharedPreferences = getPrivateAndMultiProcessSharedPreferences(mContext); } /** @@ -65,15 +67,23 @@ public class TermuxBootAppSharedPreferences { return SharedPreferenceUtils.getPrivateSharedPreferences(context, TermuxConstants.TERMUX_BOOT_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - - - public int getLogLevel() { - return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_BOOT_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + private static SharedPreferences getPrivateAndMultiProcessSharedPreferences(Context context) { + if (context == null) return null; + return SharedPreferenceUtils.getPrivateAndMultiProcessSharedPreferences(context, TermuxConstants.TERMUX_BOOT_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - public void setLogLevel(Context context, int logLevel) { + + + public int getLogLevel(boolean readFromFile) { + if (readFromFile) + return SharedPreferenceUtils.getInt(mMultiProcessSharedPreferences, TERMUX_BOOT_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + else + return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_BOOT_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + } + + public void setLogLevel(Context context, int logLevel, boolean commitToFile) { logLevel = Logger.setLogLevel(context, logLevel); - SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_BOOT_APP.KEY_LOG_LEVEL, logLevel, false); + SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_BOOT_APP.KEY_LOG_LEVEL, logLevel, commitToFile); } } diff --git a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxStylingAppSharedPreferences.java b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxStylingAppSharedPreferences.java index df7a9758..f6aa24a9 100644 --- a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxStylingAppSharedPreferences.java +++ b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxStylingAppSharedPreferences.java @@ -18,6 +18,7 @@ public class TermuxStylingAppSharedPreferences { private final Context mContext; private final SharedPreferences mSharedPreferences; + private final SharedPreferences mMultiProcessSharedPreferences; private static final String LOG_TAG = "TermuxStylingAppSharedPreferences"; @@ -25,6 +26,7 @@ public class TermuxStylingAppSharedPreferences { private TermuxStylingAppSharedPreferences(@Nonnull Context context) { mContext = context; mSharedPreferences = getPrivateSharedPreferences(mContext); + mMultiProcessSharedPreferences = getPrivateAndMultiProcessSharedPreferences(mContext); } /** @@ -65,15 +67,23 @@ public class TermuxStylingAppSharedPreferences { return SharedPreferenceUtils.getPrivateSharedPreferences(context, TermuxConstants.TERMUX_STYLING_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - - - public int getLogLevel() { - return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_STYLING_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + private static SharedPreferences getPrivateAndMultiProcessSharedPreferences(Context context) { + if (context == null) return null; + return SharedPreferenceUtils.getPrivateAndMultiProcessSharedPreferences(context, TermuxConstants.TERMUX_STYLING_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - public void setLogLevel(Context context, int logLevel) { + + + public int getLogLevel(boolean readFromFile) { + if (readFromFile) + return SharedPreferenceUtils.getInt(mMultiProcessSharedPreferences, TERMUX_STYLING_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + else + return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_STYLING_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + } + + public void setLogLevel(Context context, int logLevel, boolean commitToFile) { logLevel = Logger.setLogLevel(context, logLevel); - SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_STYLING_APP.KEY_LOG_LEVEL, logLevel, false); + SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_STYLING_APP.KEY_LOG_LEVEL, logLevel, commitToFile); } } diff --git a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxWidgetAppSharedPreferences.java b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxWidgetAppSharedPreferences.java index 44447d3f..5356e94c 100644 --- a/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxWidgetAppSharedPreferences.java +++ b/termux-shared/src/main/java/com/termux/shared/settings/preferences/TermuxWidgetAppSharedPreferences.java @@ -18,6 +18,7 @@ public class TermuxWidgetAppSharedPreferences { private final Context mContext; private final SharedPreferences mSharedPreferences; + private final SharedPreferences mMultiProcessSharedPreferences; private static final String LOG_TAG = "TermuxWidgetAppSharedPreferences"; @@ -25,6 +26,7 @@ public class TermuxWidgetAppSharedPreferences { private TermuxWidgetAppSharedPreferences(@Nonnull Context context) { mContext = context; mSharedPreferences = getPrivateSharedPreferences(mContext); + mMultiProcessSharedPreferences = getPrivateAndMultiProcessSharedPreferences(mContext); } /** @@ -65,15 +67,23 @@ public class TermuxWidgetAppSharedPreferences { return SharedPreferenceUtils.getPrivateSharedPreferences(context, TermuxConstants.TERMUX_WIDGET_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - - - public int getLogLevel() { - return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_WIDGET_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + private static SharedPreferences getPrivateAndMultiProcessSharedPreferences(Context context) { + if (context == null) return null; + return SharedPreferenceUtils.getPrivateAndMultiProcessSharedPreferences(context, TermuxConstants.TERMUX_WIDGET_DEFAULT_PREFERENCES_FILE_BASENAME_WITHOUT_EXTENSION); } - public void setLogLevel(Context context, int logLevel) { + + + public int getLogLevel(boolean readFromFile) { + if (readFromFile) + return SharedPreferenceUtils.getInt(mMultiProcessSharedPreferences, TERMUX_WIDGET_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + else + return SharedPreferenceUtils.getInt(mSharedPreferences, TERMUX_WIDGET_APP.KEY_LOG_LEVEL, Logger.DEFAULT_LOG_LEVEL); + } + + public void setLogLevel(Context context, int logLevel, boolean commitToFile) { logLevel = Logger.setLogLevel(context, logLevel); - SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_WIDGET_APP.KEY_LOG_LEVEL, logLevel, false); + SharedPreferenceUtils.setInt(mSharedPreferences, TERMUX_WIDGET_APP.KEY_LOG_LEVEL, logLevel, commitToFile); } }