From 6d0bde716e308ea06f95f414c551e129674e486e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Apr 2017 12:50:59 +0200 Subject: [PATCH] fully replace language pref handling with Languages class closes #908 --- .../java/org/fdroid/fdroid/FDroidApp.java | 41 ++++--------------- .../java/org/fdroid/fdroid/Languages.java | 10 ++++- .../java/org/fdroid/fdroid/Preferences.java | 4 ++ .../views/fragments/PreferencesFragment.java | 6 +-- 4 files changed, 25 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java index 7009f4ebb..ed95dedef 100644 --- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java +++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java @@ -27,7 +27,6 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -36,16 +35,15 @@ import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.StrictMode; -import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; - import com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiskCache; import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; - +import info.guardianproject.netcipher.NetCipher; +import info.guardianproject.netcipher.proxy.OrbotHelper; import org.acra.ACRA; import org.acra.ReportingInteractionMode; import org.acra.annotation.ReportsCrashes; @@ -59,17 +57,13 @@ import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.installer.InstallHistoryService; import org.fdroid.fdroid.net.ImageLoaderForUIL; import org.fdroid.fdroid.net.WifiStateChangeService; +import sun.net.www.protocol.bluetooth.Handler; import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.security.Security; import java.util.List; -import java.util.Locale; - -import info.guardianproject.netcipher.NetCipher; -import info.guardianproject.netcipher.proxy.OrbotHelper; -import sun.net.www.protocol.bluetooth.Handler; @ReportsCrashes(mailTo = "reports@f-droid.org", mode = ReportingInteractionMode.DIALOG, @@ -82,8 +76,6 @@ public class FDroidApp extends Application { public static final String SYSTEM_DIR_NAME = Environment.getRootDirectory().getAbsolutePath(); - private static Locale locale; - // for the local repo on this device, all static since there is only one public static volatile int port; public static volatile String ipAddressString; @@ -181,25 +173,10 @@ public class FDroidApp extends Application { repo = new Repo(); } - public void updateLanguage() { - Context ctx = getBaseContext(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); - String lang = prefs.getString(Preferences.PREF_LANGUAGE, ""); - locale = Utils.getLocaleFromAndroidLangTag(lang); - applyLanguage(); - } - - private void applyLanguage() { - Context ctx = getBaseContext(); - Configuration cfg = new Configuration(); - cfg.locale = locale == null ? Locale.getDefault() : locale; - ctx.getResources().updateConfiguration(cfg, null); - } - @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - applyLanguage(); + Languages.setLanguage(this, Preferences.get().getLangauge(), false); } @Override @@ -215,7 +192,9 @@ public class FDroidApp extends Application { .penaltyLog() .build()); } - updateLanguage(); + Preferences.setup(this); + Languages.setup(getClass(), R.string.pref_language_default); + Languages.setLanguage(this, Preferences.get().getLangauge(), false); ACRA.init(this); if (isAcraProcess()) { @@ -224,10 +203,8 @@ public class FDroidApp extends Application { PRNGFixes.apply(); - Preferences.setup(this); curTheme = Preferences.get().getTheme(); Preferences.get().configureProxy(); - Languages.setup(getClass(), R.string.pref_language_default); InstalledAppProviderService.compareToPackageManager(this); AppUpdateStatusService.scanDownloadedApks(this); @@ -326,13 +303,13 @@ public class FDroidApp extends Application { /** * Asks if the current process is "org.fdroid.fdroid:acra". - * + *

* This is helpful for bailing out of the {@link FDroidApp#onCreate} method early, preventing * problems that arise from executing the code twice. This happens due to the `android:process` * statement in AndroidManifest.xml causes another process to be created to run * {@link org.fdroid.fdroid.acra.CrashReportActivity}. This was causing lots of things to be * started/run twice including {@link CleanCacheService} and {@link WifiStateChangeService}. - * + *

* Note that it is not perfect, because some devices seem to not provide a list of running app * processes when asked. In such situations, F-Droid may regress to the behaviour where some * services may run twice and thus cause weirdness or slowness. However that is probably better diff --git a/app/src/main/java/org/fdroid/fdroid/Languages.java b/app/src/main/java/org/fdroid/fdroid/Languages.java index 546605b06..5891d9123 100644 --- a/app/src/main/java/org/fdroid/fdroid/Languages.java +++ b/app/src/main/java/org/fdroid/fdroid/Languages.java @@ -25,6 +25,7 @@ public final class Languages { private static final Locale DEFAULT_LOCALE; private static final Locale TIBETAN = new Locale("bo"); + private static final Locale CHINESE_HONG_KONG = new Locale("zh", "HK"); private static final String DEFAULT_STRING = "System Default"; private static Locale locale; @@ -62,8 +63,10 @@ public final class Languages { tmpMap.put(Locale.SIMPLIFIED_CHINESE.toString(), "中文 (中国)"); // Chinese (China) } else if (locale.equals(Locale.TRADITIONAL_CHINESE)) { tmpMap.put(Locale.TRADITIONAL_CHINESE.toString(), "中文 (台灣)"); // Chinese (Taiwan) + } else if (locale.equals(CHINESE_HONG_KONG)) { + tmpMap.put(CHINESE_HONG_KONG.toString(), "中文 (香港)"); // Chinese (Hong Kong) } else { - tmpMap.put(locale.getLanguage(), locale.getDisplayLanguage(locale)); + tmpMap.put(locale.getLanguage(), capitalize(locale.getDisplayLanguage(locale))); } } @@ -196,6 +199,10 @@ public final class Languages { return keys.toArray(new String[keys.size()]); } + private String capitalize(final String line) { + return Character.toUpperCase(line.charAt(0)) + line.substring(1); + } + private static final Locale[] LOCALES_TO_TEST = { Locale.ENGLISH, Locale.FRENCH, @@ -205,6 +212,7 @@ public final class Languages { Locale.KOREAN, Locale.SIMPLIFIED_CHINESE, Locale.TRADITIONAL_CHINESE, + CHINESE_HONG_KONG, TIBETAN, new Locale("af"), new Locale("am"), diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index a3b8d7936..92977927e 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -229,6 +229,10 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh .replaceAll(" ", "-"); } + public String getLangauge() { + return preferences.getString(Preferences.PREF_LANGUAGE, ""); + } + public String getLocalRepoName() { return preferences.getString(PREF_LOCAL_REPO_NAME, getDefaultLocalRepoName()); } diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java index f8c918e47..ed50137d5 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java @@ -17,7 +17,6 @@ import info.guardianproject.netcipher.NetCipher; import info.guardianproject.netcipher.proxy.OrbotHelper; import org.fdroid.fdroid.AppDetails2; import org.fdroid.fdroid.CleanCacheService; -import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Languages; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; @@ -142,8 +141,9 @@ public class PreferencesFragment extends PreferenceFragment case Preferences.PREF_LANGUAGE: entrySummary(key); if (changing) { - // TODO: Ask MainActivity to restart itself. - ((FDroidApp) getActivity().getApplication()).updateLanguage(); + Activity activity = getActivity(); + Languages.setLanguage(activity, Preferences.get().getLangauge(), false); + Languages.forceChangeLanguage(activity); } break;