OSDN Git Service

Improving widget handling for pinItemRequest
authorSunny Goyal <sunnygoyal@google.com>
Wed, 25 Jan 2017 19:30:06 +0000 (11:30 -0800)
committerSunny Goyal <sunnygoyal@google.com>
Fri, 27 Jan 2017 17:35:18 +0000 (09:35 -0800)
> Preloading widget view while dragging for smoother
  transition
> Skipping config activity and sending confirmation to
  the caller when widget is dropped

Bug: 33584624
Change-Id: Ib23e5964298296d12d9c93f38aefdf924a07368e

src/com/android/launcher3/Launcher.java
src/com/android/launcher3/dragndrop/PinItemDragListener.java
src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java [new file with mode: 0644]
src/com/android/launcher3/widget/PendingAddWidgetInfo.java
src/com/android/launcher3/widget/WidgetAddFlowHandler.java
src/com/android/launcher3/widget/WidgetHostViewLoader.java
src/com/android/launcher3/widget/WidgetsContainerView.java

index 69b305f..a1aafb8 100644 (file)
@@ -2109,7 +2109,7 @@ public class Launcher extends BaseActivity
     private void addAppWidgetFromDrop(PendingAddWidgetInfo info) {
         AppWidgetHostView hostView = info.boundWidget;
         int appWidgetId;
-        WidgetAddFlowHandler addFlowHandler = info.getHander();
+        WidgetAddFlowHandler addFlowHandler = info.getHandler();
         if (hostView != null) {
             // In the case where we've prebound the widget, we remove it from the DragLayer
             if (LOGD) {
index 1a99cc8..73ad1c8 100644 (file)
@@ -48,6 +48,8 @@ import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.widget.PendingAddShortcutInfo;
 import com.android.launcher3.widget.PendingAddWidgetInfo;
 import com.android.launcher3.widget.PendingItemPreviewProvider;
+import com.android.launcher3.widget.WidgetAddFlowHandler;
+import com.android.launcher3.widget.WidgetHostViewLoader;
 
 import java.util.UUID;
 
@@ -141,6 +143,7 @@ public class PinItemDragListener implements Parcelable, View.OnDragListener, Dra
 
         final PendingAddItemInfo item;
         final Bitmap preview;
+        final View view = new View(mLauncher);
 
         Point dragShift = new Point(mPreviewRect.left, mPreviewRect.top);
         if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) {
@@ -160,9 +163,18 @@ public class PinItemDragListener implements Parcelable, View.OnDragListener, Dra
                     (size[1] - icon.getHeight() - dp.iconTextSizePx - dp.iconDrawablePaddingPx) / 2,
                     new Paint(Paint.FILTER_BITMAP_FLAG));
         } else {
-            PendingAddWidgetInfo info = new PendingAddWidgetInfo(
+            // mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_APPWIDGET
+            LauncherAppWidgetProviderInfo providerInfo =
                     LauncherAppWidgetProviderInfo.fromProviderInfo(
-                            mLauncher, mRequest.getAppWidgetProviderInfo(mLauncher)));
+                            mLauncher, mRequest.getAppWidgetProviderInfo(mLauncher));
+            final PinWidgetFlowHandler flowHandler =
+                    new PinWidgetFlowHandler(providerInfo, mRequest);
+            PendingAddWidgetInfo info = new PendingAddWidgetInfo(providerInfo) {
+                @Override
+                public WidgetAddFlowHandler getHandler() {
+                    return flowHandler;
+                }
+            };
             int[] size = mLauncher.getWorkspace().estimateItemSize(info, true, false);
 
             float minScale = 1.25f;
@@ -176,10 +188,13 @@ public class PinItemDragListener implements Parcelable, View.OnDragListener, Dra
                     (mPreviewRect.width() - preview.getWidth()) / 2,
                     (mPreviewRect.height() - preview.getHeight()) / 2);
             item = info;
+
+            view.setTag(info);
+            mDragController.addDragListener(new WidgetHostViewLoader(mLauncher, view));
         }
 
         PendingItemPreviewProvider previewProvider =
-                new PendingItemPreviewProvider(new View(mLauncher), item, preview);
+                new PendingItemPreviewProvider(view, item, preview);
 
         // Since we are not going through the workspace for starting the drag, set drag related
         // information on the workspace before starting the drag.
