• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
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
7  *
8  *      http://www.eclipse.org/org/documents/epl-v10.php
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ide.eclipse.adt.internal.sdk;
18 
19 import com.android.ide.common.resources.configuration.CountryCodeQualifier;
20 import com.android.ide.common.resources.configuration.DensityQualifier;
21 import com.android.ide.common.resources.configuration.FolderConfiguration;
22 import com.android.ide.common.resources.configuration.KeyboardStateQualifier;
23 import com.android.ide.common.resources.configuration.NavigationMethodQualifier;
24 import com.android.ide.common.resources.configuration.NavigationStateQualifier;
25 import com.android.ide.common.resources.configuration.NetworkCodeQualifier;
26 import com.android.ide.common.resources.configuration.ScreenDimensionQualifier;
27 import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
28 import com.android.ide.common.resources.configuration.ScreenRatioQualifier;
29 import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
30 import com.android.ide.common.resources.configuration.TextInputMethodQualifier;
31 import com.android.ide.common.resources.configuration.TouchScreenQualifier;
32 import com.android.resources.Density;
33 import com.android.resources.Keyboard;
34 import com.android.resources.KeyboardState;
35 import com.android.resources.Navigation;
36 import com.android.resources.NavigationState;
37 import com.android.resources.ScreenOrientation;
38 import com.android.resources.ScreenRatio;
39 import com.android.resources.ScreenSize;
40 import com.android.resources.TouchScreen;
41 
42 import org.xml.sax.Attributes;
43 import org.xml.sax.SAXException;
44 import org.xml.sax.helpers.DefaultHandler;
45 
46 import java.util.ArrayList;
47 import java.util.List;
48 
49 /**
50  * {@link DefaultHandler} implementation to parse Layout Device XML file.
51  * @see LayoutDevicesXsd
52  * @see Layout-configs.xsd
53  */
54 class LayoutDeviceHandler extends DefaultHandler {
55     /*
56      * The handler does most of the work in startElement and endElement.
57      * In startElement, it'll create DeviceConfiguration on <device>, as well as
58      * FolderConfiguration instances on <default> and <config>.
59      * Those objects are then filled as new nodes are discovered.
60      *
61      * For the qualifier values, the qualifier is created and added to the current config
62      * on the endElement, by using the content found in characters().
63      */
64 
65     private List<LayoutDevice> mDevices = new ArrayList<LayoutDevice>();
66 
67     private LayoutDevice mCurrentDevice;
68     private FolderConfiguration mDefaultConfig;
69     private FolderConfiguration mCurrentConfig;
70     private final StringBuilder mStringAccumulator = new StringBuilder();
71 
72     private String mSize1, mSize2;
73 
getDevices()74     public List<LayoutDevice> getDevices() {
75         return mDevices;
76     }
77 
78     @Override
startElement(String uri, String localName, String name, Attributes attributes)79     public void startElement(String uri, String localName, String name, Attributes attributes)
80             throws SAXException {
81         if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
82             // get the deviceName, will not be null since we validated the XML.
83             String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
84 
85             // create a device and add it to the list
86             mCurrentDevice = new LayoutDevice(deviceName);
87             mDevices.add(mCurrentDevice);
88         } else if (LayoutDevicesXsd.NODE_DEFAULT.equals(localName)) {
89             // create a new default config
90             mDefaultConfig = mCurrentConfig = new FolderConfiguration();
91         } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
92             // create a new config
93             mCurrentConfig = new FolderConfiguration();
94 
95             // init with default config if applicable
96             if (mDefaultConfig != null) {
97                 mCurrentConfig.set(mDefaultConfig);
98             }
99 
100             // get the name of the config
101             String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
102 
103             // give it to the current device.
104             mCurrentDevice.addConfig(deviceName, mCurrentConfig);
105         } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
106             mSize1 = mSize2 = null;
107         }
108 
109         mStringAccumulator.setLength(0);
110     }
111 
112     @Override
characters(char[] ch, int start, int length)113     public void characters(char[] ch, int start, int length) throws SAXException {
114         mStringAccumulator.append(ch, start, length);
115     }
116 
117     @Override
endElement(String uri, String localName, String name)118     public void endElement(String uri, String localName, String name) throws SAXException {
119         if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
120             mCurrentDevice = null;
121             mDefaultConfig = null;
122         } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
123             mCurrentConfig.updateScreenWidthAndHeight();
124             mCurrentConfig = null;
125         } else if (LayoutDevicesXsd.NODE_COUNTRY_CODE.equals(localName)) {
126             CountryCodeQualifier ccq = new CountryCodeQualifier(
127                     Integer.parseInt(mStringAccumulator.toString()));
128             mCurrentConfig.setCountryCodeQualifier(ccq);
129         } else if (LayoutDevicesXsd.NODE_NETWORK_CODE.equals(localName)) {
130             NetworkCodeQualifier ncq = new NetworkCodeQualifier(
131                     Integer.parseInt(mStringAccumulator.toString()));
132             mCurrentConfig.setNetworkCodeQualifier(ncq);
133         } else if (LayoutDevicesXsd.NODE_SCREEN_SIZE.equals(localName)) {
134             ScreenSizeQualifier ssq = new ScreenSizeQualifier(
135                     ScreenSize.getEnum(mStringAccumulator.toString()));
136             mCurrentConfig.setScreenSizeQualifier(ssq);
137         } else if (LayoutDevicesXsd.NODE_SCREEN_RATIO.equals(localName)) {
138             ScreenRatioQualifier srq = new ScreenRatioQualifier(
139                     ScreenRatio.getEnum(mStringAccumulator.toString()));
140             mCurrentConfig.setScreenRatioQualifier(srq);
141         } else if (LayoutDevicesXsd.NODE_SCREEN_ORIENTATION.equals(localName)) {
142             ScreenOrientationQualifier soq = new ScreenOrientationQualifier(
143                     ScreenOrientation.getEnum(mStringAccumulator.toString()));
144             mCurrentConfig.setScreenOrientationQualifier(soq);
145         } else if (LayoutDevicesXsd.NODE_PIXEL_DENSITY.equals(localName)) {
146             DensityQualifier dq = new DensityQualifier(
147                     Density.getEnum(mStringAccumulator.toString()));
148             mCurrentConfig.setDensityQualifier(dq);
149         } else if (LayoutDevicesXsd.NODE_TOUCH_TYPE.equals(localName)) {
150             TouchScreenQualifier tsq = new TouchScreenQualifier(
151                     TouchScreen.getEnum(mStringAccumulator.toString()));
152             mCurrentConfig.setTouchTypeQualifier(tsq);
153         } else if (LayoutDevicesXsd.NODE_KEYBOARD_STATE.equals(localName)) {
154             KeyboardStateQualifier ksq = new KeyboardStateQualifier(
155                     KeyboardState.getEnum(mStringAccumulator.toString()));
156             mCurrentConfig.setKeyboardStateQualifier(ksq);
157         } else if (LayoutDevicesXsd.NODE_TEXT_INPUT_METHOD.equals(localName)) {
158             TextInputMethodQualifier timq = new TextInputMethodQualifier(
159                     Keyboard.getEnum(mStringAccumulator.toString()));
160             mCurrentConfig.setTextInputMethodQualifier(timq);
161         } else if (LayoutDevicesXsd.NODE_NAV_STATE.equals(localName)) {
162             NavigationStateQualifier nsq = new NavigationStateQualifier(
163                     NavigationState.getEnum(mStringAccumulator.toString()));
164             mCurrentConfig.setNavigationStateQualifier(nsq);
165         } else if (LayoutDevicesXsd.NODE_NAV_METHOD.equals(localName)) {
166             NavigationMethodQualifier nmq = new NavigationMethodQualifier(
167                     Navigation.getEnum(mStringAccumulator.toString()));
168             mCurrentConfig.setNavigationMethodQualifier(nmq);
169         } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
170             ScreenDimensionQualifier qual = ScreenDimensionQualifier.getQualifier(mSize1, mSize2);
171             if (qual != null) {
172                 mCurrentConfig.setScreenDimensionQualifier(qual);
173             }
174         } else if (LayoutDevicesXsd.NODE_XDPI.equals(localName)) {
175             mCurrentDevice.setXDpi(Float.parseFloat(mStringAccumulator.toString()));
176         } else if (LayoutDevicesXsd.NODE_YDPI.equals(localName)) {
177             mCurrentDevice.setYDpi(Float.parseFloat(mStringAccumulator.toString()));
178         } else if (LayoutDevicesXsd.NODE_SIZE.equals(localName)) {
179             if (mSize1 == null) {
180                 mSize1 = mStringAccumulator.toString();
181             } else if (mSize2 == null) {
182                 mSize2 = mStringAccumulator.toString();
183             }
184         }
185     }
186 }
187