merge in ub-now-queens-release history after reset to 08072c05bf9c760acff653545a795a0fae4bd917
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 22db3ac..0d1d3ef 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -737,8 +737,7 @@
         return screenId;
     }
 
-    @Override
-    protected void onActivityResult(
+    private void handleActivityResult(
             final int requestCode, final int resultCode, final Intent data) {
         // Reset the startActivity waiting flag
         setWaitingForResult(false);
@@ -871,6 +870,16 @@
                     ON_ACTIVITY_RESULT_ANIMATION_DELAY, false);
         }
         mDragLayer.clearAnimatedView();
+
+    }
+
+    @Override
+    protected void onActivityResult(
+            final int requestCode, final int resultCode, final Intent data) {
+        handleActivityResult(requestCode, resultCode, data);
+        if (mLauncherCallbacks != null) {
+            mLauncherCallbacks.onActivityResult(requestCode, resultCode, data);
+        }
     }
 
     private PendingAddArguments preparePendingAddArgs(int requestCode, Intent data, int
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
index b03b13c..3868a57 100644
--- a/src/com/android/launcher3/LauncherBackupAgentHelper.java
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -69,13 +69,23 @@
             Log.d(TAG, "Restore is only supported on devices running Lollipop and above.");
             return;
         }
-        super.onRestore(data, appVersionCode, newState);
 
-        // If no favorite was migrated, clear the data and start fresh.
-        final Cursor c = getContentResolver().query(
-                LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, null, null, null, null);
-        boolean hasData = c.moveToNext();
-        c.close();
+        // Clear dB before restore
+        LauncherAppState.getLauncherProvider().createEmptyDB();
+
+        boolean hasData;
+        try {
+            super.onRestore(data, appVersionCode, newState);
+            // If no favorite was migrated, clear the data and start fresh.
+            final Cursor c = getContentResolver().query(
+                    LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, null, null, null, null);
+            hasData = c.moveToNext();
+            c.close();
+        } catch (Exception e) {
+            // If the restore fails, we should do a fresh start.
+            Log.e(TAG, "Restore failed", e);
+            hasData = false;
+        }
 
         if (hasData && mHelper.restoreSuccessful) {
             LauncherAppState.getLauncherProvider().clearFlagEmptyDbCreated();
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 2b520c5..8bd7991 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -283,6 +283,7 @@
     private float[] mNewAlphas;
     private int mLastChildCount = -1;
     private float mTransitionProgress;
+    private Animator mStateAnimator = null;
 
     float mOverScrollEffect = 0f;
 
@@ -2243,6 +2244,13 @@
 
         AnimatorSet anim = animated ? LauncherAnimUtils.createAnimatorSet() : null;
 
+        // We only want a single instance of a workspace animation to be running at once, so
+        // we cancel any incomplete transition.
+        if (mStateAnimator != null) {
+            mStateAnimator.cancel();
+        }
+        mStateAnimator = anim;
+
         final State oldState = mState;
         final boolean oldStateIsNormal = (oldState == State.NORMAL);
         final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
@@ -2440,6 +2448,12 @@
             anim.play(hotseatAlpha);
             anim.play(pageIndicatorAlpha);
             anim.setStartDelay(delay);
+            anim.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    mStateAnimator = null;
+                }
+            });
         } else {
             overviewPanel.setAlpha(finalOverviewPanelAlpha);
             AlphaUpdateListener.updateVisibility(overviewPanel);