diff --git a/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java b/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java
new file mode 100644 (file)
index 0000000..b6da6ad
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.dragndrop;
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.launcher3.ItemInfo;
+import com.android.launcher3.Launcher;
+import com.android.launcher3.compat.PinItemRequestCompat;
+import com.android.launcher3.widget.WidgetAddFlowHandler;
+
+/**
+ * Extension of WidgetAddFlowHandler to handle pin item request behavior.
+ *
+ * No config activity is shown even if it is defined in widget config. And a callback is sent when
+ * the widget is bound.
+ */
+public class PinWidgetFlowHandler extends WidgetAddFlowHandler implements Parcelable {
+
+    private final PinItemRequestCompat mRequest;
+
+    public PinWidgetFlowHandler(AppWidgetProviderInfo providerInfo, PinItemRequestCompat request) {
+        super(providerInfo);
+        mRequest = request;
+    }
+
+    protected PinWidgetFlowHandler(Parcel parcel) {
+        super(parcel);
+        mRequest = PinItemRequestCompat.CREATOR.createFromParcel(parcel);
+    }
+
+    @Override
+    public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
+        mRequest.writeToParcel(parcel, i);
+    }
+
+    @Override
+    public boolean startConfigActivity(Launcher launcher, int appWidgetId, ItemInfo info,
+            int requestCode) {
+        Bundle extras = new Bundle();
+        extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+        mRequest.accept(extras);
+        return false;
+    }
+
+    @Override
+    public boolean needsConfigure() {
+        return false;
+    }
+
+    public static final Parcelable.Creator<PinWidgetFlowHandler> CREATOR =
+            new Parcelable.Creator<PinWidgetFlowHandler>() {
+                public PinWidgetFlowHandler createFromParcel(Parcel source) {
+                    return new PinWidgetFlowHandler(source);
+                }
+
+                public PinWidgetFlowHandler[] newArray(int size) {
+                    return new PinWidgetFlowHandler[size];
+                }
+            };
+}
index 23e2f92..ad05ce9 100644 (file)
@@ -52,7 +52,7 @@ public class PendingAddWidgetInfo extends PendingAddItemInfo {
         minSpanY = i.minSpanY;
     }
 
-    public WidgetAddFlowHandler getHander() {
+    public WidgetAddFlowHandler getHandler() {
         return new WidgetAddFlowHandler(info);
     }
 }
index f44e56c..629f30c 100644 (file)
@@ -40,7 +40,7 @@ public class WidgetAddFlowHandler implements Parcelable {
         mProviderInfo = providerInfo;
     }
 
-    private WidgetAddFlowHandler(Parcel parcel) {
+    protected WidgetAddFlowHandler(Parcel parcel) {
         mProviderInfo = AppWidgetProviderInfo.CREATOR.createFromParcel(parcel);
     }
 
@@ -81,7 +81,7 @@ public class WidgetAddFlowHandler implements Parcelable {
      */
     public boolean startConfigActivity(Launcher launcher, int appWidgetId, ItemInfo info,
             int requestCode) {
-        if (mProviderInfo.configure == null) {
+        if (!needsConfigure()) {
             return false;
         }
         launcher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(appWidgetId, this, info));
@@ -91,6 +91,10 @@ public class WidgetAddFlowHandler implements Parcelable {
         return true;
     }
 
+    public boolean needsConfigure() {
+        return mProviderInfo.configure != null;
+    }
+
     public LauncherAppWidgetProviderInfo getProviderInfo(Context context) {
         return LauncherAppWidgetProviderInfo.fromProviderInfo(context, mProviderInfo);
     }
index 56112b2..5eeea44 100644 (file)
@@ -46,7 +46,9 @@ public class WidgetHostViewLoader implements DragController.DragListener {
     }
 
     @Override
-    public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { }
+    public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) {
+        preloadWidget();
+    }
 
     @Override
     public void onDragEnd() {
@@ -80,7 +82,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
     /**
      * Start preloading the widget.
      */
-    public boolean preloadWidget() {
+    private boolean preloadWidget() {
         final LauncherAppWidgetProviderInfo pInfo = mInfo.info;
 
         if (pInfo.isCustomWidget) {
@@ -89,7 +91,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
         final Bundle options = getDefaultOptionsForWidget(mLauncher, mInfo);
 
         // If there is a configuration activity, do not follow thru bound and inflate.
-        if (pInfo.configure != null) {
+        if (mInfo.getHandler().needsConfigure()) {
             mInfo.bindOptions = options;
             return false;
         }
index 2731fb9..d1421e0 100644 (file)
@@ -150,16 +150,7 @@ public class WidgetsContainerView extends BaseContainerView
         // Return if global dragging is not enabled
         if (!mLauncher.isDraggingEnabled()) return false;
 
-        boolean status = beginDragging(v);
-        if (status && v.getTag() instanceof PendingAddWidgetInfo) {
-            WidgetHostViewLoader hostLoader = new WidgetHostViewLoader(mLauncher, v);
-            boolean preloadStatus = hostLoader.preloadWidget();
-            if (LOGD) {
-                Log.d(TAG, String.format("preloading widget [status=%s]", preloadStatus));
-            }
-            mLauncher.getDragController().addDragListener(hostLoader);
-        }
-        return status;
+        return beginDragging(v);
     }
 
     private boolean beginDragging(View v) {
@@ -222,6 +213,8 @@ public class WidgetsContainerView extends BaseContainerView
                 bounds.right -= padding;
             }
             scale = bounds.width() / (float) preview.getWidth();
+
+            mLauncher.getDragController().addDragListener(new WidgetHostViewLoader(mLauncher, v));
         } else {
             PendingAddShortcutInfo createShortcutInfo = (PendingAddShortcutInfo) v.getTag();
             Drawable icon = createShortcutInfo.activityInfo.getFullResIcon(mIconCache);