ResourceHelper.java revision 51a7e5447de94791c464cda5cc6ebbf616d73c80
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.impl;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.DensityBasedResourceValue;
20918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
2119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceDensity;
2219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue;
23c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
24c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeContext;
25c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.ninepatch.NinePatch;
272d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohetimport com.android.ninepatch.NinePatchChunk;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.kxml2.io.KXmlParser;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
335de11a18e9151e6bc9b3e81cf31fc43dc63dffbfXavier Ducrohetimport android.graphics.Bitmap_Delegate;
342d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohetimport android.graphics.NinePatch_Delegate;
352d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohetimport android.graphics.Rect;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.BitmapDrawable;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
392d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohetimport android.graphics.drawable.NinePatchDrawable;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileReader;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.MalformedURLException;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.regex.Matcher;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.regex.Pattern;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
5090c6b7e639921e264ac65699439578bcbdbf583aXavier Ducrohet * Helper class to provide various conversion method used in handling android resources.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class ResourceHelper {
5356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static Pattern sFloatPattern = Pattern.compile("(-?[0-9]+(?:\\.[0-9]+)?)(.*)");
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static float[] sFloatOut = new float[1];
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static TypedValue mValue = new TypedValue();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the color value represented by the given string value
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value the color value
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the color as an int
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throw NumberFormatException if the conversion failed.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
65c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    public static int getColor(String value) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.startsWith("#") == false) {
6856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                throw new NumberFormatException(
6956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                        String.format("Color value '%s' must start with #", value));
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = value.substring(1);
7356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // make sure it's not longer than 32bit
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.length() > 8) {
7656222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                throw new NumberFormatException(String.format(
7756222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                        "Color value '%s' is too long. Format is either" +
7856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                        "#AARRGGBB, #RRGGBB, #RGB, or #ARGB",
7956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet                        value));
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8156a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.length() == 3) { // RGB format
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char[] color = new char[8];
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[0] = color[1] = 'F';
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[2] = color[3] = value.charAt(0);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[4] = color[5] = value.charAt(1);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[6] = color[7] = value.charAt(2);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = new String(color);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (value.length() == 4) { // ARGB format
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char[] color = new char[8];
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[0] = color[1] = value.charAt(0);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[2] = color[3] = value.charAt(1);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[4] = color[5] = value.charAt(2);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color[6] = color[7] = value.charAt(3);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = new String(color);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (value.length() == 6) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = "FF" + value;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // this is a RRGGBB or AARRGGBB value
10156a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Integer.parseInt will fail to parse strings like "ff191919", so we use
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a Long, but cast the result back into an int, since we know that we're only
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // dealing with 32 bit values.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (int)Long.parseLong(value, 16);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new NumberFormatException();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a drawable from the given value.
11356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet     * @param value The value that contains a path to a 9 patch, a bitmap or a xml based drawable,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or an hexadecimal color
11556a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet     * @param context
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isFramework indicates whether the resource is a framework resources.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Framework resources are cached, and loaded only once.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
119ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet    public static Drawable getDrawable(ResourceValue value, BridgeContext context,
1205de11a18e9151e6bc9b3e81cf31fc43dc63dffbfXavier Ducrohet            boolean isFramework) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable d = null;
12256a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
12356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet        String stringValue = value.getValue();
12456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
12556a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet        String lowerCaseValue = stringValue.toLowerCase();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lowerCaseValue.endsWith(NinePatch.EXTENSION_9PATCH)) {
12856a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet            File file = new File(stringValue);
12956a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet            if (file.isFile()) {
1302d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                // see if we still have both the chunk and the bitmap in the caches
1312d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                NinePatchChunk chunk = Bridge.getCached9Patch(stringValue,
1322d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                        isFramework ? null : context.getProjectKey());
1332d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                Bitmap bitmap = Bridge.getCachedBitmap(stringValue,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        isFramework ? null : context.getProjectKey());
13556a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1362d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                // if either chunk or bitmap is null, then we reload the 9-patch file.
1372d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                if (chunk == null || bitmap == null) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
13990c6b7e639921e264ac65699439578bcbdbf583aXavier Ducrohet                        NinePatch ninePatch = NinePatch.load(file.toURI().toURL(),
14090c6b7e639921e264ac65699439578bcbdbf583aXavier Ducrohet                                false /* convert */);
1412d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                        if (ninePatch != null) {
1422d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            if (chunk == null) {
1432d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                chunk = ninePatch.getChunk();
14456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1452d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                Bridge.setCached9Patch(stringValue, chunk,
1462d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                        isFramework ? null : context.getProjectKey());
1472d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            }
1482d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet
1492d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            if (bitmap == null) {
150ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                                ResourceDensity density = ResourceDensity.MEDIUM;
151ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                                if (value instanceof DensityBasedResourceValue) {
152ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                                    density =
153ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                                        ((DensityBasedResourceValue)value).getResourceDensity();
1542d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                }
1552d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet
1562d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                bitmap = Bitmap_Delegate.createBitmap(ninePatch.getImage(),
1572d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                        false /*isMutable*/,
1582d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                        density);
1592d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet
1602d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                Bridge.setCachedBitmap(stringValue, bitmap,
1612d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                        isFramework ? null : context.getProjectKey());
1622d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            }
1632d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                        }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (MalformedURLException e) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // URL is wrong, we'll return null below
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // failed to read the file, we'll return null below.
168918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                        Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
16951a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                                "Failed lot load " + file.getAbsolutePath(), e, null /*data*/);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17256a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1732d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                if (chunk != null && bitmap != null) {
1742d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                    int[] padding = chunk.getPadding();
1752d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                    Rect paddingRect = new Rect(padding[0], padding[1], padding[2], padding[3]);
1762d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet
1772d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                    return new NinePatchDrawable(context.getResources(), bitmap,
1782d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            NinePatch_Delegate.serialize(chunk),
1792d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                            paddingRect, null);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18256a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (lowerCaseValue.endsWith(".xml")) {
18590c6b7e639921e264ac65699439578bcbdbf583aXavier Ducrohet            // create a block parser for the file
18656a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet            File f = new File(stringValue);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (f.isFile()) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // let the framework inflate the Drawable from the XML file.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    KXmlParser parser = new KXmlParser();
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parser.setInput(new FileReader(f));
19356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d = Drawable.createFromXml(context.getResources(),
195c2e28dd74813799aad132673ff9d302657dd04edXavier Ducrohet                            new BridgeXmlBlockParser(parser, context, isFramework));
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return d;
1976c740cf71e5ce5ba7c8493c545c3a57c57ac7024Xavier Ducrohet                } catch (Exception e) {
1986c740cf71e5ce5ba7c8493c545c3a57c57ac7024Xavier Ducrohet                    // this is an error and not warning since the file existence is checked before
1996c740cf71e5ce5ba7c8493c545c3a57c57ac7024Xavier Ducrohet                    // attempting to parse it.
20051a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                    Bridge.getLog().error(null, "Failed to parse file " + value, e, null /*data*/);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2026c740cf71e5ce5ba7c8493c545c3a57c57ac7024Xavier Ducrohet            } else {
203918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
20451a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        String.format("File %s does not exist (or is not a file)", stringValue),
20551a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        null /*data*/);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21056a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet            File bmpFile = new File(stringValue);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bmpFile.isFile()) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
21356a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                    Bitmap bitmap = Bridge.getCachedBitmap(stringValue,
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            isFramework ? null : context.getProjectKey());
21556a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (bitmap == null) {
217ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                        ResourceDensity density = ResourceDensity.MEDIUM;
218ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                        if (value instanceof DensityBasedResourceValue) {
219ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet                            density = ((DensityBasedResourceValue)value).getResourceDensity();
22056a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                        }
2212d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet
2222d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                        bitmap = Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/,
2232d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                density);
2242d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                        Bridge.setCachedBitmap(stringValue, bitmap,
2252d56b273ef6e2984a4e8914fb67772b173d0a154Xavier Ducrohet                                isFramework ? null : context.getProjectKey());
22656a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                    }
22756a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
22856a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                    return new BitmapDrawable(context.getResources(), bitmap);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we'll return null below
231918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                    Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
23251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                            "Failed lot load " + bmpFile.getAbsolutePath(), e, null /*data*/);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // attempt to get a color from the value
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
23756a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                    int color = getColor(stringValue);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return new ColorDrawable(color);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NumberFormatException e) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we'll return null below.
241918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                    Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT,
24251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                            "Failed to convert " + stringValue + " into a drawable", e,
24351a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                            null /*data*/);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24756a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25156a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------- TypedValue stuff
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is taken from //device/libs/utils/ResourceTypes.cpp
25456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class UnitEntry {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int unit;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float scale;
26056a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        UnitEntry(String name, int type, int unit, float scale) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.name = name;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.type = type;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.unit = unit;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.scale = scale;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static UnitEntry[] sUnitNames = new UnitEntry[] {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("px", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_PX, 1.0f),
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("dip", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_DIP, 1.0f),
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("dp", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_DIP, 1.0f),
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("sp", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_SP, 1.0f),
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("pt", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_PT, 1.0f),
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("in", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_IN, 1.0f),
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("mm", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_MM, 1.0f),
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("%", TypedValue.TYPE_FRACTION, TypedValue.COMPLEX_UNIT_FRACTION, 1.0f/100),
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new UnitEntry("%p", TypedValue.TYPE_FRACTION, TypedValue.COMPLEX_UNIT_FRACTION_PARENT, 1.0f/100),
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
28056a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the raw value from the given string.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This object is only valid until the next call on to {@link ResourceHelper}.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static TypedValue getValue(String s) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (stringToFloat(s, mValue)) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mValue;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28956a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29256a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convert the string into a {@link TypedValue}.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param s
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outValue
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if success.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean stringToFloat(String s, TypedValue outValue) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // remove the space before and after
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s.trim();
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = s.length();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len <= 0) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check that there's no non ascii characters.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] buf = s.toCharArray();
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0 ; i < len ; i++) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (buf[i] > 255) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check the first character
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (buf[0] < '0' && buf[0] > '9' && buf[0] != '.') {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32056a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now look for the string that is after the float...
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Matcher m = sFloatPattern.matcher(s);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m.matches()) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String f_str = m.group(1);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String end = m.group(2);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float f;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                f = Float.parseFloat(f_str);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NumberFormatException e) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this shouldn't happen with the regexp above.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (end.length() > 0 && end.charAt(0) != ' ') {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Might be a unit...
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parseUnit(end, outValue, sFloatOut)) {
33856a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    f *= sFloatOut[0];
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean neg = f < 0;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (neg) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        f = -f;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long bits = (long)(f*(1<<23)+.5f);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int radix;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int shift;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((bits&0x7fffff) == 0) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Always use 23p0 if there is no fraction, just to make
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // things easier to read.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        radix = TypedValue.COMPLEX_RADIX_23p0;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        shift = 23;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if ((bits&0xffffffffff800000L) == 0) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Magnitude is zero -- can fit in 0 bits of precision.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        radix = TypedValue.COMPLEX_RADIX_0p23;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        shift = 0;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if ((bits&0xffffffff80000000L) == 0) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Magnitude can fit in 8 bits of precision.
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        radix = TypedValue.COMPLEX_RADIX_8p15;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        shift = 8;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if ((bits&0xffffff8000000000L) == 0) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Magnitude can fit in 16 bits of precision.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        radix = TypedValue.COMPLEX_RADIX_16p7;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        shift = 16;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Magnitude needs entire range, so no fractional part.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        radix = TypedValue.COMPLEX_RADIX_23p0;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        shift = 23;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int mantissa = (int)(
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (bits>>shift) & TypedValue.COMPLEX_MANTISSA_MASK);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (neg) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mantissa = (-mantissa) & TypedValue.COMPLEX_MANTISSA_MASK;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet                    outValue.data |=
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (radix<<TypedValue.COMPLEX_RADIX_SHIFT)
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | (mantissa<<TypedValue.COMPLEX_MANTISSA_SHIFT);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38156a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // make sure it's only spaces at the end.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            end = end.trim();
38456a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (end.length() == 0) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (outValue != null) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outValue.type = TypedValue.TYPE_FLOAT;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outValue.data = Float.floatToIntBits(f);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39656a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean parseUnit(String str, TypedValue outValue, float[] outScale) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = str.trim();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (UnitEntry unit : sUnitNames) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (unit.name.equals(str)) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outValue.type = unit.type;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outValue.data = unit.unit << TypedValue.COMPLEX_UNIT_SHIFT;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outScale[0] = unit.scale;
40556a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
413