Merge "Adding jank tracing for some CUJs" into ub-launcher3-master
diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java
index 199cf63..75355c9 100644
--- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java
+++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java
@@ -34,8 +34,7 @@
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 
 @TargetApi(Build.VERSION_CODES.P)
-public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat,
-        WrappedAnimationRunnerImpl {
+public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat {
 
     private static final String TAG = "LauncherAnimationRunner";
 
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 0e32c95..2f55f14 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -41,7 +41,10 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.InvariantDeviceProfile;
 import com.android.launcher3.LauncherAnimationRunner;
+import com.android.launcher3.LauncherAnimationRunner.AnimationResult;
 import com.android.launcher3.R;
+import com.android.launcher3.WrappedAnimationRunnerImpl;
+import com.android.launcher3.WrappedLauncherAnimationRunner;
 import com.android.launcher3.anim.Interpolators;
 import com.android.launcher3.anim.PendingAnimation;
 import com.android.launcher3.compat.AccessibilityManagerCompat;
@@ -87,6 +90,9 @@
 
     private StateManager<RecentsState> mStateManager;
 
+    // Strong refs to runners which are cleared when the activity is destroyed
+    private WrappedAnimationRunnerImpl mActivityLaunchAnimationRunner;
+
     /**
      * Init drag layer and overview panel views.
      */
@@ -169,8 +175,11 @@
         }
 
         final TaskView taskView = (TaskView) v;
-        RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mUiHandler,
-                true /* startAtFrontOfQueue */) {
+        mActivityLaunchAnimationRunner = new WrappedAnimationRunnerImpl() {
+            @Override
+            public Handler getHandler() {
+                return mUiHandler;
+            }
 
             @Override
             public void onCreateAnimation(RemoteAnimationTargetCompat[] appTargets,
@@ -181,8 +190,10 @@
                 result.setAnimation(anim, RecentsActivity.this);
             }
         };
+        final LauncherAnimationRunner wrapper = new WrappedLauncherAnimationRunner<>(
+                mActivityLaunchAnimationRunner, true /* startAtFrontOfQueue */);
         return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat(
-                runner, RECENTS_LAUNCH_DURATION,
+                wrapper, RECENTS_LAUNCH_DURATION,
                 RECENTS_LAUNCH_DURATION - STATUS_BAR_TRANSITION_DURATION
                         - STATUS_BAR_TRANSITION_PRE_DELAY));
     }
@@ -287,6 +298,7 @@
     protected void onDestroy() {
         super.onDestroy();
         ACTIVITY_TRACKER.onActivityDestroyed(this);
+        mActivityLaunchAnimationRunner = null;
     }
 
     @Override
diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
index 04308c8..19c6588 100644
--- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
+++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
@@ -21,6 +21,8 @@
 import android.os.Handler;
 
 import com.android.launcher3.LauncherAnimationRunner;
+import com.android.launcher3.LauncherAnimationRunner.AnimationResult;
+import com.android.launcher3.WrappedAnimationRunnerImpl;
 import com.android.launcher3.WrappedLauncherAnimationRunner;
 import com.android.systemui.shared.system.ActivityOptionsCompat;
 import com.android.systemui.shared.system.RemoteAnimationAdapterCompat;
