Merge "Adding empty locale-config case" into tm-dev
diff --git a/core/java/com/android/internal/app/AppLocaleStore.java b/core/java/com/android/internal/app/AppLocaleStore.java
index 76e5898..f958385 100644
--- a/core/java/com/android/internal/app/AppLocaleStore.java
+++ b/core/java/com/android/internal/app/AppLocaleStore.java
@@ -16,6 +16,8 @@
package com.android.internal.app;
+import static com.android.internal.app.AppLocaleStore.AppLocaleResult.LocaleStatus;
+
import android.app.LocaleConfig;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -25,41 +27,43 @@
import java.util.ArrayList;
import java.util.Locale;
-public class AppLocaleStore {
+class AppLocaleStore {
private static final String TAG = AppLocaleStore.class.getSimpleName();
- public static ArrayList<Locale> getAppSupportedLocales(Context context, String packageName) {
+ public static AppLocaleResult getAppSupportedLocales(
+ Context context, String packageName) {
+ LocaleConfig localeConfig = null;
+ AppLocaleResult.LocaleStatus localeStatus = LocaleStatus.UNKNOWN_FAILURE;
ArrayList<Locale> appSupportedLocales = new ArrayList<>();
- LocaleList packageLocaleList = getPackageLocales(context, packageName);
- if (packageLocaleList != null && packageLocaleList.size() > 0) {
- for (int i = 0; i < packageLocaleList.size(); i++) {
- appSupportedLocales.add(packageLocaleList.get(i));
- }
- Log.d(TAG, "getAppSupportedLocales from LocaleConfig. Size: "
- + appSupportedLocales.size());
- } else {
- String[] languages = getAssetLocales(context, packageName);
- for (String language : languages) {
- appSupportedLocales.add(Locale.forLanguageTag(language));
- }
- Log.d(TAG, "getAppSupportedLocales from asset. Size: "
- + appSupportedLocales.size());
- }
- return appSupportedLocales;
- }
-
- private static LocaleList getPackageLocales(Context context, String packageName) {
try {
- LocaleConfig localeConfig =
- new LocaleConfig(context.createPackageContext(packageName, 0));
- if (localeConfig.getStatus() == LocaleConfig.STATUS_SUCCESS) {
- return localeConfig.getSupportedLocales();
- }
+ localeConfig = new LocaleConfig(context.createPackageContext(packageName, 0));
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Can not found the package name : " + packageName + " / " + e);
}
- return null;
+
+ if (localeConfig != null) {
+ if (localeConfig.getStatus() == LocaleConfig.STATUS_SUCCESS) {
+ LocaleList packageLocaleList = localeConfig.getSupportedLocales();
+ if (packageLocaleList.size() > 0) {
+ localeStatus = LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG;
+ for (int i = 0; i < packageLocaleList.size(); i++) {
+ appSupportedLocales.add(packageLocaleList.get(i));
+ }
+ } else {
+ localeStatus = LocaleStatus.NO_SUPPORTED_LANGUAGE;
+ }
+ } else if (localeConfig.getStatus() == LocaleConfig.STATUS_NOT_SPECIFIED) {
+ localeStatus = LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_ASSET;
+ String[] languages = getAssetLocales(context, packageName);
+ for (String language : languages) {
+ appSupportedLocales.add(Locale.forLanguageTag(language));
+ }
+ }
+ }
+ Log.d(TAG, "getAppSupportedLocales(). status: " + localeStatus
+ + ", appSupportedLocales:" + appSupportedLocales.size());
+ return new AppLocaleResult(localeStatus, appSupportedLocales);
}
private static String[] getAssetLocales(Context context, String packageName) {
@@ -82,4 +86,20 @@
return new String[0];
}
+ static class AppLocaleResult {
+ enum LocaleStatus {
+ UNKNOWN_FAILURE,
+ NO_SUPPORTED_LANGUAGE,
+ GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG,
+ GET_SUPPORTED_LANGUAGE_FROM_ASSET,
+ }
+
+ LocaleStatus mLocaleStatus;
+ ArrayList<Locale> mAppSupportedLocales;
+
+ public AppLocaleResult(LocaleStatus localeStatus, ArrayList<Locale> appSupportedLocales) {
+ this.mLocaleStatus = localeStatus;
+ this.mAppSupportedLocales = appSupportedLocales;
+ }
+ }
}
diff --git a/core/java/com/android/internal/app/LocalePickerWithRegion.java b/core/java/com/android/internal/app/LocalePickerWithRegion.java
index b81bd47..213af26 100644
--- a/core/java/com/android/internal/app/LocalePickerWithRegion.java
+++ b/core/java/com/android/internal/app/LocalePickerWithRegion.java
@@ -16,6 +16,8 @@
package com.android.internal.app;
+import static com.android.internal.app.AppLocaleStore.AppLocaleResult.LocaleStatus;
+
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ListFragment;
@@ -158,9 +160,18 @@
if (appCurrentLocale != null && !isForCountryMode) {
mLocaleList.add(appCurrentLocale);
}
- mLocaleList = filterTheLanguagesNotSupportedInApp(context, appPackageName);
- if (!isForCountryMode) {
+ AppLocaleStore.AppLocaleResult result =
+ AppLocaleStore.getAppSupportedLocales(context, appPackageName);
+ boolean shouldShowList =
+ result.mLocaleStatus == LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG
+ || result.mLocaleStatus == LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_ASSET;
+
+ mLocaleList = filterTheLanguagesNotSupportedInApp(
+ shouldShowList, result.mAppSupportedLocales);
+
+ // Add "system language"
+ if (!isForCountryMode && shouldShowList) {
mLocaleList.add(LocaleStore.getSystemDefaultLocaleInfo(appCurrentLocale == null));
}
}
@@ -168,19 +179,18 @@
}
private Set<LocaleStore.LocaleInfo> filterTheLanguagesNotSupportedInApp(
- Context context, String appPackageName) {
- ArrayList<Locale> supportedLocales =
- AppLocaleStore.getAppSupportedLocales(context, appPackageName);
-
+ boolean shouldShowList, ArrayList<Locale> supportedLocales) {
Set<LocaleStore.LocaleInfo> filteredList = new HashSet<>();
- for(LocaleStore.LocaleInfo li: mLocaleList) {
- for(Locale l: supportedLocales) {
- if(LocaleList.matchesLanguageAndScript(li.getLocale(), l)) {
- filteredList.add(li);
+ if (shouldShowList) {
+ for(LocaleStore.LocaleInfo li: mLocaleList) {
+ for(Locale l: supportedLocales) {
+ if(LocaleList.matchesLanguageAndScript(li.getLocale(), l)) {
+ filteredList.add(li);
+ }
}
}
+ Log.d(TAG, "mLocaleList after app-supported filter: " + filteredList.size());
}
- Log.d(TAG, "mLocaleList after app-supported filter: " + filteredList.size());
return filteredList;
}