Configurable language, part 1

This commit is contained in:
str4d
2015-05-29 02:54:40 +00:00
parent d0b47cd577
commit af7e7c2581
7 changed files with 171 additions and 1 deletions

View File

@@ -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()
);
}
}

View File

@@ -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();
}

View File

@@ -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()
);
}
}
}

View File

@@ -16,4 +16,36 @@
<item>I2P Android</item>
<item>@string/remote_i2p_router</item>
</string-array>
<string-array name="languages">
<item>zz</item>
<item>en</item>
<item>zh</item>
<item>de</item>
<item>es</item>
<item>fr</item>
<item>in</item>
<item>nb</item>
<item>nl</item>
<item>pl</item>
<item>pt</item>
<item>ro</item>
<item>ru</item>
<item>sq</item>
</string-array>
<string-array name="language_names">
<item>@string/settings_default</item>
<item>English</item>
<item>Chinese 中国的</item>
<item>Deutsch</item>
<item>Español</item>
<item>Français</item>
<item>Indonesia</item>
<item>Norwegian Bokmål</item>
<item>Nederlands</item>
<item>Polski</item>
<item>Português</item>
<item>Română</item>
<item>Russian Pусский</item>
<item>Shqip</item>
</string-array>
</resources>

View File

@@ -213,6 +213,9 @@
<string name="pref_dialog_title_router">Router to use</string>
<string name="pref_title_i2cp_host">I2CP host</string>
<string name="pref_title_i2cp_port">I2CP port</string>
<string name="settings_label_appearance">Appearance</string>
<string name="settings_label_language">Language</string>
<string name="settings_default">Default</string>
<string name="pref_title_change_password">Change password</string>
<string name="old_password">Old password</string>
<string name="new_password">New password</string>

View File

@@ -9,4 +9,7 @@
<Preference
android:key="preference_category_identities"
android:title="@string/pref_title_identities"/>
<Preference
android:key="preference_category_appearance"
android:title="@string/settings_label_appearance" />
</PreferenceScreen>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:defaultValue="zz"
android:entries="@array/language_names"
android:entryValues="@array/languages"
android:key="pref_language"
android:summary="%s"
android:title="@string/settings_label_language" />
</PreferenceScreen>