Merge change 165 into donut

* changes:
  Squashed commit of the following:
This commit is contained in:
Android (Google) Code Review
2009-04-23 12:23:46 -07:00
12 changed files with 463 additions and 252 deletions

View File

@@ -988,119 +988,225 @@ struct ResTable_config
return diffs; return diffs;
} }
// Return true if 'this' is more specific than 'o'. Optionally, if // Return true if 'this' is more specific than 'o'.
// 'requested' is null, then they will also be compared against the
// requested configuration and true will only be returned if 'this'
// is a better candidate than 'o' for the configuration. This assumes that
// match() has already been used to remove any configurations that don't
// match the requested configuration at all; if they are not first filtered,
// non-matching results can be considered better than matching ones.
inline bool inline bool
isBetterThan(const ResTable_config& o, const ResTable_config* requested = NULL) const { isMoreSpecificThan(const ResTable_config& o) const {
// The order of the following tests defines the importance of one // The order of the following tests defines the importance of one
// configuration parameter over another. Those tests first are more // configuration parameter over another. Those tests first are more
// important, trumping any values in those following them. // important, trumping any values in those following them.
if (imsi != 0 && (!requested || requested->imsi != 0)) { if (imsi || o.imsi) {
if (mcc != 0 && (!requested || requested->mcc != 0)) { if (mcc != o.mcc) {
if (o.mcc == 0) { if (!mcc) return false;
return true; if (!o.mcc) return true;
}
} }
if (mnc != 0 && (!requested || requested->mnc != 0)) {
if (o.mnc == 0) { if (mnc != o.mnc) {
return true; if (!mnc) return false;
} if (!o.mnc) return true;
} }
} }
if (locale != 0 && (!requested || requested->locale != 0)) {
if (language[0] != 0 && (!requested || requested->language[0] != 0)) { if (locale || o.locale) {
if (o.language[0] == 0) { if (language[0] != o.language[0]) {
return true; if (!language[0]) return false;
} if (!o.language[0]) return true;
} }
if (country[0] != 0 && (!requested || requested->country[0] != 0)) {
if (o.country[0] == 0) { if (country[0] != o.country[0]) {
return true; if (!country[0]) return false;
} if (!o.country[0]) return true;
} }
} }
if (screenType != 0 && (!requested || requested->screenType != 0)) {
if (orientation != 0 && (!requested || requested->orientation != 0)) { if (screenType || o.screenType) {
if (o.orientation == 0) { if (orientation != o.orientation) {
return true; if (!orientation) return false;
} if (!o.orientation) return true;
} }
if (density != 0 && (!requested || requested->density != 0)) {
if (o.density == 0) { // density is never 'more specific'
return true; // as the default just equals 160
}
} if (touchscreen != o.touchscreen) {
if (touchscreen != 0 && (!requested || requested->touchscreen != 0)) { if (!touchscreen) return false;
if (o.touchscreen == 0) { if (!o.touchscreen) return true;
return true;
}
} }
} }
if (input != 0 && (!requested || requested->input != 0)) {
const int keysHidden = inputFlags&MASK_KEYSHIDDEN; if (input || o.input) {
const int reqKeysHidden = requested if (inputFlags != o.inputFlags) {
? requested->inputFlags&MASK_KEYSHIDDEN : 0; if (!(inputFlags & MASK_KEYSHIDDEN)) return false;
if (keysHidden != 0 && reqKeysHidden != 0) { if (!(o.inputFlags & MASK_KEYSHIDDEN)) return true;
const int oKeysHidden = o.inputFlags&MASK_KEYSHIDDEN;
//LOGI("isBetterThan keysHidden: cur=%d, given=%d, config=%d\n",
// keysHidden, oKeysHidden, reqKeysHidden);
if (oKeysHidden == 0) {
//LOGI("Better because 0!");
return true;
}
// For compatibility, we count KEYSHIDDEN_NO as being
// the same as KEYSHIDDEN_SOFT. Here we disambiguate these
// may making an exact match more specific.
if (keysHidden == reqKeysHidden && oKeysHidden != reqKeysHidden) {
// The current configuration is an exact match, and
// the given one is not, so the current one is better.
//LOGI("Better because other not same!");
return true;
}
} }
if (keyboard != 0 && (!requested || requested->keyboard != 0)) {
if (o.keyboard == 0) { if (keyboard != o.keyboard) {
return true; if (!keyboard) return false;
} if (!o.keyboard) return true;
} }
if (navigation != 0 && (!requested || requested->navigation != 0)) {
if (o.navigation == 0) { if (navigation != o.navigation) {
return true; if (!navigation) return false;
} if (!o.navigation) return true;
} }
} }
if (screenSize != 0 && (!requested || requested->screenSize != 0)) {
if (screenWidth != 0 && (!requested || requested->screenWidth != 0)) { if (screenSize || o.screenSize) {
if (o.screenWidth == 0) { if (screenWidth != o.screenWidth) {
return true; if (!screenWidth) return false;
} if (!o.screenWidth) return true;
} }
if (screenHeight != 0 && (!requested || requested->screenHeight != 0)) {
if (o.screenHeight == 0) { if (screenHeight != o.screenHeight) {
return true; if (!screenHeight) return false;
} if (!o.screenHeight) return true;
} }
} }
if (version != 0 && (!requested || requested->version != 0)) {
if (sdkVersion != 0 && (!requested || requested->sdkVersion != 0)) { if (version || o.version) {
if (o.sdkVersion == 0) { if (sdkVersion != o.sdkVersion) {
return true; if (!sdkVersion) return false;
} if (!o.sdkVersion) return true;
} }
if (minorVersion != 0 && (!requested || requested->minorVersion != 0)) {
if (o.minorVersion == 0) { if (minorVersion != o.minorVersion) {
return true; if (!minorVersion) return false;
} if (!o.minorVersion) return true;
} }
} }
return false; return false;
} }
// Return true if 'this' is a better match than 'o' for the 'requested'
// configuration. This assumes that match() has already been used to
// remove any configurations that don't match the requested configuration
// at all; if they are not first filtered, non-matching results can be
// considered better than matching ones.
// The general rule per attribute: if the request cares about an attribute
// (it normally does), if the two (this and o) are equal it's a tie. If
// they are not equal then one must be generic because only generic and
// '==requested' will pass the match() call. So if this is not generic,
// it wins. If this IS generic, o wins (return false).
inline bool
isBetterThan(const ResTable_config& o,
const ResTable_config* requested) const {
if (requested) {
if (imsi || o.imsi) {
if ((mcc != o.mcc) && requested->mcc) {
return (mcc);
}
if ((mnc != o.mnc) && requested->mnc) {
return (mnc);
}
}
if (locale || o.locale) {
if ((language[0] != o.language[0]) && requested->language[0]) {
return (language[0]);
}
if ((country[0] != o.country[0]) && requested->country[0]) {
return (country[0]);
}
}
if (screenType || o.screenType) {
if ((orientation != o.orientation) && requested->orientation) {
return (orientation);
}
if (density != o.density) {
// density is tough. Any density is potentially useful
// because the system will scale it. Scaling down
// is generally better than scaling up.
// Default density counts as 160dpi (the system default)
// TODO - remove 160 constants
int h = (density?density:160);
int l = (o.density?o.density:160);
bool bImBigger = true;
if (l > h) {
int t = h;
h = l;
l = t;
bImBigger = false;
}
int reqValue = (requested->density?requested->density:160);
if (reqValue >= h) {
// requested value higher than both l and h, give h
return bImBigger;
}
if (l >= reqValue) {
// requested value lower than both l and h, give l
return !bImBigger;
}
// saying that scaling down is 2x better than up
if (((2 * l) - reqValue) * h > reqValue * reqValue) {
return !bImBigger;
} else {
return bImBigger;
}
}
if ((touchscreen != o.touchscreen) && requested->touchscreen) {
return (touchscreen);
}
}
if (input || o.input) {
const int keysHidden = inputFlags & MASK_KEYSHIDDEN;
const int oKeysHidden = o.inputFlags & MASK_KEYSHIDDEN;
if (keysHidden != oKeysHidden) {
const int reqKeysHidden =
requested->inputFlags & MASK_KEYSHIDDEN;
if (reqKeysHidden) {
if (!keysHidden) return false;
if (!oKeysHidden) return true;
// For compatibility, we count KEYSHIDDEN_NO as being
// the same as KEYSHIDDEN_SOFT. Here we disambiguate
// these by making an exact match more specific.
if (reqKeysHidden == keysHidden) return true;
if (reqKeysHidden == oKeysHidden) return false;
}
}
if ((keyboard != o.keyboard) && requested->keyboard) {
return (keyboard);
}
if ((navigation != o.navigation) && requested->navigation) {
return (navigation);
}
}
if (screenSize || o.screenSize) {
if ((screenWidth != o.screenWidth) && requested->screenWidth) {
return (screenWidth);
}
if ((screenHeight != o.screenHeight) &&
requested->screenHeight) {
return (screenHeight);
}
}
if (version || o.version) {
if ((sdkVersion != o.sdkVersion) && requested->sdkVersion) {
return (sdkVersion);
}
if ((minorVersion != o.minorVersion) &&
requested->minorVersion) {
return (minorVersion);
}
}
return false;
}
return isMoreSpecificThan(o);
}
// Return true if 'this' can be considered a match for the parameters in // Return true if 'this' can be considered a match for the parameters in
// 'settings'. // 'settings'.
// Note this is asymetric. A default piece of data will match every request // Note this is asymetric. A default piece of data will match every request
@@ -1137,8 +1243,7 @@ struct ResTable_config
&& orientation != settings.orientation) { && orientation != settings.orientation) {
return false; return false;
} }
// Density not taken into account, always match, no matter what // density always matches - we can scale it. See isBetterThan
// density is specified for the resource
if (settings.touchscreen != 0 && touchscreen != 0 if (settings.touchscreen != 0 && touchscreen != 0
&& touchscreen != settings.touchscreen) { && touchscreen != settings.touchscreen) {
return false; return false;

View File

@@ -1820,7 +1820,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
} }
} }
if (bestPackage != NULL && bestItem.isBetterThan(thisConfig)) { if (bestPackage != NULL && bestItem.isMoreSpecificThan(thisConfig)) {
continue; continue;
} }

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple portrait</item> <item type="configVarying" name="simple">simple 32dpi</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag portrait</item> <item name="testString">bag 32dpi</item>
</bag> </bag>
</resources> </resources>

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple 320x200</item> <item type="configVarying" name="simple">simple 640x400</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag 320x200</item> <item name="testString">bag 640x400</item>
</bag> </bag>
</resources> </resources>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 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.
-->
<resources>
<item type="configVarying" name="simple">simple fr FR</item>
<bag type="configVarying" name="bag">
<item name="testString">bag fr FR</item>
</bag>
</resources>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 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.
-->
<resources>
<item type="configVarying" name="simple">simple fr</item>
<bag type="configVarying" name="bag">
<item name="testString">bag fr</item>
</bag>
</resources>

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple trackball</item> <item type="configVarying" name="simple">simple mcc110 xx</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag trackball</item> <item name="testString">bag mcc110 xx</item>
</bag> </bag>
</resources> </resources>

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple finger</item> <item type="configVarying" name="simple">simple mcc112</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag finger</item> <item name="testString">bag mcc112</item>
</bag> </bag>
</resources> </resources>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 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.
-->
<resources>
<item type="configVarying" name="simple">simple mnc220 xx</item>
<bag type="configVarying" name="bag">
<item name="testString">bag mnc220 xx</item>
</bag>
</resources>

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple keyshidden</item> <item type="configVarying" name="simple">simple mnc222 32dpi</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag keyshidden</item> <item name="testString">bag mnc222 32dpi</item>
</bag> </bag>
</resources> </resources>

