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