blob: 7ad4e5d1a114ade0d7f8b7a60cb4fd89b330dfa6 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.
*/
package com.android.ide.eclipse.adt.internal.sdk;
import com.android.ide.eclipse.adt.internal.resources.configurations.CountryCodeQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.NetworkCodeQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenDimensionQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier.KeyboardState;
import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier.NavigationMethod;
import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier.ScreenOrientation;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier.ScreenRatio;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier.ScreenSize;
import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier.TextInputMethod;
import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier.TouchScreenType;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
/**
* {@link DefaultHandler} implementation to parse Layout Device XML file.
* @see LayoutDevicesXsd
* @see Layout-configs.xsd
*/
class LayoutDeviceHandler extends DefaultHandler {
/*
* The handler does most of the work in startElement and endElement.
* In startElement, it'll create DeviceConfiguration on <device>, as well as
* FolderConfiguration instances on <default> and <config>.
* Those objects are then filled as new nodes are discovered.
*
* For the qualifier values, the qualifier is created and added to the current config
* on the endElement, by using the content found in characters().
*/
private List<LayoutDevice> mDevices = new ArrayList<LayoutDevice>();
private LayoutDevice mCurrentDevice;
private FolderConfiguration mDefaultConfig;
private FolderConfiguration mCurrentConfig;
private final StringBuilder mStringAccumulator = new StringBuilder();
private String mSize1, mSize2;
public List<LayoutDevice> getDevices() {
return mDevices;
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes)
throws SAXException {
if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
// get the deviceName, will not be null since we validated the XML.
String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
// create a device and add it to the list
mCurrentDevice = new LayoutDevice(deviceName);
mDevices.add(mCurrentDevice);
} else if (LayoutDevicesXsd.NODE_DEFAULT.equals(localName)) {
// create a new default config
mDefaultConfig = mCurrentConfig = new FolderConfiguration();
} else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
// create a new config
mCurrentConfig = new FolderConfiguration();
// init with default config if applicable
if (mDefaultConfig != null) {
mCurrentConfig.set(mDefaultConfig);
}
// get the name of the config
String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
// give it to the current device.
mCurrentDevice.addConfig(deviceName, mCurrentConfig);
} else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
mSize1 = mSize2 = null;
}
mStringAccumulator.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
mStringAccumulator.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
mCurrentDevice = null;
mDefaultConfig = null;
} else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
mCurrentConfig = null;
} else if (LayoutDevicesXsd.NODE_COUNTRY_CODE.equals(localName)) {
CountryCodeQualifier ccq = new CountryCodeQualifier(
Integer.parseInt(mStringAccumulator.toString()));
mCurrentConfig.setCountryCodeQualifier(ccq);
} else if (LayoutDevicesXsd.NODE_NETWORK_CODE.equals(localName)) {
NetworkCodeQualifier ncq = new NetworkCodeQualifier(
Integer.parseInt(mStringAccumulator.toString()));
mCurrentConfig.setNetworkCodeQualifier(ncq);
} else if (LayoutDevicesXsd.NODE_SCREEN_SIZE.equals(localName)) {
ScreenSizeQualifier ssq = new ScreenSizeQualifier(
ScreenSize.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setScreenSizeQualifier(ssq);
} else if (LayoutDevicesXsd.NODE_SCREEN_RATIO.equals(localName)) {
ScreenRatioQualifier srq = new ScreenRatioQualifier(
ScreenRatio.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setScreenRatioQualifier(srq);
} else if (LayoutDevicesXsd.NODE_SCREEN_ORIENTATION.equals(localName)) {
ScreenOrientationQualifier soq = new ScreenOrientationQualifier(
ScreenOrientation.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setScreenOrientationQualifier(soq);
} else if (LayoutDevicesXsd.NODE_PIXEL_DENSITY.equals(localName)) {
PixelDensityQualifier pdq = new PixelDensityQualifier(
Density.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setPixelDensityQualifier(pdq);
} else if (LayoutDevicesXsd.NODE_TOUCH_TYPE.equals(localName)) {
TouchScreenQualifier tsq = new TouchScreenQualifier(
TouchScreenType.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setTouchTypeQualifier(tsq);
} else if (LayoutDevicesXsd.NODE_KEYBOARD_STATE.equals(localName)) {
KeyboardStateQualifier ksq = new KeyboardStateQualifier(
KeyboardState.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setKeyboardStateQualifier(ksq);
} else if (LayoutDevicesXsd.NODE_TEXT_INPUT_METHOD.equals(localName)) {
TextInputMethodQualifier timq = new TextInputMethodQualifier(
TextInputMethod.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setTextInputMethodQualifier(timq);
} else if (LayoutDevicesXsd.NODE_NAV_METHOD.equals(localName)) {
NavigationMethodQualifier nmq = new NavigationMethodQualifier(
NavigationMethod.getEnum(mStringAccumulator.toString()));
mCurrentConfig.setNavigationMethodQualifier(nmq);
} else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
ScreenDimensionQualifier qual = ScreenDimensionQualifier.getQualifier(mSize1, mSize2);
if (qual != null) {
mCurrentConfig.setScreenDimensionQualifier(qual);
}
} else if (LayoutDevicesXsd.NODE_XDPI.equals(localName)) {
mCurrentDevice.setXDpi(Float.parseFloat(mStringAccumulator.toString()));
} else if (LayoutDevicesXsd.NODE_YDPI.equals(localName)) {
mCurrentDevice.setYDpi(Float.parseFloat(mStringAccumulator.toString()));
} else if (LayoutDevicesXsd.NODE_SIZE.equals(localName)) {
if (mSize1 == null) {
mSize1 = mStringAccumulator.toString();
} else if (mSize2 == null) {
mSize2 = mStringAccumulator.toString();
}
}
}
}