diff options
| author | Raphael <raphael@google.com> | 2009-09-29 12:14:05 -0700 |
|---|---|---|
| committer | Raphael <raphael@google.com> | 2009-09-29 14:41:45 -0700 |
| commit | 9b8a8056d1f3da6f040dd77dc103d0a1c5ff8f1d (patch) | |
| tree | 1f2f3328e6a851365bb4e630b33c6ea63c5a175a /tools/eclipse | |
| parent | 1028accb55919c0a84a4871002efb19a202c475c (diff) | |
| download | android_development-9b8a8056d1f3da6f040dd77dc103d0a1c5ff8f1d.tar.gz android_development-9b8a8056d1f3da6f040dd77dc103d0a1c5ff8f1d.tar.bz2 android_development-9b8a8056d1f3da6f040dd77dc103d0a1c5ff8f1d.zip | |
Add xdpi and ydpi to layout-configs XML Schema.
Also validate that whitespace around tokens is accepted.
BUG 2138329
Change-Id: Id5af7cf2b0689f05327a0cf0b17a525ceba78a12
Diffstat (limited to 'tools/eclipse')
4 files changed, 284 insertions, 138 deletions
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutConfigsXsd.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutConfigsXsd.java index ae0bb5be7..69bf18b09 100755 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutConfigsXsd.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutConfigsXsd.java @@ -94,8 +94,13 @@ public class LayoutConfigsXsd { public static final String NODE_SCREEN_DIMENSION = "screen-dimension"; //$NON-NLS-1$
+ /** The screen-dimension element has 2 size element children. */
public static final String NODE_SIZE = "size"; //$NON-NLS-1$
+ public static final String NODE_XPDI = "xdpi"; //$NON-NLS-1$
+
+ public static final String NODE_YDPI = "ydpi"; //$NON-NLS-1$
+
/**
* The "name" attribute, used by both the "device" and the "config"
* elements. It represents the user-interface name of these objects.
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-configs.xsd b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-configs.xsd index 476fce78e..49131fba6 100755 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-configs.xsd +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-configs.xsd @@ -24,7 +24,7 @@ <xsd:element name="layout-configs"> <xsd:annotation> - <xsd:documentation> + <xsd:documentation xml:lang="en"> The "layout-configs" element is the root element of this schema. It must contain one or more "device" elements that each define the configurations @@ -41,7 +41,7 @@ <xsd:element name="device" minOccurs="1" maxOccurs="unbounded"> <xsd:annotation> - <xsd:documentation> + <xsd:documentation xml:lang="en"> A device element must contain at most one "default" element followed by one or more "config" elements. @@ -78,10 +78,14 @@ --> <xsd:complexType name="parametersType"> <xsd:annotation> - <xsd:documentation> + <xsd:documentation xml:lang="en"> The parametersType define all the parameters that can happen either in a "default" element or in a named "config" element. Each parameter element can appear once at most. + + Parameters here are the same as those used to specify alternate Android + resources, as documented by + http://d.android.com/guide/topics/resources/resources-i18n.html#AlternateResources </xsd:documentation> </xsd:annotation> @@ -89,6 +93,11 @@ <!-- parametersType says that 0..1 of each of these elements must be declared. --> <xsd:element name="screen-size" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies that the configuration is for a particular class of screen. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="small" /> @@ -99,6 +108,14 @@ </xsd:element> <xsd:element name="screen-ratio" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies that the configuration is for a taller/wider than traditional + screen. This is based purely on the aspect ration of the screen: QVGA, + HVGA, and VGA are notlong; WQVGA, WVGA, FWVGA are long. Note that long + may mean either wide or tall, depending on the current orientation. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="long" /> @@ -108,6 +125,12 @@ </xsd:element> <xsd:element name="screen-orientation" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies that the configuration is for a screen that is tall (port) or + wide (land). + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="port" /> @@ -118,6 +141,17 @@ </xsd:element> <xsd:element name="pixel-density" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the screen density the configuration is defined for. The medium + density of traditional HVGA screens (mdpi) is defined to be approximately + 160dpi; low density (ldpi) is 120, and high density (hdpi) is 240. There + is thus a 4:3 scaling factor between each density, so a 9x9 bitmap in ldpi + would be 12x12 is mdpi and 16x16 in hdpi. + The special nodpi density that can be used in resource qualifiers is not + a valid keyword here. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="ldpi" /> @@ -128,6 +162,11 @@ </xsd:element> <xsd:element name="touch-type" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the touch type the configuration is defined for. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="notouch" /> @@ -138,6 +177,12 @@ </xsd:element> <xsd:element name="keyboard-state" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + If your configuration uses a soft keyboard, use the keyssoft value. + If it doesn't and has a real keyboard, use keysexposed or keyshidden. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="keysexposed" /> @@ -148,6 +193,11 @@ </xsd:element> <xsd:element name="text-input-method" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the primary text input method the configuration is designed for. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="nokeys" /> @@ -158,6 +208,12 @@ </xsd:element> <xsd:element name="nav-method" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the primary non-touchscreen navigation method the configuration + is designed for. + </xsd:documentation> + </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="dpad" /> @@ -169,6 +225,11 @@ </xsd:element> <xsd:element name="screen-dimension" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the device screen resolution, in pixels. + </xsd:documentation> + </xsd:annotation> <xsd:complexType> <xsd:sequence minOccurs="2" maxOccurs="2"> @@ -181,6 +242,33 @@ </xsd:sequence> </xsd:complexType> </xsd:element> + + <xsd:element name="xdpi" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the actual density in X of the device screen. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType> + <xsd:restriction base="xsd:float"> + <xsd:minExclusive value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <xsd:element name="ydpi" minOccurs="0"> + <xsd:annotation> + <xsd:documentation xml:lang="en"> + Specifies the actual density in Y of the device screen. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType> + <xsd:restriction base="xsd:float"> + <xsd:minExclusive value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + </xsd:all> </xsd:complexType> diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/TestLayoutConfisXsd.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/TestLayoutConfisXsd.java index 45332f243..43b0507e3 100755 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/TestLayoutConfisXsd.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/TestLayoutConfisXsd.java @@ -104,19 +104,6 @@ public class TestLayoutConfisXsd extends TestCase { // --- Helpers ------------
- /** Validate a valid sample using an InputStream */
- public void testValidateLocalRepositoryFile() throws Exception {
-
- InputStream xmlStream =
- TestLayoutConfisXsd.class.getResourceAsStream("config_sample.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = LayoutConfigsXsd.getValidator(handler);
- validator.validate(source);
- handler.verify();
- }
-
/** An helper that validates a string against an expected regexp. */
private void assertRegex(String expectedRegexp, String actualString) {
assertNotNull(actualString);
@@ -126,36 +113,7 @@ public class TestLayoutConfisXsd extends TestCase { actualString.matches(expectedRegexp));
}
- // --- Tests ------------
-
- /** A document should at least have a root to be valid */
- public void testEmptyXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>";
-
- Source source = new StreamSource(new StringReader(document));
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = LayoutConfigsXsd.getValidator(handler);
-
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect to get this specific exception message
- assertRegex("Premature end of file.*", e.getMessage());
- return;
- }
- // We shouldn't get here
- handler.verify();
- fail();
- }
-
- /** A document with an unknown element. */
- public void testUnknownContentXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
- "<d:unknown />" +
- "</d:layout-configs>";
-
+ public void checkFailure(String document, String regexp) throws Exception {
Source source = new StreamSource(new StringReader(document));
// don't capture the validator errors, we want it to fail and catch the exception
@@ -164,124 +122,211 @@ public class TestLayoutConfisXsd extends TestCase { validator.validate(source);
} catch (SAXParseException e) {
// We expect a parse expression referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found.*", e.getMessage());
+ assertRegex(regexp, e.getMessage());
return;
}
// If we get here, the validator has not failed as we expected it to.
fail();
}
- /** A document with an missing attribute in a device element. */
- public void testIncompleteContentXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
- "<d:device />" +
- "</d:layout-configs>";
-
+ public void checkSuccess(String document) throws Exception {
Source source = new StreamSource(new StringReader(document));
- // don't capture the validator errors, we want it to fail and catch the exception
+ CaptureErrorHandler handler = new CaptureErrorHandler();
Validator validator = LayoutConfigsXsd.getValidator(null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.4: Attribute 'name' must appear on element 'd:device'.", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
+ validator.validate(source);
+ handler.verify();
+ }
+
+ // --- Tests ------------
+
+ /** Validate a valid sample using an InputStream */
+ public void testValidateLocalRepositoryFile() throws Exception {
+
+ InputStream xmlStream =
+ TestLayoutConfisXsd.class.getResourceAsStream("config_sample.xml");
+ Source source = new StreamSource(xmlStream);
+
+ CaptureErrorHandler handler = new CaptureErrorHandler();
+ Validator validator = LayoutConfigsXsd.getValidator(handler);
+ validator.validate(source);
+ handler.verify();
+ }
+
+ /** A document should at least have a root to be valid */
+ public void testEmptyXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>",
+
+ // expected failure
+ "Premature end of file.*");
+ }
+
+ /** A document with an unknown element. */
+ public void testUnknownContentXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:unknown />" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-complex-type.2.4.a: Invalid content was found.*");
+ }
+
+ /** A document with an missing attribute in a device element. */
+ public void testIncompleteContentXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device />" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-complex-type.4: Attribute 'name' must appear on element 'd:device'.");
}
/** A document with a root element containing no device element is not valid. */
public void testEmptyRootXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" />";
-
- Source source = new StreamSource(new StringReader(document));
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" />",
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = LayoutConfigsXsd.getValidator(null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse expression referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.b: The content of element 'd:layout-configs' is not complete.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
+ // expected failure
+ "cvc-complex-type.2.4.b: The content of element 'd:layout-configs' is not complete.*");
}
/** A document with an empty device element is not valid. */
public void testEmptyDeviceXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
- "<d:device name=\"foo\"/>" +
- "</d:layout-configs>";
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = LayoutConfigsXsd.getValidator(null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.b: The content of element 'd:device' is not complete.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\"/>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-complex-type.2.4.b: The content of element 'd:device' is not complete.*");
}
/** A document with two default elements in a device element is not valid. */
public void testTwoDefaultsXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
- "<d:device name=\"foo\">" +
- " <d:default />" +
- " <d:default />" +
- "</d:device>" +
- "</d:layout-configs>";
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = LayoutConfigsXsd.getValidator(null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found starting with element 'd:default'.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:default />" +
+ " <d:default />" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-complex-type.2.4.a: Invalid content was found starting with element 'd:default'.*");
}
/** The default elements must be defined before the config one. It's invalid if after. */
public void testDefaultConfigOrderXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
- "<d:device name=\"foo\">" +
- " <d:config name=\"must-be-after-default\" />" +
- " <d:default />" +
- "</d:device>" +
- "</d:layout-configs>";
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:config name=\"must-be-after-default\" />" +
+ " <d:default />" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-complex-type.2.4.a: Invalid content was found starting with element 'd:default'.*");
+ }
- Source source = new StreamSource(new StringReader(document));
+ /** Screen dimension cannot be 0. */
+ public void testScreenDimZeroXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:default>" +
+ " <d:screen-dimension> <d:size>0</d:size> <d:size>1</d:size> </d:screen-dimension>" +
+ " </d:default>" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-minInclusive-valid: Value '0' is not facet-valid with respect to minInclusive '1'.*");
+ }
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = LayoutConfigsXsd.getValidator(null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found starting with element 'd:default'.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
+ /** Screen dimension cannot be negative. */
+ public void testScreenDimNegativeXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:default>" +
+ " <d:screen-dimension> <d:size>-5</d:size> <d:size>1</d:size> </d:screen-dimension>" +
+ " </d:default>" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-minInclusive-valid: Value '-5' is not facet-valid with respect to minInclusive '1'.*");
+ }
+
+ /** X/Y dpi cannot be 0. */
+ public void testXDpiZeroXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:default>" +
+ " <d:xdpi>0</d:xdpi>" +
+ " </d:default>" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-minExclusive-valid: Value '0' is not facet-valid with respect to minExclusive '0.0E1'.*");
+ }
+
+
+ /** X/Y dpi cannot be negative. */
+ public void testXDpiNegativeXml() throws Exception {
+ checkFailure(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:default>" +
+ " <d:xdpi>-3.1415926538</d:xdpi>" +
+ " </d:default>" +
+ "</d:device>" +
+ "</d:layout-configs>",
+
+ // expected failure
+ "cvc-minExclusive-valid: Value '-3.1415926538' is not facet-valid with respect to minExclusive '0.0E1'.*");
}
+
+ /** WHitespace around token is accepted by the schema. */
+ public void testTokenWhitespaceXml() throws Exception {
+ checkSuccess(
+ // document
+ "<?xml version=\"1.0\"?>" +
+ "<d:layout-configs xmlns:d=\"http://schemas.android.com/sdk/android/layout-configs/1\" >" +
+ "<d:device name=\"foo\">" +
+ " <d:config name='foo'>" +
+ " <d:screen-ratio> \n long \r </d:screen-ratio>" +
+ " </d:config>" +
+ "</d:device>" +
+ "</d:layout-configs>");
+ }
+
}
+
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/config_sample.xml b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/config_sample.xml index 12c481d60..901dd71c8 100755 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/config_sample.xml +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/sdk/config_sample.xml @@ -32,6 +32,8 @@ <d:size>240</d:size> <!-- 2 * int>0 -->
<d:size>480</d:size>
</d:screen-dimension>
+ <d:xdpi>180.81234</d:xdpi>
+ <d:ydpi>180.81234</d:ydpi>
</d:default>
<d:config name="Portrait">
@@ -117,8 +119,14 @@ <d:nav-method>nonav</d:nav-method>
</d:config>
- </d:device>
+ <d:config name="xdpi">
+ <d:xdpi>240</d:xdpi>
+ </d:config>
+ <d:config name="ydpi">
+ <d:ydpi>2800</d:ydpi>
+ </d:config>
+ </d:device>
<d:device name="SomePhone"> <!-- 1..n -->
<d:config name="screen-size-normal">
|
