From af7e7c2581c9d1e39228a765af141e57686cf746 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 29 May 2015 02:54:40 +0000 Subject: [PATCH] Configurable language, part 1 --- .../config/AppearancePreferenceFragment.java | 36 +++++++++++ .../bote/android/config/SettingsActivity.java | 26 +++++++- .../i2p/bote/android/util/LocaleManager.java | 62 +++++++++++++++++++ app/src/main/res/values/arrays.xml | 32 ++++++++++ app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/settings.xml | 3 + app/src/main/res/xml/settings_appearance.xml | 10 +++ 7 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/i2p/bote/android/config/AppearancePreferenceFragment.java create mode 100644 app/src/main/java/i2p/bote/android/util/LocaleManager.java create mode 100644 app/src/main/res/xml/settings_appearance.xml diff --git a/app/src/main/java/i2p/bote/android/config/AppearancePreferenceFragment.java b/app/src/main/java/i2p/bote/android/config/AppearancePreferenceFragment.java new file mode 100644 index 0000000..a84b6e1 --- /dev/null +++ b/app/src/main/java/i2p/bote/android/config/AppearancePreferenceFragment.java @@ -0,0 +1,36 @@ +package i2p.bote.android.config; + +import android.os.Bundle; +import android.support.v4.preference.PreferenceFragment; + +import i2p.bote.android.R; + +public class AppearancePreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle paramBundle) { + super.onCreate(paramBundle); + addPreferencesFromResource(R.xml.settings_appearance); + } + + @Override + public void onStart() { + super.onStart(); + getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener( + (SettingsActivity) getActivity() + ); + } + + @Override + public void onResume() { + super.onResume(); + ((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_appearance); + } + + @Override + public void onStop() { + super.onStop(); + getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( + (SettingsActivity) getActivity() + ); + } +} diff --git a/app/src/main/java/i2p/bote/android/config/SettingsActivity.java b/app/src/main/java/i2p/bote/android/config/SettingsActivity.java index 37d370e..f3246bc 100644 --- a/app/src/main/java/i2p/bote/android/config/SettingsActivity.java +++ b/app/src/main/java/i2p/bote/android/config/SettingsActivity.java @@ -1,6 +1,7 @@ package i2p.bote.android.config; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.support.v4.app.Fragment; @@ -13,12 +14,17 @@ import i2p.bote.android.EmailListActivity; import i2p.bote.android.InitActivities; import i2p.bote.android.R; import i2p.bote.android.identities.IdentityListActivity; +import i2p.bote.android.util.LocaleManager; -public class SettingsActivity extends AppCompatActivity { +public class SettingsActivity extends AppCompatActivity implements + SharedPreferences.OnSharedPreferenceChangeListener { public static final String PREFERENCE_CATEGORY = "preference_category"; public static final String PREFERENCE_CATEGORY_GENERAL = "preference_category_general"; public static final String PREFERENCE_CATEGORY_CHANGE_PASSWORD = "preference_category_change_password"; public static final String PREFERENCE_CATEGORY_IDENTITIES = "preference_category_identities"; + public static final String PREFERENCE_CATEGORY_APPEARANCE = "preference_category_appearance"; + + private final LocaleManager localeManager = new LocaleManager(); // @@ -27,6 +33,7 @@ public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + localeManager.onCreate(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_toolbar); @@ -51,6 +58,12 @@ public class SettingsActivity extends AppCompatActivity { .commit(); } + @Override + public void onResume() { + super.onResume(); + localeManager.onResume(this); + } + @Override public boolean onSupportNavigateUp() { FragmentManager fragmentManager = getSupportFragmentManager(); @@ -65,6 +78,13 @@ public class SettingsActivity extends AppCompatActivity { return true; } + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (key.equals("pref_language")) { + localeManager.onResume(this); + } + } + // // Settings pages @@ -82,6 +102,8 @@ public class SettingsActivity extends AppCompatActivity { .setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_CHANGE_PASSWORD)); findPreference(PREFERENCE_CATEGORY_IDENTITIES) .setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_IDENTITIES)); + findPreference(PREFERENCE_CATEGORY_APPEARANCE) + .setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_APPEARANCE)); } @Override @@ -127,6 +149,8 @@ public class SettingsActivity extends AppCompatActivity { switch (category) { case PREFERENCE_CATEGORY_GENERAL: return new GeneralPreferenceFragment(); + case PREFERENCE_CATEGORY_APPEARANCE: + return new AppearancePreferenceFragment(); default: throw new AssertionError(); } diff --git a/app/src/main/java/i2p/bote/android/util/LocaleManager.java b/app/src/main/java/i2p/bote/android/util/LocaleManager.java new file mode 100644 index 0000000..c306c6e --- /dev/null +++ b/app/src/main/java/i2p/bote/android/util/LocaleManager.java @@ -0,0 +1,62 @@ +package i2p.bote.android.util; + +import android.app.Activity; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.preference.PreferenceManager; +import android.text.TextUtils; + +import java.util.Locale; + +public class LocaleManager { + private Locale currentLocale; + + public void onCreate(Activity activity) { + currentLocale = getSelectedLocale(activity); + setContextLocale(activity, currentLocale); + } + + public void onResume(Activity activity) { + // If the activity has the incorrect locale, restart it + if (!currentLocale.equals(getSelectedLocale(activity))) { + Intent intent = activity.getIntent(); + activity.finish(); + activity.overridePendingTransition(0, 0); + activity.startActivity(intent); + activity.overridePendingTransition(0, 0); + } + } + + public void updateServiceLocale(Service service) { + currentLocale = getSelectedLocale(service); + setContextLocale(service, currentLocale); + } + + private static Locale getSelectedLocale(Context context) { + String defaultLanguage = "zz"; + String selectedLanguage = PreferenceManager.getDefaultSharedPreferences(context).getString( + "pref_language", defaultLanguage + ); + String language[] = TextUtils.split(selectedLanguage, "_"); + + if (language[0].equals(defaultLanguage)) + return Locale.getDefault(); + else if (language.length == 2) + return new Locale(language[0], language[1]); + else + return new Locale(language[0]); + } + + private static void setContextLocale(Context context, Locale selectedLocale) { + Configuration configuration = context.getResources().getConfiguration(); + if (!configuration.locale.equals(selectedLocale)) { + configuration.locale = selectedLocale; + context.getResources().updateConfiguration( + configuration, + context.getResources().getDisplayMetrics() + ); + } + } +} diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3e307e5..3ada9ec 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -16,4 +16,36 @@ I2P Android @string/remote_i2p_router + + zz + en + zh + de + es + fr + in + nb + nl + pl + pt + ro + ru + sq + + + @string/settings_default + English + Chinese 中国的 + Deutsch + Español + Français + Indonesia + Norwegian Bokmål + Nederlands + Polski + Português + Română + Russian Pусский + Shqip + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57cd272..5e35dbb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,6 +213,9 @@ Router to use I2CP host I2CP port + Appearance + Language + Default Change password Old password New password diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 8c03cd1..522ca2d 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -9,4 +9,7 @@ + \ No newline at end of file diff --git a/app/src/main/res/xml/settings_appearance.xml b/app/src/main/res/xml/settings_appearance.xml new file mode 100644 index 0000000..834c662 --- /dev/null +++ b/app/src/main/res/xml/settings_appearance.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file