View File

@@ -15,8 +15,8 @@
--> -->
<resources> <resources>
<item type="configVarying" name="simple">simple qwerty</item> <item type="configVarying" name="simple">simple mnc223</item>
<bag type="configVarying" name="bag"> <bag type="configVarying" name="bag">
<item name="testString">bag qwerty</item> <item name="testString">bag mnc223</item>
</bag> </bag>
</resources> </resources>

View File

@@ -98,7 +98,7 @@ public class ConfigTest extends AndroidTestCase {
mMetrics = new DisplayMetrics(); mMetrics = new DisplayMetrics();
mMetrics.widthPixels = 200; mMetrics.widthPixels = 200;
mMetrics.heightPixels = 320; mMetrics.heightPixels = 320;
mMetrics.density = 120; mMetrics.density = 1;
} }
void setProperty(properties p, int value) { void setProperty(properties p, int value) {
@@ -131,7 +131,9 @@ public class ConfigTest extends AndroidTestCase {
mMetrics.heightPixels = value; mMetrics.heightPixels = value;
break; break;
case DENSITY: case DENSITY:
mMetrics.density = value; // this is the ratio from the standard
mMetrics.density = (((float)value)/((float)DisplayMetrics.DEFAULT_DENSITY));
break; break;
default: default:
assert(false); assert(false);
@@ -187,18 +189,16 @@ public class ConfigTest extends AndroidTestCase {
*/ */
TotalConfig config = new TotalConfig(); TotalConfig config = new TotalConfig();
Resources res = config.getResources(); Resources res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple default");
// checkValue(res, R.configVarying.simple, "simple default"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag default"});
// R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx"); config.setProperty(properties.LANGUAGE, "xx");
res = config.getResources(); res = config.getResources();
// got simple xx 32dpi checkValue(res, R.configVarying.simple, "simple xx");
// checkValue(res, R.configVarying.simple, "simple xx"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag xx"});
// R.styleable.TestConfig, new String[]{"bag xx"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx"); config.setProperty(properties.LANGUAGE, "xx");
@@ -225,116 +225,66 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH); config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple notouch");
// checkValue(res, R.configVarying.simple, "simple notouch"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag notouch"});
// R.styleable.TestConfig, new String[]{"bag notouch"});
config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_FINGER);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple finger");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag finger"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS); config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
res = config.getResources(); res = config.getResources();
// got simple 32dpi stylus checkValue(res, R.configVarying.simple, "simple stylus");
// checkValue(res, R.configVarying.simple, "simple stylus"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag stylus"});
// R.styleable.TestConfig, new String[]{"bag stylus"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS); config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple nokeys");
// checkValue(res, R.configVarying.simple, "simple nokeys"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag nokeys"});
// R.styleable.TestConfig, new String[]{"bag nokeys"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_QWERTY);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple qwerty");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag qwerty"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY); config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple 12key");
// checkValue(res, R.configVarying.simple, "simple 12key"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag 12key"});
// R.styleable.TestConfig, new String[]{"bag 12key"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_YES);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple keyshidden");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag keyshidden"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO); config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
res = config.getResources(); res = config.getResources();
// got simple 32dpi keysexposed checkValue(res, R.configVarying.simple, "simple keysexposed");
// checkValue(res, R.configVarying.simple, "simple keysexposed"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag keysexposed"});
// R.styleable.TestConfig, new String[]{"bag keysexposed"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV); config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple nonav");
// checkValue(res, R.configVarying.simple, "simple nonav"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag nonav"});
// R.styleable.TestConfig, new String[]{"bag nonav"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD); config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple dpad");
// checkValue(res, R.configVarying.simple, "simple dpad"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag dpad"});
// R.styleable.TestConfig, new String[]{"bag dpad"});
config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_TRACKBALL);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple trackball");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag trackball"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL); config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple wheel");
// checkValue(res, R.configVarying.simple, "simple wheel"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag wheel"});
// R.styleable.TestConfig, new String[]{"bag wheel"});
config = new TotalConfig();
config.setProperty(properties.HEIGHT, 320);
config.setProperty(properties.WIDTH, 200);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple 320x200");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag 320x200"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.HEIGHT, 480); config.setProperty(properties.HEIGHT, 480);
config.setProperty(properties.WIDTH, 320); config.setProperty(properties.WIDTH, 320);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple 480x320");
// checkValue(res, R.configVarying.simple, "simple 480x320"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag 480x320"});
// R.styleable.TestConfig, new String[]{"bag 480x320"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.DENSITY, 240); config.setProperty(properties.DENSITY, 240);
@@ -343,37 +293,92 @@ public class ConfigTest extends AndroidTestCase {
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 240dpi"}); R.styleable.TestConfig, new String[]{"bag 240dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 120);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple 120dpi");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag 120dpi"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE); config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple landscape");
// checkValue(res, R.configVarying.simple, "simple landscape"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag landscape"});
// R.styleable.TestConfig, new String[]{"bag landscape"});
config = new TotalConfig();
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_PORTRAIT);
res = config.getResources();
// got simple 240dpi
// checkValue(res, R.configVarying.simple, "simple portrait");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag portrait"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE); config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
res = config.getResources(); res = config.getResources();
// got simple square 32dpi checkValue(res, R.configVarying.simple, "simple square");
// checkValue(res, R.configVarying.simple, "simple square"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag square"});
// R.styleable.TestConfig, new String[]{"bag square"}); }
@MediumTest
public void testDensity() throws Exception {
// have 32, 240 and the default 160 content.
// rule is that closest wins, with down scaling (larger content)
// being twice as nice as upscaling.
// transition at H/2 * (-1 +/- sqrt(1+8L/H))
// SO, X < 49 goes to 32
// 49 >= X < 182 goes to 160
// X >= 182 goes to 240
TotalConfig config = new TotalConfig();
config.setProperty(properties.DENSITY, 2);
Resources res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 32);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 48);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 49);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple default");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 150);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple default");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 181);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple default");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 182);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 240dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 240dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 239);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 240dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 240dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 490);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 240dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 240dpi"});
} }
// TODO - add tests for special cases - ie, other key params seem ignored if // TODO - add tests for special cases - ie, other key params seem ignored if
@@ -407,10 +412,9 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.MNC, 333); config.setProperty(properties.MNC, 333);
res = config.getResources(); res = config.getResources();
// got simple 24dpi checkValue(res, R.configVarying.simple, "simple default");
// checkValue(res, R.configVarying.simple, "simple default"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag default"});
// R.styleable.TestConfig, new String[]{"bag default"});
} }
@MediumTest @MediumTest
@@ -419,13 +423,31 @@ public class ConfigTest extends AndroidTestCase {
* Verify that in cases of ties, the specific ordering is followed * Verify that in cases of ties, the specific ordering is followed
*/ */
/* full A + B + C doesn't exist. Do we get A + C or B + C? /**
* Precidence order: mcc, mnc, locale, orientation, density,
* touchscreen, hidden, keyboard, navigation, width-height
*/
/**
* verify mcc trumps mnc. Have 110-xx, 220-xx but no 110-220
* so with is selected? Should be mcc110-xx.
*/ */
TotalConfig config = new TotalConfig(); TotalConfig config = new TotalConfig();
config.setProperty(properties.MCC, 110);
config.setProperty(properties.MNC, 220);
config.setProperty(properties.LANGUAGE, "xx");
Resources res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mcc110 xx");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag mcc110 xx"});
/* full A + B + C doesn't exist. Do we get A + C or B + C?
*/
config = new TotalConfig();
config.setProperty(properties.MCC, 111); config.setProperty(properties.MCC, 111);
config.setProperty(properties.MNC, 222); config.setProperty(properties.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx"); config.setProperty(properties.LANGUAGE, "xx");
Resources res = config.getResources(); res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mcc111 mnc222"); checkValue(res, R.configVarying.simple, "simple mcc111 mnc222");
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"}); R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"});
@@ -433,7 +455,8 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.MNC, 222); config.setProperty(properties.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx"); config.setProperty(properties.LANGUAGE, "xx");
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE); config.setProperty(properties.ORIENTATION,
Configuration.ORIENTATION_SQUARE);
res = config.getResources(); res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mnc222 xx"); checkValue(res, R.configVarying.simple, "simple mnc222 xx");
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
@@ -441,60 +464,77 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx"); config.setProperty(properties.LANGUAGE, "xx");
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE); config.setProperty(properties.ORIENTATION,
Configuration.ORIENTATION_SQUARE);
config.setProperty(properties.DENSITY, 32); config.setProperty(properties.DENSITY, 32);
res = config.getResources(); res = config.getResources();
checkValue(res, R.configVarying.simple, "simple xx 32dpi"); checkValue(res, R.configVarying.simple, "simple xx square");
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag xx 32dpi"}); R.styleable.TestConfig, new String[]{"bag xx square"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE); config.setProperty(properties.ORIENTATION,
Configuration.ORIENTATION_SQUARE);
config.setProperty(properties.DENSITY, 32); config.setProperty(properties.DENSITY, 32);
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS); config.setProperty(properties.TOUCHSCREEN,
Configuration.TOUCHSCREEN_STYLUS);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple square 32dpi");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag square 32dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 32);
config.setProperty(properties.TOUCHSCREEN,
Configuration.TOUCHSCREEN_STYLUS);
config.setProperty(properties.KEYBOARDHIDDEN,
Configuration.KEYBOARDHIDDEN_NO);
res = config.getResources(); res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi stylus"); checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi stylus"}); R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.DENSITY, 32); config.setProperty(properties.TOUCHSCREEN,
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS); Configuration.TOUCHSCREEN_STYLUS);
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO); config.setProperty(properties.KEYBOARDHIDDEN,
Configuration.KEYBOARDHIDDEN_NO);
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources(); res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi stylus"); checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
checkValue(res, R.configVarying.bag, checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi stylus"}); R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS); config.setProperty(properties.KEYBOARDHIDDEN,
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO); Configuration.KEYBOARDHIDDEN_NO);
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY); config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
config.setProperty(properties.NAVIGATION,
Configuration.NAVIGATION_DPAD);
res = config.getResources(); res = config.getResources();
// got simple 32dpi stylus checkValue(res, R.configVarying.simple, "simple keysexposed 12key");
// checkValue(res, R.configVarying.simple, "simple stylus 12key"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag keysexposed 12key"});
// R.styleable.TestConfig, new String[]{"bag stylus 12key"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
res = config.getResources();
// got simple 32dpi exposed
// checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
// checkValue(res, R.configVarying.bag,
// R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
config = new TotalConfig(); config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY); config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD); config.setProperty(properties.NAVIGATION,
Configuration.NAVIGATION_DPAD);
config.setProperty(properties.HEIGHT, 63); config.setProperty(properties.HEIGHT, 63);
config.setProperty(properties.WIDTH, 57); config.setProperty(properties.WIDTH, 57);
res = config.getResources(); res = config.getResources();
// got simple 240dpi checkValue(res, R.configVarying.simple, "simple 12key dpad");
// checkValue(res, R.configVarying.simple, "simple 12key dpad"); checkValue(res, R.configVarying.bag,
// checkValue(res, R.configVarying.bag, R.styleable.TestConfig, new String[]{"bag 12key dpad"});
// R.styleable.TestConfig, new String[]{"bag 12key dpad"});
config = new TotalConfig();
config.setProperty(properties.NAVIGATION,
Configuration.NAVIGATION_DPAD);
config.setProperty(properties.HEIGHT, 640);
config.setProperty(properties.WIDTH, 400);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple dpad");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag dpad"});
} }
} }