2 * Copyright (C) 2009 The Android Open Source Project
4 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.eclipse.org/org/documents/epl-v10.php
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.ide.eclipse.adt.internal.sdk;
19 import com.android.ide.eclipse.adt.internal.resources.configurations.CountryCodeQualifier;
20 import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
21 import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier;
22 import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier;
23 import com.android.ide.eclipse.adt.internal.resources.configurations.NetworkCodeQualifier;
24 import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
25 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenDimensionQualifier;
26 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier;
27 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier;
28 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier;
29 import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier;
30 import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier;
31 import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier.KeyboardState;
32 import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier.NavigationMethod;
33 import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
34 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier.ScreenOrientation;
35 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier.ScreenRatio;
36 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier.ScreenSize;
37 import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier.TextInputMethod;
38 import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier.TouchScreenType;
40 import org.xml.sax.Attributes;
41 import org.xml.sax.SAXException;
42 import org.xml.sax.helpers.DefaultHandler;
44 import java.util.ArrayList;
45 import java.util.List;
48 * {@link DefaultHandler} implementation to parse Layout Device XML file.
49 * @see LayoutDevicesXsd
50 * @see Layout-configs.xsd
52 class LayoutDeviceHandler extends DefaultHandler {
54 * The handler does most of the work in startElement and endElement.
55 * In startElement, it'll create DeviceConfiguration on <device>, as well as
56 * FolderConfiguration instances on <default> and <config>.
57 * Those objects are then filled as new nodes are discovered.
59 * For the qualifier values, the qualifier is created and added to the current config
60 * on the endElement, by using the content found in characters().
63 private List<LayoutDevice> mDevices = new ArrayList<LayoutDevice>();
65 private LayoutDevice mCurrentDevice;
66 private FolderConfiguration mDefaultConfig;
67 private FolderConfiguration mCurrentConfig;
68 private final StringBuilder mStringAccumulator = new StringBuilder();
70 private String mSize1, mSize2;
72 public List<LayoutDevice> getDevices() {
77 public void startElement(String uri, String localName, String name, Attributes attributes)
79 if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
80 // get the deviceName, will not be null since we validated the XML.
81 String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
83 // create a device and add it to the list
84 mCurrentDevice = new LayoutDevice(deviceName);
85 mDevices.add(mCurrentDevice);
86 } else if (LayoutDevicesXsd.NODE_DEFAULT.equals(localName)) {
87 // create a new default config
88 mDefaultConfig = mCurrentConfig = new FolderConfiguration();
89 } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
90 // create a new config
91 mCurrentConfig = new FolderConfiguration();
93 // init with default config if applicable
94 if (mDefaultConfig != null) {
95 mCurrentConfig.set(mDefaultConfig);
98 // get the name of the config
99 String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
101 // give it to the current device.
102 mCurrentDevice.addConfig(deviceName, mCurrentConfig);
103 } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
104 mSize1 = mSize2 = null;
107 mStringAccumulator.setLength(0);
111 public void characters(char[] ch, int start, int length) throws SAXException {
112 mStringAccumulator.append(ch, start, length);
116 public void endElement(String uri, String localName, String name) throws SAXException {
117 if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
118 mCurrentDevice = null;
119 mDefaultConfig = null;
120 } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
121 mCurrentConfig = null;
122 } else if (LayoutDevicesXsd.NODE_COUNTRY_CODE.equals(localName)) {
123 CountryCodeQualifier ccq = new CountryCodeQualifier(
124 Integer.parseInt(mStringAccumulator.toString()));
125 mCurrentConfig.setCountryCodeQualifier(ccq);
126 } else if (LayoutDevicesXsd.NODE_NETWORK_CODE.equals(localName)) {
127 NetworkCodeQualifier ncq = new NetworkCodeQualifier(
128 Integer.parseInt(mStringAccumulator.toString()));
129 mCurrentConfig.setNetworkCodeQualifier(ncq);
130 } else if (LayoutDevicesXsd.NODE_SCREEN_SIZE.equals(localName)) {
131 ScreenSizeQualifier ssq = new ScreenSizeQualifier(
132 ScreenSize.getEnum(mStringAccumulator.toString()));
133 mCurrentConfig.setScreenSizeQualifier(ssq);
134 } else if (LayoutDevicesXsd.NODE_SCREEN_RATIO.equals(localName)) {
135 ScreenRatioQualifier srq = new ScreenRatioQualifier(
136 ScreenRatio.getEnum(mStringAccumulator.toString()));
137 mCurrentConfig.setScreenRatioQualifier(srq);
138 } else if (LayoutDevicesXsd.NODE_SCREEN_ORIENTATION.equals(localName)) {
139 ScreenOrientationQualifier soq = new ScreenOrientationQualifier(
140 ScreenOrientation.getEnum(mStringAccumulator.toString()));
141 mCurrentConfig.setScreenOrientationQualifier(soq);
142 } else if (LayoutDevicesXsd.NODE_PIXEL_DENSITY.equals(localName)) {
143 PixelDensityQualifier pdq = new PixelDensityQualifier(
144 Density.getEnum(mStringAccumulator.toString()));
145 mCurrentConfig.setPixelDensityQualifier(pdq);
146 } else if (LayoutDevicesXsd.NODE_TOUCH_TYPE.equals(localName)) {
147 TouchScreenQualifier tsq = new TouchScreenQualifier(
148 TouchScreenType.getEnum(mStringAccumulator.toString()));
149 mCurrentConfig.setTouchTypeQualifier(tsq);
150 } else if (LayoutDevicesXsd.NODE_KEYBOARD_STATE.equals(localName)) {
151 KeyboardStateQualifier ksq = new KeyboardStateQualifier(
152 KeyboardState.getEnum(mStringAccumulator.toString()));
153 mCurrentConfig.setKeyboardStateQualifier(ksq);
154 } else if (LayoutDevicesXsd.NODE_TEXT_INPUT_METHOD.equals(localName)) {
155 TextInputMethodQualifier timq = new TextInputMethodQualifier(
156 TextInputMethod.getEnum(mStringAccumulator.toString()));
157 mCurrentConfig.setTextInputMethodQualifier(timq);
158 } else if (LayoutDevicesXsd.NODE_NAV_METHOD.equals(localName)) {
159 NavigationMethodQualifier nmq = new NavigationMethodQualifier(
160 NavigationMethod.getEnum(mStringAccumulator.toString()));
161 mCurrentConfig.setNavigationMethodQualifier(nmq);
162 } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
163 ScreenDimensionQualifier qual = ScreenDimensionQualifier.getQualifier(mSize1, mSize2);
165 mCurrentConfig.setScreenDimensionQualifier(qual);
167 } else if (LayoutDevicesXsd.NODE_XDPI.equals(localName)) {
168 mCurrentDevice.setXDpi(Float.parseFloat(mStringAccumulator.toString()));
169 } else if (LayoutDevicesXsd.NODE_YDPI.equals(localName)) {
170 mCurrentDevice.setYDpi(Float.parseFloat(mStringAccumulator.toString()));
171 } else if (LayoutDevicesXsd.NODE_SIZE.equals(localName)) {
172 if (mSize1 == null) {
173 mSize1 = mStringAccumulator.toString();
174 } else if (mSize2 == null) {
175 mSize2 = mStringAccumulator.toString();