Squashed commit of the following:
commit 012b56fc607cf243cf4b29cb2a5f172bcbe0aecd
Author: Robert Greenwalt <robdroid@android.com>
Date: Wed Apr 22 14:31:26 2009 -0700
Additional fixes and tests for density.
commit 91fdc8e187551ae69e0029a4325fb3ad38fe411b
Author: Robert Greenwalt <robdroid@android.com>
Date: Tue Apr 14 14:39:00 2009 -0700
Fix runtime resource selection logic.
Fix isBetterThan so that o or this may be supperior at any stage.
Used to only handle this-better or tie at each stage, biasing against o.
Also allows reset of unit test to succeed. Fixes bug 1709202.
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index d01d83f..9b8c302 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -988,119 +988,225 @@
return diffs;
}
- // Return true if 'this' is more specific than 'o'. Optionally, if
- // '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.
+ // Return true if 'this' is more specific than 'o'.
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
// configuration parameter over another. Those tests first are more
// important, trumping any values in those following them.
- if (imsi != 0 && (!requested || requested->imsi != 0)) {
- if (mcc != 0 && (!requested || requested->mcc != 0)) {
- if (o.mcc == 0) {
- return true;
- }
+ if (imsi || o.imsi) {
+ if (mcc != o.mcc) {
+ if (!mcc) return false;
+ if (!o.mcc) return true;
}
- if (mnc != 0 && (!requested || requested->mnc != 0)) {
- if (o.mnc == 0) {
- return true;
- }
+
+ if (mnc != o.mnc) {
+ 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 (o.language[0] == 0) {
- return true;
- }
+
+ if (locale || o.locale) {
+ if (language[0] != o.language[0]) {
+ 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) {
- return true;
- }
+
+ if (country[0] != o.country[0]) {
+ 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 (o.orientation == 0) {
- return true;
- }
+
+ if (screenType || o.screenType) {
+ if (orientation != o.orientation) {
+ if (!orientation) return false;
+ if (!o.orientation) return true;
}
- if (density != 0 && (!requested || requested->density != 0)) {
- if (o.density == 0) {
- return true;
- }
- }
- if (touchscreen != 0 && (!requested || requested->touchscreen != 0)) {
- if (o.touchscreen == 0) {
- return true;
- }
+
+ // density is never 'more specific'
+ // as the default just equals 160
+
+ if (touchscreen != o.touchscreen) {
+ if (!touchscreen) return false;
+ if (!o.touchscreen) return true;
}
}
- if (input != 0 && (!requested || requested->input != 0)) {
- const int keysHidden = inputFlags&MASK_KEYSHIDDEN;
- const int reqKeysHidden = requested
- ? requested->inputFlags&MASK_KEYSHIDDEN : 0;
- if (keysHidden != 0 && reqKeysHidden != 0) {
- 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 (input || o.input) {
+ if (inputFlags != o.inputFlags) {
+ if (!(inputFlags & MASK_KEYSHIDDEN)) return false;
+ if (!(o.inputFlags & MASK_KEYSHIDDEN)) return true;
}
- if (keyboard != 0 && (!requested || requested->keyboard != 0)) {
- if (o.keyboard == 0) {
- return true;
- }
+
+ if (keyboard != o.keyboard) {
+ if (!keyboard) return false;
+ if (!o.keyboard) return true;
}
- if (navigation != 0 && (!requested || requested->navigation != 0)) {
- if (o.navigation == 0) {
- return true;
- }
+
+ if (navigation != o.navigation) {
+ if (!navigation) return false;
+ if (!o.navigation) return true;
}
}
- if (screenSize != 0 && (!requested || requested->screenSize != 0)) {
- if (screenWidth != 0 && (!requested || requested->screenWidth != 0)) {
- if (o.screenWidth == 0) {
- return true;
- }
+
+ if (screenSize || o.screenSize) {
+ if (screenWidth != o.screenWidth) {
+ if (!screenWidth) return false;
+ if (!o.screenWidth) return true;
}
- if (screenHeight != 0 && (!requested || requested->screenHeight != 0)) {
- if (o.screenHeight == 0) {
- return true;
- }
+
+ if (screenHeight != o.screenHeight) {
+ if (!screenHeight) return false;
+ if (!o.screenHeight) return true;
}
}
- if (version != 0 && (!requested || requested->version != 0)) {
- if (sdkVersion != 0 && (!requested || requested->sdkVersion != 0)) {
- if (o.sdkVersion == 0) {
- return true;
- }
+
+ if (version || o.version) {
+ if (sdkVersion != o.sdkVersion) {
+ if (!sdkVersion) return false;
+ if (!o.sdkVersion) return true;
}
- if (minorVersion != 0 && (!requested || requested->minorVersion != 0)) {
- if (o.minorVersion == 0) {
- return true;
- }
+
+ if (minorVersion != o.minorVersion) {
+ if (!minorVersion) return false;
+ if (!o.minorVersion) return true;
}
}
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
// 'settings'.
// Note this is asymetric. A default piece of data will match every request
@@ -1137,8 +1243,7 @@
&& orientation != settings.orientation) {
return false;
}
- // Density not taken into account, always match, no matter what
- // density is specified for the resource
+ // density always matches - we can scale it. See isBetterThan
if (settings.touchscreen != 0 && touchscreen != 0
&& touchscreen != settings.touchscreen) {
return false;
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 2ad3bfe..3d12dca 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -1820,7 +1820,7 @@
}
}
- if (bestPackage != NULL && bestItem.isBetterThan(thisConfig)) {
+ if (bestPackage != NULL && bestItem.isMoreSpecificThan(thisConfig)) {
continue;
}
diff --git a/tests/AndroidTests/res/values-320x200/configVarying.xml b/tests/AndroidTests/res/values-320x200/configVarying.xml
deleted file mode 100644
index ca2a286..0000000
--- a/tests/AndroidTests/res/values-320x200/configVarying.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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 320x200</item>
- <bag type="configVarying" name="bag">
- <item name="testString">bag 320x200</item>
- </bag>
-</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-32dpi/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-32dpi/configVarying.xml
index 674787e..f903f0f 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-32dpi/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple 32dpi</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag 32dpi</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-640x400/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-640x400/configVarying.xml
index 674787e..30332c0 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-640x400/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple 640x400</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag 640x400</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-fr-rFR/configVarying.xml
similarity index 86%
rename from tests/AndroidTests/res/values-finger/configVarying.xml
rename to tests/AndroidTests/res/values-fr-rFR/configVarying.xml
index 674787e..5ecac7c 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-fr-rFR/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple fr FR</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag fr FR</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-fr/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-fr/configVarying.xml
index 674787e..8413b5a 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-fr/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple fr</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag fr</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-keyshidden/configVarying.xml b/tests/AndroidTests/res/values-keyshidden/configVarying.xml
deleted file mode 100644
index fdffc4d..0000000
--- a/tests/AndroidTests/res/values-keyshidden/configVarying.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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 keyshidden</item>
- <bag type="configVarying" name="bag">
- <item name="testString">bag keyshidden</item>
- </bag>
-</resources>
diff --git a/tests/AndroidTests/res/values-trackball/configVarying.xml b/tests/AndroidTests/res/values-mcc110-xx/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-trackball/configVarying.xml
copy to tests/AndroidTests/res/values-mcc110-xx/configVarying.xml
index 0dec300..82e2435 100644
--- a/tests/AndroidTests/res/values-trackball/configVarying.xml
+++ b/tests/AndroidTests/res/values-mcc110-xx/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple trackball</item>
+ <item type="configVarying" name="simple">simple mcc110 xx</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag trackball</item>
+ <item name="testString">bag mcc110 xx</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-mcc112/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-mcc112/configVarying.xml
index 674787e..9c05d77 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-mcc112/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple mcc112</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag mcc112</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-trackball/configVarying.xml b/tests/AndroidTests/res/values-mnc220-xx/configVarying.xml
similarity index 86%
rename from tests/AndroidTests/res/values-trackball/configVarying.xml
rename to tests/AndroidTests/res/values-mnc220-xx/configVarying.xml
index 0dec300..fbc7888 100644
--- a/tests/AndroidTests/res/values-trackball/configVarying.xml
+++ b/tests/AndroidTests/res/values-mnc220-xx/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple trackball</item>
+ <item type="configVarying" name="simple">simple mnc220 xx</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag trackball</item>
+ <item name="testString">bag mnc220 xx</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml
similarity index 85%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml
index 674787e..03bea33 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple mnc222 32dpi</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag mnc222 32dpi</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-mnc223/configVarying.xml
similarity index 86%
copy from tests/AndroidTests/res/values-finger/configVarying.xml
copy to tests/AndroidTests/res/values-mnc223/configVarying.xml
index 674787e..8936cbc 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-mnc223/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple mnc223</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag mnc223</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-port/configVarying.xml b/tests/AndroidTests/res/values-port/configVarying.xml
deleted file mode 100644
index 0e1f247..0000000
--- a/tests/AndroidTests/res/values-port/configVarying.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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 portrait</item>
- <bag type="configVarying" name="bag">
- <item name="testString">bag portrait</item>
- </bag>
-</resources>
diff --git a/tests/AndroidTests/res/values-qwerty/configVarying.xml b/tests/AndroidTests/res/values-qwerty/configVarying.xml
deleted file mode 100644
index 939f682..0000000
--- a/tests/AndroidTests/res/values-qwerty/configVarying.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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 qwerty</item>
- <bag type="configVarying" name="bag">
- <item name="testString">bag qwerty</item>
- </bag>
-</resources>
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
index 1ea83c3..e6639d3 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
@@ -98,7 +98,7 @@
mMetrics = new DisplayMetrics();
mMetrics.widthPixels = 200;
mMetrics.heightPixels = 320;
- mMetrics.density = 120;
+ mMetrics.density = 1;
}
void setProperty(properties p, int value) {
@@ -131,7 +131,9 @@
mMetrics.heightPixels = value;
break;
case DENSITY:
- mMetrics.density = value;
+ // this is the ratio from the standard
+
+ mMetrics.density = (((float)value)/((float)DisplayMetrics.DEFAULT_DENSITY));
break;
default:
assert(false);
@@ -187,18 +189,16 @@
*/
TotalConfig config = new TotalConfig();
Resources res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple default");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag default"});
+ 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.LANGUAGE, "xx");
res = config.getResources();
-// got simple xx 32dpi
-// checkValue(res, R.configVarying.simple, "simple xx");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag xx"});
+ checkValue(res, R.configVarying.simple, "simple xx");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag xx"});
config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx");
@@ -225,116 +225,66 @@
config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple notouch");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple notouch");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag notouch"});
config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
res = config.getResources();
-// got simple 32dpi stylus
-// checkValue(res, R.configVarying.simple, "simple stylus");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag stylus"});
+ checkValue(res, R.configVarying.simple, "simple stylus");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag stylus"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple nokeys");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple nokeys");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag nokeys"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 12key");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple 12key");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 12key"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
res = config.getResources();
-// got simple 32dpi keysexposed
-// checkValue(res, R.configVarying.simple, "simple keysexposed");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag keysexposed"});
+ checkValue(res, R.configVarying.simple, "simple keysexposed");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag keysexposed"});
config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple nonav");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag nonav"});
+ checkValue(res, R.configVarying.simple, "simple nonav");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag nonav"});
config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple dpad");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple dpad");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag dpad"});
config = new TotalConfig();
config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple wheel");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple wheel");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag wheel"});
config = new TotalConfig();
config.setProperty(properties.HEIGHT, 480);
config.setProperty(properties.WIDTH, 320);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 480x320");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 480x320"});
+ checkValue(res, R.configVarying.simple, "simple 480x320");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 480x320"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 240);
@@ -344,36 +294,91 @@
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.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple landscape");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple landscape");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag landscape"});
config = new TotalConfig();
config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
res = config.getResources();
-// got simple square 32dpi
-// checkValue(res, R.configVarying.simple, "simple square");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag square"});
+ checkValue(res, R.configVarying.simple, "simple square");
+ checkValue(res, R.configVarying.bag,
+ 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
@@ -407,10 +412,9 @@
config = new TotalConfig();
config.setProperty(properties.MNC, 333);
res = config.getResources();
-// got simple 24dpi
-// checkValue(res, R.configVarying.simple, "simple default");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag default"});
+ checkValue(res, R.configVarying.simple, "simple default");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag default"});
}
@MediumTest
@@ -419,13 +423,31 @@
* 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();
+ 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.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx");
- Resources res = config.getResources();
+ res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mcc111 mnc222");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"});
@@ -433,7 +455,8 @@
config = new TotalConfig();
config.setProperty(properties.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mnc222 xx");
checkValue(res, R.configVarying.bag,
@@ -441,60 +464,77 @@
config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
config.setProperty(properties.DENSITY, 32);
res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx 32dpi");
+ checkValue(res, R.configVarying.simple, "simple xx square");
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.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
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();
checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
config = new TotalConfig();
- config.setProperty(properties.DENSITY, 32);
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.TOUCHSCREEN,
+ Configuration.TOUCHSCREEN_STYLUS);
+ config.setProperty(properties.KEYBOARDHIDDEN,
+ Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
+ checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
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.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ 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 stylus
-// checkValue(res, R.configVarying.simple, "simple stylus 12key");
-// checkValue(res, R.configVarying.bag,
-// 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"});
+ checkValue(res, R.configVarying.simple, "simple keysexposed 12key");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag keysexposed 12key"});
config = new TotalConfig();
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.WIDTH, 57);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 12key dpad");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 12key dpad"});
+ checkValue(res, R.configVarying.simple, "simple 12key dpad");
+ checkValue(res, R.configVarying.bag,
+ 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"});
}
}