Merge "Prevent launcher crash when an App Widget is removed." into sc-dev
diff --git a/src/com/android/launcher3/dragndrop/AppWidgetHostViewDrawable.java b/src/com/android/launcher3/dragndrop/AppWidgetHostViewDrawable.java
index 5cd95dc..7b32bbf 100644
--- a/src/com/android/launcher3/dragndrop/AppWidgetHostViewDrawable.java
+++ b/src/com/android/launcher3/dragndrop/AppWidgetHostViewDrawable.java
@@ -27,15 +27,21 @@
 
 import com.android.launcher3.widget.LauncherAppWidgetHostView;
 
-/** A drawable which renders {@link LauncherAppWidgetHostView} to a canvas. */
+/**
+ * A drawable which renders {@link LauncherAppWidgetHostView} to a canvas.
+ *
+ * TODO(b/183609936) Stop using that class and remove it.
+ */
 public final class AppWidgetHostViewDrawable extends Drawable {
 
     private final LauncherAppWidgetHostView mAppWidgetHostView;
     private Paint mPaint = new Paint();
     private final Path mClipPath;
+    private final boolean mWasAttached;
 
     public AppWidgetHostViewDrawable(LauncherAppWidgetHostView appWidgetHostView) {
         mAppWidgetHostView = appWidgetHostView;
+        mWasAttached = appWidgetHostView.isAttachedToWindow();
         Path clipPath = null;
         if (appWidgetHostView.getClipToOutline()) {
             Outline outline = new Outline();
@@ -56,7 +62,12 @@
         if (mClipPath != null) {
             canvas.clipPath(mClipPath);
         }
-        mAppWidgetHostView.draw(canvas);
+        // If the view was never attached, or is current attached, then draw. Otherwise do not try
+        // to draw, or we might trigger bugs with items that get drawn while requiring the view to
+        // be attached.
+        if (!mWasAttached || mAppWidgetHostView.isAttachedToWindow()) {
+            mAppWidgetHostView.draw(canvas);
+        }
         canvas.restoreToCount(saveCount);
     }