[tor-commits] [orbot/master] rework setting locale from pref to have a lighter touch and be dynamic
n8fr8 at torproject.org
n8fr8 at torproject.org
Thu Jun 25 14:59:58 UTC 2015
commit fbf9932be3f44f7e43f2672217a6ce05f23668f8
Author: Hans-Christoph Steiner <hans at eds.org>
Date: Fri Jun 5 17:09:10 2015 -0400
rework setting locale from pref to have a lighter touch and be dynamic
This leaves the default Locale unchanged, i.e. Locale.setDefault(). This
also will immediately change the language after the user selects it in the
pref.
---
src/org/torproject/android/OrbotApp.java | 115 +++++++++++---------
src/org/torproject/android/OrbotMainActivity.java | 46 ++------
.../android/settings/SettingsPreferences.java | 45 ++++----
3 files changed, 95 insertions(+), 111 deletions(-)
diff --git a/src/org/torproject/android/OrbotApp.java b/src/org/torproject/android/OrbotApp.java
index 744d538..070d7d7 100644
--- a/src/org/torproject/android/OrbotApp.java
+++ b/src/org/torproject/android/OrbotApp.java
@@ -1,72 +1,87 @@
-package org.torproject.android;
-
-import java.util.Locale;
-import org.torproject.android.service.TorServiceUtils;
+package org.torproject.android;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Application;
+import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
-import android.preference.PreferenceManager;
+import android.os.Build;
+import android.text.TextUtils;
+import android.util.Log;
import info.guardianproject.util.Languages;
+import org.torproject.android.service.TorServiceUtils;
+
+import java.util.Locale;
+
public class OrbotApp extends Application implements OrbotConstants
{
- private Locale locale;
- private final static String DEFAULT_LOCALE = "en";
- private SharedPreferences settings;
-
- @Override
+ private Locale locale;
+ private SharedPreferences prefs;
+
+ @Override
public void onCreate() {
super.onCreate();
-
- settings = TorServiceUtils.getSharedPrefs(getApplicationContext());
- Configuration config = getResources().getConfiguration();
-
- String lang = settings.getString(PREF_DEFAULT_LOCALE, DEFAULT_LOCALE);
-
- if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
- {
- if (lang.equals("xx"))
- {
- locale = Locale.getDefault();
-
- }
- else
- locale = new Locale(lang);
-
- Locale.setDefault(locale);
-
- Configuration myConfig = new Configuration(config);
- myConfig.locale = locale;
-
- getResources().updateConfiguration(myConfig, getResources().getDisplayMetrics());
- }
-
-
+ prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+ setNewLocale(prefs.getString(PREF_DEFAULT_LOCALE, Locale.getDefault().getLanguage()));
}
-
+
@Override
- public void onConfigurationChanged(Configuration newConfig)
- {
+ public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
+ Log.i(TAG, "onConfigurationChanged " + newConfig.locale.getLanguage());
+ setNewLocale(prefs.getString(PREF_DEFAULT_LOCALE, Locale.getDefault().getLanguage()));
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+ public void setNewLocale(String language) {
+ if (TextUtils.isEmpty(language))
+ return;
+
+ if (locale != null && TextUtils.equals(locale.getLanguage(), language))
+ return; // already configured
+
+ /* handle locales with the country in it, i.e. zh_CN, zh_TW, etc */
+ String localeSplit[] = language.split("_");
+ if (localeSplit.length > 1)
+ locale = new Locale(localeSplit[0], localeSplit[1]);
+ else
+ locale = new Locale(language);
+ Configuration config = getResources().getConfiguration();
+ if (Build.VERSION.SDK_INT >= 17)
+ config.setLocale(locale);
+ else
+ config.locale = locale;
+ getResources().updateConfiguration(config, getResources().getDisplayMetrics());
+
+ /*
+ * Set the preference after setting the locale in case something goes
+ * wrong. If setting the locale causes an Exception, it should be set in
+ * the preferences, otherwise ChatSecure will be stuck in a crash loop.
+ */
+ SharedPreferences prefs = TorServiceUtils.getSharedPrefs(this);
+ Editor prefEdit = prefs.edit();
+ prefEdit.putString(PREF_DEFAULT_LOCALE, language);
+ prefEdit.apply();
+ Log.i(TAG, "setNewLocale complete: locale: " + locale.getLanguage()
+ + " Locale.getDefault: " + Locale.getDefault().getLanguage());
+ }
- String lang = settings.getString(PREF_DEFAULT_LOCALE, DEFAULT_LOCALE);
-
- if (! "".equals(lang) && ! newConfig.locale.getLanguage().equals(lang))
- {
- locale = new Locale(lang);
- Locale.setDefault(locale);
-
- Configuration myConfig = new Configuration(newConfig);
- myConfig.locale = locale;
-
- getResources().updateConfiguration(myConfig, getResources().getDisplayMetrics());
- }
+ public static void forceChangeLanguage(Activity activity) {
+ Intent intent = activity.getIntent();
+ if (intent == null) // when launched as LAUNCHER
+ intent = new Intent(activity, OrbotMainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ activity.finish();
+ activity.overridePendingTransition(0, 0);
+ activity.startActivity(intent);
+ activity.overridePendingTransition(0, 0);
}
public static Languages getLanguages(Activity activity) {
diff --git a/src/org/torproject/android/OrbotMainActivity.java b/src/org/torproject/android/OrbotMainActivity.java
index 3e577ad..a721a45 100644
--- a/src/org/torproject/android/OrbotMainActivity.java
+++ b/src/org/torproject/android/OrbotMainActivity.java
@@ -95,6 +95,7 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
private final static long INIT_DELAY = 100;
private final static int REQUEST_VPN = 8888;
+ private final static int REQUEST_SETTINGS = 0x9874;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
@@ -102,8 +103,6 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
mPrefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
mPrefs.registerOnSharedPreferenceChangeListener(this);
-
- setLocale();
doLayout();
@@ -390,7 +389,8 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
if (item.getItemId() == R.id.menu_settings)
{
- showSettings();
+ Intent intent = new Intent(OrbotMainActivity.this, SettingsPreferences.class);
+ startActivityForResult(intent, REQUEST_SETTINGS);
}
else if (item.getItemId() == R.id.menu_wizard)
{
@@ -804,25 +804,15 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
{
return false;
}
- }
-
- /*
- * Load the basic settings application to display torrc
- */
- private void showSettings ()
- {
-
- startActivityForResult(new Intent(this, SettingsPreferences.class), 1);
- }
-
+ }
@Override
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
-
-
- if (request == 1 && response == RESULT_OK)
+
+ if (request == REQUEST_SETTINGS && response == RESULT_OK)
{
+ OrbotApp.forceChangeLanguage(this);
if (data != null && data.getBooleanExtra("transproxywipe", false))
{
@@ -1160,13 +1150,11 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
boolean useBridges = mPrefs.getBoolean("pref_bridges_enabled", false);
mBtnBridges.setChecked(useBridges);
}
-
+
mHandler.postDelayed(new Runnable ()
{
public void run ()
{
-
- setLocale();
handleIntents();
@@ -1427,24 +1415,6 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
};
-
- // this is the connection that gets called back when a successfull bind occurs
- // we should use this to activity monitor unbind so that we don't have to call
- // bindService() a million times
-
- private void setLocale ()
- {
- Configuration config = getResources().getConfiguration();
- String lang = mPrefs.getString(PREF_DEFAULT_LOCALE, "");
-
- if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
- {
- Locale locale = new Locale(lang);
- Locale.setDefault(locale);
- config.locale = locale;
- getResources().updateConfiguration(config, getResources().getDisplayMetrics());
- }
- }
@Override
protected void onDestroy() {
diff --git a/src/org/torproject/android/settings/SettingsPreferences.java b/src/org/torproject/android/settings/SettingsPreferences.java
index f20898b..5c02d2b 100644
--- a/src/org/torproject/android/settings/SettingsPreferences.java
+++ b/src/org/torproject/android/settings/SettingsPreferences.java
@@ -6,12 +6,12 @@ package org.torproject.android.settings;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;
@@ -20,6 +20,7 @@ import info.guardianproject.util.Languages;
import org.sufficientlysecure.rootcommands.RootCommands;
import org.sufficientlysecure.rootcommands.Shell;
+import org.torproject.android.OrbotApp;
import org.torproject.android.R;
import org.torproject.android.service.TorServiceUtils;
@@ -56,6 +57,26 @@ public class SettingsPreferences
Languages languages = Languages.get(this, R.string.menu_settings, "Settings");
prefLocale.setEntries(languages.getAllNames());
prefLocale.setEntryValues(languages.getSupportedLocales());
+ prefLocale.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ String language = (String) newValue;
+ if (preference == prefLocale) {
+ SharedPreferences settings = TorServiceUtils
+ .getSharedPrefs(getApplicationContext());
+
+ String lang = settings.getString("pref_default_locale",
+ Locale.getDefault().getLanguage());
+ OrbotApp app = (OrbotApp) getApplication();
+ app.setNewLocale(language);
+ lang = settings.getString("pref_default_locale",
+ Locale.getDefault().getLanguage());
+ OrbotApp.forceChangeLanguage(SettingsPreferences.this);
+ }
+ return false;
+ }
+ });
prefCBTransProxy = (CheckBoxPreference) findPreference("pref_transparent");
prefcBTransProxyAll = (CheckBoxPreference) findPreference("pref_transparent_all");
@@ -132,28 +153,6 @@ public class SettingsPreferences
prefHiddenServicesPorts.setEnabled(prefHiddenServices.isChecked());
prefHiddenServicesHostname.setEnabled(prefHiddenServices.isChecked());
}
- else if (preference == prefLocale)
- {
- SharedPreferences settings = TorServiceUtils.getSharedPrefs(getApplicationContext());
-
- Configuration config = getResources().getConfiguration();
-
- String lang = settings.getString("pref_default_locale", "en");
-
- Locale locale;
-
- if (lang.equals("xx"))
- {
- locale = Locale.getDefault();
- }
- else
- locale = new Locale(lang);
-
- Locale.setDefault(locale);
- config.locale = locale;
- getResources().updateConfiguration(config, getResources().getDisplayMetrics());
-
- }
else
{
prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked());
More information about the tor-commits
mailing list