diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2017-03-08 14:49:55 -0800 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2017-03-17 11:25:29 -0700 |
commit | c65a0085d77edd8e8821254f081eb94e9dcc5e75 (patch) | |
tree | 9b5828af69bd8c6fb34d47e121202cfe86123b8f /src/com/android/launcher3/dragndrop | |
parent | efd5cbf55c45185230d56799e67b31e96d8d7029 (diff) | |
download | android_packages_apps_Trebuchet-c65a0085d77edd8e8821254f081eb94e9dcc5e75.tar.gz android_packages_apps_Trebuchet-c65a0085d77edd8e8821254f081eb94e9dcc5e75.tar.bz2 android_packages_apps_Trebuchet-c65a0085d77edd8e8821254f081eb94e9dcc5e75.zip |
Adding support for showing the widget preview based on the provided RemoteViews
Bug: 35811129
Change-Id: I336e48cd00cfec2e617ac73bd8a81419b0944aa7
Diffstat (limited to 'src/com/android/launcher3/dragndrop')
3 files changed, 120 insertions, 6 deletions
diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java index b80baf32f..c2a4820c8 100644 --- a/src/com/android/launcher3/dragndrop/AddItemActivity.java +++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java @@ -27,10 +27,8 @@ import android.graphics.Canvas; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; -import android.graphics.RectF; import android.os.Build; import android.os.Bundle; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.*; @@ -47,7 +45,6 @@ import com.android.launcher3.compat.PinItemRequestCompat; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.widget.PendingAddWidgetInfo; -import com.android.launcher3.widget.WidgetCell; import com.android.launcher3.widget.WidgetHostViewLoader; import com.android.launcher3.widget.WidgetImageView; @@ -65,7 +62,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener private LauncherAppState mApp; private InvariantDeviceProfile mIdp; - private WidgetCell mWidgetCell; + private LivePreviewWidgetCell mWidgetCell; // Widget request specific options. private AppWidgetHost mAppWidgetHost; @@ -92,7 +89,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener mDeviceProfile = mIdp.getDeviceProfile(getApplicationContext()); setContentView(R.layout.add_item_confirmation_activity); - mWidgetCell = (WidgetCell) findViewById(R.id.widget_cell); + mWidgetCell = (LivePreviewWidgetCell) findViewById(R.id.widget_cell); if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) { setupShortcut(); @@ -169,6 +166,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener // Cannot add widget return false; } + mWidgetCell.setPreview(PinItemDragListener.getPreview(mRequest)); mAppWidgetManager = AppWidgetManagerCompat.getInstance(this); mAppWidgetHost = new AppWidgetHost(this, Launcher.APPWIDGET_HOST_ID); diff --git a/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java new file mode 100644 index 000000000..36a0292da --- /dev/null +++ b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java @@ -0,0 +1,99 @@ +package com.android.launcher3.dragndrop; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RemoteViews; + +import com.android.launcher3.BaseActivity; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.LauncherAppWidgetProviderInfo; +import com.android.launcher3.widget.WidgetCell; + +/** + * Extension of {@link WidgetCell} which supports generating previews from {@link RemoteViews} + */ +public class LivePreviewWidgetCell extends WidgetCell { + + private RemoteViews mPreview; + + public LivePreviewWidgetCell(Context context) { + this(context, null); + } + + public LivePreviewWidgetCell(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LivePreviewWidgetCell(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public void setPreview(RemoteViews view) { + mPreview = view; + } + + @Override + public void ensurePreview() { + if (mPreview != null && mActiveRequest == null) { + Bitmap preview = generateFromRemoteViews( + mActivity, mPreview, mItem.widgetInfo, mPresetPreviewSize, new int[1]); + if (preview != null) { + applyPreview(preview); + return; + } + } + super.ensurePreview(); + } + + /** + * Generates a bitmap by inflating {@param views}. + * @see com.android.launcher3.WidgetPreviewLoader#generateWidgetPreview + * + * TODO: Consider moving this to the background thread. + */ + public static Bitmap generateFromRemoteViews(BaseActivity activity, RemoteViews views, + LauncherAppWidgetProviderInfo info, int previewSize, int[] preScaledWidthOut) { + + DeviceProfile dp = activity.getDeviceProfile(); + int viewWidth = dp.cellWidthPx * info.spanX; + int viewHeight = dp.cellHeightPx * info.spanY; + + final View v; + try { + v = views.apply(activity, new FrameLayout(activity)); + v.measure(MeasureSpec.makeMeasureSpec(viewWidth, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY)); + + viewWidth = v.getMeasuredWidth(); + viewHeight = v.getMeasuredHeight(); + v.layout(0, 0, viewWidth, viewHeight); + } catch (Exception e) { + return null; + } + + preScaledWidthOut[0] = viewWidth; + final int bitmapWidth, bitmapHeight; + final float scale; + if (viewWidth > previewSize) { + scale = ((float) previewSize) / viewWidth; + bitmapWidth = previewSize; + bitmapHeight = (int) (viewHeight * scale); + } else { + scale = 1; + bitmapWidth = viewWidth; + bitmapHeight = viewHeight; + } + + Bitmap preview = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(preview); + c.scale(scale, scale); + v.draw(c); + c.setBitmap(null); + return preview; + } +} diff --git a/src/com/android/launcher3/dragndrop/PinItemDragListener.java b/src/com/android/launcher3/dragndrop/PinItemDragListener.java index 6e5318f2a..fd252a26a 100644 --- a/src/com/android/launcher3/dragndrop/PinItemDragListener.java +++ b/src/com/android/launcher3/dragndrop/PinItemDragListener.java @@ -16,9 +16,11 @@ package com.android.launcher3.dragndrop; +import android.appwidget.AppWidgetManager; import android.content.ClipDescription; import android.graphics.Point; import android.graphics.Rect; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Parcel; @@ -27,6 +29,7 @@ import android.os.SystemClock; import android.util.Log; import android.view.DragEvent; import android.view.View; +import android.widget.RemoteViews; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DragSource; @@ -171,7 +174,12 @@ public class PinItemDragListener // and the absolute position (position relative to the screen) of drag event is same // across windows, using drag position here give a good estimate for relative position // to source window. - new PendingItemDragHelper(view).startDrag(new Rect(mPreviewRect), + PendingItemDragHelper dragHelper = new PendingItemDragHelper(view); + if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_APPWIDGET) { + dragHelper.setPreview(getPreview(mRequest)); + } + + dragHelper.startDrag(new Rect(mPreviewRect), mPreviewBitmapWidth, mPreviewViewWidth, downPos, this, options); mDragStartTime = SystemClock.uptimeMillis(); return true; @@ -250,6 +258,15 @@ public class PinItemDragListener } } + public static RemoteViews getPreview(PinItemRequestCompat request) { + Bundle extras = request.getExtras(); + if (extras != null && + extras.get(AppWidgetManager.EXTRA_APPWIDGET_PREVIEW) instanceof RemoteViews) { + return (RemoteViews) extras.get(AppWidgetManager.EXTRA_APPWIDGET_PREVIEW); + } + return null; + } + public static final Parcelable.Creator<PinItemDragListener> CREATOR = new Parcelable.Creator<PinItemDragListener>() { public PinItemDragListener createFromParcel(Parcel source) { |