From 5d2704fbb0a7bb4763d4e2ee031e16a8913ba003 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Tue, 18 Mar 2014 23:09:12 +0100 Subject: 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 --- .../android/launcher3/AppsCustomizePagedView.java | 11 -- src/com/android/launcher3/PagedViewIconCache.java | 133 --------------------- src/com/android/launcher3/WidgetPreviewLoader.java | 54 ++++----- 3 files changed, 25 insertions(+), 173 deletions(-) delete mode 100644 src/com/android/launcher3/PagedViewIconCache.java diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java index e5e1580ee..d6e0bb49e 100644 --- a/src/com/android/launcher3/AppsCustomizePagedView.java +++ b/src/com/android/launcher3/AppsCustomizePagedView.java @@ -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; diff --git a/src/com/android/launcher3/PagedViewIconCache.java b/src/com/android/launcher3/PagedViewIconCache.java deleted file mode 100644 index 93887ea23..000000000 --- a/src/com/android/launcher3/PagedViewIconCache.java +++ /dev/null @@ -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 mIconOutlineCache = new HashMap(); - - public void clear() { - for (Key key : mIconOutlineCache.keySet()) { - mIconOutlineCache.get(key).recycle(); - } - mIconOutlineCache.clear(); - } - private void retainAll(HashSet keysToKeep, Key.Type t) { - HashSet keysToRemove = new HashSet(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 keys) { - HashSet keysSet = new HashSet(); - 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 keys) { - HashSet keysSet = new HashSet(); - 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 keys) { - HashSet keysSet = new HashSet(); - 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); - } -} diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 3db0b51ad..1a67987b4 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -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> mLoadedPreviews; - private ArrayList> mUnusedBitmaps; - private static HashSet sInvalidPackages; + private final HashMap> mLoadedPreviews; + private final ArrayList> mUnusedBitmaps; + private final static HashSet sInvalidPackages; static { sInvalidPackages = new HashSet(); @@ -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); - } - if (!packageValid) { - return null; + boolean packageValid = !sInvalidPackages.contains(packageName); + 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 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); -- cgit v1.2.3