OSDN Git Service

Clean up dead, ugly and wrong code in icon and widget preview loading
authorAdrian Roos <roosa@google.com>
Tue, 18 Mar 2014 22:09:12 +0000 (23:09 +0100)
committerAdrian Roos <roosa@google.com>
Wed, 19 Mar 2014 15:27:35 +0000 (16:27 +0100)
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

src/com/android/launcher3/AppsCustomizePagedView.java
src/com/android/launcher3/PagedViewIconCache.java [deleted file]
src/com/android/launcher3/WidgetPreviewLoader.java

index e5e1580..d6e0bb4 100644 (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;
diff --git a/src/com/android/launcher3/PagedViewIconCache.java b/src/com/android/launcher3/PagedViewIconCache.java
deleted file mode 100644 (file)
index 93887ea..0000000
+++ /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<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);
-    }
-}
index 3db0b51..1a67987 100644 (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);
-        }
-        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<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);