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.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; 39 40 import org.xml.sax.Attributes; 41 import org.xml.sax.SAXException; 42 import org.xml.sax.helpers.DefaultHandler; 43 44 import java.util.ArrayList; 45 import java.util.List; 46 47 /** 48 * {@link DefaultHandler} implementation to parse Layout Device XML file. 49 * @see LayoutDevicesXsd 50 * @see Layout-configs.xsd 51 */ 52 class LayoutDeviceHandler extends DefaultHandler { 53 /* 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. 58 * 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(). 61 */ 62 63 private List<LayoutDevice> mDevices = new ArrayList<LayoutDevice>(); 64 65 private LayoutDevice mCurrentDevice; 66 private FolderConfiguration mDefaultConfig; 67 private FolderConfiguration mCurrentConfig; 68 private final StringBuilder mStringAccumulator = new StringBuilder(); 69 70 private String mSize1, mSize2; 71 getDevices()72 public List<LayoutDevice> getDevices() { 73 return mDevices; 74 } 75 76 @Override startElement(String uri, String localName, String name, Attributes attributes)77 public void startElement(String uri, String localName, String name, Attributes attributes) 78 throws SAXException { 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); 82 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(); 92 93 // init with default config if applicable 94 if (mDefaultConfig != null) { 95 mCurrentConfig.set(mDefaultConfig); 96 } 97 98 // get the name of the config 99 String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME); 100 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; 105 } 106 107 mStringAccumulator.setLength(0); 108 } 109 110 @Override characters(char[] ch, int start, int length)111 public void characters(char[] ch, int start, int length) throws SAXException { 112 mStringAccumulator.append(ch, start, length); 113 } 114 115 @Override endElement(String uri, String localName, String name)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); 164 if (qual != null) { 165 mCurrentConfig.setScreenDimensionQualifier(qual); 166 } 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(); 176 } 177 } 178 } 179 } 180