Fix class cast issue in AddItemActivity

AddItemActivity is a standalone activity. There is no Launcher activity
instance. Avoid using LauncherAppWidgetHostView in WidgetCell by
replacing it NavigableAppWidgetHostView instead

Test: Check preview layouts are correctly rendered in widgets picker
      and pin widget dialog. Also test drag and drop to verify the
      local color extraction still works when dragging a preview layout
      from widgets picker to home screen.
Fix: 193765783
Change-Id: I3a734a54941257cebcd7b7f6a4c2c9cc764c5c12
This commit is contained in:
Steven Ng
2021-07-15 13:11:59 +01:00
parent a5e98ad98a
commit 671ffb88ca

View File

@@ -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();