diff options
author | Adrian Roos <roosa@google.com> | 2014-03-19 15:58:14 +0100 |
---|---|---|
committer | Adrian Roos <roosa@google.com> | 2014-03-19 16:29:30 +0100 |
commit | fa4c799a9bc6b2eb55ce21609591d49f5c5ea9ba (patch) | |
tree | e34016ea2c27c3928a4128162b90ad94b1248d31 /src | |
parent | 5d2704fbb0a7bb4763d4e2ee031e16a8913ba003 (diff) | |
download | android_packages_apps_Trebuchet-fa4c799a9bc6b2eb55ce21609591d49f5c5ea9ba.tar.gz android_packages_apps_Trebuchet-fa4c799a9bc6b2eb55ce21609591d49f5c5ea9ba.tar.bz2 android_packages_apps_Trebuchet-fa4c799a9bc6b2eb55ce21609591d49f5c5ea9ba.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/WidgetPreviewLoader.java | 15 |
1 files changed, 12 insertions, 3 deletions
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 |