Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of 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,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.content.res.cts;
     18 
     19 import java.util.Locale;
     20 
     21 import android.content.res.AssetManager;
     22 import android.content.res.Configuration;
     23 import android.content.res.Resources;
     24 import android.content.res.TypedArray;
     25 import android.content.res.Resources.NotFoundException;
     26 import android.test.AndroidTestCase;
     27 import android.test.suitebuilder.annotation.MediumTest;
     28 import android.test.suitebuilder.annotation.SmallTest;
     29 import android.util.DisplayMetrics;
     30 
     31 import com.android.cts.stub.R;
     32 
     33 public class ConfigTest extends AndroidTestCase {
     34     enum Properties {
     35         LANGUAGE,
     36         COUNTRY,
     37         MCC,
     38         MNC,
     39         TOUCHSCREEN,
     40         KEYBOARD,
     41         KEYBOARDHIDDEN,
     42         NAVIGATION,
     43         ORIENTATION,
     44         WIDTH,
     45         HEIGHT,
     46         DENSITY,
     47         SCREENLAYOUT
     48     }
     49 
     50     private static void checkValue(final Resources res, final int resId,
     51             final String expectedValue) {
     52         try {
     53             final String actual = res.getString(resId);
     54             assertNotNull("Returned wrong configuration-based simple value: expected <nothing>, "
     55                     + "got '" + actual + "' from resource 0x" + Integer.toHexString(resId),
     56                     expectedValue);
     57             assertEquals("Returned wrong configuration-based simple value: expected '"
     58                     + expectedValue + "', got '" + actual + "' from resource 0x"
     59                     + Integer.toHexString(resId), expectedValue, actual);
     60         } catch (NotFoundException e) {
     61             assertNull("Resource not found for configuration-based simple value: expecting \""
     62                     + expectedValue + "\"", expectedValue);
     63         }
     64     }
     65 
     66     private static void checkValue(final Resources res, final int resId,
     67             final int[] styleable, final String[] expectedValues) {
     68         final Resources.Theme theme = res.newTheme();
     69         final TypedArray sa = theme.obtainStyledAttributes(resId, styleable);
     70         for (int i = 0; i < styleable.length; i++) {
     71             final String actual = sa.getString(i);
     72             assertEquals("Returned wrong configuration-based style value: expected '"
     73                     + expectedValues[i] + "', got '" + actual + "' from attr "
     74                     + i + " of resource 0x" + Integer.toHexString(resId),
     75                     actual, expectedValues[i]);
     76         }
     77         sa.recycle();
     78     }
     79 
     80     private class TotalConfig {
     81         private Configuration mConfig;
     82         private DisplayMetrics mMetrics;
     83 
     84         public TotalConfig() {
     85             mConfig = new Configuration();
     86             // don't rely on build settings - they may change
     87             mConfig.locale = new Locale("en", "US");
     88             mConfig.mcc = 310;
     89             mConfig.mnc = 001; // unused
     90             mConfig.touchscreen = Configuration.TOUCHSCREEN_FINGER;
     91             mConfig.keyboard = Configuration.KEYBOARD_QWERTY;
     92             mConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
     93             mConfig.navigation = Configuration.NAVIGATION_TRACKBALL;
     94             mConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
     95 
     96             mMetrics = new DisplayMetrics();
     97             mMetrics.widthPixels = 200;
     98             mMetrics.heightPixels = 320;
     99             mMetrics.density = 1;
    100         }
    101 
    102         public void setProperty(final Properties p, final int value) {
    103             switch(p) {
    104                 case MCC:
    105                     mConfig.mcc = value;
    106                     break;
    107                 case MNC:
    108                     mConfig.mnc = value;
    109                     break;
    110                 case TOUCHSCREEN:
    111                     mConfig.touchscreen = value;
    112                     break;
    113                 case KEYBOARD:
    114                     mConfig.keyboard = value;
    115                     break;
    116                 case KEYBOARDHIDDEN:
    117                     mConfig.keyboardHidden = value;
    118                     break;
    119                 case NAVIGATION:
    120                     mConfig.navigation = value;
    121                     break;
    122                 case ORIENTATION:
    123                     mConfig.orientation = value;
    124                     break;
    125                 case WIDTH:
    126                     mMetrics.widthPixels = value;
    127                     break;
    128                 case HEIGHT:
    129                     mMetrics.heightPixels = value;
    130                     break;
    131                 case DENSITY:
    132                     // this is the ratio from the standard
    133                     mMetrics.density = (((float)value)/((float)DisplayMetrics.DENSITY_DEFAULT));
    134                     break;
    135                 case SCREENLAYOUT:
    136                     mConfig.screenLayout = value;
    137                     break;
    138                 default:
    139                     assert(false);
    140                     break;
    141             }
    142         }
    143 
    144         public void setProperty(final Properties p, final String value) {
    145             switch(p) {
    146                 case LANGUAGE:
    147                     final String oldCountry = mConfig.locale.getCountry();
    148                     mConfig.locale = new Locale(value, oldCountry);
    149                     break;
    150                 case COUNTRY:
    151                     final String oldLanguage = mConfig.locale.getLanguage();
    152                     mConfig.locale = new Locale(oldLanguage, value);
    153                     break;
    154                 default:
    155                     assert(false);
    156                     break;
    157             }
    158         }
    159 
    160         public Resources getResources() {
    161             final AssetManager assmgr = new AssetManager();
    162             assmgr.addAssetPath(mContext.getPackageResourcePath());
    163             return new Resources(assmgr, mMetrics, mConfig);
    164         }
    165     }
    166 
    167     private static void checkPair(Resources res, int[] notResIds,
    168             int simpleRes, String simpleString,
    169             int bagRes, String bagString) {
    170         boolean willHave = true;
    171         if (notResIds != null) {
    172             for (int i : notResIds) {
    173                 if (i == simpleRes) {
    174                     willHave = false;
    175                     break;
    176                 }
    177             }
    178         }
    179         checkValue(res, simpleRes, willHave ? simpleString : null);
    180         checkValue(res, bagRes, R.styleable.TestConfig,
    181                 new String[]{willHave ? bagString : null});
    182     }
    183 
    184     @SmallTest
    185     public void testAllConfigs() {
    186         /**
    187          * Test a resource that contains a value for each possible single
    188          * configuration value.
    189          */
    190         TotalConfig config = new TotalConfig();
    191         Resources res = config.getResources();
    192         checkValue(res, R.configVarying.simple, "simple default");
    193         checkValue(res, R.configVarying.bag,
    194                 R.styleable.TestConfig, new String[]{"bag default"});
    195 
    196         config = new TotalConfig();
    197         config.setProperty(Properties.LANGUAGE, "xx");
    198         res = config.getResources();
    199         checkValue(res, R.configVarying.simple, "simple xx");
    200         checkValue(res, R.configVarying.bag,
    201                 R.styleable.TestConfig, new String[]{"bag xx"});
    202 
    203         config = new TotalConfig();
    204         config.setProperty(Properties.LANGUAGE, "xx");
    205         config.setProperty(Properties.COUNTRY, "YY");
    206         res = config.getResources();
    207         checkValue(res, R.configVarying.simple, "simple xx-rYY");
    208         checkValue(res, R.configVarying.bag,
    209                 R.styleable.TestConfig, new String[]{"bag xx-rYY"});
    210 
    211         config = new TotalConfig();
    212         config.setProperty(Properties.MCC, 111);
    213         res = config.getResources();
    214         checkValue(res, R.configVarying.simple, "simple mcc111");
    215         checkValue(res, R.configVarying.bag,
    216                 R.styleable.TestConfig, new String[]{"bag mcc111"});
    217 
    218         config = new TotalConfig();
    219         config.setProperty(Properties.MNC, 222);
    220         res = config.getResources();
    221         checkValue(res, R.configVarying.simple, "simple mnc222");
    222         checkValue(res, R.configVarying.bag,
    223                 R.styleable.TestConfig, new String[]{"bag mnc222"});
    224 
    225         config = new TotalConfig();
    226         config.setProperty(Properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH);
    227         res = config.getResources();
    228         checkValue(res, R.configVarying.simple, "simple notouch");
    229         checkValue(res, R.configVarying.bag,
    230                 R.styleable.TestConfig, new String[]{"bag notouch"});
    231 
    232         config = new TotalConfig();
    233         config.setProperty(Properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
    234         res = config.getResources();
    235         checkValue(res, R.configVarying.simple, "simple stylus");
    236         checkValue(res, R.configVarying.bag,
    237                 R.styleable.TestConfig, new String[]{"bag stylus"});
    238 
    239         config = new TotalConfig();
    240         config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
    241         res = config.getResources();
    242         checkValue(res, R.configVarying.simple, "simple nokeys");
    243         checkValue(res, R.configVarying.bag,
    244                 R.styleable.TestConfig, new String[]{"bag nokeys"});
    245 
    246         config = new TotalConfig();
    247         config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
    248         res = config.getResources();
    249         checkValue(res, R.configVarying.simple, "simple 12key");
    250         checkValue(res, R.configVarying.bag,
    251                 R.styleable.TestConfig, new String[]{"bag 12key"});
    252 
    253         config = new TotalConfig();
    254         config.setProperty(Properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
    255         res = config.getResources();
    256         checkValue(res, R.configVarying.simple, "simple keysexposed");
    257         checkValue(res, R.configVarying.bag,
    258                 R.styleable.TestConfig, new String[]{"bag keysexposed"});
    259 
    260         config = new TotalConfig();
    261         config.setProperty(Properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
    262         res = config.getResources();
    263         checkValue(res, R.configVarying.simple, "simple nonav");
    264         checkValue(res, R.configVarying.bag,
    265                 R.styleable.TestConfig, new String[]{"bag nonav"});
    266 
    267         config = new TotalConfig();
    268         config.setProperty(Properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
    269         res = config.getResources();
    270         checkValue(res, R.configVarying.simple, "simple dpad");
    271         checkValue(res, R.configVarying.bag,
    272                 R.styleable.TestConfig, new String[]{"bag dpad"});
    273 
    274         config = new TotalConfig();
    275         config.setProperty(Properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
    276         res = config.getResources();
    277         checkValue(res, R.configVarying.simple, "simple wheel");
    278         checkValue(res, R.configVarying.bag,
    279                 R.styleable.TestConfig, new String[]{"bag wheel"});
    280 
    281         config = new TotalConfig();
    282         config.setProperty(Properties.HEIGHT, 480);
    283         config.setProperty(Properties.WIDTH, 320);
    284         res = config.getResources();
    285         checkValue(res, R.configVarying.simple, "simple 480x320");
    286         checkValue(res, R.configVarying.bag,
    287                 R.styleable.TestConfig, new String[]{"bag 480x320"});
    288 
    289         config = new TotalConfig();
    290         config.setProperty(Properties.DENSITY, 240);
    291         res = config.getResources();
    292         checkValue(res, R.configVarying.simple, "simple 240dpi");
    293         checkValue(res, R.configVarying.bag,
    294                 R.styleable.TestConfig, new String[]{"bag 240dpi"});
    295 
    296         config = new TotalConfig();
    297         config.setProperty(Properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
    298         res = config.getResources();
    299         checkValue(res, R.configVarying.simple, "simple landscape");
    300         checkValue(res, R.configVarying.bag,
    301                 R.styleable.TestConfig, new String[]{"bag landscape"});
    302 
    303         config = new TotalConfig();
    304         config.setProperty(Properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
    305         res = config.getResources();
    306         checkValue(res, R.configVarying.simple, "simple square");
    307         checkValue(res, R.configVarying.bag,
    308                 R.styleable.TestConfig, new String[]{"bag square"});
    309 
    310         config = new TotalConfig();
    311         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_SMALL);
    312         res = config.getResources();
    313         checkValue(res, R.configVarying.simple, "simple small");
    314         checkValue(res, R.configVarying.bag,
    315                 R.styleable.TestConfig, new String[]{"bag small"});
    316 
    317         config = new TotalConfig();
    318         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_NORMAL);
    319         res = config.getResources();
    320         checkValue(res, R.configVarying.simple, "simple normal");
    321         checkValue(res, R.configVarying.bag,
    322                 R.styleable.TestConfig, new String[]{"bag normal"});
    323 
    324         config = new TotalConfig();
    325         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_LARGE);
    326         res = config.getResources();
    327         checkValue(res, R.configVarying.simple, "simple large");
    328         checkValue(res, R.configVarying.bag,
    329                 R.styleable.TestConfig, new String[]{"bag large"});
    330 
    331         config = new TotalConfig();
    332         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_XLARGE);
    333         res = config.getResources();
    334         checkValue(res, R.configVarying.simple, "simple xlarge");
    335         checkValue(res, R.configVarying.bag,
    336                 R.styleable.TestConfig, new String[]{"bag xlarge"});
    337     }
    338 
    339     @MediumTest
    340     public void testDensity() throws Exception {
    341         // have 32, 240 and the default 160 content.
    342         // rule is that closest wins, with down scaling (larger content)
    343         // being twice as nice as upscaling.
    344         // transition at H/2 * (-1 +/- sqrt(1+8L/H))
    345         // SO, X < 49 goes to 32
    346         // 49 >= X < 182 goes to 160
    347         // X >= 182 goes to 240
    348         TotalConfig config = new TotalConfig();
    349         config.setProperty(Properties.DENSITY, 2);
    350         Resources res = config.getResources();
    351         checkValue(res, R.configVarying.simple, "simple 32dpi");
    352         checkValue(res, R.configVarying.bag,
    353                 R.styleable.TestConfig, new String[]{"bag 32dpi"});
    354 
    355         config = new TotalConfig();
    356         config.setProperty(Properties.DENSITY, 32);
    357         res = config.getResources();
    358         checkValue(res, R.configVarying.simple, "simple 32dpi");
    359         checkValue(res, R.configVarying.bag,
    360                 R.styleable.TestConfig, new String[]{"bag 32dpi"});
    361 
    362         config = new TotalConfig();
    363         config.setProperty(Properties.DENSITY, 48);
    364         res = config.getResources();
    365         checkValue(res, R.configVarying.simple, "simple 32dpi");
    366         checkValue(res, R.configVarying.bag,
    367                 R.styleable.TestConfig, new String[]{"bag 32dpi"});
    368 
    369         config = new TotalConfig();
    370         config.setProperty(Properties.DENSITY, 49);
    371         res = config.getResources();
    372         checkValue(res, R.configVarying.simple, "simple default");
    373         checkValue(res, R.configVarying.bag,
    374                 R.styleable.TestConfig, new String[]{"bag default"});
    375 
    376         config = new TotalConfig();
    377         config.setProperty(Properties.DENSITY, 150);
    378         res = config.getResources();
    379         checkValue(res, R.configVarying.simple, "simple default");
    380         checkValue(res, R.configVarying.bag,
    381                 R.styleable.TestConfig, new String[]{"bag default"});
    382 
    383         config = new TotalConfig();
    384         config.setProperty(Properties.DENSITY, 181);
    385         res = config.getResources();
    386         checkValue(res, R.configVarying.simple, "simple default");
    387         checkValue(res, R.configVarying.bag,
    388                 R.styleable.TestConfig, new String[]{"bag default"});
    389 
    390         config = new TotalConfig();
    391         config.setProperty(Properties.DENSITY, 182);
    392         res = config.getResources();
    393         checkValue(res, R.configVarying.simple, "simple 240dpi");
    394         checkValue(res, R.configVarying.bag,
    395                 R.styleable.TestConfig, new String[]{"bag 240dpi"});
    396 
    397         config = new TotalConfig();
    398         config.setProperty(Properties.DENSITY, 239);
    399         res = config.getResources();
    400         checkValue(res, R.configVarying.simple, "simple 240dpi");
    401         checkValue(res, R.configVarying.bag,
    402                 R.styleable.TestConfig, new String[]{"bag 240dpi"});
    403 
    404         config = new TotalConfig();
    405         config.setProperty(Properties.DENSITY, 490);
    406         res = config.getResources();
    407         checkValue(res, R.configVarying.simple, "simple 240dpi");
    408         checkValue(res, R.configVarying.bag,
    409                 R.styleable.TestConfig, new String[]{"bag 240dpi"});
    410     }
    411 
    412     @MediumTest
    413     public void testScreenSize() throws Exception {
    414         // ensure that we fall back to the best available screen size
    415         // for a given configuration.
    416         TotalConfig config = new TotalConfig();
    417         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_SMALL);
    418         Resources res = config.getResources();
    419         checkValue(res, R.configVarying.simple, "simple small");
    420         checkValue(res, R.configVarying.small, "small");
    421         checkValue(res, R.configVarying.normal, "default");
    422         checkValue(res, R.configVarying.large, "default");
    423         checkValue(res, R.configVarying.xlarge, "default");
    424 
    425         config = new TotalConfig();
    426         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_NORMAL);
    427         res = config.getResources();
    428         checkValue(res, R.configVarying.simple, "simple normal");
    429         checkValue(res, R.configVarying.small, "default");
    430         checkValue(res, R.configVarying.normal, "normal");
    431         checkValue(res, R.configVarying.large, "default");
    432         checkValue(res, R.configVarying.xlarge, "default");
    433 
    434         config = new TotalConfig();
    435         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_LARGE);
    436         res = config.getResources();
    437         checkValue(res, R.configVarying.simple, "simple large");
    438         checkValue(res, R.configVarying.small, "default");
    439         checkValue(res, R.configVarying.normal, "normal");
    440         checkValue(res, R.configVarying.large, "large");
    441         checkValue(res, R.configVarying.xlarge, "default");
    442 
    443         config = new TotalConfig();
    444         config.setProperty(Properties.SCREENLAYOUT, Configuration.SCREENLAYOUT_SIZE_XLARGE);
    445         res = config.getResources();
    446         checkValue(res, R.configVarying.simple, "simple xlarge");
    447         checkValue(res, R.configVarying.small, "default");
    448         checkValue(res, R.configVarying.normal, "normal");
    449         checkValue(res, R.configVarying.large, "large");
    450         checkValue(res, R.configVarying.xlarge, "xlarge");
    451     }
    452 
    453 // TODO - add tests for special cases - ie, other key params seem ignored if
    454 // nokeys is set
    455 
    456     @MediumTest
    457     public void testCombinations() {
    458         /**
    459          * Verify that proper strings are found for multiple-selectivity case
    460          * (ie, a string set for locale and mcc is found only when both are
    461          * true).
    462          */
    463         TotalConfig config = new TotalConfig();
    464         config.setProperty(Properties.LANGUAGE, "xx");
    465         config.setProperty(Properties.COUNTRY, "YY");
    466         config.setProperty(Properties.MCC, 111);
    467         Resources res = config.getResources();
    468         checkValue(res, R.configVarying.simple, "simple mcc111 xx-rYY");
    469         checkValue(res, R.configVarying.bag, R.styleable.TestConfig,
    470                 new String[] { "bag mcc111 xx-rYY" });
    471 
    472         config = new TotalConfig();
    473         config.setProperty(Properties.LANGUAGE, "xx");
    474         config.setProperty(Properties.COUNTRY, "YY");
    475         config.setProperty(Properties.MCC, 333);
    476         res = config.getResources();
    477         checkValue(res, R.configVarying.simple, "simple xx-rYY");
    478         checkValue(res, R.configVarying.bag,
    479                 R.styleable.TestConfig, new String[] { "bag xx-rYY" });
    480 
    481         config = new TotalConfig();
    482         config.setProperty(Properties.MNC, 333);
    483         res = config.getResources();
    484         checkValue(res, R.configVarying.simple, "simple default");
    485         checkValue(res, R.configVarying.bag,
    486                 R.styleable.TestConfig, new String[]{"bag default"});
    487     }
    488 
    489     @MediumTest
    490     public void testPrecidence() {
    491         /**
    492          * Verify that in cases of ties, the specific ordering is followed
    493          */
    494 
    495         /**
    496          * Precidence order: mcc, mnc, locale, screenlayout-size,
    497          * screenlayout-long, orientation, density,
    498          * touchscreen, hidden, keyboard, navigation, width-height
    499          */
    500 
    501         /**
    502          * verify mcc trumps mnc.  Have 110-xx, 220-xx but no 110-220
    503          * so with is selected?  Should be mcc110-xx.
    504          */
    505         TotalConfig config = new TotalConfig();
    506         config.setProperty(Properties.MCC, 110);
    507         config.setProperty(Properties.MNC, 220);
    508         config.setProperty(Properties.LANGUAGE, "xx");
    509         Resources res = config.getResources();
    510         checkValue(res, R.configVarying.simple, "simple mcc110 xx");
    511         checkValue(res, R.configVarying.bag,
    512                 R.styleable.TestConfig, new String[]{"bag mcc110 xx"});
    513 
    514         /* full A + B + C doesn't exist.  Do we get A + C or B + C?
    515          */
    516         config = new TotalConfig();
    517         config.setProperty(Properties.MCC, 111);
    518         config.setProperty(Properties.MNC, 222);
    519         config.setProperty(Properties.LANGUAGE, "xx");
    520         res = config.getResources();
    521         checkValue(res, R.configVarying.simple, "simple mcc111 mnc222");
    522         checkValue(res, R.configVarying.bag,
    523                 R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"});
    524 
    525         config = new TotalConfig();
    526         config.setProperty(Properties.MNC, 222);
    527         config.setProperty(Properties.LANGUAGE, "xx");
    528         config.setProperty(Properties.ORIENTATION,
    529                 Configuration.ORIENTATION_SQUARE);
    530         res = config.getResources();
    531         checkValue(res, R.configVarying.simple, "simple mnc222 xx");
    532         checkValue(res, R.configVarying.bag,
    533                 R.styleable.TestConfig, new String[]{"bag mnc222 xx"});
    534 
    535         config = new TotalConfig();
    536         config.setProperty(Properties.LANGUAGE, "xx");
    537         config.setProperty(Properties.ORIENTATION,
    538                 Configuration.ORIENTATION_SQUARE);
    539         config.setProperty(Properties.DENSITY, 32);
    540         res = config.getResources();
    541         checkValue(res, R.configVarying.simple, "simple xx square");
    542         checkValue(res, R.configVarying.bag,
    543                 R.styleable.TestConfig, new String[]{"bag xx square"});
    544 
    545         config = new TotalConfig();
    546         config.setProperty(Properties.ORIENTATION,
    547                 Configuration.ORIENTATION_SQUARE);
    548         config.setProperty(Properties.DENSITY, 32);
    549         config.setProperty(Properties.TOUCHSCREEN,
    550                 Configuration.TOUCHSCREEN_STYLUS);
    551         res = config.getResources();
    552         checkValue(res, R.configVarying.simple, "simple square 32dpi");
    553         checkValue(res, R.configVarying.bag,
    554                 R.styleable.TestConfig, new String[]{"bag square 32dpi"});
    555 
    556         config = new TotalConfig();
    557         config.setProperty(Properties.DENSITY, 32);
    558         config.setProperty(Properties.TOUCHSCREEN,
    559                 Configuration.TOUCHSCREEN_STYLUS);
    560         config.setProperty(Properties.KEYBOARDHIDDEN,
    561                 Configuration.KEYBOARDHIDDEN_NO);
    562         res = config.getResources();
    563         checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
    564         checkValue(res, R.configVarying.bag,
    565                 R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
    566 
    567         config = new TotalConfig();
    568         config.setProperty(Properties.TOUCHSCREEN,
    569                 Configuration.TOUCHSCREEN_STYLUS);
    570         config.setProperty(Properties.KEYBOARDHIDDEN,
    571                 Configuration.KEYBOARDHIDDEN_NO);
    572         config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
    573         res = config.getResources();
    574         checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
    575         checkValue(res, R.configVarying.bag,
    576                 R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
    577 
    578         config = new TotalConfig();
    579         config.setProperty(Properties.KEYBOARDHIDDEN,
    580                 Configuration.KEYBOARDHIDDEN_NO);
    581         config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
    582         config.setProperty(Properties.NAVIGATION,
    583                 Configuration.NAVIGATION_DPAD);
    584         res = config.getResources();
    585         checkValue(res, R.configVarying.simple, "simple keysexposed 12key");
    586         checkValue(res, R.configVarying.bag,
    587                 R.styleable.TestConfig, new String[]{"bag keysexposed 12key"});
    588 
    589         config = new TotalConfig();
    590         config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
    591         config.setProperty(Properties.NAVIGATION,
    592                 Configuration.NAVIGATION_DPAD);
    593         config.setProperty(Properties.HEIGHT, 63);
    594         config.setProperty(Properties.WIDTH, 57);
    595         res = config.getResources();
    596         checkValue(res, R.configVarying.simple, "simple 12key dpad");
    597         checkValue(res, R.configVarying.bag,
    598                 R.styleable.TestConfig, new String[]{"bag 12key dpad"});
    599 
    600         config = new TotalConfig();
    601         config.setProperty(Properties.NAVIGATION,
    602                 Configuration.NAVIGATION_DPAD);
    603         config.setProperty(Properties.HEIGHT, 640);
    604         config.setProperty(Properties.WIDTH, 400);
    605         res = config.getResources();
    606         checkValue(res, R.configVarying.simple, "simple dpad");
    607         checkValue(res, R.configVarying.bag,
    608                 R.styleable.TestConfig, new String[]{"bag dpad"});
    609     }
    610 
    611     @MediumTest
    612     public void testVersions() {
    613         // Check that we get the most recent resources that are <= our
    614         // current version.  Note the special version adjustment, so that
    615         // during development the resource version is incremented to the
    616         // next one.
    617         int vers = android.os.Build.VERSION.SDK_INT;
    618         if (!"REL".equals(android.os.Build.VERSION.CODENAME)) {
    619             vers++;
    620         }
    621         String expected = "v" + vers + "cur";
    622         assertEquals(expected, mContext.getResources().getString(R.string.version_cur));
    623         assertEquals("base",  mContext.getResources().getString(R.string.version_old));
    624         assertEquals("v3",  mContext.getResources().getString(R.string.version_v3));
    625     }
    626 }
    627