19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.res; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 198b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viveretteimport android.util.Pools.SynchronizedPool; 20836c0a8b949d71293c996761691e065f0651acefJon Mirandaimport android.view.ViewDebug; 212269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 263b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viveretteimport android.annotation.Nullable; 27ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornimport android.content.pm.ActivityInfo; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Movie; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable; 31c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Oginoimport android.graphics.drawable.Drawable.ConstantState; 323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackbornimport android.os.Build; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 3448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautnerimport android.os.IBinder; 353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyimport android.os.Trace; 3675257cefcd64cf5cc73083d9546d27825b29a595Alan Viveretteimport android.util.ArrayMap; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 402f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackbornimport android.util.Slog; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 42fdbf6a7eac39a23e0e910c29678fe00d4eb56c99Romain Guyimport android.util.LongSparseArray; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 47e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport java.util.Locale; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 491ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughesimport libcore.icu.NativePluralRules; 501ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class for accessing an application's resources. This sits on top of the 53f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * asset manager of the application (accessible through {@link #getAssets}) and 54f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * provides a high-level API for getting typed data from the assets. 55f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * 56f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * <p>The Android resource system keeps track of all non-code assets associated with an 57f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * application. You can use this class to access your application's resources. You can generally 58f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * acquire the {@link android.content.res.Resources} instance associated with your application 59f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * with {@link android.content.Context#getResources getResources()}.</p> 60f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * 61f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * <p>The Android SDK tools compile your application's resources into the application binary 62f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * at build time. To use a resource, you must install it correctly in the source tree (inside 63f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * your project's {@code res/} directory) and build your application. As part of the build 64f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * process, the SDK tools generate symbols for each resource, which you can use in your application 65f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * code to access the resources.</p> 66f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * 67f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * <p>Using application resources makes it easy to update various characteristics of your 68f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * application without modifying code, and—by providing sets of alternative 69f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * resources—enables you to optimize your application for a variety of device configurations 70f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * (such as for different languages and screen sizes). This is an important aspect of developing 71f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * Android applications that are compatible on different types of devices.</p> 72f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * 73f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * <p>For more information about using resources, see the documentation about <a 74f4f05b8f24183b9e0d6959fe8b71fb88543edd9bScott Main * href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</p> 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Resources { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "Resources"; 78562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG_LOAD = false; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG_CONFIG = false; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean TRACE_FOR_PRELOAD = false; 829b44aaefc0c8c4aafd176c2fe5af86e098422b56Dianne Hackborn private static final boolean TRACE_FOR_MISS_PRELOAD = false; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private static final int LAYOUT_DIR_CONFIG = ActivityInfo.activityInfoConfigToNative( 85562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette ActivityInfo.CONFIG_LAYOUT_DIRECTION); 86562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette 871ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes private static final int ID_OTHER = 0x01000004; 881ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes 8950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn private static final Object sSync = new Object(); 90b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Information about preloaded resources. Note that they are not 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // protected by a lock, because while preloading in zygote we are all 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // single-threaded, and after that these are immutable. 9452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private static final LongSparseArray<ConstantState>[] sPreloadedDrawables; 9552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private static final LongSparseArray<ConstantState> sPreloadedColorDrawables 9652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette = new LongSparseArray<ConstantState>(); 975d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy private static final LongSparseArray<ColorStateList> sPreloadedColorStateLists 985d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy = new LongSparseArray<ColorStateList>(); 99b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio 1008b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette // Pool of TypedArrays targeted to this Resources object. 1018b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<TypedArray>(5); 1028b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette 103edc4664d60af1f124d05f0a2b6ba58b837630f51Alan Viverette // Used by BridgeResources in layoutlib 104edc4664d60af1f124d05f0a2b6ba58b837630f51Alan Viverette static Resources mSystem = null; 105edc4664d60af1f124d05f0a2b6ba58b837630f51Alan Viverette 106dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn private static boolean sPreloaded; 107dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn private static int sPreloadedDensity; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn // These are protected by mAccessLock. 110562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private final Object mAccessLock = new Object(); 111562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private final Configuration mTmpConfig = new Configuration(); 11275257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> mDrawableCache = 11375257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette new ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>>(); 11475257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> mColorDrawableCache = 11575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette new ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>>(); 11652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private final LongSparseArray<WeakReference<ColorStateList>> mColorStateListCache = 11752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette new LongSparseArray<WeakReference<ColorStateList>>(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private TypedValue mTmpValue = new TypedValue(); 120562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private boolean mPreloading; 121562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette 122562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette private TypedArray mCachedStyledAttributes = null; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastCachedXmlBlockIndex = -1; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int[] mCachedXmlBlockIds = { 0, 0, 0, 0 }; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4]; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1288b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette final AssetManager mAssets; 1298b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette final DisplayMetrics mMetrics = new DisplayMetrics(); 1308b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Configuration mConfiguration = new Configuration(); 1321ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes private NativePluralRules mPluralRule; 13348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner 13448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner private CompatibilityInfo mCompatibilityInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; 13552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 13652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @SuppressWarnings("unused") 13748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner private WeakReference<IBinder> mToken; 138e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima 139b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio static { 140b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio sPreloadedDrawables = new LongSparseArray[2]; 14152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedDrawables[0] = new LongSparseArray<ConstantState>(); 14252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedDrawables[1] = new LongSparseArray<ConstantState>(); 143b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio } 144b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio 1456259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette /** 1466259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * Returns the most appropriate default theme for the specified target SDK version. 1475effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * <ul> 1485effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * <li>Below API 11: Gingerbread 1495effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * <li>APIs 11 thru 14: Holo 1505effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * <li>APIs 14 thru XX: Device default dark 1515effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * <li>API XX and above: Device default light with dark action bar 1525effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette * </ul> 1536259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * 1546259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * @param curTheme The current theme, or 0 if not specified. 1556259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * @param targetSdkVersion The target SDK version. 1566259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * @return A theme resource identifier 1576259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette * @hide 1586259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette */ 1595effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette public static int selectDefaultTheme(int curTheme, int targetSdkVersion) { 160d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn return selectSystemTheme(curTheme, targetSdkVersion, 1615effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme, 1625effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_Holo, 1635effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_DeviceDefault, 1645effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_DeviceDefault_Light_DarkActionBar); 165d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn } 1666259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette 1675effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette /** @hide */ 1685effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo, 1695effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette int dark, int deviceDefault) { 170d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn if (curTheme != 0) { 171d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn return curTheme; 172d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn } 1735effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) { 1745effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette return orig; 1756259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette } 1765effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 1775effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette return holo; 1785effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette } 1795effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette if (targetSdkVersion < Build.VERSION_CODES.CUR_DEVELOPMENT) { 1805effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette return dark; 1815effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette } 1825effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette return deviceDefault; 183d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn } 1846259933ec99dee566f200c5fdfe1756ee72b1513Alan Viverette 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This exception is thrown by the resource APIs when a requested resource 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can not be found. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class NotFoundException extends RuntimeException { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public NotFoundException() { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public NotFoundException(String name) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(name); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new Resources object on top of an existing set of assets in an 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AssetManager. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param assets Previously created AssetManager. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param metrics Current display metrics to consider when 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selecting/computing resource values. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config Desired device configuration to consider when 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selecting/computing resource values (optional). 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2085d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config) { 20948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner this(assets, metrics, config, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null); 2108169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima } 2118169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 2128169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima /** 213ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima * Creates a new Resources object with CompatibilityInfo. 2149189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * 2159189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * @param assets Previously created AssetManager. 2169189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * @param metrics Current display metrics to consider when 2179189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * selecting/computing resource values. 2189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * @param config Desired device configuration to consider when 2199189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * selecting/computing resource values (optional). 22048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner * @param compatInfo this resource's compatibility info. Must not be null. 22148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner * @param token The Activity token for determining stack affiliation. Usually null. 2228169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima * @hide 2238169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima */ 22448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config, 22548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner CompatibilityInfo compatInfo, IBinder token) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets = assets; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMetrics.setToDefaults(); 22879a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski if (compatInfo != null) { 22979a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski mCompatibilityInfo = compatInfo; 23079a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski } 23148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mToken = new WeakReference<IBinder>(token); 232569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima updateConfiguration(config, metrics); 233569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima assets.ensureStringBlocks(); 234569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima } 235569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima 236569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a global shared Resources object that provides access to only 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system resources (no application resources), and is not configured for 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current screen (can not use dimension units, does not change based 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on orientation, etc). 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Resources getSystem() { 24350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (sSync) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources ret = mSystem; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret == null) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = new Resources(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystem = ret; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the string value associated with a particular resource ID. The 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned object will be a String if this is a plain string; it will be 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other type of CharSequence if it is styled. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@more} 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence The string data associated with the resource, plus 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possibly styled text information. 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getText(int id) throws NotFoundException { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence res = mAssets.getResourceText(id); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("String resource ID #0x" 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27995d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Returns the character sequence necessary for grammatically correct pluralization 28095d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * of the given resource ID for the given quantity. 28195d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Note that the character sequence is selected based solely on grammatical necessity, 28295d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * and that such rules differ between languages. Do not assume you know which string 28395d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * will be returned for a given quantity. See 28495d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String Resources</a> 28595d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * for more detail. 2861ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes * 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 2901ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes * @param quantity The number used to get the correct string for the current language's 2911ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes * plural rules. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence The string data associated with the resource, plus 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possibly styled text information. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getQuantityText(int id, int quantity) throws NotFoundException { 2991ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes NativePluralRules rule = getPluralRule(); 3001ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes CharSequence res = mAssets.getResourceBagText(id, 3011ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes attrForQuantityCode(rule.quantityForInt(quantity))); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3051ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes res = mAssets.getResourceBagText(id, ID_OTHER); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Plural resource ID #0x" + Integer.toHexString(id) 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " quantity=" + quantity 3111ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes + " item=" + stringForQuantityCode(rule.quantityForInt(quantity))); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3141ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes private NativePluralRules getPluralRule() { 31550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (sSync) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPluralRule == null) { 3171ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes mPluralRule = NativePluralRules.forLocale(mConfiguration.locale); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPluralRule; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3231ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes private static int attrForQuantityCode(int quantityCode) { 3241ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes switch (quantityCode) { 3251ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.ZERO: return 0x01000005; 3261ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.ONE: return 0x01000006; 3271ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.TWO: return 0x01000007; 3281ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.FEW: return 0x01000008; 3291ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.MANY: return 0x01000009; 3301ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes default: return ID_OTHER; 3311ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes } 3321ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes } 3331ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes 3341ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes private static String stringForQuantityCode(int quantityCode) { 3351ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes switch (quantityCode) { 3361ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.ZERO: return "zero"; 3371ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.ONE: return "one"; 3381ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.TWO: return "two"; 3391ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.FEW: return "few"; 3401ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes case NativePluralRules.MANY: return "many"; 3411ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes default: return "other"; 3421ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes } 3431ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes } 3441ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the string value associated with a particular resource ID. It 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be stripped of any styled text information. 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@more} 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The string data associated with the resource, 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stripped of styled text information. 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getString(int id) throws NotFoundException { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence res = getText(id); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res.toString(); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("String resource ID #0x" 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the string value associated with a particular resource ID, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * substituting the format arguments as defined in {@link java.util.Formatter} 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link java.lang.String#format}. It will be stripped of any styled text 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@more} 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param formatArgs The format arguments that will be used for substitution. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The string data associated with the resource, 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stripped of styled text information. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getString(int id, Object... formatArgs) throws NotFoundException { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String raw = getString(id); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.format(mConfiguration.locale, raw, formatArgs); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 39395d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Formats the string necessary for grammatically correct pluralization 39495d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * of the given resource ID for the given quantity, using the given arguments. 39595d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Note that the string is selected based solely on grammatical necessity, 39695d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * and that such rules differ between languages. Do not assume you know which string 39795d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * will be returned for a given quantity. See 39895d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String Resources</a> 39995d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * for more detail. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 40195d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * <p>Substitution of format arguments works as if using 40295d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * {@link java.util.Formatter} and {@link java.lang.String#format}. 40395d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * The resulting string will be stripped of any styled text information. 4041ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes * 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param quantity The number used to get the correct string for the current language's 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * plural rules. 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param formatArgs The format arguments that will be used for substitution. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The string data associated with the resource, 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stripped of styled text information. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getQuantityString(int id, int quantity, Object... formatArgs) 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String raw = getQuantityText(id, quantity).toString(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.format(mConfiguration.locale, raw, formatArgs); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 42495d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Returns the string necessary for grammatically correct pluralization 42595d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * of the given resource ID for the given quantity. 42695d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * Note that the string is selected based solely on grammatical necessity, 42795d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * and that such rules differ between languages. Do not assume you know which string 42895d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * will be returned for a given quantity. See 42995d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String Resources</a> 43095d5ab30f2f91b63af2f493548dc67e90c052831Elliott Hughes * for more detail. 4311ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param quantity The number used to get the correct string for the current language's 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * plural rules. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The string data associated with the resource, 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stripped of styled text information. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getQuantityString(int id, int quantity) throws NotFoundException { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getQuantityText(id, quantity).toString(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the string value associated with a particular resource ID. The 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned object will be a String if this is a plain string; it will be 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some other type of CharSequence if it is styled. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param def The default CharSequence to return. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence The string data associated with the resource, plus 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possibly styled text information, or def if id is 0 or not found. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getText(int id, CharSequence def) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence res = id != 0 ? mAssets.getResourceText(id) : null; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != null ? res : def; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the styled text array associated with a particular resource ID. 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The styled text array associated with the resource. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence[] getTextArray(int id) throws NotFoundException { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence[] res = mAssets.getResourceTextArray(id); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Text array resource ID #0x" 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the string array associated with a particular resource ID. 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The string array associated with the resource. 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] getStringArray(int id) throws NotFoundException { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] res = mAssets.getResourceStringArray(id); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("String array resource ID #0x" 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the int array associated with a particular resource ID. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The int array associated with the resource. 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getIntArray(int id) throws NotFoundException { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] res = mAssets.getArrayIntResource(id); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Int array resource ID #0x" 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an array of heterogeneous values. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedArray holding an array of the array values. 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when done with it. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedArray obtainTypedArray(int id) throws NotFoundException { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = mAssets.getArraySize(id); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len < 0) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Array resource ID #0x" 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette TypedArray array = TypedArray.obtain(this, len); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array.mLength = mAssets.retrieveArray(id, array.mData); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array.mIndices[0] = 0; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional for a particular resource ID. Unit 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * conversions are based on the current {@link DisplayMetrics} associated 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the resources. 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Resource dimension value multiplied by the appropriate 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric. 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getDimension(int id) throws NotFoundException { 57150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 57350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 57450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 57550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type == TypedValue.TYPE_DIMENSION) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimension(value.data, mMetrics); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional for a particular resource ID for use 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as an offset in raw pixels. This is the same as 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for you. An offset conversion involves simply 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * truncating the base value to an integer. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Resource dimension value multiplied by the appropriate 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelOffset(int id) throws NotFoundException { 60650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 60850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 60950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 61050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type == TypedValue.TYPE_DIMENSION) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelOffset( 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data, mMetrics); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional for a particular resource ID for use 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a size in raw pixels. This is the same as 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for use as a size. A size conversion involves 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rounding the base value, and ensuring that a non-zero base value 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is at least one pixel in size. 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Resource dimension value multiplied by the appropriate 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelSize(int id) throws NotFoundException { 64350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 64550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 64650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 64750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type == TypedValue.TYPE_DIMENSION) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelSize( 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data, mMetrics); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a fractional unit for a particular resource ID. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The base value of this fraction. In other words, a 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard fraction is multiplied by this value. 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pbase The parent base value of this fraction. In other 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * words, a parent fraction (nn%p) is multiplied by this 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value. 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute fractional value multiplied by the appropriate 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * base value. 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFraction(int id, int base, int pbase) { 67750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 67950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 68050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 68150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type == TypedValue.TYPE_FRACTION) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToFraction(value.data, base, pbase); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a drawable object associated with a particular resource ID. 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Various types of objects will be returned depending on the underlying 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource -- for example, a solid color, PNG image, scalable image, etc. 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Drawable API hides these implementation details. 697fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * 698fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * <p class="note"><strong>Note:</strong> Prior to 699fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * {@link android.os.Build.VERSION_CODES#JELLY_BEAN}, this function 700fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * would not correctly retrieve the final configuration density when 701fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * the resource ID passed here is an alias to another Drawable resource. 702fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * This means that if the density configuration of the alias resource 703fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * is different than the actual resource, the density of the returned 704fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * Drawable would be incorrect, resulting in bad scaling. To work 705fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * around this, you can instead retrieve the Drawable through 706fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * {@link TypedArray#getDrawable TypedArray.getDrawable}. Use 707fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * {@link android.content.Context#obtainStyledAttributes(int[]) 708fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * Context.obtainStyledAttributes} with 709fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * an array containing the resource ID of interest to create the TypedArray.</p> 710fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn * 7116dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * <p class="note"><strong>Note:</strong> To obtain a themed drawable, use 7126dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * {@link android.content.Context#getDrawable(int) Context.getDrawable(int)} 7136dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * or {@link #getDrawable(int, Theme)} passing the desired theme.</p> 7146dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Drawable An object that can be used to draw this resource. 7198eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @throws NotFoundException Throws NotFoundException if the given ID does 7208eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * not exist. 7216dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * @see #getDrawable(int, Theme) 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getDrawable(int id) throws NotFoundException { 72434a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette final Drawable d = getDrawable(id, null); 72534a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette if (d.canApplyTheme()) { 72634a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette Log.w(TAG, "Drawable " + getResourceName(id) + " has unresolved theme " 72734a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette + "attributes! Consider using Resources.getDrawable(int, Theme) or " 72834a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette + "Context.getDrawable(int).", new RuntimeException()); 72934a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette } 73034a14f967ab6c88829c9a36ce6e909c47b3ee398Alan Viverette return d; 7318eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette } 7328eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 7338eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette /** 7348eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * Return a drawable object associated with a particular resource ID and 7356dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * styled for the specified theme. Various types of objects will be 7366dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * returned depending on the underlying resource -- for example, a solid 7376dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * color, PNG image, scalable image, etc. 7388eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * 7398eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @param id The desired resource identifier, as generated by the aapt 7408eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * tool. This integer encodes the package, type, and resource 7418eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * entry. The value 0 is an invalid identifier. 7423b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * @param theme The theme used to style the drawable attributes, may be {@code null}. 7438eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @return Drawable An object that can be used to draw this resource. 7448eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @throws NotFoundException Throws NotFoundException if the given ID does 7458eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * not exist. 7468eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette */ 7473b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette public Drawable getDrawable(int id, @Nullable Theme theme) throws NotFoundException { 74850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 74950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 75050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 75150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 75250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 75350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else { 75450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = null; 75550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7588eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final Drawable res = loadDrawable(value, id, theme); 75950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 76050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 76150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 76250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 76350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 76450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return res; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 76855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * Return a drawable object associated with a particular resource ID for the 76955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * given screen density in DPI. This will set the drawable's density to be 77055fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * the device's density multiplied by the ratio of actual drawable density 77155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * to requested density. This allows the drawable to be scaled up to the 77255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * correct size if needed. Various types of objects will be returned 77355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * depending on the underlying resource -- for example, a solid color, PNG 77455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * image, scalable image, etc. The Drawable API hides these implementation 77555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * details. 7768eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * 7776dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * <p class="note"><strong>Note:</strong> To obtain a themed drawable, use 7786dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * {@link android.content.Context#getDrawable(int) Context.getDrawable(int)} 7796dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * or {@link #getDrawableForDensity(int, int, Theme)} passing the desired 7806dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * theme.</p> 7816dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * 78255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @param id The desired resource identifier, as generated by the aapt tool. 78355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * This integer encodes the package, type, and resource entry. 78455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * The value 0 is an invalid identifier. 78555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @param density the desired screen density indicated by the resource as 78655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * found in {@link DisplayMetrics}. 7878eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @return Drawable An object that can be used to draw this resource. 78855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @throws NotFoundException Throws NotFoundException if the given ID does 78955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * not exist. 7908eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @see #getDrawableForDensity(int, int, Theme) 79155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root */ 79255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root public Drawable getDrawableForDensity(int id, int density) throws NotFoundException { 7938eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette return getDrawableForDensity(id, density, null); 7948eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette } 7958eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 7968eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette /** 7978eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * Return a drawable object associated with a particular resource ID for the 7988eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * given screen density in DPI and styled for the specified theme. 7998eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * 8008eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @param id The desired resource identifier, as generated by the aapt tool. 8018eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * This integer encodes the package, type, and resource entry. 8028eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * The value 0 is an invalid identifier. 8038eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @param density The desired screen density indicated by the resource as 8048eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * found in {@link DisplayMetrics}. 8053b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * @param theme The theme used to style the drawable attributes, may be {@code null}. 8068eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @return Drawable An object that can be used to draw this resource. 8078eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @throws NotFoundException Throws NotFoundException if the given ID does 8088eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * not exist. 8098eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette */ 8103b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette public Drawable getDrawableForDensity(int id, int density, @Nullable Theme theme) { 81150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 81250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 81350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 81450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 81550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 81650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else { 81750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = null; 81850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 81955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root getValueForDensity(id, density, value, true); 82055fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root 82155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root /* 82255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * Pretend the requested density is actually the display density. If 82355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * the drawable returned is not the requested density, then force it 82455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * to be scaled later by dividing its density by the ratio of 82555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * requested density to actual device density. Drawables that have 82655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * undefined density or no density don't need to be handled here. 82755fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root */ 82855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root if (value.density > 0 && value.density != TypedValue.DENSITY_NONE) { 82955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root if (value.density == density) { 830908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn value.density = mMetrics.densityDpi; 83155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } else { 832908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn value.density = (value.density * mMetrics.densityDpi) / density; 83355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 83455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 83550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 83655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root 8378eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final Drawable res = loadDrawable(value, id, theme); 83850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 83950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 84050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 84150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 84255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 84350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return res; 84455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 84555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root 84655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root /** 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a movie object associated with the particular resource ID. 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Movie getMovie(int id) throws NotFoundException { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is = openRawResource(id); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Movie movie = Movie.decodeStream(is); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (java.io.IOException e) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't care, since the return value is valid 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return movie; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a color integer associated with a particular resource ID. 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the resource holds a complex 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.res.ColorStateList}, then the default color from 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the set is returned. 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a single color value in the form 0xAARRGGBB. 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getColor(int id) throws NotFoundException { 88150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 88250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 88350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 88450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 88550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 88650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type >= TypedValue.TYPE_FIRST_INT 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && value.type <= TypedValue.TYPE_LAST_INT) { 89050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value.data; 89250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else if (value.type != TypedValue.TYPE_STRING) { 89350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn throw new NotFoundException( 89450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 89550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn + Integer.toHexString(value.type) + " is not valid"); 89650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 897e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn mTmpValue = null; 89850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 89950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn ColorStateList csl = loadColorStateList(value, id); 90050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 90150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 90250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return csl.getDefaultColor(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a color state list associated with a particular resource ID. The 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource may contain either a single raw color value, or a complex 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.res.ColorStateList} holding multiple possible colors. 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier of a {@link ColorStateList}, 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as generated by the aapt tool. This integer encodes the package, type, and resource 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a ColorStateList object containing either a single 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * solid color or multiple colors that can be selected based on a state. 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorStateList getColorStateList(int id) throws NotFoundException { 92350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 92450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 92550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 92650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 92750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 92850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else { 92950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = null; 93050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn ColorStateList res = loadColorStateList(value, id); 93450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 93550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 93650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 93750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 93850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 93950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return res; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a boolean associated with a particular resource ID. This can be 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used with any integral resource value, and will return true if it is 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * non-zero. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the boolean value contained in the resource. 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBoolean(int id) throws NotFoundException { 95650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 95850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 95950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 96050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type >= TypedValue.TYPE_FIRST_INT 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && value.type <= TypedValue.TYPE_LAST_INT) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value.data != 0; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an integer associated with a particular resource ID. 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the integer value contained in the resource. 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInteger(int id) throws NotFoundException { 98450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 98650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 98750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value = new TypedValue(); 98850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type >= TypedValue.TYPE_FIRST_INT 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && value.type <= TypedValue.TYPE_LAST_INT) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value.data; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1001b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * Retrieve a floating-point value for a particular resource ID. 1002b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * 1003b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * @param id The desired resource identifier, as generated by the aapt 1004b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * tool. This integer encodes the package, type, and resource 1005b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * entry. The value 0 is an invalid identifier. 1006b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * 1007b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * @return Returns the floating-point value contained in the resource. 1008b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * 1009b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * @throws NotFoundException Throws NotFoundException if the given ID does 1010b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * not exist or is not a floating-point value. 1011b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette * @hide Pending API council approval. 1012b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette */ 1013b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette public float getFloat(int id) { 1014b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette synchronized (mAccessLock) { 1015b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette TypedValue value = mTmpValue; 1016b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette if (value == null) { 1017b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette mTmpValue = value = new TypedValue(); 1018b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette } 1019b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette getValue(id, value, true); 1020b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette if (value.type == TypedValue.TYPE_FLOAT) { 1021b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette return value.getFloat(); 1022b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette } 1023b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + " type #0x" 1024b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette + Integer.toHexString(value.type) + " is not valid"); 1025b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette } 1026b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette } 1027b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette 1028b1e1dbfb36b658bd2710fedf8c0381a5d89fa302Alan Viverette /** 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an XmlResourceParser through which you can read a view layout 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * description for the given resource ID. This parser has limited 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * functionality -- in particular, you can't change its input, and only 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the high-level events are available. 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function is really a simple wrapper for calling 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getXml} with a layout resource. 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A new parser object through which you can read 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the XML data. 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getXml 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public XmlResourceParser getLayout(int id) throws NotFoundException { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadXmlResourceParser(id, "layout"); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an XmlResourceParser through which you can read an animation 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * description for the given resource ID. This parser has limited 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * functionality -- in particular, you can't change its input, and only 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the high-level events are available. 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function is really a simple wrapper for calling 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getXml} with an animation resource. 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A new parser object through which you can read 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the XML data. 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getXml 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public XmlResourceParser getAnimation(int id) throws NotFoundException { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadXmlResourceParser(id, "anim"); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an XmlResourceParser through which you can read a generic XML 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource for the given resource ID. 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The XmlPullParser implementation returned here has some limited 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * functionality. In particular, you can't change its input, and only 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * high-level parsing events are available (since the document was 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pre-parsed for you at build time, which involved merging text and 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stripping comments). 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A new parser object through which you can read 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the XML data. 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.util.AttributeSet 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public XmlResourceParser getXml(int id) throws NotFoundException { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadXmlResourceParser(id, "xml"); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a data stream for reading a raw resource. This can only be used 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with resources whose value is the name of an asset files -- that is, it can be 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to open drawable, sound, and raw resources; it will fail on string 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and color resources. 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource identifier to open, as generated by the appt 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return InputStream Access to the resource data. 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputStream openRawResource(int id) throws NotFoundException { 111650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 111750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 111850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 111950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 112050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 112150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else { 112250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = null; 112350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 112450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 112550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn InputStream res = openRawResource(id, value); 112650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 112750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 112850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 112950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 113150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return res; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a data stream for reading a raw resource. This can only be used 1136f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * with resources whose value is the name of an asset file -- that is, it can be 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to open drawable, sound, and raw resources; it will fail on string 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and color resources. 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource identifier to open, as generated by the appt tool. 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value The TypedValue object to hold the resource information. 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return InputStream Access to the resource data. 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputStream openRawResource(int id, TypedValue value) throws NotFoundException { 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAssets.openNonAsset(value.assetCookie, value.string.toString(), 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager.ACCESS_STREAMING); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotFoundException rnf = new NotFoundException("File " + value.string.toString() + 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " from drawable resource ID #0x" + Integer.toHexString(id)); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(e); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a file descriptor for reading a raw resource. This can only be used 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with resources whose value is the name of an asset files -- that is, it can be 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to open drawable, sound, and raw resources; it will fail on string 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and color resources. 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This function only works for resources that are stored in the package 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as uncompressed data, which typically includes things like mp3 files 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and png images. 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource identifier to open, as generated by the appt 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return AssetFileDescriptor A new file descriptor you can use to read 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the resource. This includes the file descriptor itself, as well as the 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * offset and length of data where the resource appears in the file. A 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null is returned if the file exists but is compressed. 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException { 118350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn TypedValue value; 118450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 118550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = mTmpValue; 118650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (value == null) { 118750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value = new TypedValue(); 118850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } else { 118950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = null; 119050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 119250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 119350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn try { 119450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn return mAssets.openNonAssetFd( 119550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn value.assetCookie, value.string.toString()); 119650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } catch (Exception e) { 119750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn NotFoundException rnf = new NotFoundException( 119850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn "File " + value.string.toString() 119950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn + " from drawable resource ID #0x" 120050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn + Integer.toHexString(id)); 120150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn rnf.initCause(e); 120250707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn throw rnf; 120350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } finally { 120450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 120550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (mTmpValue == null) { 120650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn mTmpValue = value; 120750707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the raw data associated with a particular resource ID. 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The desired resource identifier, as generated by the aapt 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool. This integer encodes the package, type, and resource 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * entry. The value 0 is an invalid identifier. 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue Object in which to place the resource data. 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resolveRefs If true, a resource that is a reference to another 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource will be followed so that you receive the 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual final resource data. If false, the TypedValue 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be filled in with the reference itself. 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getValue(int id, TypedValue outValue, boolean resolveRefs) 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 122955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs); 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (found) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Resource ID #0x" 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 123855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * Get the raw value associated with a resource with associated density. 123955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * 124055fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @param id resource identifier 124155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @param density density in DPI 124255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @param resolveRefs If true, a resource that is a reference to another 124355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * resource will be followed so that you receive the actual final 124455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * resource data. If false, the TypedValue will be filled in with 124555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * the reference itself. 124655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @throws NotFoundException Throws NotFoundException if the given ID does 124755fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * not exist. 124855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root * @see #getValue(String, TypedValue, boolean) 124955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root */ 125055fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root public void getValueForDensity(int id, int density, TypedValue outValue, boolean resolveRefs) 125155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root throws NotFoundException { 125255fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root boolean found = mAssets.getResourceValue(id, density, outValue, resolveRefs); 125355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root if (found) { 125455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root return; 125555fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 125655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)); 125755fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root } 125855fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root 125955fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root /** 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the raw data associated with a particular resource ID. 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See getIdentifier() for information on how names are mapped to resource 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IDs, and getString(int) for information on how string resources are 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note: use of this function is discouraged. It is much more 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * efficient to retrieve resources by identifier than by name. 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name The name of the desired resource. This is passed to 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getIdentifier() with a default type of "string". 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue Object in which to place the resource data. 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resolveRefs If true, a resource that is a reference to another 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource will be followed so that you receive the 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual final resource data. If false, the TypedValue 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be filled in with the reference itself. 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getValue(String name, TypedValue outValue, boolean resolveRefs) 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = getIdentifier(name, "string", null); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != 0) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, outValue, resolveRefs); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("String resource name " + name); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class holds the current attribute values for a particular theme. 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In other words, a Theme is a set of values for resource attributes; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these are used in conjunction with {@link TypedArray} 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to resolve the final value for an attribute. 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Theme's attributes come into play in two ways: (1) a styled 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute can explicit reference a value in the theme through the 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "?themeAttribute" syntax; (2) if no value has been defined for a 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular styled attribute, as a last resort we will try to find that 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute's value in the Theme. 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You will normally use the {@link #obtainStyledAttributes} APIs to 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieve XML attributes with style and theme information applied. 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Theme { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Place new attribute values into the theme. The style resource 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified by <var>resid</var> will be retrieved from this Theme's 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, its values placed into the Theme object. 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The semantics of this function depends on the <var>force</var> 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * argument: If false, only values that are not already defined in 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the theme will be copied from the system resource; otherwise, if 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any of the style's attributes are already defined in the theme, the 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current values in the theme will be overwritten. 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 131675257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette * @param resId The resource ID of a style resource from which to 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtain attribute values. 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param force If true, values in the style resource will always be 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used in the theme; otherwise, they will only be used 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if not already defined in the theme. 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 132275257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette public void applyStyle(int resId, boolean force) { 132375257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette AssetManager.applyThemeStyle(mTheme, resId, force); 132452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 132575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette mThemeResId = resId; 132675257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette mKey += Integer.toHexString(resId) + (force ? "! " : " "); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this theme to hold the same contents as the theme 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>other</var>. If both of these themes are from the same 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object, they will be identical after this function 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns. If they are from different Resources, only the resources 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they have in common will be set in this theme. 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param other The existing Theme to copy from. 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTo(Theme other) { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager.copyTheme(mTheme, other.mTheme); 134052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 134152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette mThemeResId = other.mThemeResId; 134275257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette mKey = other.mKey; 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1346330dd534848562515c6c67cb3de13067e86866a1John Spurlock * Return a TypedArray holding the values defined by 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>Theme</var> which are listed in <var>attrs</var>. 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * <p>Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} when you are done 1350183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * with the array. 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs The desired attributes. 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedArray holding an array of the attribute values. 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when done with it. 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Resources#obtainAttributes 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(int, int[]) 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(AttributeSet, int[], int, int) 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedArray obtainStyledAttributes(int[] attrs) { 13658eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final int len = attrs.length; 136652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final TypedArray array = TypedArray.obtain(Resources.this, len); 13678eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette array.mTheme = this; 136852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette AssetManager.applyStyle(mTheme, 0, 0, 0, attrs, array.mData, array.mIndices); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1373330dd534848562515c6c67cb3de13067e86866a1John Spurlock * Return a TypedArray holding the values defined by the style 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource <var>resid</var> which are listed in <var>attrs</var>. 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1376183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * <p>Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} when you are done 1377183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * with the array. 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The desired style resource. 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs The desired attributes in the style. 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedArray holding an array of the attribute values. 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when done with it. 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Resources#obtainAttributes 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(int[]) 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(AttributeSet, int[], int, int) 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13928eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette public TypedArray obtainStyledAttributes(int resid, int[] attrs) throws NotFoundException { 13938eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final int len = attrs.length; 139452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final TypedArray array = TypedArray.obtain(Resources.this, len); 13958eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette array.mTheme = this; 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] data = array.mData; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("**********************************************************"); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("**********************************************************"); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("**********************************************************"); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Attributes:"); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = " Attrs:"; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<attrs.length; i++) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + " 0x" + Integer.toHexString(attrs[i]); 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(s); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = " Found:"; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = new TypedValue(); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<attrs.length; i++) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int d = i*AssetManager.STYLE_NUM_ENTRIES; 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.type = data[d+AssetManager.STYLE_TYPE]; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data = data[d+AssetManager.STYLE_DATA]; 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.assetCookie = data[d+AssetManager.STYLE_ASSET_COOKIE]; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.resourceId = data[d+AssetManager.STYLE_RESOURCE_ID]; 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + " 0x" + Integer.toHexString(attrs[i]) 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "=" + value; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(s); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette AssetManager.applyStyle(mTheme, 0, resid, 0, attrs, array.mData, array.mIndices); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1427330dd534848562515c6c67cb3de13067e86866a1John Spurlock * Return a TypedArray holding the attribute values in 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>set</var> 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that are listed in <var>attrs</var>. In addition, if the given 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AttributeSet specifies a style class (through the "style" attribute), 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that style will be applied on top of the base attributes it defines. 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1433183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * <p>Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} when you are done 1434183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * with the array. 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When determining the final value of a particular attribute, there 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are four inputs that come into play:</p> 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any attribute values in the given AttributeSet. 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The style resource specified in the AttributeSet (named 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "style"). 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The default style specified by <var>defStyleAttr</var> and 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>defStyleRes</var> 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The base values in this theme. 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Each of these inputs is considered in-order, with the first listed 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taking precedence over the following ones. In other words, if in the 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AttributeSet you have supplied <code><Button 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * textColor="#ff000000"></code>, then the button's text will 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>always</em> be black, regardless of what is specified in any of 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the styles. 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param set The base set of attribute values. May be null. 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs The desired attributes to be retrieved. 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defStyleAttr An attribute in the current theme that contains a 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference to a style resource that supplies 1459330dd534848562515c6c67cb3de13067e86866a1John Spurlock * defaults values for the TypedArray. Can be 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 to not look for defaults. 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defStyleRes A resource identifier of a style resource that 1462330dd534848562515c6c67cb3de13067e86866a1John Spurlock * supplies default values for the TypedArray, 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used only if defStyleAttr is 0 or can not be found 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the theme. Can be 0 to not look for defaults. 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedArray holding an array of the attribute values. 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when done with it. 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Resources#obtainAttributes 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(int[]) 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #obtainStyledAttributes(int, int[]) 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedArray obtainStyledAttributes(AttributeSet set, 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] attrs, int defStyleAttr, int defStyleRes) { 14768eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final int len = attrs.length; 147752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final TypedArray array = TypedArray.obtain(Resources.this, len); 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX note that for now we only work with compiled XML files. 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To support generic XML files we will need to manually parse 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // out the attributes from the XML file (applying type information 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // contained in the resources and such). 14838eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final XmlBlock.Parser parser = (XmlBlock.Parser)set; 14848eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette AssetManager.applyStyle(mTheme, defStyleAttr, defStyleRes, 14858eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette parser != null ? parser.mParseState : 0, attrs, array.mData, array.mIndices); 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14878eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette array.mTheme = this; 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array.mXml = parser; 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] data = array.mData; 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Attributes:"); 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = " Attrs:"; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<set.getAttributeCount(); i++) { 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + " " + set.getAttributeName(i); 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = set.getAttributeNameResource(i); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != 0) { 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + "(0x" + Integer.toHexString(id) + ")"; 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + "=" + set.getAttributeValue(i); 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(s); 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = " Found:"; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = new TypedValue(); 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<attrs.length; i++) { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int d = i*AssetManager.STYLE_NUM_ENTRIES; 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.type = data[d+AssetManager.STYLE_TYPE]; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data = data[d+AssetManager.STYLE_DATA]; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.assetCookie = data[d+AssetManager.STYLE_ASSET_COOKIE]; 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.resourceId = data[d+AssetManager.STYLE_RESOURCE_ID]; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = s + " 0x" + Integer.toHexString(attrs[i]) 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "=" + value; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(s); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 152352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Retrieve the values for a set of attributes in the Theme. The 152452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * contents of the typed array are ultimately filled in by 152552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * {@link Resources#getValue}. 152652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 152752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param values The base set of attribute values, must be equal 152852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * in length to {@code attrs} or {@code null}. All values 152952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * must be of type {@link TypedValue#TYPE_ATTRIBUTE}. 153052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param attrs The desired attributes to be retrieved. 153152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @return Returns a TypedArray holding an array of the attribute 153252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * values. Be sure to call {@link TypedArray#recycle()} 153352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * when done with it. 153452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @hide 153552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 15360cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette public TypedArray resolveAttributes(int[] values, int[] attrs) { 153752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int len = attrs.length; 153852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (values != null && len != values.length) { 153952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throw new IllegalArgumentException( 154052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette "Base attribute values must be null or the same length as attrs"); 154152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 154252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 154352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final TypedArray array = TypedArray.obtain(Resources.this, len); 15440cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette AssetManager.resolveAttrs(mTheme, 0, 0, values, attrs, array.mData, array.mIndices); 154552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette array.mTheme = this; 154652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette array.mXml = null; 154752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 154852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return array; 154952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 155052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 155152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the value of an attribute in the Theme. The contents of 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>outValue</var> are ultimately filled in by 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getValue}. 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The resource identifier of the desired theme 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute. 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue Filled in with the ultimate resource value supplied 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the attribute. 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resolveRefs If true, resource references will be walked; if 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false, <var>outValue</var> may be a 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TYPE_REFERENCE. In either case, it will never 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a TYPE_ATTRIBUTE. 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean Returns true if the attribute was found and 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>outValue</var> is valid, else false. 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 156852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean resolveAttribute(int resid, TypedValue outValue, boolean resolveRefs) { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean got = mAssets.getThemeValue(mTheme, resid, outValue, resolveRefs); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resolveAttribute #" + Integer.toHexString(resid) 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " got=" + got + ", type=0x" + Integer.toHexString(outValue.type) 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", data=0x" + Integer.toHexString(outValue.data)); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return got; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1580042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda * Gets all of the attribute ids associated with this {@link Theme}. For debugging only. 1581042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda * 1582042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda * @return The int array containing attribute ids associated with this {@link Theme}. 1583042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda * @hide 1584042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda */ 1585042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda public int[] getAllAttributes() { 1586042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda return mAssets.getStyleAttributes(getAppliedStyleResId()); 1587042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda } 1588042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda 1589042ad633bc68bdda2bb0c50216706d73575a5992Jon Miranda /** 159052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Returns the resources to which this theme belongs. 159152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 159252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @return Resources to which this theme belongs. 159352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 159452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public Resources getResources() { 159552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return Resources.this; 159652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 159752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 159852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 15998eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * Return a drawable object associated with a particular resource ID 16008eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * and styled for the Theme. 16018eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * 16028eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @param id The desired resource identifier, as generated by the aapt 16038eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * tool. This integer encodes the package, type, and resource 16048eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * entry. The value 0 is an invalid identifier. 16058eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @return Drawable An object that can be used to draw this resource. 16068eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * @throws NotFoundException Throws NotFoundException if the given ID 16078eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette * does not exist. 16088eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette */ 16098eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette public Drawable getDrawable(int id) throws NotFoundException { 16108eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette return Resources.this.getDrawable(id, this); 16118eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette } 16128eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 16138eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette /** 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print contents of this theme out to the log. For debugging only. 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param priority The log priority to use. 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag The log tag to use. 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param prefix Text to prefix each line printed. 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(int priority, String tag, String prefix) { 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager.dumpTheme(mTheme, priority, tag, prefix); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16238eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 16248eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette @Override 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.releaseTheme(mTheme); 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ Theme() { 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets = Resources.this.mAssets; 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mAssets.createTheme(); 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16358eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette @SuppressWarnings("hiding") 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final AssetManager mAssets; 1637896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat private final long mTheme; 163852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 1639351f0c1d26999af7b86f9e0c7eca707121739ee0Alan Viverette /** Resource identifier for the theme. */ 164052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private int mThemeResId = 0; 1641bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 164275257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette /** Unique key for the series of styles applied to this theme. */ 164375257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette private String mKey = ""; 164475257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette 1645bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta // Needed by layoutlib. 1646bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta /*package*/ long getNativeTheme() { 1647bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return mTheme; 1648bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 1649bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 1650bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta /*package*/ int getAppliedStyleResId() { 1651bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return mThemeResId; 1652bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 165375257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette 165475257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette /*package*/ String getKey() { 165575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette return mKey; 165675257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette } 1657836c0a8b949d71293c996761691e065f0651acefJon Miranda 1658836c0a8b949d71293c996761691e065f0651acefJon Miranda private String getResourceNameFromHexString(String hexString) { 1659836c0a8b949d71293c996761691e065f0651acefJon Miranda return getResourceName(Integer.parseInt(hexString, 16)); 1660836c0a8b949d71293c996761691e065f0651acefJon Miranda } 1661836c0a8b949d71293c996761691e065f0651acefJon Miranda 1662836c0a8b949d71293c996761691e065f0651acefJon Miranda /** 1663836c0a8b949d71293c996761691e065f0651acefJon Miranda * Parses {@link #mKey} and returns a String array that holds pairs of adjacent Theme data: 1664836c0a8b949d71293c996761691e065f0651acefJon Miranda * resource name followed by whether or not it was forced, as specified by 1665836c0a8b949d71293c996761691e065f0651acefJon Miranda * {@link #applyStyle(int, boolean)}. 1666836c0a8b949d71293c996761691e065f0651acefJon Miranda * 1667836c0a8b949d71293c996761691e065f0651acefJon Miranda * @hide 1668836c0a8b949d71293c996761691e065f0651acefJon Miranda */ 1669836c0a8b949d71293c996761691e065f0651acefJon Miranda @ViewDebug.ExportedProperty(category = "theme", hasAdjacentMapping = true) 1670836c0a8b949d71293c996761691e065f0651acefJon Miranda public String[] getTheme() { 1671836c0a8b949d71293c996761691e065f0651acefJon Miranda String[] themeData = mKey.split(" "); 1672836c0a8b949d71293c996761691e065f0651acefJon Miranda String[] themes = new String[themeData.length * 2]; 1673836c0a8b949d71293c996761691e065f0651acefJon Miranda String theme; 1674836c0a8b949d71293c996761691e065f0651acefJon Miranda boolean forced; 1675836c0a8b949d71293c996761691e065f0651acefJon Miranda 1676836c0a8b949d71293c996761691e065f0651acefJon Miranda for (int i = 0, j = themeData.length - 1; i < themes.length; i += 2, --j) { 1677836c0a8b949d71293c996761691e065f0651acefJon Miranda theme = themeData[j]; 1678836c0a8b949d71293c996761691e065f0651acefJon Miranda forced = theme.endsWith("!"); 1679836c0a8b949d71293c996761691e065f0651acefJon Miranda themes[i] = forced ? 1680836c0a8b949d71293c996761691e065f0651acefJon Miranda getResourceNameFromHexString(theme.substring(0, theme.length() - 1)) : 1681836c0a8b949d71293c996761691e065f0651acefJon Miranda getResourceNameFromHexString(theme); 1682836c0a8b949d71293c996761691e065f0651acefJon Miranda themes[i + 1] = forced ? "forced" : "not forced"; 1683836c0a8b949d71293c996761691e065f0651acefJon Miranda } 1684836c0a8b949d71293c996761691e065f0651acefJon Miranda return themes; 1685836c0a8b949d71293c996761691e065f0651acefJon Miranda } 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate a new Theme object for this set of Resources. It initially 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * starts out empty. 1691836c0a8b949d71293c996761691e065f0651acefJon Miranda * 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Theme The newly created Theme container. 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Theme newTheme() { 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Theme(); 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a set of basic attribute values from an AttributeSet, not 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * performing styling of them using a theme and/or style resources. 1701836c0a8b949d71293c996761691e065f0651acefJon Miranda * 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param set The current attribute values to retrieve. 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs The specific attributes to be retrieved. 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedArray holding an array of the attribute values. 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Be sure to call {@link TypedArray#recycle() TypedArray.recycle()} 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when done with it. 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Theme#obtainStyledAttributes(AttributeSet, int[], int, int) 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = attrs.length; 171252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette TypedArray array = TypedArray.obtain(this, len); 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX note that for now we only work with compiled XML files. 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To support generic XML files we will need to manually parse 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // out the attributes from the XML file (applying type information 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // contained in the resources and such). 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlBlock.Parser parser = (XmlBlock.Parser)set; 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.retrieveAttributes(parser.mParseState, attrs, 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array.mData, array.mIndices); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array.mXml = parser; 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1726e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Store the newly updated configuration. 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateConfiguration(Configuration config, 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics) { 1732e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn updateConfiguration(config, metrics, null); 1733e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1734e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1735e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn /** 1736e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn * @hide 1737e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn */ 1738e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn public void updateConfiguration(Configuration config, 1739e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn DisplayMetrics metrics, CompatibilityInfo compat) { 174050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 17412f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn if (false) { 17422f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn Slog.i(TAG, "**** Updating config of " + this + ": old config is " 17432f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn + mConfiguration + " old compat is " + mCompatibilityInfo); 17442f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn Slog.i(TAG, "**** Updating config of " + this + ": new config is " 17452f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn + config + " new compat is " + compat); 17462f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn } 1747e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (compat != null) { 1748e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mCompatibilityInfo = compat; 1749e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (metrics != null) { 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMetrics.setTo(metrics); 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17532b31d53161789358de57fd396716a6503855c5daDianne Hackborn // NOTE: We should re-arrange this code to create a Display 17542b31d53161789358de57fd396716a6503855c5daDianne Hackborn // with the CompatibilityInfo that is used everywhere we deal 17552b31d53161789358de57fd396716a6503855c5daDianne Hackborn // with the display in relation to this app, rather than 17562b31d53161789358de57fd396716a6503855c5daDianne Hackborn // doing the conversion here. This impl should be okay because 17572b31d53161789358de57fd396716a6503855c5daDianne Hackborn // we make sure to return a compatible display in the places 17582b31d53161789358de57fd396716a6503855c5daDianne Hackborn // where there are public APIs to retrieve the display... but 17592b31d53161789358de57fd396716a6503855c5daDianne Hackborn // it would be cleaner and more maintainble to just be 17602b31d53161789358de57fd396716a6503855c5daDianne Hackborn // consistently dealing with a compatible display everywhere in 17612b31d53161789358de57fd396716a6503855c5daDianne Hackborn // the framework. 176279a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski mCompatibilityInfo.applyToDisplayMetrics(mMetrics); 176379a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski 17645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int configChanges = 0xfffffff; 17655fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (config != null) { 17665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mTmpConfig.setTo(config); 1767756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn int density = config.densityDpi; 1768756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (density == Configuration.DENSITY_DPI_UNDEFINED) { 1769756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn density = mMetrics.noncompatDensityDpi; 1770756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 177179a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski 177279a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski mCompatibilityInfo.applyToConfiguration(density, mTmpConfig); 177379a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski 17745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (mTmpConfig.locale == null) { 17755fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mTmpConfig.locale = Locale.getDefault(); 17765f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio mTmpConfig.setLayoutDirection(mTmpConfig.locale); 17775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 17785fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn configChanges = mConfiguration.updateFrom(mTmpConfig); 17795fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn configChanges = ActivityInfo.activityInfoConfigToNative(configChanges); 17805fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 17815fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (mConfiguration.locale == null) { 17825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mConfiguration.locale = Locale.getDefault(); 17835f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio mConfiguration.setLayoutDirection(mConfiguration.locale); 17845fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 1785756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mConfiguration.densityDpi != Configuration.DENSITY_DPI_UNDEFINED) { 1786756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mMetrics.densityDpi = mConfiguration.densityDpi; 1787756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mMetrics.density = mConfiguration.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE; 1788756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 17892b31d53161789358de57fd396716a6503855c5daDianne Hackborn mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale; 17908169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String locale = null; 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mConfiguration.locale != null) { 17935cd9dde5a2a77c5095f985186d8f03147fd22870Deepanshu Gupta locale = adjustLanguageTag(mConfiguration.locale.toLanguageTag()); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int width, height; 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMetrics.widthPixels >= mMetrics.heightPixels) { 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = mMetrics.widthPixels; 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = mMetrics.heightPixels; 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection SuspiciousNameCombination 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = mMetrics.heightPixels; 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection SuspiciousNameCombination 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = mMetrics.widthPixels; 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int keyboardHidden = mConfiguration.keyboardHidden; 180608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (keyboardHidden == Configuration.KEYBOARDHIDDEN_NO 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mConfiguration.hardKeyboardHidden 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == Configuration.HARDKEYBOARDHIDDEN_YES) { 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden = Configuration.KEYBOARDHIDDEN_SOFT; 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc, 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locale, mConfiguration.orientation, 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConfiguration.touchscreen, 1814908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn mConfiguration.densityDpi, mConfiguration.keyboard, 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden, mConfiguration.navigation, width, height, 181669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn mConfiguration.smallestScreenWidthDp, 1817ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn mConfiguration.screenWidthDp, mConfiguration.screenHeightDp, 18183b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn mConfiguration.screenLayout, mConfiguration.uiMode, 18193b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn Build.VERSION.RESOURCES_SDK_INT); 1820c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino 18215fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_CONFIG) { 18222f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn Slog.i(TAG, "**** Updating config of " + this + ": final config is " + mConfiguration 18232f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn + " final compat is " + mCompatibilityInfo); 18242f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn } 18252f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn 182652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette clearDrawableCachesLocked(mDrawableCache, configChanges); 182752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette clearDrawableCachesLocked(mColorDrawableCache, configChanges); 1828c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColorStateListCache.clear(); 1830c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flushLayoutCache(); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 183350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (sSync) { 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPluralRule != null) { 18351ad636c31501b1f407a3bf504d14689c1d5c7f5aElliott Hughes mPluralRule = NativePluralRules.forLocale(config.locale); 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 184052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private void clearDrawableCachesLocked( 184175257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, 184275257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette int configChanges) { 184352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = caches.size(); 184452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 184552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette clearDrawableCacheLocked(caches.valueAt(i), configChanges); 184652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 184752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 184852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 184950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn private void clearDrawableCacheLocked( 185052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette LongSparseArray<WeakReference<ConstantState>> cache, int configChanges) { 1851c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino if (DEBUG_CONFIG) { 1852c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino Log.d(TAG, "Cleaning up drawables config changes: 0x" 1853c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + Integer.toHexString(configChanges)); 1854c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 185552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = cache.size(); 185652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 185752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final WeakReference<ConstantState> ref = cache.valueAt(i); 1858c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino if (ref != null) { 185952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantState cs = ref.get(); 1860c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino if (cs != null) { 1861c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino if (Configuration.needNewResources( 1862c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino configChanges, cs.getChangingConfigurations())) { 1863c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino if (DEBUG_CONFIG) { 1864c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino Log.d(TAG, "FLUSHING #0x" 186575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette + Long.toHexString(cache.keyAt(i)) 1866c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + " / " + cs + " with changes: 0x" 1867c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + Integer.toHexString(cs.getChangingConfigurations())); 1868c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1869c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino cache.setValueAt(i, null); 1870c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } else if (DEBUG_CONFIG) { 1871c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino Log.d(TAG, "(Keeping #0x" 1872c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + Long.toHexString(cache.keyAt(i)) 1873c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + " / " + cs + " with changes: 0x" 1874c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + Integer.toHexString(cs.getChangingConfigurations()) 1875c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino + ")"); 1876c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1877c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1878c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1879c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1880c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 1881c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 188321fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * {@code Locale.toLanguageTag} will transform the obsolete (and deprecated) 188421fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * language codes "in", "ji" and "iw" to "id", "yi" and "he" respectively. 188521fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * 188621fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * All released versions of android prior to "L" used the deprecated language 188721fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * tags, so we will need to support them for backwards compatibility. 188821fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * 188921fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * Note that this conversion needs to take place *after* the call to 189021fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * {@code toLanguageTag} because that will convert all the deprecated codes to 189121fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath * the new ones, even if they're set manually. 189221fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath */ 189321fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath private static String adjustLanguageTag(String languageTag) { 189421fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath final int separator = languageTag.indexOf('-'); 189521fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath final String language; 189621fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath final String remainder; 189721fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath 189821fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath if (separator == -1) { 189921fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath language = languageTag; 190021fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath remainder = ""; 190121fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath } else { 190221fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath language = languageTag.substring(0, separator); 190321fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath remainder = languageTag.substring(separator); 190421fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath } 190521fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath 19064c6ce23816acdede6eb589cba07916a5340d0a38Narayan Kamath return Locale.adjustLanguageCode(language) + remainder; 190721fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath } 190821fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath 190921fc8ba39c4799a346caf95218d2bd60ee42ca1aNarayan Kamath /** 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the system resources configuration if they have previously 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been initialized. 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1915e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn public static void updateSystemConfiguration(Configuration config, DisplayMetrics metrics, 1916e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn CompatibilityInfo compat) { 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSystem != null) { 1918e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mSystem.updateConfiguration(config, metrics, compat); 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Updated system resources " + mSystem 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + ": " + mSystem.getConfiguration()); 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the current display metrics that are in effect for this resource 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object. The returned object should be treated as read-only. 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The resource's current display metrics. 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DisplayMetrics getDisplayMetrics() { 19315fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels 19325fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn + "x" + mMetrics.heightPixels + " " + mMetrics.density); 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMetrics; 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the current configuration that is in effect for this resource 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object. The returned object should be treated as read-only. 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The resource's current configuration. 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration getConfiguration() { 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConfiguration; 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19459189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 19469189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima /** 19479189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * Return the compatibility mode information for the application. 19489189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * The returned object should be treated as read-only. 19499189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * 19503904d03dd01dcd43c446744e44b34615825d9679Dianne Hackborn * @return compatibility info. 19519189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * @hide 19529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima */ 19539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima public CompatibilityInfo getCompatibilityInfo() { 195479a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski return mCompatibilityInfo; 19559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1958a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * This is just for testing. 1959a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @hide 1960a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 1961a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public void setCompatibilityInfo(CompatibilityInfo ci) { 196279a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski if (ci != null) { 196379a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski mCompatibilityInfo = ci; 196479a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski updateConfiguration(mConfiguration, mMetrics); 196579a8ffe54f9c99ffc34f7b5b73c22eea2673424aAdam Lesinski } 1966a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn } 1967a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 1968a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a resource identifier for the given resource name. A fully 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * qualified resource name is of the form "package:type/entry". The first 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two components (package and type) are optional if defType and 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defPackage, respectively, are specified here. 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note: use of this function is discouraged. It is much more 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * efficient to retrieve resources by identifier than by name. 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name The name of the desired resource. 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defType Optional default resource type to find, if "type/" is 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not included in the name. Can be null to require an 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit type. 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defPackage Optional default package to find, if "package:" is 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not included in the name. Can be null to require an 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit package. 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The associated resource identifier. Returns 0 if no such 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource was found. (0 is not a valid resource ID.) 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIdentifier(String name, String defType, String defPackage) { 198950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn if (name == null) { 199050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn throw new NullPointerException("name is null"); 199150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Integer.parseInt(name); 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAssets.getResourceIdentifier(name, defType, defPackage); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 200147b50333c110194565498011379988e5c05f7890Jeff Sharkey * Return true if given resource identifier includes a package. 200247b50333c110194565498011379988e5c05f7890Jeff Sharkey * 200347b50333c110194565498011379988e5c05f7890Jeff Sharkey * @hide 200447b50333c110194565498011379988e5c05f7890Jeff Sharkey */ 200547b50333c110194565498011379988e5c05f7890Jeff Sharkey public static boolean resourceHasPackage(int resid) { 200647b50333c110194565498011379988e5c05f7890Jeff Sharkey return (resid >>> 24) != 0; 200747b50333c110194565498011379988e5c05f7890Jeff Sharkey } 200847b50333c110194565498011379988e5c05f7890Jeff Sharkey 200947b50333c110194565498011379988e5c05f7890Jeff Sharkey /** 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the full name for a given resource identifier. This name is 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single string of the form "package:type/entry". 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The resource identifier whose name is to be retrieved. 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string holding the name of the resource. 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourcePackageName 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourceTypeName 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourceEntryName 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getResourceName(int resid) throws NotFoundException { 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = mAssets.getResourceName(resid); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) return str; 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Unable to find resource ID #0x" 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid)); 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the package name for a given resource identifier. 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The resource identifier whose package name is to be 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string holding the package name of the resource. 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourceName 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getResourcePackageName(int resid) throws NotFoundException { 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = mAssets.getResourcePackageName(resid); 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) return str; 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Unable to find resource ID #0x" 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid)); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the type name for a given resource identifier. 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The resource identifier whose type name is to be 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string holding the type name of the resource. 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourceName 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getResourceTypeName(int resid) throws NotFoundException { 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = mAssets.getResourceTypeName(resid); 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) return str; 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Unable to find resource ID #0x" 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid)); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the entry name for a given resource identifier. 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The resource identifier whose entry name is to be 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string holding the entry name of the resource. 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException Throws NotFoundException if the given ID does not exist. 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getResourceName 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getResourceEntryName(int resid) throws NotFoundException { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = mAssets.getResourceEntryName(resid); 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) return str; 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException("Unable to find resource ID #0x" 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid)); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse a series of {@link android.R.styleable#Extra <extra>} tags from 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an XML file. You call this when you are at the parent tag of the 2090def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn * extra tags, and it will return once all of the child tags have been parsed. 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will call {@link #parseBundleExtra} for each extra tag encountered. 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parser The parser from which to retrieve the extras. 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outBundle A Bundle in which to place all parsed extras. 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws XmlPullParserException 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void parseBundleExtras(XmlResourceParser parser, Bundle outBundle) 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("extra")) { 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parseBundleExtra("extra", parser, outBundle); 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse a name/value pair out of an XML tag holding that data. The 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AttributeSet must be holding the data defined by 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#Extra}. The following value types are supported: 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link TypedValue#TYPE_STRING}: 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Bundle#putCharSequence Bundle.putCharSequence()} 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link TypedValue#TYPE_INT_BOOLEAN}: 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Bundle#putCharSequence Bundle.putBoolean()} 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link TypedValue#TYPE_FIRST_INT}-{@link TypedValue#TYPE_LAST_INT}: 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Bundle#putCharSequence Bundle.putBoolean()} 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link TypedValue#TYPE_FLOAT}: 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Bundle#putCharSequence Bundle.putFloat()} 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tagName The name of the tag these attributes come from; this is 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only used for reporting error messages. 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs The attributes from which to retrieve the name/value pair. 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outBundle The Bundle in which to place the parsed value. 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws XmlPullParserException If the attributes are not valid. 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void parseBundleExtra(String tagName, AttributeSet attrs, 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle outBundle) throws XmlPullParserException { 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = obtainAttributes(attrs, 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.Extra); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getString( 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.Extra_name); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("<" + tagName 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "> requires an android:name attribute at " 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.getPositionDescription()); 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.Extra_value); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outBundle.putCharSequence(name, cs); 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outBundle.putBoolean(name, v.data != 0); 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outBundle.putInt(name, v.data); 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outBundle.putFloat(name, v.getFloat()); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("<" + tagName 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "> only supports string, integer, float, color, and boolean at " 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.getPositionDescription()); 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("<" + tagName 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "> requires an android:value or android:resource attribute at " 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.getPositionDescription()); 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve underlying AssetManager storage for these resources. 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final AssetManager getAssets() { 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAssets; 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this to remove all cached loaded layout resources from the 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object. Only intended for use with performance testing 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tools. 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void flushLayoutCache() { 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCachedXmlBlockIds) { 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First see if this block is in our cache. 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int num = mCachedXmlBlockIds.length; 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<num; i++) { 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachedXmlBlockIds[i] = -0; 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlBlock oldBlock = mCachedXmlBlocks[i]; 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldBlock != null) { 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldBlock.close(); 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachedXmlBlocks[i] = null; 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start preloading of resource data using this Resources object. Only 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for use by the zygote process for loading common system resources. 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void startPreloading() { 221650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (sSync) { 2217dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (sPreloaded) { 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("Resources already preloaded"); 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2220dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn sPreloaded = true; 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreloading = true; 2222dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn sPreloadedDensity = DisplayMetrics.DENSITY_DEVICE; 2223dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn mConfiguration.densityDpi = sPreloadedDensity; 2224dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn updateConfiguration(null, null); 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by zygote when it is done preloading resources, to change back 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to normal Resources operation. 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void finishPreloading() { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreloading) { 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreloading = false; 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flushLayoutCache(); 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2238dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 22393b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy /** 22403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * @hide 22413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 224252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public LongSparseArray<ConstantState> getPreloadedDrawables() { 22433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return sPreloadedDrawables[0]; 22443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 22453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 2246f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn private boolean verifyPreloadConfig(int changingConfigurations, int allowVarying, 2247f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn int resourceId, String name) { 2248f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn // We allow preloading of resources even if they vary by font scale (which 2249f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn // doesn't impact resource selection) or density (which we handle specially by 2250f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn // simply turning off all preloading), as well as any other configs specified 2251f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn // by the caller. 2252dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio if (((changingConfigurations&~(ActivityInfo.CONFIG_FONT_SCALE | 2253f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn ActivityInfo.CONFIG_DENSITY)) & ~allowVarying) != 0) { 2254dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn String resName; 2255dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn try { 2256dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio resName = getResourceName(resourceId); 2257dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } catch (NotFoundException e) { 2258dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn resName = "?"; 2259dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 226052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // This should never happen in production, so we should log a 226152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // warning even if we're not debugging. 2262dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn Log.w(TAG, "Preloaded " + name + " resource #0x" 2263dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio + Integer.toHexString(resourceId) 2264dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn + " (" + resName + ") that varies with configuration!!"); 2265dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return false; 2266dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 2267b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio if (TRACE_FOR_PRELOAD) { 2268b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio String resName; 2269b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio try { 2270b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio resName = getResourceName(resourceId); 2271b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio } catch (NotFoundException e) { 2272b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio resName = "?"; 2273b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio } 2274b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio Log.w(TAG, "Preloading " + name + " resource #0x" 2275b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio + Integer.toHexString(resourceId) 2276b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio + " (" + resName + ")"); 2277b9a13b892ef3da521d428f144e4048aac8a63017Fabrice Di Meglio } 2278dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return true; 2279dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 2280dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 22818eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette /*package*/ Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException { 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TRACE_FOR_PRELOAD) { 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log only framework resources 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((id >>> 24) == 0x1) { 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String name = getResourceName(id); 22868eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette if (name != null) { 22878eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette Log.d("PreloadDrawable", name); 22888eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette } 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final boolean isColorDrawable; 229375257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches; 229452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final long key; 229552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT 229652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { 2297c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino isColorDrawable = true; 229852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette caches = mColorDrawableCache; 229952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette key = value.data; 230052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 230152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette isColorDrawable = false; 230252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette caches = mDrawableCache; 230352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette key = (((long) value.assetCookie) << 32) | value.data; 2304c7d9d2790f0b7a036d70bac2f100b42790ff0979Masanori Ogino } 23055f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy 230652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // First, check whether we have a cached version of this drawable 2307b6f9152b7027e78c7c0c07b1dc10ca4900b1fca7Alan Viverette // that was inflated against the specified theme. 230852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (!mPreloading) { 230952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable cachedDrawable = getCachedDrawable(caches, key, theme); 231052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (cachedDrawable != null) { 231152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return cachedDrawable; 231252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 231552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // Next, check preloaded drawables. These are unthemed but may have 231652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // themeable attributes. 231752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantState cs; 2318f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn if (isColorDrawable) { 2319f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn cs = sPreloadedColorDrawables.get(key); 2320f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn } else { 2321f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key); 2322f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn } 232352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 232452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable dr; 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cs != null) { 232652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette dr = cs.newDrawable(this, theme); 232752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else if (isColorDrawable) { 232852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette dr = new ColorDrawable(value.data); 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 233052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette dr = loadDrawableForCookie(value, id, theme); 233152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2333b6f9152b7027e78c7c0c07b1dc10ca4900b1fca7Alan Viverette // If we were able to obtain a drawable, store it in the appropriate 2334b6f9152b7027e78c7c0c07b1dc10ca4900b1fca7Alan Viverette // cache (either preload or themed). 233552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (dr != null) { 233652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette dr.setChangingConfigurations(value.changingConfigurations); 233752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette cacheDrawable(value, theme, isColorDrawable, caches, key, dr); 233852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 234052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return dr; 234152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 234352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private void cacheDrawable(TypedValue value, Theme theme, boolean isColorDrawable, 234475257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, 234575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette long key, Drawable dr) { 234652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantState cs = dr.getConstantState(); 234752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (cs == null) { 234852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return; 234952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23509b44aaefc0c8c4aafd176c2fe5af86e098422b56Dianne Hackborn 235152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (mPreloading) { 235252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // Preloaded drawables never have a theme, but may be themeable. 235352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int changingConfigs = cs.getChangingConfigurations(); 235452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (isColorDrawable) { 235552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (verifyPreloadConfig(changingConfigs, 0, value.resourceId, "drawable")) { 235652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedColorDrawables.put(key, cs); 235752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 235852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 235952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (verifyPreloadConfig( 236052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette changingConfigs, LAYOUT_DIR_CONFIG, value.resourceId, "drawable")) { 236152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if ((changingConfigs & LAYOUT_DIR_CONFIG) == 0) { 236252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // If this resource does not vary based on layout direction, 236352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // we can put it in all of the preload maps. 236452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedDrawables[0].put(key, cs); 236552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedDrawables[1].put(key, cs); 236652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 236752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // Otherwise, only in the layout dir we loaded it for. 236852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette sPreloadedDrawables[mConfiguration.getLayoutDirection()].put(key, cs); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 237252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 237352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette synchronized (mAccessLock) { 237475257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette final String themeKey = theme == null ? "" : theme.mKey; 237575257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette LongSparseArray<WeakReference<ConstantState>> themedCache = caches.get(themeKey); 237675257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette if (themedCache == null) { 237775257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette themedCache = new LongSparseArray<WeakReference<ConstantState>>(1); 237875257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette caches.put(themeKey, themedCache); 237975257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette } 238052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette themedCache.put(key, new WeakReference<ConstantState>(cs)); 238152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 238352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 238552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 238652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Loads a drawable from XML or resources stream. 238752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 238852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private Drawable loadDrawableForCookie(TypedValue value, int id, Theme theme) { 238952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (value.string == null) { 23900810b63739c9981f993063749f804b54faed0ba5Alan Viverette throw new NotFoundException("Resource \"" + getResourceName(id) + "\" (" 23910810b63739c9981f993063749f804b54faed0ba5Alan Viverette + Integer.toHexString(id) + ") is not a Drawable (color or path): " + value); 239252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 239352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 239452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final String file = value.string.toString(); 239552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 239652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (TRACE_FOR_MISS_PRELOAD) { 239752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // Log only framework resources 239852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if ((id >>> 24) == 0x1) { 239952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final String name = getResourceName(id); 240052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (name != null) { 240152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Log.d(TAG, "Loading framework drawable #" + Integer.toHexString(id) 240252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette + ": " + name + " at " + file); 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 240752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (DEBUG_LOAD) { 240852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Log.v(TAG, "Loading drawable for cookie " + value.assetCookie + ": " + file); 240952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 241052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 241152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable dr; 241252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 241352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file); 241452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette try { 241552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (file.endsWith(".xml")) { 241652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final XmlResourceParser rp = loadXmlResourceParser( 241752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette file, id, value.assetCookie, "drawable"); 24186dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette dr = Drawable.createFromXml(this, rp, theme); 241952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette rp.close(); 242052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 242152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final InputStream is = mAssets.openNonAsset( 242252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette value.assetCookie, file, AssetManager.ACCESS_STREAMING); 24236dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette dr = Drawable.createFromResourceStream(this, value, is, file, null); 242452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette is.close(); 242552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 242652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } catch (Exception e) { 242752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 242852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final NotFoundException rnf = new NotFoundException( 242952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette "File " + file + " from drawable resource ID #0x" + Integer.toHexString(id)); 243052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette rnf.initCause(e); 243152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throw rnf; 243252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 243352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 243452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dr; 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 243875257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette private Drawable getCachedDrawable( 243975257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, 244075257cefcd64cf5cc73083d9546d27825b29a595Alan Viverette long key, Theme theme) { 244150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 2442b6f9152b7027e78c7c0c07b1dc10ca4900b1fca7Alan Viverette final String themeKey = theme != null ? theme.mKey : ""; 244352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final LongSparseArray<WeakReference<ConstantState>> themedCache = caches.get(themeKey); 244452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (themedCache != null) { 244552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable themedDrawable = getCachedDrawableLocked(themedCache, key); 244652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (themedDrawable != null) { 244752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return themedDrawable; 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 245052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 245152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // No cached drawable, we'll need to create a new one. 245252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return null; 245352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 245452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 245552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 245652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private ConstantState getConstantStateLocked( 245752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette LongSparseArray<WeakReference<ConstantState>> drawableCache, long key) { 245852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final WeakReference<ConstantState> wr = drawableCache.get(key); 245952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (wr != null) { // we have the key 246052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantState entry = wr.get(); 246152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (entry != null) { 246252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette //Log.i(TAG, "Returning cached drawable @ #" + 246352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // Integer.toHexString(((Integer)key).intValue()) 246452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // + " in " + this + ": " + entry); 246552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return entry; 246652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { // our entry has been purged 246752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette drawableCache.delete(key); 246852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 246952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 247052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return null; 247152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 247252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 247352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette private Drawable getCachedDrawableLocked( 247452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette LongSparseArray<WeakReference<ConstantState>> drawableCache, long key) { 247552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantState entry = getConstantStateLocked(drawableCache, key); 247652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (entry != null) { 247752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return entry.newDrawable(this); 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ColorStateList loadColorStateList(TypedValue value, int id) 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TRACE_FOR_PRELOAD) { 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log only framework resources 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((id >>> 24) == 0x1) { 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String name = getResourceName(id); 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) android.util.Log.d("PreloadColorStateList", name); 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24925d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy final long key = (((long) value.assetCookie) << 32) | value.data; 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ColorStateList csl; 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.type <= TypedValue.TYPE_LAST_COLOR_INT) { 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24995d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy csl = sPreloadedColorStateLists.get(key); 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (csl != null) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl; 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project csl = ColorStateList.valueOf(value.data); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreloading) { 2506f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn if (verifyPreloadConfig(value.changingConfigurations, 0, value.resourceId, 2507f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn "color")) { 2508dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn sPreloadedColorStateLists.put(key, csl); 2509dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl; 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project csl = getCachedColorStateList(key); 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (csl != null) { 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl; 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25205d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy csl = sPreloadedColorStateLists.get(key); 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (csl != null) { 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl; 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.string == null) { 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource is not a ColorStateList (color or path): " + value); 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25308eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final String file = value.string.toString(); 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (file.endsWith(".xml")) { 25330acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file); 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25358eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette final XmlResourceParser rp = loadXmlResourceParser( 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file, id, value.assetCookie, "colorstatelist"); 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project csl = ColorStateList.createFromXml(this, rp); 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rp.close(); 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 25400acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotFoundException rnf = new NotFoundException( 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File " + file + " from color state list resource ID #0x" 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(e); 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25470acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File " + file + " from drawable resource ID #0x" 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id) + ": .xml extension required"); 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (csl != null) { 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreloading) { 2556f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn if (verifyPreloadConfig(value.changingConfigurations, 0, value.resourceId, 2557f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn "color")) { 2558dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn sPreloadedColorStateLists.put(key, csl); 2559dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 256150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Saving cached color state list @ #" + 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Integer.toHexString(key.intValue()) 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " in " + this + ": " + csl); 25655d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy mColorStateListCache.put(key, new WeakReference<ColorStateList>(csl)); 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl; 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25735d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy private ColorStateList getCachedColorStateList(long key) { 257450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<ColorStateList> wr = mColorStateListCache.get(key); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wr != null) { // we have the key 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ColorStateList entry = wr.get(); 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entry != null) { 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Returning cached color state list @ #" + 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Integer.toHexString(((Integer)key).intValue()) 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " in " + this + ": " + entry); 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return entry; 25835d911c3a95cf4db4cf1cc0c8d4d253553d50c550Romain Guy } else { // our entry has been purged 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColorStateListCache.delete(key); 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ XmlResourceParser loadXmlResourceParser(int id, String type) 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 259350707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mAccessLock) { 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue value = mTmpValue; 2595e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn if (value == null) { 2596e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn mTmpValue = value = new TypedValue(); 2597e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn } 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getValue(id, value, true); 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.type == TypedValue.TYPE_STRING) { 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadXmlResourceParser(value.string.toString(), id, 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.assetCookie, type); 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(value.type) + " is not valid"); 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ XmlResourceParser loadXmlResourceParser(String file, int id, 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int assetCookie, String type) throws NotFoundException { 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != 0) { 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These may be compiled... 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCachedXmlBlockIds) { 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First see if this block is in our cache. 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int num = mCachedXmlBlockIds.length; 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<num; i++) { 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCachedXmlBlockIds[i] == id) { 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("**** REUSING XML BLOCK! id=" 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + id + ", index=" + i); 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCachedXmlBlocks[i].newParser(); 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Not in the cache, create a new block and put it at 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the next slot in the cache. 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlBlock block = mAssets.openXmlBlockAsset( 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetCookie, file); 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (block != null) { 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = mLastCachedXmlBlockIndex+1; 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= num) pos = 0; 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastCachedXmlBlockIndex = pos; 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlBlock oldBlock = mCachedXmlBlocks[pos]; 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldBlock != null) { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldBlock.close(); 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachedXmlBlockIds[pos] = id; 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachedXmlBlocks[pos] = block; 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("**** CACHING NEW XML BLOCK! id=" 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + id + ", index=" + pos); 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return block.newParser(); 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotFoundException rnf = new NotFoundException( 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File " + file + " from xml type " + type + " resource ID #0x" 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(e); 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NotFoundException( 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File " + file + " from xml type " + type + " resource ID #0x" 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(id)); 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2658562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette /*package*/ void recycleCachedStyledAttributes(TypedArray attrs) { 2659562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette synchronized (mAccessLock) { 2660562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette final TypedArray cached = mCachedStyledAttributes; 2661562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette if (cached == null || cached.mData.length < attrs.mData.length) { 2662562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette mCachedStyledAttributes = attrs; 2663562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette } 2664562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette } 2665562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette } 2666562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources() { 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets = AssetManager.getSystem(); 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NOTE: Intentionally leaving this uninitialized (all values set 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to zero), so that anyone who tries to do something that requires 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // metrics will get a very wrong value. 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConfiguration.setToDefaults(); 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMetrics.setToDefaults(); 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateConfiguration(null, null); 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.ensureStringBlocks(); 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2678