Delay the PinItemRequest#accept() call until the drop animation is finished.

This prevents the caller app from taking over the focus while animation
it running.

Change-Id: I51b6673c59e848c263727502dee90504ed3a2162
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 0a1810a..49d0390 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1456,7 +1456,7 @@
         ShortcutInfo info = null;
         if (Utilities.isAtLeastO()) {
             info = LauncherAppsCompat.createShortcutInfoFromPinItemRequest(
-                    this, PinItemRequestCompat.getPinItemRequest(data));
+                    this, PinItemRequestCompat.getPinItemRequest(data), 0);
         }
 
         if (info == null) {
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java
index 2eb5b02..4580b81 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompat.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java
@@ -27,10 +27,12 @@
 import android.support.annotation.Nullable;
 
 import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.LauncherModel;
 import com.android.launcher3.ShortcutInfo;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.graphics.LauncherIcons;
 import com.android.launcher3.shortcuts.ShortcutInfoCompat;
+import com.android.launcher3.util.LooperExecuter;
 
 import java.util.List;
 
@@ -100,10 +102,32 @@
      */
     @Nullable
     public static ShortcutInfo createShortcutInfoFromPinItemRequest(
-            Context context, PinItemRequestCompat request) {
+            Context context, final PinItemRequestCompat request, final long acceptDelay) {
         if (request != null &&
                 request.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT &&
-                request.isValid() && request.accept()) {
+                request.isValid()) {
+
+            if (acceptDelay <= 0) {
+                if (!request.accept()) {
+                    return null;
+                }
+            } else {
+                // Block the worker thread until the accept() is called.
+                new LooperExecuter(LauncherModel.getWorkerLooper()).execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.sleep(acceptDelay);
+                        } catch (InterruptedException e) {
+                            // Ignore
+                        }
+                        if (request.isValid()) {
+                            request.accept();
+                        }
+                    }
+                });
+            }
+
             ShortcutInfoCompat compat = new ShortcutInfoCompat(request.getShortcutInfo());
             ShortcutInfo info = new ShortcutInfo(compat, context);
             // Apply the unbadged icon and fetch the actual icon asynchronously.
diff --git a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java
index 26460d7..bb5ac5b 100644
--- a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java
+++ b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java
@@ -26,8 +26,10 @@
 import android.os.Build;
 
 import com.android.launcher3.IconCache;
+import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherSettings;
+import com.android.launcher3.R;
 import com.android.launcher3.compat.LauncherAppsCompat;
 import com.android.launcher3.compat.PinItemRequestCompat;
 import com.android.launcher3.compat.ShortcutConfigActivityInfo;
@@ -73,7 +75,13 @@
 
     @Override
     public com.android.launcher3.ShortcutInfo createShortcutInfo() {
-        return LauncherAppsCompat.createShortcutInfoFromPinItemRequest(mContext, mRequest);
+        // Total duration for the drop animation to complete.
+        long duration = mContext.getResources().getInteger(R.integer.config_dropAnimMaxDuration) +
+                Launcher.EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT +
+                mContext.getResources().getInteger(R.integer.config_overlayTransitionTime) / 2;
+        // Delay the actual accept() call until the drop animation is complete.
+        return LauncherAppsCompat.createShortcutInfoFromPinItemRequest(
+                mContext, mRequest, duration);
     }
 
     @Override