177d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskipackage com.android.server.am; 277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 33878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManager.START_SUCCESS; 43878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManager.START_TASK_TO_FRONT; 58347163dbb64fb61012c0393163283106a0a351eWinson Chungimport static android.app.ActivityManager.StackId.ASSISTANT_STACK_ID; 677d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport static android.app.ActivityManager.StackId.DOCKED_STACK_ID; 777d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; 877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; 93878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManager.StackId.INVALID_STACK_ID; 10caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynskiimport static android.app.ActivityManager.StackId.PINNED_STACK_ID; 113878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT; 123878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION; 13515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_BIND_APPLICATION_DELAY_MS; 1450d946c13a5a47c6617530425479b0ad4f381700Todd Kennedyimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_CALLING_PACKAGE_NAME; 153878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DELAY_MS; 163878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS; 1750d946c13a5a47c6617530425479b0ad4f381700Todd Kennedyimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_IS_EPHEMERAL; 183878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS; 193878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; 20cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME; 2150d946c13a5a47c6617530425479b0ad4f381700Todd Kennedyimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN; 223878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; 233878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH; 243878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH; 25f970410afef518003c84eef022194848b2a4f606Jorim Jaggiimport static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; 26f970410afef518003c84eef022194848b2a4f606Jorim Jaggiimport static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; 270e381e278a2c2a3a7c86c9951ac5cbcdc3a186f4Filip Gruszczynskiimport static com.android.server.am.ActivityStack.STACK_INVISIBLE; 2877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 2977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport android.app.ActivityManager.StackId; 3077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport android.content.Context; 313878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.metrics.LogMaker; 3277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport android.os.SystemClock; 33f970410afef518003c84eef022194848b2a4f606Jorim Jaggiimport android.util.Slog; 343878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseArray; 353878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseIntArray; 3677d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 3777d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiimport com.android.internal.logging.MetricsLogger; 3877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 391e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggiimport java.util.ArrayList; 401e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi 4177d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski/** 4277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski * Handles logging into Tron. 4377d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski */ 4477d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynskiclass ActivityMetricsLogger { 45f970410afef518003c84eef022194848b2a4f606Jorim Jaggi 46f970410afef518003c84eef022194848b2a4f606Jorim Jaggi private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityMetricsLogger" : TAG_AM; 47f970410afef518003c84eef022194848b2a4f606Jorim Jaggi 4877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // Window modes we are interested in logging. If we ever introduce a new type, we need to add 4977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // a value here and increase the {@link #TRON_WINDOW_STATE_VARZ_STRINGS} array. 5077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private static final int WINDOW_STATE_STANDARD = 0; 5177d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private static final int WINDOW_STATE_SIDE_BY_SIDE = 1; 5277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private static final int WINDOW_STATE_FREEFORM = 2; 538347163dbb64fb61012c0393163283106a0a351eWinson Chung private static final int WINDOW_STATE_ASSISTANT = 3; 5477d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private static final int WINDOW_STATE_INVALID = -1; 5577d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 56275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi private static final long INVALID_START_TIME = -1; 57275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 5877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // Preallocated strings we are sending to tron, so we don't have to allocate a new one every 5977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // time we log. 6077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private static final String[] TRON_WINDOW_STATE_VARZ_STRINGS = { 618347163dbb64fb61012c0393163283106a0a351eWinson Chung "window_time_0", "window_time_1", "window_time_2", "window_time_3"}; 6277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 6377d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private int mWindowState = WINDOW_STATE_STANDARD; 6477d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private long mLastLogTimeSecs; 6577d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private final ActivityStackSupervisor mSupervisor; 6677d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski private final Context mContext; 673878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private final MetricsLogger mMetricsLogger = new MetricsLogger(); 6877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 69275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi private long mCurrentTransitionStartTime = INVALID_START_TIME; 703878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 713878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int mCurrentTransitionDeviceUptime; 723878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int mCurrentTransitionDelayMs; 73275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi private boolean mLoggedTransitionStarting; 74275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 753878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>(); 763878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 773878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private final class StackTransitionInfo { 783878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private ActivityRecord launchedActivity; 793878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int startResult; 803878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private boolean currentTransitionProcessRunning; 813878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int windowsDrawnDelayMs; 82515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi private int startingWindowDelayMs = -1; 83515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi private int bindApplicationDelayMs = -1; 843878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int reason = APP_TRANSITION_TIMEOUT; 853878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private boolean loggedWindowsDrawn; 863878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private boolean loggedStartingWindowDrawn; 873878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 883878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 8977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context) { 9077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000; 9177d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski mSupervisor = supervisor; 9277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski mContext = context; 9377d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski } 9477d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 9577d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski void logWindowState() { 9677d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski final long now = SystemClock.elapsedRealtime() / 1000; 9777d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski if (mWindowState != WINDOW_STATE_INVALID) { 9877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // We log even if the window state hasn't changed, because the user might remain in 9977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // home/fullscreen move forever and we would like to track this kind of behavior 10077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski // too. 10177d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski MetricsLogger.count(mContext, TRON_WINDOW_STATE_VARZ_STRINGS[mWindowState], 10277d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski (int) (now - mLastLogTimeSecs)); 10377d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski } 10477d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski mLastLogTimeSecs = now; 10577d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski 10677d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski ActivityStack stack = mSupervisor.getStack(DOCKED_STACK_ID); 107cd501ecd91bd7016639e8e62d4a739a01971f95cWale Ogunwale if (stack != null && stack.shouldBeVisible(null) != STACK_INVISIBLE) { 10877d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski mWindowState = WINDOW_STATE_SIDE_BY_SIDE; 109caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski return; 110caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski } 111caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski mWindowState = WINDOW_STATE_INVALID; 112caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski stack = mSupervisor.getFocusedStack(); 113caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski if (stack.mStackId == PINNED_STACK_ID) { 114caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski stack = mSupervisor.findStackBehind(stack); 11577d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski } 116ae1ff4f85ffd12ab8a14c610b1474a012536888fMatthew Ng if (StackId.isHomeOrRecentsStack(stack.mStackId) 117caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski || stack.mStackId == FULLSCREEN_WORKSPACE_STACK_ID) { 118caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski mWindowState = WINDOW_STATE_STANDARD; 119caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski } else if (stack.mStackId == DOCKED_STACK_ID) { 120f970410afef518003c84eef022194848b2a4f606Jorim Jaggi Slog.wtf(TAG, "Docked stack shouldn't be the focused stack, because it reported not" 121f970410afef518003c84eef022194848b2a4f606Jorim Jaggi + " being visible."); 122f970410afef518003c84eef022194848b2a4f606Jorim Jaggi mWindowState = WINDOW_STATE_INVALID; 123caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski } else if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) { 124caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski mWindowState = WINDOW_STATE_FREEFORM; 1258347163dbb64fb61012c0393163283106a0a351eWinson Chung } else if (stack.mStackId == ASSISTANT_STACK_ID) { 1268347163dbb64fb61012c0393163283106a0a351eWinson Chung mWindowState = WINDOW_STATE_ASSISTANT; 127caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski } else if (StackId.isStaticStack(stack.mStackId)) { 128caae14e478e115d01f9b32890cb31231575e65ddFilip Gruszczynski throw new IllegalStateException("Unknown stack=" + stack); 12977d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski } 13077d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski } 131275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 132275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi /** 133275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * Notifies the tracker at the earliest possible point when we are starting to launch an 134275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * activity. 135275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi */ 136275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi void notifyActivityLaunching() { 1373878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (!isAnyTransitionActive()) { 138b7f67abe3475e5397a065826157e1ef9eacb8522Alison Cichowlas mCurrentTransitionStartTime = SystemClock.uptimeMillis(); 1393878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 140275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 141275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 142275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi /** 1431e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi * Notifies the tracker that the activity is actually launching. 1441e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi * 1451e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the 1461e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi * launch 1471e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi * @param launchedActivity the activity that is being launched 1481e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi */ 1491e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) { 1501e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi final ProcessRecord processRecord = launchedActivity != null 1511e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi ? mSupervisor.mService.mProcessNames.get(launchedActivity.processName, 1521e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi launchedActivity.appInfo.uid) 1531e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi : null; 1541e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi final boolean processRunning = processRecord != null; 1551e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi 1561e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi // We consider this a "process switch" if the process of the activity that gets launched 1571e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi // didn't have an activity that was in started state. In this case, we assume that lot 1581e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi // of caches might be purged so the time until it produces the first frame is very 1591e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi // interesting. 1601e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi final boolean processSwitch = processRecord == null 1611e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi || !hasStartedActivity(processRecord, launchedActivity); 1621e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi 1633878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi notifyActivityLaunched(resultCode, launchedActivity, processRunning, processSwitch); 1641e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi } 1651e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi 1661e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi private boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) { 1671e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi final ArrayList<ActivityRecord> activities = record.activities; 1681e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi for (int i = activities.size() - 1; i >= 0; i--) { 1691e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi final ActivityRecord activity = activities.get(i); 1701e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi if (launchedActivity == activity) { 1711e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi continue; 1721e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi } 1731e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi if (!activity.stopped) { 1741e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi return true; 1751e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi } 1761e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi } 1771e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi return false; 1781e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi } 1791e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi 1801e630c08296ec6cc311cc4e1c397f7ca50a1a735Jorim Jaggi /** 181275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * Notifies the tracker the the activity is actually launching. 182275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * 183275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the 184275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * launch 1853878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi * @param launchedActivity the activity being launched 186275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * @param processRunning whether the process that will contains the activity is already running 187be67c90f4c2255cab3bc036ecdc8d9636ed5e4b5Jorim Jaggi * @param processSwitch whether the process that will contain the activity didn't have any 188be67c90f4c2255cab3bc036ecdc8d9636ed5e4b5Jorim Jaggi * activity that was stopped, i.e. the started activity is "switching" 189be67c90f4c2255cab3bc036ecdc8d9636ed5e4b5Jorim Jaggi * processes 190275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi */ 1913878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity, 192be67c90f4c2255cab3bc036ecdc8d9636ed5e4b5Jorim Jaggi boolean processRunning, boolean processSwitch) { 193275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 1943878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi // If we are already in an existing transition, only update the activity name, but not the 1953878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi // other attributes. 1963878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final int stackId = launchedActivity != null && launchedActivity.getStack() != null 1973878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi ? launchedActivity.getStack().mStackId 1983878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi : INVALID_STACK_ID; 199cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi 200cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi if (mCurrentTransitionStartTime == INVALID_START_TIME) { 201cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi return; 202cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi } 203cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi 2043878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.get(stackId); 2053878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (launchedActivity != null && info != null) { 2063878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi info.launchedActivity = launchedActivity; 2073878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return; 2083878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 2093878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 2103878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final boolean otherStacksLaunching = mStackTransitionInfo.size() > 0 && info == null; 2113878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if ((resultCode < 0 || launchedActivity == null || !processSwitch 2123878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi || stackId == INVALID_STACK_ID) && !otherStacksLaunching) { 213275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 214be67c90f4c2255cab3bc036ecdc8d9636ed5e4b5Jorim Jaggi // Failed to launch or it was not a process switch, so we don't care about the timing. 2153878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi reset(true /* abort */); 2163878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return; 2173878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } else if (otherStacksLaunching) { 2183878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi // Don't log this stack but continue with the other stacks. 219275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return; 220275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 221275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 2223878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo newInfo = new StackTransitionInfo(); 2233878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi newInfo.launchedActivity = launchedActivity; 2243878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi newInfo.currentTransitionProcessRunning = processRunning; 2253878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi newInfo.startResult = resultCode; 2263878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mStackTransitionInfo.append(stackId, newInfo); 2273878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mCurrentTransitionDeviceUptime = (int) (SystemClock.uptimeMillis() / 1000); 228275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 229275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 230275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi /** 231275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * Notifies the tracker that all windows of the app have been drawn. 232275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi */ 233c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka void notifyWindowsDrawn(int stackId, long timestamp) { 2343878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.get(stackId); 2353878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info == null || info.loggedWindowsDrawn) { 236275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return; 237275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 238c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka info.windowsDrawnDelayMs = calculateDelay(timestamp); 2393878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi info.loggedWindowsDrawn = true; 2403878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (allStacksWindowsDrawn() && mLoggedTransitionStarting) { 2413878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi reset(false /* abort */); 242275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 243275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 244275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 245275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi /** 246275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * Notifies the tracker that the starting window was drawn. 247275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi */ 248c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka void notifyStartingWindowDrawn(int stackId, long timestamp) { 2493878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.get(stackId); 2503878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info == null || info.loggedStartingWindowDrawn) { 251275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return; 252275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 2533878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi info.loggedStartingWindowDrawn = true; 254c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka info.startingWindowDelayMs = calculateDelay(timestamp); 255275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 256275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 257275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi /** 258275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * Notifies the tracker that the app transition is starting. 259275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi * 2603878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi * @param stackIdReasons A map from stack id to a reason integer, which must be on of 2613878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi * ActivityManagerInternal.APP_TRANSITION_* reasons. 262275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi */ 263c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka void notifyTransitionStarting(SparseIntArray stackIdReasons, long timestamp) { 264d8a5777bf87555979b3f8297cb3cdccb9e34a4cdJorim Jaggi if (!isAnyTransitionActive() || mLoggedTransitionStarting) { 265275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return; 266275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 267c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka mCurrentTransitionDelayMs = calculateDelay(timestamp); 268275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mLoggedTransitionStarting = true; 2693878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi for (int index = stackIdReasons.size() - 1; index >= 0; index--) { 2703878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final int stackId = stackIdReasons.keyAt(index); 2713878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.get(stackId); 2723878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info == null) { 2733878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi continue; 2743878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 2753878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi info.reason = stackIdReasons.valueAt(index); 276275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 2773878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (allStacksWindowsDrawn()) { 2783878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi reset(false /* abort */); 2793878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 2803878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 2813878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 282cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi /** 283cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi * Notifies the tracker that the visibility of an app is changing. 284cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi * 285cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi * @param activityRecord the app that is changing its visibility 286cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi * @param visible whether it's going to be visible or not 287cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi */ 288cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi void notifyVisibilityChanged(ActivityRecord activityRecord, boolean visible) { 289cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.get(activityRecord.getStackId()); 290cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi 291cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi // If we have an active transition that's waiting on a certain activity that will be 292cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi // invisible now, we'll never get onWindowsDrawn, so abort the transition if necessary. 293cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi if (info != null && !visible && info.launchedActivity == activityRecord) { 294cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi mStackTransitionInfo.remove(activityRecord.getStackId()); 295cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi if (mStackTransitionInfo.size() == 0) { 296cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi reset(true /* abort */); 297cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi } 298cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi } 299cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi } 300cdfc04e7b1924884fdb641a4f1adc07847e6ba36Jorim Jaggi 301515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi /** 302515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi * Notifies the tracker that we called immediately before we call bindApplication on the client. 303515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi * 304515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi * @param app The client into which we'll call bindApplication. 305515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi */ 306515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi void notifyBindApplication(ProcessRecord app) { 307515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi for (int i = mStackTransitionInfo.size() - 1; i >= 0; i--) { 308515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.valueAt(i); 309515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi 310515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi // App isn't attached to record yet, so match with info. 311515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi if (info.launchedActivity.appInfo == app.info) { 312515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi info.bindApplicationDelayMs = calculateCurrentDelay(); 313515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi } 314515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi } 315515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi } 316515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi 3173878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private boolean allStacksWindowsDrawn() { 3183878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) { 3193878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (!mStackTransitionInfo.valueAt(index).loggedWindowsDrawn) { 3203878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return false; 3213878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3223878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3233878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return true; 324275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 325275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 3263878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private boolean isAnyTransitionActive() { 3273878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return mCurrentTransitionStartTime != INVALID_START_TIME 3283878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi && mStackTransitionInfo.size() > 0; 329275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 330275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 3313878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private void reset(boolean abort) { 3323878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (!abort && isAnyTransitionActive()) { 3333878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi logAppTransitionMultiEvents(); 3343878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 335275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mCurrentTransitionStartTime = INVALID_START_TIME; 3363878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mCurrentTransitionDelayMs = -1; 337275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mLoggedTransitionStarting = false; 3383878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mStackTransitionInfo.clear(); 339275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 340275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 341275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi private int calculateCurrentDelay() { 342275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi 343275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi // Shouldn't take more than 25 days to launch an app, so int is fine here. 344b7f67abe3475e5397a065826157e1ef9eacb8522Alison Cichowlas return (int) (SystemClock.uptimeMillis() - mCurrentTransitionStartTime); 345275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 3463878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 347c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka private int calculateDelay(long timestamp) { 348c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka // Shouldn't take more than 25 days to launch an app, so int is fine here. 349c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka return (int) (timestamp - mCurrentTransitionStartTime); 350c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka } 351c766db0a54679cd67884d7366cee8b6e8ecd447cSudheer Shanka 3523878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private void logAppTransitionMultiEvents() { 3533878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) { 3543878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final StackTransitionInfo info = mStackTransitionInfo.valueAt(index); 3553878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final int type = getTransitionType(info); 3563878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (type == -1) { 3573878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return; 3583878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3593878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi final LogMaker builder = new LogMaker(APP_TRANSITION); 3603878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.setPackageName(info.launchedActivity.packageName); 3613878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.setType(type); 3628c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name); 36356279cb0e17c6c035c58f3d50561fc629b0c2164Todd Kennedy final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp(); 36456279cb0e17c6c035c58f3d50561fc629b0c2164Todd Kennedy if (isInstantApp && info.launchedActivity.launchedFromPackage != null) { 36550d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, 36650d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy info.launchedActivity.launchedFromPackage); 36750d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy } 36850d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy if (info.launchedActivity.info.launchToken != null) { 36950d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, 37050d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy info.launchedActivity.info.launchToken); 371b3b43130db1c02493ca881ad95adf27ec0cbe8adTodd Kennedy info.launchedActivity.info.launchToken = null; 37250d946c13a5a47c6617530425479b0ad4f381700Todd Kennedy } 37356279cb0e17c6c035c58f3d50561fc629b0c2164Todd Kennedy builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0); 3743878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS, 3753878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mCurrentTransitionDeviceUptime); 3763878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs); 3773878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.setSubtype(info.reason); 3783878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info.startingWindowDelayMs != -1) { 3793878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS, 3803878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi info.startingWindowDelayMs); 3813878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 382515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi if (info.bindApplicationDelayMs != -1) { 383515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS, 384515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi info.bindApplicationDelayMs); 385515dd689ad3fdef0f59088ff0206e4650ecec3ebJorim Jaggi } 3863878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); 3873878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi mMetricsLogger.write(builder); 3883878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3893878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3903878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi 3913878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private int getTransitionType(StackTransitionInfo info) { 3923878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info.currentTransitionProcessRunning) { 3933878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi if (info.startResult == START_SUCCESS) { 3943878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return TYPE_TRANSITION_WARM_LAUNCH; 3953878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } else if (info.startResult == START_TASK_TO_FRONT) { 3963878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return TYPE_TRANSITION_HOT_LAUNCH; 3973878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 3983878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } else if (info.startResult == START_SUCCESS) { 3993878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return TYPE_TRANSITION_COLD_LAUNCH; 4003878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 4013878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi return -1; 4023878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi } 40377d9448e2d6dd8a45c5fedef43c8a1cf4afd28b9Filip Gruszczynski} 404