@@ -28,14 +30,17 @@
 
 public abstract class RemoteAnimationProvider {
 
-    LauncherAnimationRunner mAnimationRunner;
+    WrappedAnimationRunnerImpl mAnimationRunner;
 
     public abstract AnimatorSet createWindowAnimation(RemoteAnimationTargetCompat[] appTargets,
             RemoteAnimationTargetCompat[] wallpaperTargets);
 
     ActivityOptions toActivityOptions(Handler handler, long duration, Context context) {
-        mAnimationRunner = new LauncherAnimationRunner(handler,
-                false /* startAtFrontOfQueue */) {
+        mAnimationRunner = new WrappedAnimationRunnerImpl() {
+            @Override
+            public Handler getHandler() {
+                return handler;
+            }
 
             @Override
             public void onCreateAnimation(RemoteAnimationTargetCompat[] appTargets,
@@ -45,7 +50,6 @@
         };
         final LauncherAnimationRunner wrapper = new WrappedLauncherAnimationRunner(
                 mAnimationRunner, false /* startAtFrontOfQueue */);
-
         return ActivityOptionsCompat.makeRemoteAnimation(
                 new RemoteAnimationAdapterCompat(wrapper, duration, 0));
     }
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index c0d5882..2b4520b 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -49,7 +49,6 @@
 import android.util.TimingLogger;
 
 import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.LauncherAppWidgetProviderInfo;
 import com.android.launcher3.LauncherModel;
 import com.android.launcher3.LauncherSettings;
 import com.android.launcher3.Utilities;
@@ -307,7 +306,6 @@
         final PackageManagerHelper pmHelper = new PackageManagerHelper(context);
         final boolean isSafeMode = pmHelper.isSafeMode();
         final boolean isSdCardReady = Utilities.isBootCompleted();
-        final WidgetManagerHelper widgetHelper = new WidgetManagerHelper(context);
 
         boolean clearDb = false;
         try {
@@ -393,7 +391,6 @@
 
                 WorkspaceItemInfo info;
                 LauncherAppWidgetInfo appWidgetInfo;
-                LauncherAppWidgetProviderInfo widgetProviderInfo;
                 Intent intent;
                 String targetPkg;
 
@@ -723,19 +720,6 @@
                                             + appWidgetInfo.spanX + "x" + appWidgetInfo.spanY);
                                     continue;
                                 }
-                                widgetProviderInfo =
-                                        widgetHelper.getLauncherAppWidgetInfo(appWidgetId);
-                                if (widgetProviderInfo != null
-                                        && (appWidgetInfo.spanX < widgetProviderInfo.minSpanX
-                                        || appWidgetInfo.spanY < widgetProviderInfo.minSpanY)) {
-                                    // This can happen when display size changes.
-                                    c.markDeleted("Widget removed, min sizes not met: "
-                                            + "span=" + appWidgetInfo.spanX + "x"
-                                            + appWidgetInfo.spanY + " minSpan="
-                                            + widgetProviderInfo.minSpanX + "x"
-                                            + widgetProviderInfo.minSpanY);
-                                    continue;
-                                }
                                 if (!c.isOnWorkspaceOrHotseat()) {
                                     c.markDeleted("Widget found where container != " +
                                             "CONTAINER_DESKTOP nor CONTAINER_HOTSEAT - ignoring!");
diff --git a/src/com/android/launcher3/views/SearchResultPeopleView.java b/src/com/android/launcher3/views/SearchResultPeopleView.java
index eacc095..0c9a22f 100644
--- a/src/com/android/launcher3/views/SearchResultPeopleView.java
+++ b/src/com/android/launcher3/views/SearchResultPeopleView.java
@@ -15,9 +15,6 @@
  */
 package com.android.launcher3.views;
 
-import static android.content.Intent.URI_ALLOW_UNSAFE;
-import static android.content.Intent.URI_ANDROID_APP_SCHEME;
-
 import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
 import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
 
@@ -28,7 +25,6 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.net.Uri;
 import android.os.Bundle;
 import android.util.AttributeSet;
 import android.view.View;
@@ -50,7 +46,6 @@
 import com.android.systemui.plugins.shared.SearchTarget;
 import com.android.systemui.plugins.shared.SearchTargetEvent;
 
-import java.net.URISyntaxException;
 import java.util.ArrayList;
 
 /**
@@ -66,7 +61,7 @@
     private TextView mTitleView;
     private ImageButton[] mProviderButtons = new ImageButton[3];
     private AllAppsSearchPlugin mPlugin;
-    private Uri mContactUri;
+    private Intent mIntent;
     private final Object[] mTargetInfo = createTargetInfo();
 
     public SearchResultPeopleView(Context context) {
@@ -109,7 +104,7 @@
         Bundle payload = adapterItemWithPayload.getPayload();
         mPlugin = adapterItemWithPayload.getPlugin();
         mTitleView.setText(payload.getString("title"));
-        mContactUri = payload.getParcelable("contact_uri");
+        mIntent = payload.getParcelable("intent");
         Bitmap icon = payload.getParcelable("icon");
         if (icon != null) {
             RoundedBitmapDrawable d = RoundedBitmapDrawableFactory.create(getResources(), icon);
@@ -125,25 +120,20 @@
         for (int i = 0; i < mProviderButtons.length; i++) {
             ImageButton button = mProviderButtons[i];
             if (providers != null && i < providers.size()) {
-                try {
-                    Bundle provider = providers.get(i);
-                    Intent intent = Intent.parseUri(provider.getString("intent_uri_str"),
-                            URI_ANDROID_APP_SCHEME | URI_ALLOW_UNSAFE);
-                    setupProviderButton(button, provider, intent, adapterItemWithPayload);
-                    String pkg = provider.getString("package_name");
-                    UI_HELPER_EXECUTOR.post(() -> {
-                        try {
-                            ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(
-                                    pkg, 0);
-                            Drawable appIcon = applicationInfo.loadIcon(mPackageManager);
-                            MAIN_EXECUTOR.post(() -> button.setImageDrawable(appIcon));
-                        } catch (PackageManager.NameNotFoundException ignored) {
-                        }
+                Bundle provider = providers.get(i);
+                Intent intent = provider.getParcelable("intent");
+                setupProviderButton(button, provider, intent, adapterItemWithPayload);
+                String pkg = provider.getString("package_name");
+                UI_HELPER_EXECUTOR.post(() -> {
+                    try {
+                        ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(
+                                pkg, 0);
+                        Drawable appIcon = applicationInfo.loadIcon(mPackageManager);
+                        MAIN_EXECUTOR.post(() -> button.setImageDrawable(appIcon));
+                    } catch (PackageManager.NameNotFoundException ignored) {
+                    }
 
-                    });
-                } catch (URISyntaxException ex) {
-                    button.setVisibility(GONE);
-                }
+                });
             } else {
                 button.setVisibility(GONE);
             }
@@ -165,7 +155,7 @@
                     SearchTarget.ItemType.PEOPLE,
                     SearchTargetEvent.CHILD_SELECT);
             searchTargetEvent.bundle = new Bundle();
-            searchTargetEvent.bundle.putParcelable("contact_uri", mContactUri);
+            searchTargetEvent.bundle.putParcelable("intent", mIntent);
             searchTargetEvent.bundle.putBundle("provider", provider);
             if (mPlugin != null) {
                 mPlugin.notifySearchTargetEvent(searchTargetEvent);
@@ -175,14 +165,13 @@
 
 
     private void handleSelection(int eventType) {
-        if (mContactUri != null) {
+        if (mIntent != null) {
             Launcher launcher = Launcher.getLauncher(getContext());
-            launcher.startActivitySafely(this, new Intent(Intent.ACTION_VIEW, mContactUri).setFlags(
-                    Intent.FLAG_ACTIVITY_NEW_TASK), null);
+            launcher.startActivitySafely(this, mIntent, null);
             SearchTargetEvent searchTargetEvent = getSearchTargetEvent(SearchTarget.ItemType.PEOPLE,
                     eventType);
             searchTargetEvent.bundle = new Bundle();
-            searchTargetEvent.bundle.putParcelable("contact_uri", mContactUri);
+            searchTargetEvent.bundle.putParcelable("intent", mIntent);
             if (mPlugin != null) {
                 mPlugin.notifySearchTargetEvent(searchTargetEvent);
             }