BridgeXmlPullAttributes.java revision 35ea7cd4c0c89122fda0b57af20061645082ffb9
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetpackage com.android.layoutlib.bridge.android;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1970552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderResources;
2019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue;
21c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
22c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.BridgeConstants;
2335ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohetimport com.android.resources.ResourceType;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.XmlPullAttributes;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A correct implementation of the {@link AttributeSet} interface on top of a XmlPullParser
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class BridgeXmlPullAttributes extends XmlPullAttributes {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final BridgeContext mContext;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final boolean mPlatformFile;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BridgeXmlPullAttributes(XmlPullParser parser, BridgeContext context,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean platformFile) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(parser);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPlatformFile = platformFile;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (non-Javadoc)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.util.XmlPullAttributes#getAttributeNameResource(int)
48c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet     *
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This methods must return com.android.internal.R.attr.<name> matching
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the name of the attribute.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It returns 0 if it doesn't find anything.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAttributeNameResource(int index) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the attribute name.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = getAttributeName(index);
57c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the attribute namespace
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String ns = mParser.getAttributeNamespace(index);
60c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (BridgeConstants.NS_RESOURCES.equals(ns)) {
6235ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet            Integer v = Bridge.getResourceValue(ResourceType.ATTR, name);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v.intValue();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
66c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not an attribute in the android namespace, we query the customviewloader, if
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the namespaces match.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.getProjectCallback().getNamespace().equals(ns)) {
7335ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet            Integer v = mContext.getProjectCallback().getResourceValue(ResourceType.ATTR,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v.intValue();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (non-Javadoc)
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.util.XmlPullAttributes#getAttributeResourceValue(int, int)
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAttributeResourceValue(int index, int defaultValue) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value = getAttributeValue(index);
90c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return resolveResourceValue(value, defaultValue);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (non-Javadoc)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.util.XmlPullAttributes#getAttributeResourceValue(java.lang.String, java.lang.String, int)
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value = getAttributeValue(namespace, attribute);
101c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return resolveResourceValue(value, defaultValue);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int resolveResourceValue(String value, int defaultValue) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now look for this particular value
10770552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohet        RenderResources resources = mContext.getRenderResources();
10870552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohet        ResourceValue resource = resources.resolveResValue(
10970552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohet                resources.findResValue(value, mPlatformFile));
110c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resource != null) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Integer id = null;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPlatformFile || resource.isFramework()) {
11435ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet                id = Bridge.getResourceValue(resource.getResourceType(), resource.getName());
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                id = mContext.getProjectCallback().getResourceValue(
11735ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet                        resource.getResourceType(), resource.getName());
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (id != null) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return id;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
124c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return defaultValue;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
129