Merge "Removing unnecessary view inflation" into ub-launcher3-master
diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
index ca99253..d8ba186 100644
--- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
+++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
@@ -70,7 +70,7 @@
         dummyInfo.intent = new Intent();
         ComponentName component = task.getTopComponent();
         dummyInfo.intent.setComponent(component);
-        dummyInfo.user = UserHandle.getUserHandleForUid(task.key.userId);
+        dummyInfo.user = UserHandle.of(task.key.userId);
         dummyInfo.title = TaskUtils.getTitle(launcher, task);
 
         return getOnClickListenerForTask(launcher, task, dummyInfo);
diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java
index a95e7c1..b31d42f 100644
--- a/quickstep/src/com/android/quickstep/TaskUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskUtils.java
@@ -16,10 +16,14 @@
 
 package com.android.quickstep;
 
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.os.UserHandle;
 import android.util.Log;
 
 import com.android.launcher3.Launcher;
+import com.android.launcher3.compat.LauncherAppsCompat;
+import com.android.launcher3.compat.UserManagerCompat;
 import com.android.systemui.shared.recents.model.Task;
 
 /**
@@ -27,16 +31,21 @@
  * TODO: remove this once we switch to getting the icon and label from IconCache.
  */
 public class TaskUtils {
+
     private static final String TAG = "TaskUtils";
 
     public static CharSequence getTitle(Launcher launcher, Task task) {
-        PackageManager pm = launcher.getPackageManager();
-        try {
-            return pm.getPackageInfo(task.getTopComponent().getPackageName(), 0)
-                    .applicationInfo.loadLabel(pm);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Failed to get title for task " + task, e);
+        LauncherAppsCompat launcherAppsCompat = LauncherAppsCompat.getInstance(launcher);
+        UserManagerCompat userManagerCompat = UserManagerCompat.getInstance(launcher);
+        PackageManager packageManager = launcher.getPackageManager();
+        UserHandle user = UserHandle.of(task.key.userId);
+        ApplicationInfo applicationInfo = launcherAppsCompat.getApplicationInfo(
+            task.getTopComponent().getPackageName(), 0, user);
+        if (applicationInfo == null) {
+            Log.e(TAG, "Failed to get title for task " + task);
+            return "";
         }
-        return "";
+        return userManagerCompat.getBadgedLabelForUser(
+            applicationInfo.loadLabel(packageManager), user);
     }
 }
diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
index 551ed29..028af9a 100644
--- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -22,6 +22,7 @@
 import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB;
 import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SWITCH;
 import static com.android.quickstep.TouchConsumer.isInteractionQuick;
+import static com.android.systemui.shared.recents.utilities.Utilities.postAtFrontOfQueueAsynchronously;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
 
 import android.animation.Animator;
@@ -35,6 +36,7 @@
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Build;
+import android.os.Handler;
 import android.os.Looper;
 import android.support.annotation.UiThread;
 import android.support.annotation.WorkerThread;
@@ -78,6 +80,7 @@
     private static final int STATE_SCALED_CONTROLLER_APP = 1 << 5;
 
     private static final int STATE_HANDLER_INVALIDATED = 1 << 6;
+    private static final int STATE_GESTURE_STARTED = 1 << 7;
 
     private static final int LAUNCHER_UI_STATES =
             STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_ACTIVITY_MULTIPLIER_COMPLETE;
@@ -147,12 +150,13 @@
 
     private void initStateCallbacks() {
         mStateCallback = new MultiStateCallback();
+        mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED,
+                this::initializeLauncherAnimationController);
         mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN,
                 this::launcherFrameDrawn);
 
         mStateCallback.addCallback(STATE_SCALED_CONTROLLER_APP | STATE_APP_CONTROLLER_RECEIVED,
                 this::resumeLastTask);
-
         mStateCallback.addCallback(STATE_SCALED_CONTROLLER_RECENTS
                         | STATE_ACTIVITY_MULTIPLIER_COMPLETE
                         | STATE_APP_CONTROLLER_RECEIVED,
@@ -173,7 +177,12 @@
     }
 
     private void setStateOnUiThread(int stateFlag) {
-        mMainExecutor.execute(() -> mStateCallback.setState(stateFlag));
+        Handler handler = mMainExecutor.getHandler();
+        if (Looper.myLooper() == handler.getLooper()) {
+            mStateCallback.setState(stateFlag);
+        } else {
+            postAtFrontOfQueueAsynchronously(handler, () -> mStateCallback.setState(stateFlag));
+        }
     }
 
     private void initTransitionEndpoints(DeviceProfile dp) {
@@ -292,14 +301,16 @@
                 mStateCallback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE);
             }
         }
-        mLauncherLayoutListener.setHandler(this);
-        onLauncherLayoutChanged();
-
         if (mLauncherDrawnCallback != null) {
             mLauncherDrawnCallback.run();
         }
     }
 
+    private void initializeLauncherAnimationController() {
+        mLauncherLayoutListener.setHandler(this);
+        onLauncherLayoutChanged();
+    }
+
     public void updateInteractionType(@InteractionType int interactionType) {
         Preconditions.assertUIThread();
         if (mInteractionType != INTERACTION_NORMAL) {
@@ -418,6 +429,7 @@
     }
 
     public void onGestureStarted() {
+        setStateOnUiThread(STATE_GESTURE_STARTED);
         mGestureStarted = true;
     }
 
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index a9cf8cc..19ee0b8 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -344,9 +344,10 @@
     }
 
     public void setTextVisible(boolean isVisible) {
-        if (mTextVisible != isVisible) {
+        CharSequence newText = isVisible ? mText : "";
+        if (mTextVisible != isVisible || !TextUtils.equals(newText, getText())) {
             mTextVisible = isVisible;
-            setText(isVisible ? mText : "");
+            setText(newText);
             if (mTextVisible) {
                 setCompoundDrawablesRelativeWithIntrinsicBounds(mDrawable, null, null, null);
             } else {
diff --git a/src/com/android/launcher3/util/LooperExecutor.java b/src/com/android/launcher3/util/LooperExecutor.java
index 5b7c20b..cc07469 100644
--- a/src/com/android/launcher3/util/LooperExecutor.java
+++ b/src/com/android/launcher3/util/LooperExecutor.java
@@ -33,6 +33,10 @@
         mHandler = new Handler(looper);
     }
 
+    public Handler getHandler() {
+        return mHandler;
+    }
+
     @Override
     public void execute(Runnable runnable) {
         if (mHandler.getLooper() == Looper.myLooper()) {