From e83b2764e7b835b39afcaed92e424315219304aa Mon Sep 17 00:00:00 2001 From: FatttSnake Date: Thu, 4 Aug 2022 16:34:04 +0800 Subject: [PATCH] Added theme mode switch --- .idea/dbnavigator.xml | 6 +-- .../java/com/fatapp/oxygentoolbox/App.java | 38 ++++++---------- .../oxygentoolbox/ui/home/HomeFragment.java | 2 +- .../ui/setting/SettingFragment.java | 21 ++++++--- .../util/MultiLanguageUtils.java | 3 +- .../oxygentoolbox/util/ResourceUtil.java | 44 +++++++++++++++++++ .../util/SharedPreferencesUtils.java | 28 ++++++++---- .../fatapp/oxygentoolbox/util/ToolsList.java | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 6 +++ app/src/main/res/values-zh-rHK/strings.xml | 10 +++++ app/src/main/res/values-zh-rTW/strings.xml | 10 +++++ app/src/main/res/values/strings.xml | 17 ++++++- app/src/main/res/xml/fragment_setting.xml | 7 +++ 13 files changed, 145 insertions(+), 49 deletions(-) diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml index 22b9d8d..7b1bc5f 100644 --- a/.idea/dbnavigator.xml +++ b/.idea/dbnavigator.xml @@ -145,11 +145,11 @@ - - + + - + diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/App.java b/app/src/main/java/com/fatapp/oxygentoolbox/App.java index 0a3937a..2efc2d2 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/App.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/App.java @@ -4,11 +4,7 @@ import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Build; import android.os.Bundle; -import android.os.LocaleList; -import android.util.DisplayMetrics; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,8 +13,6 @@ import com.fatapp.oxygentoolbox.util.MultiLanguageUtils; import com.fatapp.oxygentoolbox.util.ResourceUtil; import com.fatapp.oxygentoolbox.util.SharedPreferencesUtils; -import java.util.Locale; - public class App extends Application { @Override public void onCreate() { @@ -27,9 +21,10 @@ public class App extends Application { registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle bundle) { - ResourceUtil.init(App.this); SharedPreferencesUtils.init(App.this); - setAppLanguage(getApplicationContext(), SharedPreferencesUtils.getLanguage()); + ResourceUtil.init(App.this); + ResourceUtil.setAppLocale(SharedPreferencesUtils.getPreferenceLocale()); + loadAppUiMode(); } @Override @@ -75,23 +70,16 @@ public class App extends Application { MultiLanguageUtils.attachBaseContext(this); } - - private static void setAppLanguage(Context context, Locale locale) { - Resources resources = context.getResources(); - Configuration configuration = resources.getConfiguration(); - DisplayMetrics displayMetrics = resources.getDisplayMetrics(); - //Android 7.0以上的方法 - if (Build.VERSION.SDK_INT >= 24) { - configuration.setLocale(locale); - configuration.setLocales(new LocaleList(locale)); - context.createConfigurationContext(configuration); - //实测,updateConfiguration这个方法虽然很多博主说是版本不适用 - //但是我的生产环境androidX+Android Q环境下,必须加上这一句,才可以通过重启App来切换语言 - resources.updateConfiguration(configuration, displayMetrics); - } else { - //Android 4.1 以上方法 - configuration.setLocale(locale); - resources.updateConfiguration(configuration, displayMetrics); + public static void loadAppUiMode() { + switch (SharedPreferencesUtils.getPreferenceUiMode()) { + case light: + ResourceUtil.setAppUiMode(ResourceUtil.UI_MODE_LIGHT); + break; + case dark: + ResourceUtil.setAppUiMode(ResourceUtil.UI_MODE_DARK); + break; + default: + ResourceUtil.setAppUiMode(ResourceUtil.getSystemUiMode()); } } } diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/ui/home/HomeFragment.java b/app/src/main/java/com/fatapp/oxygentoolbox/ui/home/HomeFragment.java index 0f8d9cf..80b45ff 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/ui/home/HomeFragment.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/ui/home/HomeFragment.java @@ -56,7 +56,7 @@ public class HomeFragment extends Fragment { } }); - bottomNavViewPager.setCurrentItem(SharedPreferencesUtils.getLaunchPage() == SharedPreferencesUtils.LaunchPage.tools ? 0 : 1, false); + bottomNavViewPager.setCurrentItem(SharedPreferencesUtils.getPreferenceLaunchPage() == SharedPreferencesUtils.LaunchPage.tools ? 0 : 1, false); return root; } diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/ui/setting/SettingFragment.java b/app/src/main/java/com/fatapp/oxygentoolbox/ui/setting/SettingFragment.java index ff09143..86268ea 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/ui/setting/SettingFragment.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/ui/setting/SettingFragment.java @@ -1,16 +1,18 @@ package com.fatapp.oxygentoolbox.ui.setting; import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; +import android.util.Log; import androidx.annotation.Nullable; +import androidx.navigation.Navigation; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import com.fatapp.oxygentoolbox.MainActivity; import com.fatapp.oxygentoolbox.R; -import com.fatapp.oxygentoolbox.ui.about.LibrariesActivity; import com.fatapp.oxygentoolbox.util.ResourceUtil; public class SettingFragment extends PreferenceFragmentCompat { @@ -21,10 +23,7 @@ public class SettingFragment extends PreferenceFragmentCompat { ListPreference appLanguagePreference = findPreference(ResourceUtil.getString(R.string.setting_language_key)); if (appLanguagePreference != null) { appLanguagePreference.setOnPreferenceChangeListener((preference, newValue) -> { - Intent intent = new Intent(getActivity(), MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - requireActivity().startActivity(intent); - requireActivity().finish(); + ResourceUtil.restartActivity(requireActivity(), MainActivity.class); return true; }); } @@ -32,10 +31,20 @@ public class SettingFragment extends PreferenceFragmentCompat { Preference aboutPreference = findPreference(ResourceUtil.getString(R.string.setting_about_oxygen_toolbox_key)); if (aboutPreference != null) { aboutPreference.setOnPreferenceClickListener(preference -> { +/* Intent intent = new Intent(getActivity(), LibrariesActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); -// Navigation.findNavController(requireView()).navigate(R.id.action_setting_to_about); +*/ + Navigation.findNavController(requireView()).navigate(R.id.action_setting_to_about); + return true; + }); + } + + ListPreference uiModePreference = findPreference(ResourceUtil.getString(R.string.setting_ui_mode_key)); + if (uiModePreference != null) { + uiModePreference.setOnPreferenceChangeListener((preference, newValue) -> { + ResourceUtil.restartActivity(requireActivity(), MainActivity.class); return true; }); } diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java index bff4b25..6bb676f 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java @@ -10,12 +10,11 @@ import android.util.DisplayMetrics; import androidx.annotation.RequiresApi; import java.util.Locale; -import java.util.Objects; public class MultiLanguageUtils { public static Context attachBaseContext(Context context) { - Locale locale = SharedPreferencesUtils.getLanguage(); + Locale locale = SharedPreferencesUtils.getPreferenceLocale(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { return createConfigurationContext(context, locale.getLanguage(), locale.getCountry()); } else { diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java index 4f98925..ae5b805 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java @@ -1,13 +1,16 @@ package com.fatapp.oxygentoolbox.util; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.Application; import android.content.Context; +import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; import android.os.Build; +import android.os.LocaleList; import android.util.DisplayMetrics; import android.view.Window; @@ -25,11 +28,17 @@ import java.util.Locale; import java.util.Objects; public final class ResourceUtil { + private static int UI_MODE_SYSTEM; + public static final int UI_MODE_LIGHT = Configuration.UI_MODE_NIGHT_NO + Configuration.UI_MODE_TYPE_NORMAL; + public static final int UI_MODE_DARK = Configuration.UI_MODE_NIGHT_YES + Configuration.UI_MODE_TYPE_NORMAL; private static Application sApp; public static void init(Application app) { sApp = app; + if (UI_MODE_SYSTEM == 0) { + UI_MODE_SYSTEM = getAppUiMode(); + } } public static Application getApplication() { @@ -110,6 +119,41 @@ public final class ResourceUtil { return ConfigurationCompat.getLocales(configuration); } + public static void setAppLocale(Locale locale) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + getConfiguration().setLocale(locale); + getConfiguration().setLocales(new LocaleList(locale)); + getApplication().createConfigurationContext(getConfiguration()); + } else { + getConfiguration().setLocale(locale); + } + updateConfiguration(); + } + + public static int getSystemUiMode() { + return UI_MODE_SYSTEM; + } + + public static int getAppUiMode() { + return getConfiguration().uiMode; + } + + public static void setAppUiMode(int uiMode) { + getConfiguration().uiMode = uiMode; + updateConfiguration(); + } + + private static void updateConfiguration() { + getResources().updateConfiguration(getConfiguration(), getDisplayMetrics()); + } + + public static void restartActivity(Activity activity, Class cls) { + Intent intent = new Intent(activity, cls); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + activity.startActivity(intent); + activity.finish(); + } + public static int dpToPx(float dp) { return (int) (dp * getDisplayMetrics().density + 0.5f); } diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java index a608453..f5ff92d 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java @@ -17,7 +17,11 @@ public class SharedPreferencesUtils { preferences = PreferenceManager.getDefaultSharedPreferences(app); } - public static Locale getLanguage() { + public static boolean isNull() { + return preferences == null; + } + + public static Locale getPreferenceLocale() { String languagePreference; String language; String country; @@ -33,15 +37,21 @@ public class SharedPreferencesUtils { return new Locale(language, country); } - public static boolean isNull() { - return preferences == null; - } - - public static LaunchPage getLaunchPage() { + public static LaunchPage getPreferenceLaunchPage() { return LaunchPage.valueOf(preferences.getString(ResourceUtil.getString(R.string.setting_launch_page_key), ResourceUtil.getString(R.string.setting_launch_page_default_value))); } - public enum LaunchPage { - tools,favourites + public static UiMode getPreferenceUiMode() { + return UiMode.valueOf(preferences.getString(ResourceUtil.getString(R.string.setting_ui_mode_key), ResourceUtil.getString(R.string.setting_ui_mode_default_value))); } -} + + @SuppressWarnings("unused") + public enum LaunchPage { + tools, favourites + } + + @SuppressWarnings("unused") + public enum UiMode { + system, light, dark + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/ToolsList.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/ToolsList.java index f0027dc..0d29d96 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/util/ToolsList.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/ToolsList.java @@ -41,7 +41,7 @@ public class ToolsList { } private static String getLocale(Locales strings) { - if (SharedPreferencesUtils.getLanguage().getLanguage().equals("zh")) { + if (SharedPreferencesUtils.getPreferenceLocale().getLanguage().equals("zh")) { return strings.getCn(); } return strings.getEn(); diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 25bee5c..198e62d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,6 +37,12 @@ 工具 收藏 + 主题模式 + + 跟随系统 + 亮色 + 深色 + 开源许可 查找 关于 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 1060723..198e62d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -33,6 +33,16 @@ English 启动页 + + 工具 + 收藏 + + 主题模式 + + 跟随系统 + 亮色 + 深色 + 开源许可 查找 关于 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1060723..198e62d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -33,6 +33,16 @@ English 启动页 + + 工具 + 收藏 + + 主题模式 + + 跟随系统 + 亮色 + 深色 + 开源许可 查找 关于 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9a8a86..126c44e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,11 +41,11 @@ English - default + system zh_CN en_US - default + system Launch Page app_launch_page @@ -57,6 +57,19 @@ favourites tools + Theme Mode + app_ui_mode + + Follow System + Light + Dark + + + system + light + dark + + system OpenSource Search About diff --git a/app/src/main/res/xml/fragment_setting.xml b/app/src/main/res/xml/fragment_setting.xml index 96916d5..b74e363 100644 --- a/app/src/main/res/xml/fragment_setting.xml +++ b/app/src/main/res/xml/fragment_setting.xml @@ -17,6 +17,13 @@ app:key="@string/setting_launch_page_key" app:title="@string/setting_launch_page" app:useSimpleSummaryProvider="true" /> +