Clean up dead, ugly and wrong code in icon and widget preview loading

Removed and fixed serveral instances of dead code and small
bugs that grew in the widget preloading logic, discovered
while chasing a bug.

Bug: 12525890
Change-Id: I22e03eccecc07b73388cfd3c8462d947601c6e54
This commit is contained in:
Adrian Roos
2014-03-18 23:09:12 +01:00
parent e769d1681e
commit 5d2704fbb0
3 changed files with 25 additions and 173 deletions

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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);