Fix transition delay tracking when starting activity from recents

- Move logic to determine app switch etc. into ActivityMetricsLogger.
- Make sure the notify the tracker in startActivityFromRecentsInner

Bug: 27295491
Change-Id: Ic68058c88917e3f37183dded2f13cb35055323ee
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index fe085d7..be8f21d 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -18,6 +18,8 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 
+import java.util.ArrayList;
+
 /**
  * Handles logging into Tron.
  */
@@ -99,6 +101,47 @@
     }
 
     /**
+     * Notifies the tracker that the activity is actually launching.
+     *
+     * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the
+     *                   launch
+     * @param launchedActivity the activity that is being launched
+     */
+    void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) {
+        final ProcessRecord processRecord = launchedActivity != null
+                ? mSupervisor.mService.mProcessNames.get(launchedActivity.processName,
+                        launchedActivity.appInfo.uid)
+                : null;
+        final boolean processRunning = processRecord != null;
+        final String componentName = launchedActivity != null
+                ? launchedActivity.shortComponentName
+                : null;
+
+        // We consider this a "process switch" if the process of the activity that gets launched
+        // didn't have an activity that was in started state. In this case, we assume that lot
+        // of caches might be purged so the time until it produces the first frame is very
+        // interesting.
+        final boolean processSwitch = processRecord == null
+                || !hasStartedActivity(processRecord, launchedActivity);
+
+        notifyActivityLaunched(resultCode, componentName, processRunning, processSwitch);
+    }
+
+    private boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) {
+        final ArrayList<ActivityRecord> activities = record.activities;
+        for (int i = activities.size() - 1; i >= 0; i--) {
+            final ActivityRecord activity = activities.get(i);
+            if (launchedActivity == activity) {
+                continue;
+            }
+            if (!activity.stopped) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Notifies the tracker the the activity is actually launching.
      *
      * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the
@@ -109,7 +152,7 @@
      *                      activity that was stopped, i.e. the started activity is "switching"
      *                      processes
      */
-    void notifyActivityLaunched(int resultCode, @Nullable String componentName,
+    private void notifyActivityLaunched(int resultCode, @Nullable String componentName,
             boolean processRunning, boolean processSwitch) {
 
         if (resultCode < 0 || componentName == null || !processSwitch) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 4bf28b2..e86ba22 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -4423,6 +4423,8 @@
                 && task.getRootActivity() != null) {
             mActivityMetricsLogger.notifyActivityLaunching();
             mService.moveTaskToFrontLocked(task.taskId, 0, bOptions);
+            mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT,
+                    task.getTopActivity());
 
             // If we are launching the task in the docked stack, put it into resizing mode so
             // the window renders full-screen with the background filling the void. Also only
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 64bd14c..7641827 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -846,42 +846,13 @@
                 }
             }
 
-            final String componentName = outRecord[0] != null ? outRecord[0].shortComponentName
-                    : null;
             final ActivityRecord launchedActivity = mReusedActivity != null
                     ? mReusedActivity : outRecord[0];
-            final ProcessRecord processRecord = launchedActivity != null
-                    ? mService.mProcessNames.get(launchedActivity.processName,
-                            launchedActivity.appInfo.uid)
-                    : null;
-            final boolean processRunning = processRecord != null;
-
-            // We consider this a "process switch" if the process of the activity that gets launched
-            // didn't have an activity that was in started state. In this case, we assume that lot
-            // of caches might be purged so the time until it produces the first frame is very
-            // interesting.
-            final boolean processSwitch = processRecord == null
-                    || !hasStartedActivity(processRecord, launchedActivity);
-            mSupervisor.mActivityMetricsLogger.notifyActivityLaunched(res, componentName,
-                    processRunning, processSwitch);
+            mSupervisor.mActivityMetricsLogger.notifyActivityLaunched(res, launchedActivity);
             return res;
         }
     }
 
-    final boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) {
-        final ArrayList<ActivityRecord> activities = record.activities;
-        for (int i = activities.size() - 1; i >= 0; i--) {
-            final ActivityRecord activity = activities.get(i);
-            if (launchedActivity == activity) {
-                continue;
-            }
-            if (!activity.stopped) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
             Intent[] intents, String[] resolvedTypes, IBinder resultTo,
             Bundle bOptions, int userId) {