[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