diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index 5759f75535..5769ba0c69 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -43,6 +43,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.BaseActivity; import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.icons.RoundDrawableWrapper; @@ -217,12 +218,7 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { private void applyPreviewOnAppWidgetHostView(WidgetItem item) { if (mRemoteViewsPreview != null) { - mAppWidgetHostViewPreview = new NavigableAppWidgetHostView(getContext()) { - @Override - protected boolean shouldAllowDirectClick() { - return false; - } - }; + mAppWidgetHostViewPreview = createAppWidgetHostView(getContext()); setAppWidgetHostViewPreview(mAppWidgetHostViewPreview, item.widgetInfo, mRemoteViewsPreview); return; @@ -230,10 +226,15 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { if (!item.hasPreviewLayout()) return; - mAppWidgetHostViewPreview = new LauncherAppWidgetHostView(getContext()); + Context context = getContext(); + // If the context is a Launcher activity, DragView will show mAppWidgetHostViewPreview as + // a preview during drag & drop. And thus, we should use LauncherAppWidgetHostView, which + // supports applying local color extraction during drag & drop. + mAppWidgetHostViewPreview = isLauncherContext(context) + ? new LauncherAppWidgetHostView(context) + : createAppWidgetHostView(context); LauncherAppWidgetProviderInfo launcherAppWidgetProviderInfo = - LauncherAppWidgetProviderInfo.fromProviderInfo(getContext(), - item.widgetInfo.clone()); + LauncherAppWidgetProviderInfo.fromProviderInfo(context, item.widgetInfo.clone()); // A hack to force the initial layout to be the preview layout since there is no API for // rendering a preview layout for work profile apps yet. For non-work profile layout, a // proper solution is to use RemoteViews(PackageName, LayoutId). @@ -400,6 +401,24 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { return ""; } + private static NavigableAppWidgetHostView createAppWidgetHostView(Context context) { + return new NavigableAppWidgetHostView(context) { + @Override + protected boolean shouldAllowDirectClick() { + return false; + } + }; + } + + private static boolean isLauncherContext(Context context) { + try { + Launcher.getLauncher(context); + return true; + } catch (Exception e) { + return false; + } + } + @Override public CharSequence getAccessibilityClassName() { return WidgetCell.class.getName();