Home | History | Annotate | Download | only in sdk
      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 
     74     public List<LayoutDevice> getDevices() {
     75         return mDevices;
     76     }
     77 
     78     @Override
     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
    113     public void characters(char[] ch, int start, int length) throws SAXException {
    114         mStringAccumulator.append(ch, start, length);
    115     }
    116 
    117     @Override
    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