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