blob: aa1a5341de57b71b2c7975f739d83682a23aa702 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package android.content.res;
import android.os.FileUtils;
import android.os.LocaleList;
import android.test.AndroidTestCase;
import android.util.DisplayMetrics;
import androidx.test.filters.SmallTest;
import com.android.frameworks.coretests.R;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Locale;
public class ResourcesLocaleTest extends AndroidTestCase {
private String extractApkAndGetPath(int id) throws Exception {
final Resources resources = getContext().getResources();
try (InputStream is = resources.openRawResource(id)) {
File path = new File(getContext().getFilesDir(), resources.getResourceEntryName(id));
FileUtils.copyToFileOrThrow(is, path);
return path.getAbsolutePath();
}
}
private Resources createResourcesWithApk(int rawApkId) throws Exception {
final AssetManager assets = new AssetManager();
assertTrue(assets.addAssetPath(extractApkAndGetPath(rawApkId)) != 0);
final DisplayMetrics dm = new DisplayMetrics();
dm.setToDefaults();
return new Resources(assets, dm, new Configuration());
}
private static void ensureNoLanguage(Resources resources, String language) {
final String[] supportedLocales = resources.getAssets().getNonSystemLocales();
for (String languageTag : supportedLocales) {
if ("en-XA".equals(languageTag)) {
continue;
}
assertFalse(
"supported locales: " + Arrays.toString(supportedLocales),
language.equals(Locale.forLanguageTag(languageTag).getLanguage()));
}
}
@SmallTest
public void testEnglishIsAlwaysConsideredSupported() throws Exception {
final Resources resources = createResourcesWithApk(R.raw.locales);
ensureNoLanguage(resources, "en");
final LocaleList preferredLocales = LocaleList.forLanguageTags("en-US,pl-PL");
final Configuration config = new Configuration();
config.setLocales(preferredLocales);
resources.updateConfiguration(config, null);
// The APK we loaded has default and Polish languages. If English is first in the list,
// always take it the default (assumed to be English).
assertEquals(Locale.forLanguageTag("en-US"),
resources.getConfiguration().getLocales().get(0));
}
@SmallTest
public void testSelectFirstSupportedLanguage() throws Exception {
final Resources resources = createResourcesWithApk(R.raw.locales);
ensureNoLanguage(resources, "fr");
final LocaleList preferredLocales = LocaleList.forLanguageTags("fr-FR,pl-PL");
final Configuration config = new Configuration();
config.setLocales(preferredLocales);
resources.updateConfiguration(config, null);
// The APK we loaded has default and Polish languages. We expect the Polish language to
// therefore be chosen.
assertEquals(Locale.forLanguageTag("pl-PL"),
resources.getConfiguration().getLocales().get(0));
}
}