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
This commit is contained in:
@@ -15,6 +15,7 @@ import android.database.sqlite.SQLiteOpenHelper;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Bitmap.Config;
|
import android.graphics.Bitmap.Config;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.BitmapShader;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.ColorMatrix;
|
import android.graphics.ColorMatrix;
|
||||||
import android.graphics.ColorMatrixColorFilter;
|
import android.graphics.ColorMatrixColorFilter;
|
||||||
@@ -121,6 +122,7 @@ public class WidgetPreviewLoader {
|
|||||||
private RectCache mCachedAppWidgetPreviewSrcRect = new RectCache();
|
private RectCache mCachedAppWidgetPreviewSrcRect = new RectCache();
|
||||||
private RectCache mCachedAppWidgetPreviewDestRect = new RectCache();
|
private RectCache mCachedAppWidgetPreviewDestRect = new RectCache();
|
||||||
private PaintCache mCachedAppWidgetPreviewPaint = new PaintCache();
|
private PaintCache mCachedAppWidgetPreviewPaint = new PaintCache();
|
||||||
|
private PaintCache mDefaultAppWidgetPreviewPaint = new PaintCache();
|
||||||
private String mCachedSelectQuery;
|
private String mCachedSelectQuery;
|
||||||
private BitmapFactoryOptionsCache mCachedBitmapFactoryOptions = new BitmapFactoryOptionsCache();
|
private BitmapFactoryOptionsCache mCachedBitmapFactoryOptions = new BitmapFactoryOptionsCache();
|
||||||
|
|
||||||
@@ -521,9 +523,16 @@ public class WidgetPreviewLoader {
|
|||||||
defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
|
defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
|
||||||
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
|
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
|
||||||
c.setBitmap(defaultPreview);
|
c.setBitmap(defaultPreview);
|
||||||
previewDrawable.setBounds(0, 0, previewWidth, previewHeight);
|
Paint p = mDefaultAppWidgetPreviewPaint.get();
|
||||||
previewDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
|
if (p == null) {
|
||||||
previewDrawable.draw(c);
|
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);
|
c.setBitmap(null);
|
||||||
|
|
||||||
// Draw the icon in the top left corner
|
// Draw the icon in the top left corner
|
||||||
|
|||||||
Reference in New Issue
Block a user