merge from open-source master
Change-Id: Iacd42b06fa01fa6dfd18b81f07ce4b6da922dfff
This commit is contained in:
107
core/java/android/content/res/Resources.java
Normal file → Executable file
107
core/java/android/content/res/Resources.java
Normal file → Executable file
@@ -25,6 +25,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
||||
import android.graphics.Movie;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable.ConstantState;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemProperties;
|
||||
@@ -66,6 +67,8 @@ public class Resources {
|
||||
= new LongSparseArray<Drawable.ConstantState>();
|
||||
private static final SparseArray<ColorStateList> mPreloadedColorStateLists
|
||||
= new SparseArray<ColorStateList>();
|
||||
private static final LongSparseArray<Drawable.ConstantState> sPreloadedColorDrawables
|
||||
= new LongSparseArray<Drawable.ConstantState>();
|
||||
private static boolean mPreloaded;
|
||||
|
||||
/*package*/ final TypedValue mTmpValue = new TypedValue();
|
||||
@@ -75,6 +78,8 @@ public class Resources {
|
||||
= new LongSparseArray<WeakReference<Drawable.ConstantState> >();
|
||||
private final SparseArray<WeakReference<ColorStateList> > mColorStateListCache
|
||||
= new SparseArray<WeakReference<ColorStateList> >();
|
||||
private final LongSparseArray<WeakReference<Drawable.ConstantState> > mColorDrawableCache
|
||||
= new LongSparseArray<WeakReference<Drawable.ConstantState> >();
|
||||
private boolean mPreloading;
|
||||
|
||||
/*package*/ TypedArray mCachedStyledAttributes = null;
|
||||
@@ -1299,37 +1304,13 @@ public class Resources {
|
||||
(int)(mMetrics.density*160), mConfiguration.keyboard,
|
||||
keyboardHidden, mConfiguration.navigation, width, height,
|
||||
mConfiguration.screenLayout, mConfiguration.uiMode, sSdkVersion);
|
||||
int N = mDrawableCache.size();
|
||||
if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "Cleaning up drawables config changes: 0x"
|
||||
+ Integer.toHexString(configChanges));
|
||||
}
|
||||
for (int i=0; i<N; i++) {
|
||||
WeakReference<Drawable.ConstantState> ref = mDrawableCache.valueAt(i);
|
||||
if (ref != null) {
|
||||
Drawable.ConstantState cs = ref.get();
|
||||
if (cs != null) {
|
||||
if (Configuration.needNewResources(
|
||||
configChanges, cs.getChangingConfigurations())) {
|
||||
if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "FLUSHING #0x"
|
||||
+ Long.toHexString(mDrawableCache.keyAt(i))
|
||||
+ " / " + cs + " with changes: 0x"
|
||||
+ Integer.toHexString(cs.getChangingConfigurations()));
|
||||
}
|
||||
mDrawableCache.setValueAt(i, null);
|
||||
} else if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "(Keeping #0x"
|
||||
+ Long.toHexString(mDrawableCache.keyAt(i))
|
||||
+ " / " + cs + " with changes: 0x"
|
||||
+ Integer.toHexString(cs.getChangingConfigurations())
|
||||
+ ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mDrawableCache.clear();
|
||||
|
||||
drawableCacheClear(mDrawableCache, configChanges);
|
||||
drawableCacheClear(mColorDrawableCache, configChanges);
|
||||
|
||||
mColorStateListCache.clear();
|
||||
|
||||
|
||||
flushLayoutCache();
|
||||
}
|
||||
synchronized (mSync) {
|
||||
@@ -1339,6 +1320,41 @@ public class Resources {
|
||||
}
|
||||
}
|
||||
|
||||
private void drawableCacheClear(
|
||||
LongSparseArray<WeakReference<ConstantState>> cache,
|
||||
int configChanges) {
|
||||
int N = cache.size();
|
||||
if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "Cleaning up drawables config changes: 0x"
|
||||
+ Integer.toHexString(configChanges));
|
||||
}
|
||||
for (int i=0; i<N; i++) {
|
||||
WeakReference<Drawable.ConstantState> ref = cache.valueAt(i);
|
||||
if (ref != null) {
|
||||
Drawable.ConstantState cs = ref.get();
|
||||
if (cs != null) {
|
||||
if (Configuration.needNewResources(
|
||||
configChanges, cs.getChangingConfigurations())) {
|
||||
if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "FLUSHING #0x"
|
||||
+ Long.toHexString(mDrawableCache.keyAt(i))
|
||||
+ " / " + cs + " with changes: 0x"
|
||||
+ Integer.toHexString(cs.getChangingConfigurations()));
|
||||
}
|
||||
cache.setValueAt(i, null);
|
||||
} else if (DEBUG_CONFIG) {
|
||||
Log.d(TAG, "(Keeping #0x"
|
||||
+ Long.toHexString(cache.keyAt(i))
|
||||
+ " / " + cs + " with changes: 0x"
|
||||
+ Integer.toHexString(cs.getChangingConfigurations())
|
||||
+ ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cache.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the system resources configuration if they have previously
|
||||
* been initialized.
|
||||
@@ -1661,13 +1677,18 @@ public class Resources {
|
||||
}
|
||||
|
||||
final long key = (((long) value.assetCookie) << 32) | value.data;
|
||||
Drawable dr = getCachedDrawable(key);
|
||||
boolean isColorDrawable = false;
|
||||
if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT &&
|
||||
value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
|
||||
isColorDrawable = true;
|
||||
}
|
||||
Drawable dr = getCachedDrawable(isColorDrawable ? mColorDrawableCache : mDrawableCache, key);
|
||||
|
||||
if (dr != null) {
|
||||
return dr;
|
||||
}
|
||||
|
||||
Drawable.ConstantState cs = sPreloadedDrawables.get(key);
|
||||
Drawable.ConstantState cs = isColorDrawable ? sPreloadedColorDrawables.get(key) : sPreloadedDrawables.get(key);
|
||||
if (cs != null) {
|
||||
dr = cs.newDrawable(this);
|
||||
} else {
|
||||
@@ -1726,13 +1747,21 @@ public class Resources {
|
||||
cs = dr.getConstantState();
|
||||
if (cs != null) {
|
||||
if (mPreloading) {
|
||||
sPreloadedDrawables.put(key, cs);
|
||||
if (isColorDrawable) {
|
||||
sPreloadedColorDrawables.put(key, cs);
|
||||
} else {
|
||||
sPreloadedDrawables.put(key, cs);
|
||||
}
|
||||
} else {
|
||||
synchronized (mTmpValue) {
|
||||
//Log.i(TAG, "Saving cached drawable @ #" +
|
||||
// Integer.toHexString(key.intValue())
|
||||
// + " in " + this + ": " + cs);
|
||||
mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));
|
||||
if (isColorDrawable) {
|
||||
mColorDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));
|
||||
} else {
|
||||
mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1741,19 +1770,21 @@ public class Resources {
|
||||
return dr;
|
||||
}
|
||||
|
||||
private Drawable getCachedDrawable(long key) {
|
||||
private Drawable getCachedDrawable(
|
||||
LongSparseArray<WeakReference<ConstantState>> drawableCache,
|
||||
long key) {
|
||||
synchronized (mTmpValue) {
|
||||
WeakReference<Drawable.ConstantState> wr = mDrawableCache.get(key);
|
||||
WeakReference<Drawable.ConstantState> wr = drawableCache.get(key);
|
||||
if (wr != null) { // we have the key
|
||||
Drawable.ConstantState entry = wr.get();
|
||||
if (entry != null) {
|
||||
//Log.i(TAG, "Returning cached drawable @ #" +
|
||||
// Integer.toHexString(((Integer)key).intValue())
|
||||
// + " in " + this + ": " + entry);
|
||||
return entry.newDrawable(this);
|
||||
return entry.newDrawable();
|
||||
}
|
||||
else { // our entry has been purged
|
||||
mDrawableCache.delete(key);
|
||||
drawableCache.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user