186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta/*
286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * Copyright (C) 2014 The Android Open Source Project
386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta *
486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License");
586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * you may not use this file except in compliance with the License.
686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * You may obtain a copy of the License at
786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta *
886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta *      http://www.apache.org/licenses/LICENSE-2.0
986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta *
1086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software
1186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS,
1286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * See the License for the specific language governing permissions and
1486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * limitations under the License.
1586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta */
1686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
1786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptapackage com.android.layoutlib.bridge.intensive.setup;
1886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
1986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.rendering.api.HardwareConfig;
2086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.CountryCodeQualifier;
2186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.DensityQualifier;
2286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.FolderConfiguration;
2386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.KeyboardStateQualifier;
2486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.LayoutDirectionQualifier;
25a035dfbf8ddfc8d301dd96088eb50e8c2e63e487Deepanshu Guptaimport com.android.ide.common.resources.configuration.LocaleQualifier;
2686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.NavigationMethodQualifier;
2786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.NetworkCodeQualifier;
2886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.NightModeQualifier;
2986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.ScreenDimensionQualifier;
3086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
3186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.ScreenRatioQualifier;
3286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.ScreenSizeQualifier;
3386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.TextInputMethodQualifier;
3486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.TouchScreenQualifier;
3586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.UiModeQualifier;
3686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.ide.common.resources.configuration.VersionQualifier;
3786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.Density;
3886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.Keyboard;
3986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.KeyboardState;
4086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.Navigation;
4186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.NightMode;
4286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.ScreenOrientation;
4386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.ScreenRatio;
4486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.ScreenSize;
4586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.TouchScreen;
4686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.android.resources.UiMode;
4786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
4886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport org.xmlpull.v1.XmlPullParser;
4986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport org.xmlpull.v1.XmlPullParserException;
5086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport org.xmlpull.v1.XmlPullParserFactory;
5186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
5286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport java.io.File;
5386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport java.io.FileInputStream;
5486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport java.io.IOException;
5586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport java.util.Map;
5686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport java.util.Properties;
5786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
5886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptaimport com.google.android.collect.Maps;
5986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
6086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta/**
6186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * Provides {@link FolderConfiguration} and {@link HardwareConfig} for various devices. Also
6286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta * provides utility methods to parse build.prop and attrs.xml to generate the appropriate maps.
6386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta */
6486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta@SuppressWarnings("UnusedDeclaration") // For the pre-configured nexus generators.
6586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Guptapublic class ConfigGenerator {
6686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
6786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static final ConfigGenerator NEXUS_4 = new ConfigGenerator();
6886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
6986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static final ConfigGenerator NEXUS_5 = new ConfigGenerator()
7086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenHeight(1920)
7186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenWidth(1080)
7286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setXdpi(445)
7386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setYdpi(445)
7486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setOrientation(ScreenOrientation.PORTRAIT)
7586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setDensity(Density.XXHIGH)
7686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setRatio(ScreenRatio.NOTLONG)
7786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSize(ScreenSize.NORMAL)
7886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboard(Keyboard.NOKEY)
7986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setTouchScreen(TouchScreen.FINGER)
8086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboardState(KeyboardState.SOFT)
8186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSoftButtons(true)
8286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setNavigation(Navigation.NONAV);
8386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
8486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static final ConfigGenerator NEXUS_7 = new ConfigGenerator()
8586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenHeight(1920)
8686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenWidth(1200)
8786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setXdpi(323)
8886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setYdpi(323)
8986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setOrientation(ScreenOrientation.PORTRAIT)
9086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setDensity(Density.XHIGH)
9186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setRatio(ScreenRatio.NOTLONG)
9286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSize(ScreenSize.LARGE)
9386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboard(Keyboard.NOKEY)
9486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setTouchScreen(TouchScreen.FINGER)
9586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboardState(KeyboardState.SOFT)
9686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSoftButtons(true)
9786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setNavigation(Navigation.NONAV);
9886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
9986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static final ConfigGenerator NEXUS_10 = new ConfigGenerator()
10086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenHeight(1600)
10186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setScreenWidth(2560)
10286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setXdpi(300)
10386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setYdpi(300)
10486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setOrientation(ScreenOrientation.LANDSCAPE)
10586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setDensity(Density.XHIGH)
10686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setRatio(ScreenRatio.NOTLONG)
10786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSize(ScreenSize.XLARGE)
10886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboard(Keyboard.NOKEY)
10986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setTouchScreen(TouchScreen.FINGER)
110139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setKeyboardState(KeyboardState.SOFT)
111139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setSoftButtons(true)
112139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setNavigation(Navigation.NONAV);
113139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta
114139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta    public static final ConfigGenerator NEXUS_5_LAND = new ConfigGenerator()
115139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setScreenHeight(1080)
116139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setScreenWidth(1920)
117139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setXdpi(445)
118139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setYdpi(445)
119139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setOrientation(ScreenOrientation.LANDSCAPE)
120139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setDensity(Density.XXHIGH)
121139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setRatio(ScreenRatio.NOTLONG)
122139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setSize(ScreenSize.NORMAL)
123139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setKeyboard(Keyboard.NOKEY)
124139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta                                                        .setTouchScreen(TouchScreen.FINGER)
12586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setKeyboardState(KeyboardState.SOFT)
12686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setSoftButtons(true)
12786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                                                        .setNavigation(Navigation.NONAV);
12886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
12986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private static final String TAG_ATTR = "attr";
13086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private static final String TAG_ENUM = "enum";
13186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private static final String TAG_FLAG = "flag";
13286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private static final String ATTR_NAME = "name";
13386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private static final String ATTR_VALUE = "value";
13486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
13586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    // Device Configuration. Defaults are for a Nexus 4 device.
13686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private int mScreenHeight = 1280;
13786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private int mScreenWidth = 768;
13886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private int mXdpi = 320;
13986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private int mYdpi = 320;
14086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private ScreenOrientation mOrientation = ScreenOrientation.PORTRAIT;
14186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private Density mDensity = Density.XHIGH;
14286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private ScreenRatio mRatio = ScreenRatio.NOTLONG;
14386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private ScreenSize mSize = ScreenSize.NORMAL;
14486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private Keyboard mKeyboard = Keyboard.NOKEY;
14586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private TouchScreen mTouchScreen = TouchScreen.FINGER;
14686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private KeyboardState mKeyboardState = KeyboardState.SOFT;
14786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private boolean mSoftButtons = true;
14886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    private Navigation mNavigation = Navigation.NONAV;
14986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
15086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public FolderConfiguration getFolderConfig() {
15186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        FolderConfiguration config = new FolderConfiguration();
15286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.createDefault();
15386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setDensityQualifier(new DensityQualifier(mDensity));
15486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setNavigationMethodQualifier(new NavigationMethodQualifier(mNavigation));
15586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        if (mScreenWidth > mScreenHeight) {
15686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            config.setScreenDimensionQualifier(new ScreenDimensionQualifier(mScreenWidth,
15786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    mScreenHeight));
15886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        } else {
15986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            config.setScreenDimensionQualifier(new ScreenDimensionQualifier(mScreenHeight,
16086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    mScreenWidth));
16186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        }
16286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setScreenRatioQualifier(new ScreenRatioQualifier(mRatio));
16386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setScreenSizeQualifier(new ScreenSizeQualifier(mSize));
16486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setTextInputMethodQualifier(new TextInputMethodQualifier(mKeyboard));
16586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setTouchTypeQualifier(new TouchScreenQualifier(mTouchScreen));
16686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setKeyboardStateQualifier(new KeyboardStateQualifier(mKeyboardState));
16786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setScreenOrientationQualifier(new ScreenOrientationQualifier(mOrientation));
16886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
16986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.updateScreenWidthAndHeight();
17086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
17186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        // some default qualifiers.
17286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL));
17386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setNightModeQualifier(new NightModeQualifier(NightMode.NOTNIGHT));
17486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setCountryCodeQualifier(new CountryCodeQualifier());
17586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setLayoutDirectionQualifier(new LayoutDirectionQualifier());
17686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setNetworkCodeQualifier(new NetworkCodeQualifier());
177a035dfbf8ddfc8d301dd96088eb50e8c2e63e487Deepanshu Gupta        config.setLocaleQualifier(new LocaleQualifier());
17886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        config.setVersionQualifier(new VersionQualifier());
17986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return config;
18086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
18186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
18286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public HardwareConfig getHardwareConfig() {
18386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return new HardwareConfig(mScreenWidth, mScreenHeight, mDensity, mXdpi, mYdpi, mSize,
184d7b846c1814de34f2cea8507907f70618ec7cae0Deepanshu Gupta                mOrientation, null, mSoftButtons);
18586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
18686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
18786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static Map<String, String> loadProperties(File path) {
18886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        Properties p = new Properties();
18986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        Map<String, String> map = Maps.newHashMap();
19086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        try {
19186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            p.load(new FileInputStream(path));
19286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            for (String key : p.stringPropertyNames()) {
19386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                map.put(key, p.getProperty(key));
19486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            }
19586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        } catch (IOException e) {
19686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            e.printStackTrace();
19786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        }
19886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return map;
19986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
20086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
20186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public static Map<String, Map<String, Integer>> getEnumMap(File path) {
20286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        Map<String, Map<String, Integer>> map = Maps.newHashMap();
20386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        try {
20486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            XmlPullParser xmlPullParser = XmlPullParserFactory.newInstance().newPullParser();
20586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            xmlPullParser.setInput(new FileInputStream(path), null);
20686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            int eventType = xmlPullParser.getEventType();
20786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            String attr = null;
20886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            while (eventType != XmlPullParser.END_DOCUMENT) {
20986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                if (eventType == XmlPullParser.START_TAG) {
21086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    if (TAG_ATTR.equals(xmlPullParser.getName())) {
21186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        attr = xmlPullParser.getAttributeValue(null, ATTR_NAME);
21286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    } else if (TAG_ENUM.equals(xmlPullParser.getName())
21386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                            || TAG_FLAG.equals(xmlPullParser.getName())) {
21486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        String name = xmlPullParser.getAttributeValue(null, ATTR_NAME);
21586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        String value = xmlPullParser.getAttributeValue(null, ATTR_VALUE);
21686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        // Integer.decode cannot handle "ffffffff", see JDK issue 6624867
21786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        int i = (int) (long) Long.decode(value);
21886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        assert attr != null;
21986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        Map<String, Integer> attributeMap = map.get(attr);
22086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        if (attributeMap == null) {
22186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                            attributeMap = Maps.newHashMap();
22286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                            map.put(attr, attributeMap);
22386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        }
22486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        attributeMap.put(name, i);
22586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    }
22686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                } else if (eventType == XmlPullParser.END_TAG) {
22786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    if (TAG_ATTR.equals(xmlPullParser.getName())) {
22886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                        attr = null;
22986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                    }
23086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                }
23186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta                eventType = xmlPullParser.next();
23286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            }
23386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        } catch (XmlPullParserException e) {
23486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            e.printStackTrace();
23586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        } catch (IOException e) {
23686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta            e.printStackTrace();
23786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        }
23886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return map;
23986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
24086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
24186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    // Methods to set the configuration values.
24286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
24386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setScreenHeight(int height) {
24486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mScreenHeight = height;
24586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
24686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
24786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
24886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setScreenWidth(int width) {
24986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mScreenWidth = width;
25086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
25186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
25286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
25386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setXdpi(int xdpi) {
25486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mXdpi = xdpi;
25586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
25686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
25786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
25886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setYdpi(int ydpi) {
25986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mYdpi = ydpi;
26086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
26186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
26286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
26386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setOrientation(ScreenOrientation orientation) {
26486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mOrientation = orientation;
26586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
26686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
26786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
26886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setDensity(Density density) {
26986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mDensity = density;
27086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
27186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
27286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
27386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setRatio(ScreenRatio ratio) {
27486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mRatio = ratio;
27586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
27686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
27786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
27886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setSize(ScreenSize size) {
27986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mSize = size;
28086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
28186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
28286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
28386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setKeyboard(Keyboard keyboard) {
28486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mKeyboard = keyboard;
28586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
28686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
28786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
28886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setTouchScreen(TouchScreen touchScreen) {
28986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mTouchScreen = touchScreen;
29086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
29186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
29286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
29386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setKeyboardState(KeyboardState state) {
29486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mKeyboardState = state;
29586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
29686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
29786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
29886eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setSoftButtons(boolean softButtons) {
29986eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mSoftButtons = softButtons;
30086eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
30186eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
30286eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta
30386eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    public ConfigGenerator setNavigation(Navigation navigation) {
30486eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        mNavigation = navigation;
30586eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta        return this;
30686eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta    }
30786eb8b4e29b1ad889fc814bae723d4d6e491f53fDeepanshu Gupta}
308