From 0d5ca096a03104d75f231175bd54a991adc27b09 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 10 Jan 2019 18:05:15 -0800 Subject: [PATCH] Fix crash when rendering pending widget preview - The pending widget disabled icon drawable is created from the icon backed by a hw bitmap, and when a user long presses the widget, we attempt to draw the drawable using a canvas backed by a software bitmap. Bug: 112324288 Test: Pick up a pending app widget Change-Id: Ied49112a2b03d54691f6db7c65e9267c8bd8e91f --- .../launcher3/graphics/DragPreviewProvider.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index 75d3425e2b..7eb4015bfa 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -36,6 +36,7 @@ import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.icons.BitmapRenderer; import com.android.launcher3.util.UiThreadHelper; import com.android.launcher3.widget.LauncherAppWidgetHostView; +import com.android.launcher3.widget.PendingAppWidgetHostView; import java.nio.ByteBuffer; @@ -131,9 +132,15 @@ public class DragPreviewProvider { width = (int) (mView.getWidth() * scale); height = (int) (mView.getHeight() * scale); - // Use software renderer for widgets as we know that they already work - return BitmapRenderer.createSoftwareBitmap(width + blurSizeOutline, - height + blurSizeOutline, (c) -> drawDragView(c, scale)); + if (mView instanceof PendingAppWidgetHostView) { + // Use hardware renderer as the icon for the pending app widget may be a hw bitmap + return BitmapRenderer.createHardwareBitmap(width + blurSizeOutline, + height + blurSizeOutline, (c) -> drawDragView(c, scale)); + } else { + // Use software renderer for widgets as we know that they already work + return BitmapRenderer.createSoftwareBitmap(width + blurSizeOutline, + height + blurSizeOutline, (c) -> drawDragView(c, scale)); + } } return BitmapRenderer.createHardwareBitmap(width + blurSizeOutline,