From bd6585765e1d30ce186e87c083942975ed8185e6 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 22 Jul 2017 22:14:02 +0800 Subject: [PATCH] Add locale settings --- .../com/topjohnwu/magisk/MagiskManager.java | 44 ++++++++++++++++- .../topjohnwu/magisk/SettingsActivity.java | 48 ++++++++++++++++++- .../topjohnwu/magisk/components/Activity.java | 11 +++++ .../magisk/superuser/SuLogEntry.java | 6 ++- .../com/topjohnwu/magisk/utils/Utils.java | 46 ++++++++++++++++++ app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/app_settings.xml | 1 + 9 files changed, 157 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java index f984cbd0b..a3d29041f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -5,22 +5,27 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; import android.os.Handler; import android.preference.PreferenceManager; import android.text.TextUtils; import android.widget.Toast; +import com.topjohnwu.magisk.asyncs.ParallelTask; import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.database.SuDatabaseHelper; import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.utils.CallbackEvent; +import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.SafetyNetHelper; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; import java.io.File; import java.util.List; +import java.util.Locale; import java.util.Map; public class MagiskManager extends Application { @@ -45,6 +50,7 @@ public class MagiskManager extends Application { public final CallbackEvent repoLoadDone = new CallbackEvent<>(); public final CallbackEvent updateCheckDone = new CallbackEvent<>(); public final CallbackEvent safetyNetDone = new CallbackEvent<>(); + public final CallbackEvent localeDone = new CallbackEvent<>(); // Info public String magiskVersionString; @@ -65,10 +71,13 @@ public class MagiskManager extends Application { // Data public Map moduleMap; public List blockList; + public List locales; // Configurations public static boolean shellLogging; public static boolean devLogging; + public static Locale locale; + public static Locale defaultLocale; public boolean magiskHide; public boolean isDarkTheme; @@ -90,6 +99,37 @@ public class MagiskManager extends Application { private static Handler mHandler = new Handler(); + private static class LoadLocale extends ParallelTask { + + LoadLocale(Context context) { + super(context); + } + + @Override + protected Void doInBackground(Void... voids) { + getMagiskManager().locales = Utils.getAvailableLocale(getMagiskManager()); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + getMagiskManager().localeDone.trigger(); + } + } + + public void setLocale() { + String localeTag = prefs.getString("locale", ""); + if (localeTag.isEmpty()) { + locale = defaultLocale; + } else { + locale = Locale.forLanguageTag(localeTag); + } + Resources res = getBaseContext().getResources(); + Configuration config = new Configuration(res.getConfiguration()); + config.setLocale(locale); + res.updateConfiguration(config, res.getDisplayMetrics()); + } + @Override public void onCreate() { super.onCreate(); @@ -98,6 +138,9 @@ public class MagiskManager extends Application { shell = Shell.getShell(); suDB = new SuDatabaseHelper(this); repoDB = new RepoDatabaseHelper(this); + defaultLocale = Locale.getDefault(); + setLocale(); + new LoadLocale(this).exec(); } public void toast(String msg, int duration) { @@ -117,7 +160,6 @@ public class MagiskManager extends Application { devLogging = false; shellLogging = false; } - magiskHide = prefs.getBoolean("magiskhide", true); initSU(); updateMagiskInfo(); updateBlockInfo(); diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java index a7c5fb875..ed4c02cc8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -15,10 +15,13 @@ import android.widget.Toast; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.database.SuDatabaseHelper; +import com.topjohnwu.magisk.utils.CallbackEvent; import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; +import java.util.Locale; + import butterknife.BindView; import butterknife.ButterKnife; @@ -55,13 +58,15 @@ public class SettingsActivity extends Activity { } public static class SettingsFragment extends PreferenceFragment - implements SharedPreferences.OnSharedPreferenceChangeListener { + implements SharedPreferences.OnSharedPreferenceChangeListener, + CallbackEvent.Listener{ private SharedPreferences prefs; private PreferenceScreen prefScreen; private ListPreference suAccess, autoRes, suNotification, requestTimeout, multiuserMode, namespaceMode; private MagiskManager magiskManager; + private PreferenceCategory generalCatagory; @Override public void onCreate(Bundle savedInstanceState) { @@ -71,6 +76,7 @@ public class SettingsActivity extends Activity { prefScreen = getPreferenceScreen(); magiskManager = Utils.getMagiskManager(getActivity()); + generalCatagory = (PreferenceCategory) findPreference("general"); PreferenceCategory magiskCategory = (PreferenceCategory) findPreference("magisk"); PreferenceCategory suCategory = (PreferenceCategory) findPreference("superuser"); PreferenceCategory developer = (PreferenceCategory) findPreference("developer"); @@ -118,16 +124,41 @@ public class SettingsActivity extends Activity { } } + private ListPreference setLocalePreference(ListPreference lp) { + if (lp == null) { + lp = new ListPreference(getActivity()); + } + CharSequence[] entries = new CharSequence[magiskManager.locales.size() + 1]; + CharSequence[] entryValues = new CharSequence[magiskManager.locales.size() + 1]; + entries[0] = getString(R.string.system_default); + entryValues[0] = ""; + int i = 1; + for (Locale locale : magiskManager.locales) { + entries[i] = locale.getDisplayName(locale); + entryValues[i++] = locale.toLanguageTag(); + } + lp.setEntries(entries); + lp.setEntryValues(entryValues); + lp.setTitle(R.string.language); + lp.setKey("locale"); + lp.setSummary(MagiskManager.locale.getDisplayName(MagiskManager.locale)); + return lp; + } + @Override public void onResume() { super.onResume(); prefs.registerOnSharedPreferenceChangeListener(this); + magiskManager.localeDone.register(this); + if (magiskManager.localeDone.isTriggered) + onTrigger(null); } @Override public void onPause() { super.onPause(); prefs.unregisterOnSharedPreferenceChangeListener(this); + magiskManager.localeDone.unRegister(this); } @Override @@ -200,6 +231,11 @@ public class SettingsActivity extends Activity { case "shell_logging": MagiskManager.shellLogging = prefs.getBoolean("shell_logging", false); break; + case "locale": + magiskManager.setLocale(); + magiskManager.reloadMainActivity.trigger(); + getActivity().recreate(); + break; } setSummary(); } @@ -218,6 +254,16 @@ public class SettingsActivity extends Activity { namespaceMode.setSummary(getResources() .getStringArray(R.array.namespace_summary)[magiskManager.suNamespaceMode]); } + + @Override + public void onTrigger(CallbackEvent event) { + ListPreference language = setLocalePreference(null); + language.setOnPreferenceClickListener((pref) -> { + setLocalePreference((ListPreference) pref); + return false; + }); + generalCatagory.addPreference(language); + } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/components/Activity.java b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java index 055d2b19a..cd0943cd4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/components/Activity.java +++ b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java @@ -1,13 +1,24 @@ package com.topjohnwu.magisk.components; +import android.content.res.Configuration; import android.support.v7.app.AppCompatActivity; import android.view.WindowManager; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.utils.Utils; + +import java.util.Locale; public class Activity extends AppCompatActivity { + public Activity() { + super(); + Configuration configuration = new Configuration(); + configuration.setLocale(MagiskManager.locale); + applyOverrideConfiguration(configuration); + } + @Override public MagiskManager getApplicationContext() { return (MagiskManager) super.getApplicationContext(); diff --git a/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogEntry.java b/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogEntry.java index a0bd0427e..b7c84f9ee 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogEntry.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogEntry.java @@ -5,6 +5,8 @@ import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; +import com.topjohnwu.magisk.MagiskManager; + import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -48,11 +50,11 @@ public class SuLogEntry implements Parcelable { } public String getDateString() { - return DateFormat.getDateInstance(DateFormat.MEDIUM).format(date); + return DateFormat.getDateInstance(DateFormat.MEDIUM, MagiskManager.locale).format(date); } public String getTimeString() { - return new SimpleDateFormat("h:mm a", Locale.US).format(date); + return new SimpleDateFormat("h:mm a", MagiskManager.locale).format(date); } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java index 10a5c4995..76b703567 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -10,18 +10,23 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Environment; import android.provider.OpenableColumns; +import android.support.annotation.IdRes; +import android.support.annotation.StringRes; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.support.v4.app.TaskStackBuilder; import android.support.v7.app.NotificationCompat; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.widget.Toast; import com.topjohnwu.magisk.MagiskManager; @@ -33,7 +38,12 @@ import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.receivers.ManagerUpdate; import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; import java.util.List; +import java.util.Locale; public class Utils { @@ -246,4 +256,40 @@ public class Utils { public static void rmMagiskHide(Shell shell, String pkg) { shell.su_raw("magiskhide --rm " + pkg); } + + public static String getLocaleString(Context context, Locale locale, @StringRes int id) { + Configuration config = context.getResources().getConfiguration(); + config.setLocale(locale); + Context localizedContext = context.createConfigurationContext(config); + return localizedContext.getString(id); + } + + public static List getAvailableLocale(Context context) { + List locales = new ArrayList<>(); + HashSet set = new HashSet<>(); + Locale locale; + + // Add default locale + locales.add(Locale.ENGLISH); + set.add(getLocaleString(context, Locale.ENGLISH, R.string.download)); + + // Add some special locales + locales.add(Locale.TAIWAN); + set.add(getLocaleString(context, Locale.TAIWAN, R.string.download)); + locale = new Locale("pt", "BR"); + locales.add(locale); + set.add(getLocaleString(context, locale, R.string.download)); + + // Other locales + for (String s : context.getAssets().getLocales()) { + locale = Locale.forLanguageTag(s); + if (set.add(getLocaleString(context, locale, R.string.download))) { + locales.add(locale); + } + } + + Collections.sort(locales, (l1, l2) -> l1.getDisplayName(l1).compareTo(l2.getDisplayName(l2))); + + return locales; + } } \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 53608e682..db157175c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -192,5 +192,6 @@ PID:\u0020 대상 UID:\u0020 명령:\u0020 + 다운로드 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 16d6c60e8..45c16c46e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -219,5 +219,7 @@ 重新安裝 更新 Magisk 更新 + (系統預設) + 語言 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e2066934..0e16fcd15 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -145,6 +145,8 @@ Show update notifications when new version is available Clear Repo Cache Clear the cached information for online repos, forces the app to refresh online + Language + (System Default) Magisk Core Only Mode Enable only core features, all modules will not be loaded. MagiskSU, MagiskHide, and systemless hosts will still be enabled diff --git a/app/src/main/res/xml/app_settings.xml b/app/src/main/res/xml/app_settings.xml index af09ae9bb..2a0ba468a 100644 --- a/app/src/main/res/xml/app_settings.xml +++ b/app/src/main/res/xml/app_settings.xml @@ -2,6 +2,7 @@ android:layout_marginTop="?attr/actionBarSize" xmlns:android="http://schemas.android.com/apk/res/android">