diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 5d9064d..9be6e51 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,18 +1,6 @@ - - - - - - - - - - - - diff --git a/.idea/misc.xml b/.idea/misc.xml index f6e282b..786cdf6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -56,6 +56,7 @@ + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ab06d67..e509b21 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ = 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); + } + } +} diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/MainActivity.java b/app/src/main/java/com/fatapp/oxygentoolbox/MainActivity.java index b8a0828..c654a88 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/MainActivity.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/MainActivity.java @@ -1,12 +1,15 @@ package com.fatapp.oxygentoolbox; +import android.content.Context; import android.os.Bundle; import android.view.Menu; +import com.fatapp.oxygentoolbox.util.MultiLanguageUtils; import com.fatapp.oxygentoolbox.util.ResourceUtil; import com.fatapp.oxygentoolbox.util.VibratorController; import com.google.android.material.navigation.NavigationView; +import androidx.annotation.NonNull; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.navigation.NavController; import androidx.navigation.Navigation; @@ -46,7 +49,6 @@ public class MainActivity extends AppCompatActivity { //init initView(); initLayout(); - ResourceUtil.init(getApplication()); VibratorController.init(); // shortCutCreateTest(); @@ -58,11 +60,9 @@ public class MainActivity extends AppCompatActivity { setSupportActionBar(toolbar); navigationView.inflateHeaderView(R.layout.nav_header_main); navigationView.inflateMenu(R.menu.activity_main_drawer); - navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { - drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked() - ? DrawerLayout.LOCK_MODE_UNLOCKED - : DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - }); + navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked() + ? DrawerLayout.LOCK_MODE_UNLOCKED + : DrawerLayout.LOCK_MODE_LOCKED_CLOSED)); navigationView.getMenu().getItem(4).setOnMenuItemClickListener(item -> { finish(); return false; @@ -112,4 +112,15 @@ public class MainActivity extends AppCompatActivity { return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp(); } + + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(MultiLanguageUtils.attachBaseContext(newBase)); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + MultiLanguageUtils.attachBaseContext(getApplicationContext()); + } } \ No newline at end of file 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 c8656af..912f790 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,33 +1,38 @@ package com.fatapp.oxygentoolbox.ui.setting; +import android.content.Intent; +import android.os.Build; import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; +import androidx.annotation.Nullable; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; +import com.fatapp.oxygentoolbox.MainActivity; import com.fatapp.oxygentoolbox.R; +import com.fatapp.oxygentoolbox.util.MultiLanguageUtils; +import com.fatapp.oxygentoolbox.util.ResourceUtil; -public class SettingFragment extends Fragment { +import java.util.Objects; - private SettingViewModel settingViewModel; +public class SettingFragment extends PreferenceFragmentCompat { - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - settingViewModel = new ViewModelProvider(this).get(SettingViewModel.class); - View root = inflater.inflate(R.layout.fragment_setting, container, false); -/* - final TextView textView = root.findViewById(R.id.text_setting); - settingViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { - @Override - public void onChanged(@Nullable String s) { - textView.setText(s); - } - }); -*/ - return root; + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { + setPreferencesFromResource(R.xml.fragment_setting, rootKey); + ListPreference appLanguage = findPreference("app_language"); + if (appLanguage != null) { + appLanguage.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(); + return true; + }); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/ui/theme/ThemeFragment.java b/app/src/main/java/com/fatapp/oxygentoolbox/ui/theme/ThemeFragment.java index fe34975..6fad9ae 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/ui/theme/ThemeFragment.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/ui/theme/ThemeFragment.java @@ -4,12 +4,9 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import com.fatapp.oxygentoolbox.R; @@ -21,13 +18,6 @@ public class ThemeFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { themeViewModel = new ViewModelProvider(this).get(ThemeViewModel.class); View root = inflater.inflate(R.layout.fragment_theme, container, false); - final TextView textView = root.findViewById(R.id.text_theme); - themeViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { - @Override - public void onChanged(@Nullable String s) { - textView.setText(s); - } - }); return root; } } \ No newline at end of file diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java new file mode 100644 index 0000000..974a5e2 --- /dev/null +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/MultiLanguageUtils.java @@ -0,0 +1,71 @@ +package com.fatapp.oxygentoolbox.util; + +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.text.TextUtils; +import android.util.DisplayMetrics; + +import androidx.annotation.RequiresApi; +import androidx.appcompat.view.ContextThemeWrapper; +import androidx.core.os.ConfigurationCompat; +import androidx.core.os.LocaleListCompat; + +import com.fatapp.oxygentoolbox.R; + +import java.util.Locale; + +public class MultiLanguageUtils { + + public static Context attachBaseContext(Context context) { + String locale; + if (SharedPreferencesUtils.isNull()) { + locale = "default"; + } else { + locale = SharedPreferencesUtils.getLocale(); + } + String language; + String country; + if (!locale.equals("default")) { + language = locale.substring(0, locale.indexOf("_")); + country = locale.substring(locale.indexOf("_") + 1); + } else { + language = ResourceUtil.getSystemLocale().get(0).getLanguage(); + country = ResourceUtil.getSystemLocale().get(0).getCountry(); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + return createConfigurationContext(context, language, country); + } else { + return updateConfiguration(context, language, country); + } + } + + @RequiresApi(api = Build.VERSION_CODES.N_MR1) + private static Context createConfigurationContext(Context context, String language, String country) { + Resources resources = context.getResources(); + Configuration configuration = resources.getConfiguration(); + Locale locale = new Locale(language, country); + LocaleList localeList = new LocaleList(locale); + configuration.setLocales(localeList); + return context.createConfigurationContext(configuration); + } + + private static Context updateConfiguration(Context context, String language, String country) { + Resources resources = context.getResources(); + Configuration configuration = resources.getConfiguration(); + Locale locale = new Locale(language, country); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + configuration.setLocales(new LocaleList(locale)); + } else { + configuration.locale = locale; + DisplayMetrics displayMetrics = resources.getDisplayMetrics(); + resources.updateConfiguration(configuration, displayMetrics); + } + return context; + } +} \ No newline at end of file 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 b5c13b7..12c5374 100644 --- a/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/ResourceUtil.java @@ -3,9 +3,12 @@ package com.fatapp.oxygentoolbox.util; import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; +import android.os.Build; +import android.util.DisplayMetrics; import android.view.Window; import androidx.annotation.AttrRes; @@ -13,19 +16,20 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.StyleRes; import androidx.appcompat.view.ContextThemeWrapper; +import androidx.core.os.ConfigurationCompat; +import androidx.core.os.LocaleListCompat; import com.google.android.material.color.MaterialColors; +import java.util.Locale; import java.util.Objects; public final class ResourceUtil { private static Application sApp; - private static Resources sRes; public static void init(Application app) { sApp = app; - sRes = app.getResources(); } public static Application getApplication() { @@ -33,15 +37,23 @@ public final class ResourceUtil { } public static Resources getResources() { - return sRes; + return sApp.getResources(); + } + + public static Configuration getConfiguration() { + return sApp.getResources().getConfiguration(); + } + + public static DisplayMetrics getDisplayMetrics() { + return sApp.getResources().getDisplayMetrics(); } public static String getString(int resId) { - return sRes.getString(resId); + return sApp.getResources().getString(resId); } public static int getColor(int resId) { - return sRes.getColor(resId); + return sApp.getResources().getColor(resId); } @ColorInt @@ -82,4 +94,19 @@ public final class ResourceUtil { return 0; } } + + public static Locale getAppLocale() { + Locale local; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + local = getConfiguration().getLocales().get(0); + } else { + local = getConfiguration().locale; + } + return local; + } + + public static LocaleListCompat getSystemLocale() { + Configuration configuration = Resources.getSystem().getConfiguration(); + return ConfigurationCompat.getLocales(configuration); + } } \ No newline at end of file diff --git a/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java b/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java new file mode 100644 index 0000000..1207f58 --- /dev/null +++ b/app/src/main/java/com/fatapp/oxygentoolbox/util/SharedPreferencesUtils.java @@ -0,0 +1,22 @@ +package com.fatapp.oxygentoolbox.util; + +import android.app.Application; +import android.content.SharedPreferences; + +import androidx.preference.PreferenceManager; + +public class SharedPreferencesUtils { + private static SharedPreferences preferences; + + public static void init(Application app) { + preferences = PreferenceManager.getDefaultSharedPreferences(app); + } + + public static String getLocale() { + return preferences.getString("app_language", "default"); + } + + public static boolean isNull() { + return preferences == null; + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index b52f40d..dd5f433 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -23,7 +23,7 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_theme.xml b/app/src/main/res/layout/fragment_theme.xml index fe154c0..550a605 100644 --- a/app/src/main/res/layout/fragment_theme.xml +++ b/app/src/main/res/layout/fragment_theme.xml @@ -1,22 +1,37 @@ - - - \ No newline at end of file + android:orientation="vertical"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index d0430f6..694660c 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -21,7 +21,7 @@ android:id="@+id/nav_setting" android:name="com.fatapp.oxygentoolbox.ui.setting.SettingFragment" android:label="@string/menu_setting" - tools:layout="@layout/fragment_setting" /> + tools:layout="@xml/fragment_setting" /> 初始化工具集失败 无法加载工具,该工具可能已损坏 + + 深色主题 + + 基本设置 + 语言 + 启动页 + + + 跟随系统 + 中文 + English + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index ae52f4b..b243dc4 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -22,4 +22,16 @@ 初始化工具集失败 无法加载工具,该工具可能已损坏 + + 深色主题 + + 基本设置 + 语言 + 启动页 + + + 跟随系统 + 中文 + English + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ae52f4b..b243dc4 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -22,4 +22,16 @@ 初始化工具集失败 无法加载工具,该工具可能已损坏 + + 深色主题 + + 基本设置 + 语言 + 启动页 + + + 跟随系统 + 中文 + English + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7678b12..deef1d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,4 +24,26 @@ Failed to initialize tools Can not load tool, it may be damaged + + Dark Theme + + Follow Device + Light + Dark + + + Base Settings + Language + app_language + + Follow System + 中文 + English + + + default + zh_CN + en_US + + Launch Page \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c1d96b1..866e994 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -19,4 +19,8 @@ wrap_content wrap_content + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_setting.xml b/app/src/main/res/xml/fragment_setting.xml new file mode 100644 index 0000000..98db574 --- /dev/null +++ b/app/src/main/res/xml/fragment_setting.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2fcc7ef..a550ce3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.1.2' apply false - id 'com.android.library' version '7.1.2' apply false + id 'com.android.application' version '7.2.1' apply false + id 'com.android.library' version '7.2.1' apply false } task clean(type: Delete) {