diff options
author | Michael Jurka <mikejurka@google.com> | 2013-02-05 11:21:28 +0100 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-08-17 02:35:26 -0700 |
commit | e84ca6bb36deca2159847bc4c77580579169704e (patch) | |
tree | 075bed35bf7098bcab0b2d59247bd56c54138029 /src | |
parent | 68c01fa7d6ff99c193015a6fda031f2c589c630c (diff) | |
download | android_packages_apps_Trebuchet-e84ca6bb36deca2159847bc4c77580579169704e.tar.gz android_packages_apps_Trebuchet-e84ca6bb36deca2159847bc4c77580579169704e.tar.bz2 android_packages_apps_Trebuchet-e84ca6bb36deca2159847bc4c77580579169704e.zip |
Fix crash when rotating all apps
Bug: 8134296
Change-Id: If03a66aae1beefc7e58b36c01f9f904cb586955d
Diffstat (limited to 'src')
-rwxr-xr-x | src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java | 24 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/PagedViewWidget.java | 10 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java | 75 |
3 files changed, 61 insertions, 48 deletions
diff --git a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java index 6fe2db96f..0963a1c6b 100755 --- a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java +++ b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java @@ -76,7 +76,7 @@ class AsyncTaskPageData { } AsyncTaskPageData(int p, ArrayList<Object> l, int cw, int ch, AsyncTaskCallback bgR, - AsyncTaskCallback postR) { + AsyncTaskCallback postR, WidgetPreviewLoader w) { page = p; items = l; generatedImages = new ArrayList<Bitmap>(); @@ -84,13 +84,14 @@ class AsyncTaskPageData { maxImageHeight = ch; doInBackgroundCallback = bgR; postExecuteCallback = postR; + widgetPreviewLoader = w; } void cleanup(boolean cancelled) { // Clean up any references to source/generated bitmaps if (generatedImages != null) { if (cancelled) { for (int i = 0; i < generatedImages.size(); i++) { - WidgetPreviewLoader.releaseBitmap(items.get(i), generatedImages.get(i)); + widgetPreviewLoader.releaseBitmap(items.get(i), generatedImages.get(i)); } } generatedImages.clear(); @@ -104,6 +105,7 @@ class AsyncTaskPageData { int maxImageHeight; AsyncTaskCallback doInBackgroundCallback; AsyncTaskCallback postExecuteCallback; + WidgetPreviewLoader widgetPreviewLoader; } /** @@ -461,6 +463,10 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } protected void onDataReady(int width, int height) { + if (mWidgetPreviewLoader == null) { + mWidgetPreviewLoader = new WidgetPreviewLoader(mLauncher); + } + // Note that we transpose the counts in portrait so that we get a similar layout boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; @@ -1299,7 +1305,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // do cleanup inside onSyncWidgetPageItems onSyncWidgetPageItems(data); } - }); + }, mWidgetPreviewLoader); // Ensure that the task is appropriately prioritized and runs in parallel AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType, @@ -1377,7 +1383,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen createItemInfo.minSpanX = minSpanXY[0]; createItemInfo.minSpanY = minSpanXY[1]; - widget.applyFromAppWidgetProviderInfo(info, -1, spanXY); + widget.applyFromAppWidgetProviderInfo(info, -1, spanXY, mWidgetPreviewLoader); widget.setTag(createItemInfo); widget.setShortPressListener(this); } else if (rawInfo instanceof ResolveInfo) { @@ -1390,7 +1396,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } createItemInfo.componentName = new ComponentName(info.activityInfo.packageName, info.activityInfo.name); - widget.applyFromResolveInfo(mPackageManager, info); + widget.applyFromResolveInfo(mPackageManager, info, mWidgetPreviewLoader); widget.setTag(createItemInfo); } widget.setOnClickListener(this); @@ -1427,13 +1433,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen maxPreviewHeight = maxSize[1]; } - if (mWidgetPreviewLoader == null) { - mWidgetPreviewLoader = new WidgetPreviewLoader( - maxPreviewWidth, maxPreviewHeight, mLauncher, mWidgetSpacingLayout); - } + mWidgetPreviewLoader.setPreviewSize( + maxPreviewWidth, maxPreviewHeight, mWidgetSpacingLayout); if (immediate) { AsyncTaskPageData data = new AsyncTaskPageData(page, items, - maxPreviewWidth, maxPreviewHeight, null, null); + maxPreviewWidth, maxPreviewHeight, null, null, mWidgetPreviewLoader); loadWidgetPreviewsInBackground(null, data); onSyncWidgetPageItems(data); } else { diff --git a/src/com/cyanogenmod/trebuchet/PagedViewWidget.java b/src/com/cyanogenmod/trebuchet/PagedViewWidget.java index d2705778c..53c6fc148 100644 --- a/src/com/cyanogenmod/trebuchet/PagedViewWidget.java +++ b/src/com/cyanogenmod/trebuchet/PagedViewWidget.java @@ -45,6 +45,7 @@ public class PagedViewWidget extends LinearLayout { boolean mIsAppWidget; private final Rect mOriginalImagePadding = new Rect(); private Object mInfo; + private WidgetPreviewLoader mWidgetPreviewLoader; public PagedViewWidget(Context context) { this(context, null); @@ -88,7 +89,7 @@ public class PagedViewWidget extends LinearLayout { if (image != null) { FastBitmapDrawable preview = (FastBitmapDrawable) image.getDrawable(); if (mInfo != null && preview != null && preview.getBitmap() != null) { - WidgetPreviewLoader.releaseBitmap(mInfo, preview.getBitmap()); + mWidgetPreviewLoader.releaseBitmap(mInfo, preview.getBitmap()); } image.setImageDrawable(null); } @@ -96,7 +97,7 @@ public class PagedViewWidget extends LinearLayout { } public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, - int maxWidth, int[] cellSpan) { + int maxWidth, int[] cellSpan, WidgetPreviewLoader loader) { mIsAppWidget = true; mInfo = info; final ImageView image = (ImageView) findViewById(R.id.widget_preview); @@ -111,9 +112,11 @@ public class PagedViewWidget extends LinearLayout { int vSpan = Math.min(cellSpan[1], LauncherModel.getWorkspaceCellCountY()); dims.setText(String.format(mDimensionsFormatString, hSpan, vSpan)); } + mWidgetPreviewLoader = loader; } - public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) { + public void applyFromResolveInfo( + PackageManager pm, ResolveInfo info, WidgetPreviewLoader loader) { mIsAppWidget = false; mInfo = info; CharSequence label = info.loadLabel(pm); @@ -124,6 +127,7 @@ public class PagedViewWidget extends LinearLayout { if (dims != null) { dims.setText(String.format(mDimensionsFormatString, 1, 1)); } + mWidgetPreviewLoader = loader; } public int[] getPreviewSize() { diff --git a/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java b/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java index 5852ae86e..a00b5dd7e 100644 --- a/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java +++ b/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java @@ -103,8 +103,8 @@ class BitmapFactoryOptionsCache extends SoftReferenceThreadLocal<BitmapFactory.O public class WidgetPreviewLoader { static final String TAG = "WidgetPreviewLoader"; - private int mPreviewBitmapMaxWidth; - private int mPreviewBitmapMaxHeight; + private int mPreviewBitmapWidth; + private int mPreviewBitmapHeight; private String mSize; private Context mContext; private Launcher mLauncher; @@ -131,27 +131,30 @@ public class WidgetPreviewLoader { private WidgetPreviewCacheDb mDb; - private static HashMap<String, WeakReference<Bitmap>> sLoadedPreviews; - private static ArrayList<SoftReference<Bitmap>> sUnusedBitmaps; + private HashMap<String, WeakReference<Bitmap>> mLoadedPreviews; + private ArrayList<SoftReference<Bitmap>> mUnusedBitmaps; private static HashSet<String> sInvalidPackages; static { - sLoadedPreviews = new HashMap<String, WeakReference<Bitmap>>(); - sUnusedBitmaps = new ArrayList<SoftReference<Bitmap>>(); sInvalidPackages = new HashSet<String>(); } - public WidgetPreviewLoader(int previewWidth, int previewHeight, - Launcher launcher, PagedViewCellLayout widgetSpacingLayout) { - mPreviewBitmapMaxWidth = previewWidth; - mPreviewBitmapMaxHeight = previewHeight; - mSize = previewWidth + "x" + previewHeight; + public WidgetPreviewLoader(Launcher launcher) { mContext = mLauncher = launcher; mPackageManager = mContext.getPackageManager(); mAppIconSize = mContext.getResources().getDimensionPixelSize(R.dimen.app_icon_size); mIconCache = ((LauncherApplication) launcher.getApplicationContext()).getIconCache(); - mWidgetSpacingLayout = widgetSpacingLayout; mDb = new WidgetPreviewCacheDb(mContext); + mLoadedPreviews = new HashMap<String, WeakReference<Bitmap>>(); + mUnusedBitmaps = new ArrayList<SoftReference<Bitmap>>(); + } + + public void setPreviewSize(int previewWidth, int previewHeight, + PagedViewCellLayout widgetSpacingLayout) { + mPreviewBitmapWidth = previewWidth; + mPreviewBitmapHeight = previewHeight; + mSize = previewWidth + "x" + previewHeight; + mWidgetSpacingLayout = widgetSpacingLayout; } public Bitmap getPreview(final Object o) { @@ -165,20 +168,22 @@ public class WidgetPreviewLoader { return null; } if (packageValid) { - synchronized(sLoadedPreviews) { + synchronized(mLoadedPreviews) { // check if it exists in our existing cache - if (sLoadedPreviews.containsKey(name) && sLoadedPreviews.get(name).get() != null) { - return sLoadedPreviews.get(name).get(); + if (mLoadedPreviews.containsKey(name) && mLoadedPreviews.get(name).get() != null) { + return mLoadedPreviews.get(name).get(); } } } Bitmap unusedBitmap = null; - synchronized(sUnusedBitmaps) { + synchronized(mUnusedBitmaps) { // not in cache; we need to load it from the db - while ((unusedBitmap == null || !unusedBitmap.isMutable()) - && sUnusedBitmaps.size() > 0) { - unusedBitmap = sUnusedBitmaps.remove(0).get(); + while ((unusedBitmap == null || !unusedBitmap.isMutable() || + unusedBitmap.getWidth() != mPreviewBitmapWidth || + unusedBitmap.getHeight() != mPreviewBitmapHeight) + && mUnusedBitmaps.size() > 0) { + unusedBitmap = mUnusedBitmaps.remove(0).get(); } if (unusedBitmap != null) { final Canvas c = mCachedAppWidgetPreviewCanvas.get(); @@ -189,7 +194,7 @@ public class WidgetPreviewLoader { } if (unusedBitmap == null) { - unusedBitmap = Bitmap.createBitmap(mPreviewBitmapMaxWidth, mPreviewBitmapMaxHeight, + unusedBitmap = Bitmap.createBitmap(mPreviewBitmapWidth, mPreviewBitmapHeight, Bitmap.Config.ARGB_8888); } @@ -200,8 +205,8 @@ public class WidgetPreviewLoader { } if (preview != null) { - synchronized(sLoadedPreviews) { - sLoadedPreviews.put(name, new WeakReference<Bitmap>(preview)); + synchronized(mLoadedPreviews) { + mLoadedPreviews.put(name, new WeakReference<Bitmap>(preview)); } return preview; } else { @@ -212,8 +217,8 @@ public class WidgetPreviewLoader { throw new RuntimeException("generatePreview is not recycling the bitmap " + o); } - synchronized(sLoadedPreviews) { - sLoadedPreviews.put(name, new WeakReference<Bitmap>(preview)); + synchronized(mLoadedPreviews) { + mLoadedPreviews.put(name, new WeakReference<Bitmap>(preview)); } // write to db on a thread pool... this can be done lazily and improves the performance @@ -229,16 +234,16 @@ public class WidgetPreviewLoader { } } - public static void releaseBitmap(Object o, Bitmap bitmapToFree) { + public void releaseBitmap(Object o, Bitmap bitmapToFree) { // enable this code when doDecode doesn't force Bitmaps to become immutable String name = getObjectName(o); - synchronized(sLoadedPreviews) { - synchronized(sUnusedBitmaps) { - Bitmap b = sLoadedPreviews.get(name).get(); + synchronized(mLoadedPreviews) { + synchronized(mUnusedBitmaps) { + Bitmap b = mLoadedPreviews.get(name).get(); if (b == bitmapToFree) { - sLoadedPreviews.remove(name); + mLoadedPreviews.remove(name); if (bitmapToFree.isMutable()) { - sUnusedBitmaps.add(new SoftReference<Bitmap>(b)); + mUnusedBitmaps.add(new SoftReference<Bitmap>(b)); } } else { throw new RuntimeException("Bitmap passed in doesn't match up"); @@ -378,15 +383,15 @@ public class WidgetPreviewLoader { public Bitmap generatePreview(Object info, Bitmap preview) { if (preview != null && - (preview.getWidth() != mPreviewBitmapMaxWidth || - preview.getHeight() != mPreviewBitmapMaxHeight)) { + (preview.getWidth() != mPreviewBitmapWidth || + preview.getHeight() != mPreviewBitmapHeight)) { throw new RuntimeException("Improperly sized bitmap passed as argument"); } if (info instanceof AppWidgetProviderInfo) { return generateWidgetPreview((AppWidgetProviderInfo) info, preview); } else { return generateShortcutPreview( - (ResolveInfo) info, mPreviewBitmapMaxWidth, mPreviewBitmapMaxHeight, preview); + (ResolveInfo) info, mPreviewBitmapWidth, mPreviewBitmapHeight, preview); } } @@ -404,12 +409,12 @@ public class WidgetPreviewLoader { } public int maxWidthForWidgetPreview(int spanX) { - return Math.min(mPreviewBitmapMaxWidth, + return Math.min(mPreviewBitmapWidth, mWidgetSpacingLayout.estimateCellWidth(spanX)); } public int maxHeightForWidgetPreview(int spanY) { - return Math.min(mPreviewBitmapMaxHeight, + return Math.min(mPreviewBitmapHeight, mWidgetSpacingLayout.estimateCellHeight(spanY)); } |