am 5d2704fb: Clean up dead, ugly and wrong code in icon and widget preview loading
* commit '5d2704fbb0a7bb4763d4e2ee031e16a8913ba003': Clean up dead, ugly and wrong code in icon and widget preview loading
This commit is contained in:
@@ -225,17 +225,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
|
||||
private Rect mTmpRect = new Rect();
|
||||
|
||||
// Used for drawing shortcut previews
|
||||
BitmapCache mCachedShortcutPreviewBitmap = new BitmapCache();
|
||||
PaintCache mCachedShortcutPreviewPaint = new PaintCache();
|
||||
CanvasCache mCachedShortcutPreviewCanvas = new CanvasCache();
|
||||
|
||||
// Used for drawing widget previews
|
||||
CanvasCache mCachedAppWidgetPreviewCanvas = new CanvasCache();
|
||||
RectCache mCachedAppWidgetPreviewSrcRect = new RectCache();
|
||||
RectCache mCachedAppWidgetPreviewDestRect = new RectCache();
|
||||
PaintCache mCachedAppWidgetPreviewPaint = new PaintCache();
|
||||
|
||||
WidgetPreviewLoader mWidgetPreviewLoader;
|
||||
|
||||
private boolean mInBulkBind;
|
||||
|
||||
@@ -1,133 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.launcher3;
|
||||
|
||||
import android.appwidget.AppWidgetProviderInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.pm.ComponentInfo;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Simple cache mechanism for PagedView outlines.
|
||||
*/
|
||||
public class PagedViewIconCache {
|
||||
public static class Key {
|
||||
public enum Type {
|
||||
ApplicationInfoKey,
|
||||
AppWidgetProviderInfoKey,
|
||||
ResolveInfoKey
|
||||
}
|
||||
private final ComponentName mComponentName;
|
||||
private final Type mType;
|
||||
|
||||
public Key(AppInfo info) {
|
||||
mComponentName = info.componentName;
|
||||
mType = Type.ApplicationInfoKey;
|
||||
}
|
||||
public Key(ResolveInfo info) {
|
||||
final ComponentInfo ci = info.activityInfo != null ? info.activityInfo :
|
||||
info.serviceInfo;
|
||||
mComponentName = new ComponentName(ci.packageName, ci.name);
|
||||
mType = Type.ResolveInfoKey;
|
||||
}
|
||||
public Key(AppWidgetProviderInfo info) {
|
||||
mComponentName = info.provider;
|
||||
mType = Type.AppWidgetProviderInfoKey;
|
||||
}
|
||||
|
||||
private ComponentName getComponentName() {
|
||||
return mComponentName;
|
||||
}
|
||||
public boolean isKeyType(Type t) {
|
||||
return (mType == t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o instanceof Key) {
|
||||
Key k = (Key) o;
|
||||
return mComponentName.equals(k.mComponentName);
|
||||
}
|
||||
return super.equals(o);
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getComponentName().hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
private final HashMap<Key, Bitmap> mIconOutlineCache = new HashMap<Key, Bitmap>();
|
||||
|
||||
public void clear() {
|
||||
for (Key key : mIconOutlineCache.keySet()) {
|
||||
mIconOutlineCache.get(key).recycle();
|
||||
}
|
||||
mIconOutlineCache.clear();
|
||||
}
|
||||
private void retainAll(HashSet<Key> keysToKeep, Key.Type t) {
|
||||
HashSet<Key> keysToRemove = new HashSet<Key>(mIconOutlineCache.keySet());
|
||||
keysToRemove.removeAll(keysToKeep);
|
||||
for (Key key : keysToRemove) {
|
||||
if (key.isKeyType(t)) {
|
||||
mIconOutlineCache.get(key).recycle();
|
||||
mIconOutlineCache.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Removes all the keys to applications that aren't in the passed in collection */
|
||||
public void retainAllApps(ArrayList<AppInfo> keys) {
|
||||
HashSet<Key> keysSet = new HashSet<Key>();
|
||||
for (AppInfo info : keys) {
|
||||
keysSet.add(new Key(info));
|
||||
}
|
||||
retainAll(keysSet, Key.Type.ApplicationInfoKey);
|
||||
}
|
||||
/** Removes all the keys to shortcuts that aren't in the passed in collection */
|
||||
public void retainAllShortcuts(List<ResolveInfo> keys) {
|
||||
HashSet<Key> keysSet = new HashSet<Key>();
|
||||
for (ResolveInfo info : keys) {
|
||||
keysSet.add(new Key(info));
|
||||
}
|
||||
retainAll(keysSet, Key.Type.ResolveInfoKey);
|
||||
}
|
||||
/** Removes all the keys to widgets that aren't in the passed in collection */
|
||||
public void retainAllAppWidgets(List<AppWidgetProviderInfo> keys) {
|
||||
HashSet<Key> keysSet = new HashSet<Key>();
|
||||
for (AppWidgetProviderInfo info : keys) {
|
||||
keysSet.add(new Key(info));
|
||||
}
|
||||
retainAll(keysSet, Key.Type.AppWidgetProviderInfoKey);
|
||||
}
|
||||
public void addOutline(Key key, Bitmap b) {
|
||||
mIconOutlineCache.put(key, b);
|
||||
}
|
||||
public void removeOutline(Key key) {
|
||||
if (mIconOutlineCache.containsKey(key)) {
|
||||
mIconOutlineCache.get(key).recycle();
|
||||
mIconOutlineCache.remove(key);
|
||||
}
|
||||
}
|
||||
public Bitmap getOutline(Key key) {
|
||||
return mIconOutlineCache.get(key);
|
||||
}
|
||||
}
|
||||
@@ -127,13 +127,13 @@ public class WidgetPreviewLoader {
|
||||
private int mAppIconSize;
|
||||
private IconCache mIconCache;
|
||||
|
||||
private final float sWidgetPreviewIconPaddingPercentage = 0.25f;
|
||||
private static final float sWidgetPreviewIconPaddingPercentage = 0.25f;
|
||||
|
||||
private CacheDb mDb;
|
||||
|
||||
private HashMap<String, WeakReference<Bitmap>> mLoadedPreviews;
|
||||
private ArrayList<SoftReference<Bitmap>> mUnusedBitmaps;
|
||||
private static HashSet<String> sInvalidPackages;
|
||||
private final HashMap<String, WeakReference<Bitmap>> mLoadedPreviews;
|
||||
private final ArrayList<SoftReference<Bitmap>> mUnusedBitmaps;
|
||||
private final static HashSet<String> sInvalidPackages;
|
||||
|
||||
static {
|
||||
sInvalidPackages = new HashSet<String>();
|
||||
@@ -184,18 +184,19 @@ public class WidgetPreviewLoader {
|
||||
final String name = getObjectName(o);
|
||||
final String packageName = getObjectPackage(o);
|
||||
// check if the package is valid
|
||||
boolean packageValid = true;
|
||||
synchronized(sInvalidPackages) {
|
||||
packageValid = !sInvalidPackages.contains(packageName);
|
||||
boolean packageValid = !sInvalidPackages.contains(packageName);
|
||||
if (!packageValid) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (!packageValid) {
|
||||
return null;
|
||||
}
|
||||
if (packageValid) {
|
||||
synchronized(mLoadedPreviews) {
|
||||
// check if it exists in our existing cache
|
||||
if (mLoadedPreviews.containsKey(name) && mLoadedPreviews.get(name).get() != null) {
|
||||
return mLoadedPreviews.get(name).get();
|
||||
synchronized(mLoadedPreviews) {
|
||||
// check if it exists in our existing cache
|
||||
if (mLoadedPreviews.containsKey(name)) {
|
||||
WeakReference<Bitmap> bitmapReference = mLoadedPreviews.get(name);
|
||||
Bitmap bitmap = bitmapReference.get();
|
||||
if (bitmap != null) {
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -203,11 +204,13 @@ public class WidgetPreviewLoader {
|
||||
Bitmap unusedBitmap = null;
|
||||
synchronized(mUnusedBitmaps) {
|
||||
// not in cache; we need to load it from the db
|
||||
while ((unusedBitmap == null || !unusedBitmap.isMutable() ||
|
||||
unusedBitmap.getWidth() != mPreviewBitmapWidth ||
|
||||
unusedBitmap.getHeight() != mPreviewBitmapHeight)
|
||||
&& mUnusedBitmaps.size() > 0) {
|
||||
unusedBitmap = mUnusedBitmaps.remove(0).get();
|
||||
while (unusedBitmap == null && mUnusedBitmaps.size() > 0) {
|
||||
Bitmap candidate = mUnusedBitmaps.remove(0).get();
|
||||
if (candidate != null && candidate.isMutable() &&
|
||||
candidate.getWidth() == mPreviewBitmapWidth &&
|
||||
candidate.getHeight() == mPreviewBitmapHeight) {
|
||||
unusedBitmap = candidate;
|
||||
}
|
||||
}
|
||||
if (unusedBitmap != null) {
|
||||
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
|
||||
@@ -221,12 +224,7 @@ public class WidgetPreviewLoader {
|
||||
unusedBitmap = Bitmap.createBitmap(mPreviewBitmapWidth, mPreviewBitmapHeight,
|
||||
Bitmap.Config.ARGB_8888);
|
||||
}
|
||||
|
||||
Bitmap preview = null;
|
||||
|
||||
if (packageValid) {
|
||||
preview = readFromDb(name, unusedBitmap);
|
||||
}
|
||||
Bitmap preview = readFromDb(name, unusedBitmap);
|
||||
|
||||
if (preview != null) {
|
||||
synchronized(mLoadedPreviews) {
|
||||
@@ -520,13 +518,11 @@ public class WidgetPreviewLoader {
|
||||
previewWidth = previewDrawableWidth * cellHSpan;
|
||||
previewHeight = previewDrawableHeight * cellVSpan;
|
||||
|
||||
defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight,
|
||||
Config.ARGB_8888);
|
||||
defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
|
||||
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
|
||||
c.setBitmap(defaultPreview);
|
||||
previewDrawable.setBounds(0, 0, previewWidth, previewHeight);
|
||||
previewDrawable.setTileModeXY(Shader.TileMode.REPEAT,
|
||||
Shader.TileMode.REPEAT);
|
||||
previewDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
|
||||
previewDrawable.draw(c);
|
||||
c.setBitmap(null);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user