Home | History | Annotate | Download | only in res
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 package android.content.res;
     17 
     18 import android.os.FileUtils;
     19 import android.os.LocaleList;
     20 import android.support.test.filters.SmallTest;
     21 import android.test.AndroidTestCase;
     22 import android.util.DisplayMetrics;
     23 import android.view.Display;
     24 
     25 import com.android.frameworks.coretests.R;
     26 
     27 import java.io.File;
     28 import java.io.InputStream;
     29 import java.util.Arrays;
     30 import java.util.Locale;
     31 
     32 public class ResourcesLocaleTest extends AndroidTestCase {
     33 
     34     private String extractApkAndGetPath(int id) throws Exception {
     35         final Resources resources = getContext().getResources();
     36         try (InputStream is = resources.openRawResource(id)) {
     37             File path = new File(getContext().getFilesDir(), resources.getResourceEntryName(id));
     38             FileUtils.copyToFileOrThrow(is, path);
     39             return path.getAbsolutePath();
     40         }
     41     }
     42 
     43     private Resources createResourcesWithApk(int rawApkId) throws Exception {
     44         final AssetManager assets = new AssetManager();
     45         assertTrue(assets.addAssetPath(extractApkAndGetPath(rawApkId)) != 0);
     46 
     47         final DisplayMetrics dm = new DisplayMetrics();
     48         dm.setToDefaults();
     49         return new Resources(assets, dm, new Configuration());
     50     }
     51 
     52     private static void ensureNoLanguage(Resources resources, String language) {
     53         final String[] supportedLocales = resources.getAssets().getNonSystemLocales();
     54         for (String languageTag : supportedLocales) {
     55             if ("en-XA".equals(languageTag)) {
     56                 continue;
     57             }
     58             assertFalse(
     59                     "supported locales: " + Arrays.toString(supportedLocales),
     60                     language.equals(Locale.forLanguageTag(languageTag).getLanguage()));
     61         }
     62     }
     63 
     64     @SmallTest
     65     public void testEnglishIsAlwaysConsideredSupported() throws Exception {
     66         final Resources resources = createResourcesWithApk(R.raw.locales);
     67         ensureNoLanguage(resources, "en");
     68 
     69         final LocaleList preferredLocales = LocaleList.forLanguageTags("en-US,pl-PL");
     70         final Configuration config = new Configuration();
     71         config.setLocales(preferredLocales);
     72 
     73         resources.updateConfiguration(config, null);
     74 
     75         // The APK we loaded has default and Polish languages. If English is first in the list,
     76         // always take it the default (assumed to be English).
     77         assertEquals(Locale.forLanguageTag("en-US"),
     78                 resources.getConfiguration().getLocales().get(0));
     79     }
     80 
     81     @SmallTest
     82     public void testSelectFirstSupportedLanguage() throws Exception {
     83         final Resources resources = createResourcesWithApk(R.raw.locales);
     84         ensureNoLanguage(resources, "fr");
     85 
     86         final LocaleList preferredLocales = LocaleList.forLanguageTags("fr-FR,pl-PL");
     87         final Configuration config = new Configuration();
     88         config.setLocales(preferredLocales);
     89 
     90         resources.updateConfiguration(config, null);
     91 
     92         // The APK we loaded has default and Polish languages. We expect the Polish language to
     93         // therefore be chosen.
     94         assertEquals(Locale.forLanguageTag("pl-PL"),
     95                 resources.getConfiguration().getLocales().get(0));
     96     }
     97 }
     98