diff --git a/app/src/main/java/eu/faircode/email/ApplicationEx.java b/app/src/main/java/eu/faircode/email/ApplicationEx.java index 0782081253..bd5422f480 100644 --- a/app/src/main/java/eu/faircode/email/ApplicationEx.java +++ b/app/src/main/java/eu/faircode/email/ApplicationEx.java @@ -39,14 +39,24 @@ import android.webkit.CookieManager; import androidx.preference.PreferenceManager; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; -public class ApplicationEx extends Application { +public class ApplicationEx extends Application implements SharedPreferences.OnSharedPreferenceChangeListener { private Thread.UncaughtExceptionHandler prev = null; + private static final List OPTIONS_RESTART = Collections.unmodifiableList(Arrays.asList( + "secure", // privacy + "shortcuts", // misc + "language", // misc + "query_threads" // misc + )); + @Override protected void attachBaseContext(Context base) { super.attachBaseContext(getLocalizedContext(base)); @@ -54,14 +64,26 @@ public class ApplicationEx extends Application { static Context getLocalizedContext(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean english = prefs.getBoolean("english", false); - if (english) { + if (prefs.contains("english")) { + boolean english = prefs.getBoolean("english", false); + if (english) + prefs.edit() + .remove("english") + .putString("language", Locale.US.toLanguageTag()) + .commit(); + } + + String language = prefs.getString("language", null); + if (language != null) { + Locale locale = Locale.forLanguageTag(language); + Locale.setDefault(locale); Configuration config = new Configuration(context.getResources().getConfiguration()); - config.setLocale(Locale.US); + config.setLocale(locale); return context.createConfigurationContext(config); - } else - return context; + } + + return context; } @Override @@ -81,6 +103,7 @@ public class ApplicationEx extends Application { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final boolean crash_reports = prefs.getBoolean("crash_reports", false); + prefs.registerOnSharedPreferenceChangeListener(this); prev = Thread.getDefaultUncaughtExceptionHandler(); @@ -136,6 +159,19 @@ public class ApplicationEx extends Application { Log.i("App created " + (end - start) + " ms"); } + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (OPTIONS_RESTART.contains(key)) + restart(); + } + + void restart() { + Intent intent = new Intent(this, ActivityMain.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + Runtime.getRuntime().exit(0); + } + @Override public void onTrimMemory(int level) { Log.logMemory(this, "Trim memory level=" + level); diff --git a/app/src/main/java/eu/faircode/email/FragmentBase.java b/app/src/main/java/eu/faircode/email/FragmentBase.java index 1eb5deac19..0c15999f21 100644 --- a/app/src/main/java/eu/faircode/email/FragmentBase.java +++ b/app/src/main/java/eu/faircode/email/FragmentBase.java @@ -176,13 +176,6 @@ public class FragmentBase extends Fragment { finish = true; } - protected void restart() { - Intent intent = new Intent(getContext(), ActivityMain.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); - Runtime.getRuntime().exit(0); - } - @Override public void onSaveInstanceState(Bundle outState) { Log.d("Save instance " + this); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 661572df13..b33f451ab3 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -39,8 +39,11 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CompoundButton; +import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -59,6 +62,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.SortedMap; import javax.net.ssl.SSLSocket; @@ -74,7 +78,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swFts; private TextView tvFtsIndexed; private TextView tvFtsPro; - private SwitchCompat swEnglish; + private Spinner spLanguage; private SwitchCompat swWatchdog; private SwitchCompat swUpdates; private SwitchCompat swExperiments; @@ -105,7 +109,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private Group grpDebug; private final static String[] RESET_OPTIONS = new String[]{ - "shortcuts", "fts", "english", "watchdog", "updates", + "shortcuts", "fts", "language", "watchdog", "updates", "experiments", "query_threads", "crash_reports", "cleanup_attachments", "protocol", "debug", "auth_plain", "auth_login", "auth_sasl" }; @@ -135,7 +139,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swFts = view.findViewById(R.id.swFts); tvFtsIndexed = view.findViewById(R.id.tvFtsIndexed); tvFtsPro = view.findViewById(R.id.tvFtsPro); - swEnglish = view.findViewById(R.id.swEnglish); + spLanguage = view.findViewById(R.id.spLanguage); swWatchdog = view.findViewById(R.id.swWatchdog); swUpdates = view.findViewById(R.id.swUpdates); swExperiments = view.findViewById(R.id.swExperiments); @@ -182,7 +186,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("shortcuts", checked).commit(); // apply won't work here - restart(); } }); @@ -225,11 +228,20 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc Helper.linkPro(tvFtsPro); - swEnglish.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + spLanguage.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { - prefs.edit().putBoolean("english", checked).commit(); // apply won't work here - restart(); + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + if (position == 0) + onNothingSelected(adapterView); + else { + String tag = getResources().getAssets().getLocales()[position - 1]; + prefs.edit().putString("language", tag).commit(); // apply won't work here + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + prefs.edit().remove("language").commit(); // apply won't work here } }); @@ -274,7 +286,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc prefs.edit().putInt("query_threads", 2).commit(); // apply won't work here else prefs.edit().remove("query_threads").commit(); // apply won't work here - restart(); } }); @@ -593,7 +604,27 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swExternalSearch.setChecked(state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED); swShortcuts.setChecked(prefs.getBoolean("shortcuts", true)); swFts.setChecked(prefs.getBoolean("fts", false)); - swEnglish.setChecked(prefs.getBoolean("english", false)); + + String language = prefs.getString("language", null); + String[] languages = getResources().getAssets().getLocales(); + + int selected = -1; + List display = new ArrayList<>(); + display.add(getString(R.string.title_advanced_language_system)); + for (int pos = 0; pos < languages.length; pos++) { + String lang = languages[pos]; + Locale loc = Locale.forLanguageTag(lang); + display.add(loc.getDisplayName() + " [" + lang + "]"); + if (lang.equals(language)) + selected = pos + 1; + } + + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, android.R.id.text1, display); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spLanguage.setAdapter(adapter); + if (selected >= 0) + spLanguage.setSelection(selected); + swWatchdog.setChecked(prefs.getBoolean("watchdog", true)); swUpdates.setChecked(prefs.getBoolean("updates", true)); swUpdates.setVisibility( diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java b/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java index f0310a2fa6..0f4ee416b3 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java @@ -230,7 +230,6 @@ public class FragmentOptionsPrivacy extends FragmentBase implements SharedPrefer @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("secure", checked).commit(); // apply won't work here - restart(); } }); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index d35011563f..878f2069f8 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -112,28 +112,39 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvFtsIndexed" /> - + app:layout_constraintTop_toBottomOf="@id/tvFtsPro" /> + + + app:layout_constraintTop_toBottomOf="@id/spLanguage" /> Detect message text language Build search index %1$d / %2$d messages indexed (%3$s) - Use US country settings + Language + System Periodically check if FairEmail is still active PLAIN LOGIN