Add code path for the recents animation using window transitions.

Test: Enable in settings, swipe up

Change-Id: I1053f9e519c2f612bd3db0b66cd16ad9a30bfeb4
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index a91907d..c1883b1 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1174,6 +1174,10 @@
         return mAllAppsController;
     }
 
+    public LauncherRootView getRootView() {
+        return (LauncherRootView) mLauncherView;
+    }
+
     public DragLayer getDragLayer() {
         return mDragLayer;
     }
diff --git a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
index 4629dad..9638a75 100644
--- a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
+++ b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
@@ -75,13 +75,14 @@
     }
 
     @Override
-    public void init(Launcher launcher, boolean alreadyOnHome) {
+    public boolean init(Launcher launcher, boolean alreadyOnHome) {
         AbstractFloatingView.closeAllOpenViews(launcher, alreadyOnHome);
         launcher.getStateManager().goToState(NORMAL, alreadyOnHome /* animated */);
         launcher.getDragLayer().setOnDragListener(this);
 
         mLauncher = launcher;
         mDragController = launcher.getDragController();
+        return false;
     }
 
     @Override
@@ -176,7 +177,4 @@
             mLauncher.getDragLayer().setOnDragListener(null);
         }
     }
-
-    @Override
-    public void onLauncherResume() { }
 }
diff --git a/src/com/android/launcher3/states/InternalStateHandler.java b/src/com/android/launcher3/states/InternalStateHandler.java
index f084fd2..4c3ef4b 100644
--- a/src/com/android/launcher3/states/InternalStateHandler.java
+++ b/src/com/android/launcher3/states/InternalStateHandler.java
@@ -21,7 +21,11 @@
 import android.os.IBinder;
 
 import com.android.launcher3.Launcher;
-import com.android.launcher3.Launcher.OnResumeCallback;
+import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.LauncherModel.Callbacks;
+import com.android.launcher3.util.Preconditions;
+
+import java.lang.ref.WeakReference;
 
 /**
  * Utility class to sending state handling logic to Launcher from within the same process.
@@ -29,11 +33,17 @@
  * Extending {@link Binder} ensures that the platform maintains a single instance of each object
  * which allows this object to safely navigate the system process.
  */
-public abstract class InternalStateHandler extends Binder implements OnResumeCallback {
+public abstract class InternalStateHandler extends Binder {
 
     public static final String EXTRA_STATE_HANDLER = "launcher.state_handler";
 
-    protected abstract void init(Launcher launcher, boolean alreadyOnHome);
+    private static WeakReference<InternalStateHandler> sPendingHandler = new WeakReference<>(null);
+
+    /**
+     * Initializes the handler when the launcher is ready.
+     * @return true if the handler wants to stay alive.
+     */
+    protected abstract boolean init(Launcher launcher, boolean alreadyOnHome);
 
     public final Intent addToIntent(Intent intent) {
         Bundle extras = new Bundle();
@@ -42,6 +52,29 @@
         return intent;
     }
 
+    public final void initWhenReady() {
+        Preconditions.assertUIThread();
+        sPendingHandler = new WeakReference<>(this);
+        LauncherAppState app = LauncherAppState.getInstanceNoCreate();
+        if (app == null) {
+            return;
+        }
+        Callbacks cb = app.getModel().getCallback();
+        if (!(cb instanceof Launcher)) {
+            return;
+        }
+        Launcher launcher = (Launcher) cb;
+        if (!init(launcher, launcher.isStarted())) {
+            sPendingHandler.clear();
+        }
+    }
+
+    public void clearReference() {
+        if (sPendingHandler.get() == this) {
+            sPendingHandler.clear();
+        }
+    }
+
     public static boolean handleCreate(Launcher launcher, Intent intent) {
         return handleIntent(launcher, intent, false);
     }
@@ -57,12 +90,21 @@
             IBinder stateBinder = intent.getExtras().getBinder(EXTRA_STATE_HANDLER);
             if (stateBinder instanceof InternalStateHandler) {
                 InternalStateHandler handler = (InternalStateHandler) stateBinder;
-                launcher.setOnResumeCallback(handler);
-                handler.init(launcher, alreadyOnHome);
+                if (!handler.init(launcher, alreadyOnHome)) {
+                    intent.getExtras().remove(EXTRA_STATE_HANDLER);
+                }
                 result = true;
             }
-            intent.getExtras().remove(EXTRA_STATE_HANDLER);
+        }
+        if (!result) {
+            InternalStateHandler pendingHandler = sPendingHandler.get();
+            if (pendingHandler != null) {
+                if (!pendingHandler.init(launcher, alreadyOnHome)) {
+                    sPendingHandler.clear();
+                }
+                result = true;
+            }
         }
         return result;
     }
-}
+}
\ No newline at end of file