From fa4c799a9bc6b2eb55ce21609591d49f5c5ea9ba Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 19 Mar 2014 15:58:14 +0100 Subject: Fix concurrent drawable usage resulting in native crash One of widget preview drawables was drawn concurrently from a thread pool, causing a native Skia crash. Bug: 12525890 Change-Id: I2dea7b86ba8b32237f40feff225657dcb2b0061b --- src/com/android/launcher3/WidgetPreviewLoader.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/com/android/launcher3/WidgetPreviewLoader.java') diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 1a67987b4..36152f807 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -15,6 +15,7 @@ import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; +import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; @@ -121,6 +122,7 @@ public class WidgetPreviewLoader { private RectCache mCachedAppWidgetPreviewSrcRect = new RectCache(); private RectCache mCachedAppWidgetPreviewDestRect = new RectCache(); private PaintCache mCachedAppWidgetPreviewPaint = new PaintCache(); + private PaintCache mDefaultAppWidgetPreviewPaint = new PaintCache(); private String mCachedSelectQuery; private BitmapFactoryOptionsCache mCachedBitmapFactoryOptions = new BitmapFactoryOptionsCache(); @@ -521,9 +523,16 @@ public class WidgetPreviewLoader { 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.draw(c); + Paint p = mDefaultAppWidgetPreviewPaint.get(); + if (p == null) { + p = new Paint(); + p.setShader(new BitmapShader(previewDrawable.getBitmap(), + Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)); + mDefaultAppWidgetPreviewPaint.set(p); + } + final Rect dest = mCachedAppWidgetPreviewDestRect.get(); + dest.set(0, 0, previewWidth, previewHeight); + c.drawRect(dest, p); c.setBitmap(null); // Draw the icon in the top left corner -- cgit v1.2.3