Skip to content

Instantly share code, notes, and snippets.

@SudoPlz
Last active November 5, 2025 19:55
Show Gist options
  • Select an option

  • Save SudoPlz/3598f86ba5600faac3f6051781ee4b83 to your computer and use it in GitHub Desktop.

Select an option

Save SudoPlz/3598f86ba5600faac3f6051781ee4b83 to your computer and use it in GitHub Desktop.
tti calculation scenarios

TTI Measurement Scenarios Analysis

Implementation Note

appOpenedTime always uses mainActivityStartTime: The difference between appStartedTimestamp (process creation) and mainActivityStartTime (MainActivity creation) is negligible (20-40ms). Using mainActivityStartTime consistently simplifies the code and fixes edge cases where the conditional logic couldn't distinguish between different launch scenarios (9c, 9f).


Scenarios Analysis

Scenario 1: Normal App Open (COLD START)

Description: User taps app icon โ†’ Fresh process starts โ†’ MainActivity instantiates

Result: COLD START โœ…

Visual Diagram:

                 Process (alive 1hr)            MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ฎ๐—ฝ๐—ฝ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+10ms             โ”œโ”€ instantiateApplication()     |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |  โ””โ”€ Load RN, init modules      |                        |
                   |                                |                        |
T+120ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |                                |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐—ณ๐—ฎ๐—น๐˜€๐—ฒ (init still running)     |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ staticMainActivityCreationTime = 120                |
         โ”ƒ          |                                |                        |
T+120ms  โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+160ms  โ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                โ””โ”€ API < 28 fallback not triggered
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
         โ”ƒ          |                                |                        |
T+3500ms โ”ƒ          โ””โ”€ initialize() complete         |                        |
         โ”ƒ                                           โ”œโ”€ Content renders       |
         โ”ƒ                                           |                        |
         โ”ƒ                                           |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ TTI = [view visible time] - 120ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•


Scenario 2: Warm Start (Activity killed, process alive)

Description: App backgrounded โ†’ MainActivity destroyed & timestamp cleared โ†’ User returns โ†’ New MainActivity created.

Result: WARM START โœ…

Visual Diagram:

                 Process (alive 1hr)            MainActivity                User
                    |                                |                        |
T-3600000ms        |                                โ—                        |
                   |                                | (created 1hr ago)      |
                   |                                |                        |
[App backgrounded - MainActivity destroyed by Android]
                   |                                |                        |
T-3599950ms        |                            onDestroy()                  |
                   |                                โ”œโ”€ isChangingConfigurations = false
                   |                                โ””โ”€ staticMainActivityCreationTime = null
                   |                                |                        |
                   |                                โœ— (destroyed)            |
                   |                                |                        |
[User taps app icon]
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ฎ๐—ฝ๐—ฝ ๐—ถ๐—ฐ๐—ผ๐—ป
                   |                                |                        |
T+0ms              |                                |                        |
T+10ms     ๐ŸŸข       โ”œโ”€ instantiateActivity()         |                        |
           โ”ƒ        |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
           โ”ƒ        |  โ”œโ”€ markActivityInstantiation()                         |
           โ”ƒ        |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ (init already done)       |
           โ”ƒ        |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
           โ”ƒ        |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿญ๐Ÿฌ                            |
           โ”ƒ        |                                |                        |
T+10ms     โ”ƒ        |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
           โ”ƒ        |                                |                           visible
           โ”ƒ        |                                |                        |
T+60ms     โ”ƒ        |                            onCreate()                   |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                โ”œโ”€ Inflate views         |
           โ”ƒ        |                                โ”œโ”€ Init React            |
           โ”ƒ        |                                |                        |
T+3500ms   โ”ƒ        |                                โ”œโ”€ Content renders       |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                |                        |
           โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 10ms                                                 โ•‘
          โ•‘ TTI = [view visible time] - 10ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•


Scenario 3: Share Menu Launch (Fresh Process)

Description: User shares from another app โ†’ ShareActivity (excluded) opens โ†’ User navigates to main app โ†’ MainActivity instantiates.

Result: WARM START โœ…

Visual Diagram:

                 Process (alive 1hr)            MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ "๐—ฆ๐—ต๐—ฎ๐—ฟ๐—ฒ"
                    |                                |                           ๐—ถ๐—ป ๐—ฎ๐—ป๐—ผ๐˜๐—ต๐—ฒ๐—ฟ ๐—ฎ๐—ฝ๐—ฝ
T+0ms              |                                |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |  โ””โ”€ Load RN, init modules      |                        |
                   |                                |                        |
T+120ms            โ”œโ”€ instantiateActivity()         |                        |
                   |  โ”œโ”€ endsWith(".MainActivity") = FALSE                   |
                   |  โ””โ”€ SKIPPED - No timestamp set |                        |
                   |                                |                        |
T+160ms            |                                |                        ๐Ÿ–ฅ๏ธ Share sheet
                   |                                |                           visible
                   |                                |                        |
[User completes share, taps to open main app]
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐˜๐—ผ ๐—ผ๐—ฝ๐—ฒ๐—ป
                   |                                |                           ๐—บ๐—ฎ๐—ถ๐—ป ๐—ฎ๐—ฝ๐—ฝ
                   |                                |                        |
T+5000ms   ๐ŸŸข       โ”œโ”€ instantiateActivity()         |                        |
           โ”ƒ        |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
           โ”ƒ        |  โ”œโ”€ markActivityInstantiation()                         |
           โ”ƒ        |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ (init done during share)    |
           โ”ƒ        |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
           โ”ƒ        |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿฑ๐Ÿฌ๐Ÿฌ๐Ÿฌ                        |
           โ”ƒ        |                                |                        |
T+5000ms  โ”ƒ        |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
           โ”ƒ        |                                |                           visible
           โ”ƒ        |                                |                        |
T+5050ms  โ”ƒ        |                            onCreate()                   |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                โ”œโ”€ Inflate views         |
           โ”ƒ        |                                โ”œโ”€ Init React            |
           โ”ƒ        |                                |                        |
T+8500ms  โ”ƒ        |                                โ”œโ”€ Content renders       |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                |                        |
           โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 5000ms                                               โ•‘
          โ•‘ TTI = [view visible time] - 5000ms                                   โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•


Scenario 4: Push Notification Launch (Headless โ†’ User Taps Later)

Description: Notification arrives โ†’ Service processes headlessly โ†’ User taps 1 minute later โ†’ MainActivity instantiates .

Result: WARM START โœ…

Visual Diagram:

                 Process (alive 1hr)            MainActivity                User
                    |                                |                        |
T+0ms              |                                |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ instantiateService()          |                        |
                   |  โ””โ”€ markServiceInstantiation() |                        |
                   |  โ””โ”€ serviceInstantiationBeforeActivity = true            |
                   |                                |                        |
T+80ms             โ”œโ”€ MessagingService.onMessageReceived()                    |
                   |  (headless, no UI)             |                        |
                   |                                |                        |
[Process stays alive in background - no Activity]
                   |                                |                        |
                   |                                |                        |
                   |                                |                        |
[LATER: User taps notification]
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€
                   |                                |                           ๐—ป๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป
                   |                                |                        |
T+60000ms  ๐ŸŸข       โ”œโ”€ instantiateActivity()         |                        |
           โ”ƒ        |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
           โ”ƒ        |  โ”œโ”€ markActivityInstantiation()                         |
           โ”ƒ        |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ (init done in background)  |
           โ”ƒ        |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
           โ”ƒ        |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿฒ๐Ÿฌ๐Ÿฌ๐Ÿฌ๐Ÿฌ                        |
           โ”ƒ        |                                |                        |
T+60000ms โ”ƒ        |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
           โ”ƒ        |                                |                           visible
           โ”ƒ        |                                |                        |
T+60050msโ”ƒ        |                            onCreate()                   |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                โ”œโ”€ Inflate views         |
           โ”ƒ        |                                โ”œโ”€ Init React            |
           โ”ƒ        |                                |                        |
T+63500msโ”ƒ        |                                โ”œโ”€ Content renders       |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                |                        |
           โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 60000ms                                              โ•‘
          โ•‘ TTI = [view visible time] - 60000ms                                  โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Scenario 5: Push Notification with Immediate Activity Launch

Description: Notification arrives โ†’ Service instantiates โ†’ User taps notification immediately (before initialize() finishes) โ†’ MainActivity opens โ†’ User waits for initialize() to complete.

Result: COLD START โœ…

Visual Diagram:

                 Process (alive 1hr)            MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ“ฑ ๐—ก๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฎ๐—ฟ๐—ฟ๐—ถ๐˜ƒ๐—ฒ๐˜€
                    |                                |                        |
T+0ms              |                                |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |  โ””โ”€ Load RN, init modules      |                        |
                   |                                |                        |
T+80ms             โ”œโ”€ instantiateService()          |                        |
                   |  โ””โ”€ serviceInstantiationBeforeActivity = true            |
                   |                                |                        |
T+100ms            โ”œโ”€ MessagingService.onMessageReceived()                    |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ป๐—ผ๐˜๐—ถ๐—ณ
                   |                                |                           ๐—ถ๐—บ๐—บ๐—ฒ๐—ฑ๐—ถ๐—ฎ๐˜๐—ฒ๐—น๐˜†
                   |                                |                        |
T+120ms   ๐ŸŸข        โ”œโ”€ instantiateActivity()         |                        |
           โ”ƒ        |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
           โ”ƒ        |  โ”œโ”€ markActivityInstantiation()                         |
           โ”ƒ        |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐—ณ๐—ฎ๐—น๐˜€๐—ฒ (init still running!)  |
           โ”ƒ        |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
           โ”ƒ        |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿญ๐Ÿฎ๐Ÿฌ                        |
           โ”ƒ        |                                |                        |
T+120ms   โ”ƒ        |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
           โ”ƒ        |                                |                           visible
           โ”ƒ        |                                |                        |
T+160ms   โ”ƒ        |                            onCreate()                   |
           โ”ƒ        |                                |                        |
           โ”ƒ        |                                โ”œโ”€ Inflate views         |
           โ”ƒ        |                                โ”œโ”€ Init React            |
           โ”ƒ        |                                |                        |
T+3500ms  โ”ƒ        โ””โ”€ initialize() complete         |                        |
           โ”ƒ                                         โ”œโ”€ Content renders       |
           โ”ƒ                                         |                        |
           โ”ƒ                                         |                        |
           โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ appStartType = COLD (initialize not complete when MA opened)          โ•‘
          โ•‘ TTI = [view visible time] - 120ms = ~3380ms                          โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Scenario 6: Foreground Notification Tap (MainActivity Already Running)

Description: App already running โ†’ User taps notification โ†’ onNewIntent() called (not instantiateActivity) โ†’ Duplicate detection prevents TTI measurement (no new activity creation).

Result: NO TTI CALCULATED (duplicate detection)

Visual Diagram:

                 Process (alive)                 MainActivity                User
                    |                                โ—                        |
T-10000ms          |                      staticMainActivityCreationTime      |
                   |                            set previously                |
                   |                                |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ“ฑ ๐—ก๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฎ๐—ฟ๐—ฟ๐—ถ๐˜ƒ๐—ฒ๐˜€
                   |                                |                        |
T+0ms             |                                |                        |
                   โ”œโ”€ Notification arrives         |                        |
                   |                                |                        |
T+10ms            โ”œโ”€ MessagingService.onMessageReceived()                    |
                   |  โ””โ”€ serviceInstantiationBeforeActivity = false          |
                   |                                |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€
                   |                                |                           ๐—ป๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป
T+5000ms          |                                |                        |
                   |                                |                        |
T+5010ms          |                            onNewIntent()                |
                   |                                |                        |
                   |                                โ”œโ”€ instantiateActivity() NOT called
                   |                                โ”œโ”€ staticMainActivityCreationTime unchanged
                   |                                |                        |
T+5020ms          |                            ๐—ด๐—ฒ๐˜๐—”๐—ฝ๐—ฝ๐—จ๐—œ๐—ฉ๐—ถ๐—ฒ๐˜„๐—ฒ๐—ฑ=๐˜๐—ฟ๐˜‚๐—ฒ       |
                   |                                |                        |
                   |                                โ”œโ”€ ๐—ก๐—ผ ๐—ฎ๐—ป๐—ฎ๐—น๐˜†๐˜๐—ถ๐—ฐ๐˜€ ๐˜€๐—ฒ๐—ป๐˜   |
                   |                                |                        |

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ NO TTI MEASUREMENT (duplicate detection blocks it)                   โ•‘
          โ•‘ appViewedByMainActivityTimes[OLD TIME] = true โ†’ returns TRUE         โ•‘
          โ•‘ No analytics sent โ†’ Correct behavior                                โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Scenario 7: Configuration Change (Screen Rotation)

Description: App running โ†’ User rotates device โ†’ onConfigurationChanged() called (activity not destroyed/recreated due to android:configChanges) โ†’ No TTI measurement (no lifecycle change).

Result: NO TTI CALCULATED (no activity recreation)

Visual Diagram:

                 Process (alive)                 MainActivity                User
                    |                                โ—                        |
                   |                      staticMainActivityCreationTime      |
                   |                            unchanged                     |
                   |                                |                        |
                   |                                |                        ๐Ÿ”„ ๐—จ๐˜€๐—ฒ๐—ฟ ๐—ฟ๐—ผ๐˜๐—ฎ๐˜๐—ฒ๐˜€
                   |                                |                           ๐—ฑ๐—ฒ๐˜ƒ๐—ถ๐—ฐ๐—ฒ
T+0ms             |                                |                        |
                   |                                |                        |
T+10ms            |                      onConfigurationChanged()            |
                   |                                |                        |
                   |                                โ”œโ”€ instantiateActivity() NOT called
                   |                                โ”œโ”€ onDestroy() NOT called
                   |                                โ”œโ”€ staticMainActivityCreationTime unchanged
                   |                                |                        |
T+50ms            |                            Redraws view                  ๐Ÿ–ฅ๏ธ New orientation

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ NO TTI MEASUREMENT (no activity lifecycle change)                    โ•‘
          โ•‘ android:configChanges prevents activity recreation                   โ•‘
          โ•‘ No impact on TTI tracking โ†’ Correct behavior                        โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Scenario 8: IncomingCallActivity Launch

Description: Incoming call โ†’ MainActivity opens first โ†’ IncomingCallActivity may appear as overlay/system UI (excluded) โ†’ User answers โ†’ MainActivity continues.

Result: COLD or WARM START โœ… (depends on whether initialize() finished during call)

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ“ž ๐—œ๐—ป๐—ฐ๐—ผ๐—บ๐—ถ๐—ป๐—ด ๐—ฐ๐—ฎ๐—น๐—น
                    |                                |                        |
T+0ms             |                                |                        |
                   ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ              |                        |
                   |                                |                        |
T+15ms            โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+120ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ/๐—ณ๐—ฎ๐—น๐˜€๐—ฒ (COLD/WARM)      |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿญ๐Ÿฎ๐Ÿฌ                        |
         โ”ƒ          |                                |                        |
T+120ms  โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+160ms  โ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
                   |                                |                        |
                   |   (IncomingCallActivity may    |                        |
                   |    appear as overlay/system    |                        |
                   |    UI, not tracked in TTI)     |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—ฎ๐—ป๐˜€๐˜„๐—ฒ๐—ฟ๐˜€ ๐—ฐ๐—ฎ๐—น๐—น
                   |                                |                        |
T+3500ms โ”ƒ          โ””โ”€ initialize() complete         |                        |
         โ”ƒ                                           โ”œโ”€ Content renders       |
         โ”ƒ                                           |                        |
         โ”ƒ                                           |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appStartType = COLD/WARM (depends on initialize() completion)        โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ TTI = [view visible time] - 120ms                                    โ•‘
          โ•‘ IncomingCallActivity (overlay/system UI) correctly EXCLUDED          โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•


Scenario 9: App Icon Long Press

Description: User long-presses app icon โ†’ Process starts (on some phones, e.g., Samsung) or doesn't start (on others, e.g., Google Pixel) โ†’ Shortcuts menu appears โ†’ Various user actions follow.

9a: Long-press โ†’ Tap Shortcut (COLD)

Description: User long-presses โ†’ Process starts โ†’ Shortcuts menu appears โ†’ User taps a shortcut option โ†’ MainActivity created with discord_shortcut Intent extra.

Result: COLD START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: triggers process start;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung: starts here;      |                        |
                   |      Pixel: starts later when   |                        |
                   |      user taps shortcut)         |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐˜€๐—ต๐—ผ๐—ฟ๐˜๐—ฐ๐˜‚๐˜
                   |                                |                        |
T+120ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ Intent has discord_shortcut extra                  |
         โ”ƒ          |  โ”œโ”€ wasLaunchedViaShortcut = true                      |
         โ”ƒ          |  โ”œโ”€ wasInitializeComplete = false (COLD)                |
         โ”ƒ          |  โ””โ”€ staticMainActivityCreationTime = 120                |
         โ”ƒ          |                                |                        |
T+120ms  โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+160ms  โ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
         โ”ƒ          |                                |                        |
T+3500ms โ”ƒ          โ””โ”€ initialize() complete         |                        |
         โ”ƒ                                           โ”œโ”€ Content renders       |
         โ”ƒ                                           |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ TTI = [view visible time] - 120ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9b: Long-press โ†’ Tap Shortcut (WARM)

Description: User long-presses โ†’ Process starts โ†’ User waits/browses shortcuts โ†’ User taps shortcut after initialize() completes.

Result: WARM START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:        |                        |
                   |      starts later when          |                        |
                   |      user taps shortcut)        |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        โฑ๏ธ ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜„๐—ฎ๐—ถ๐˜๐˜€
                   |                                |                        |
T+3500ms           โ””โ”€ initialize() complete         |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐˜€๐—ต๐—ผ๐—ฟ๐˜๐—ฐ๐˜‚๐˜
                   |                                |                        |
T+4000ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ wasLaunchedViaShortcut = true                      |
         โ”ƒ          |  โ”œโ”€ wasInitializeComplete = true (WARM)                |
         โ”ƒ          |  โ””โ”€ staticMainActivityCreationTime = 4000                |
         โ”ƒ          |                                |                        |
T+4000ms โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+4100msโ”ƒ          |                                โ”œโ”€ Content renders       |
         โ”ƒ          |                                |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 4000ms                                               โ•‘
          โ•‘ TTI = [view visible time] - 4000ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9c: Long-press โ†’ Tap Regular Icon (COLD) - RARE

Description: User long-presses โ†’ Process starts โ†’ Shortcuts menu appears โ†’ User dismisses menu or taps regular icon within 100ms after the shortcuts show up, instead of tapping one of the shortcuts โ†’ MainActivity created by tapping app icon (no discord_shortcut extra).

Result: COLD START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: triggers process start;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung: starts here;      |                        |
                   |      Pixel: starts later when   |                        |
                   |      user taps icon)             |                        |
                   |     ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฆ๐˜๐—ฎ๐—ฟ๐˜๐—ฒ๐—ฑ=๐Ÿฌ       |                        |
                   |                                |                        |
T+15ms             โ”œโ”€ MainApplication.onCreate()    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ฟ๐—ฒ๐—ด๐˜‚๐—น๐—ฎ๐—ฟ ๐—ถ๐—ฐ๐—ผ๐—ป
                   |                                |                           (no discord_shortcut extra)
                   |                                |                        |
T+120ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ Intent has NO discord_shortcut extra               |
         โ”ƒ          |  โ”œโ”€ wasLaunchedViaShortcut = false                     |
         โ”ƒ          |  โ”œโ”€ wasInitializeComplete = false (COLD)                |
         โ”ƒ          |  โ””โ”€ staticMainActivityCreationTime = 120                |
         โ”ƒ          |                                |                        |
T+120ms  โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+160ms  โ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
         โ”ƒ          |                                |                        |
T+3500ms โ”ƒ          โ””โ”€ initialize() complete         |                        |
         โ”ƒ                                           โ”œโ”€ Content renders       |
         โ”ƒ                                           |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ TTI = [view visible time] - 120ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9d: Long-press โ†’ Tap Regular Icon (WARM)

Description: User long-presses โ†’ Process starts โ†’ User waits โ†’ User taps app icon icon after initialize() completes.

Result: WARM START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:       |                        |
                   |      starts later when          |                        |
                   |      user taps icon)            |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        โฑ๏ธ ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜„๐—ฎ๐—ถ๐˜๐˜€
                   |                                |                        |
T+3500ms           โ””โ”€ initialize() complete         |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ฟ๐—ฒ๐—ด๐˜‚๐—น๐—ฎ๐—ฟ ๐—ถ๐—ฐ๐—ผ๐—ป
                   |                                |                        |
T+4000ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ Intent has NO discord_shortcut extra               |
         โ”ƒ          |  โ”œโ”€ wasLaunchedViaShortcut = false                     |
         โ”ƒ          |  โ”œโ”€ wasInitializeComplete = true (WARM)                |
         โ”ƒ          |  โ””โ”€ staticMainActivityCreationTime = 4000                |
         โ”ƒ          |                                |                        |
T+4000ms โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+4100msโ”ƒ          |                                โ”œโ”€ Content renders       |
         โ”ƒ          |                                |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 4000ms                                               โ•‘
          โ•‘ TTI = [view visible time] - 4000ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9e: Long-press โ†’ Notification Tap

Description: User long-presses โ†’ Process starts โ†’ User taps notification โ†’ Service/receiver created before MainActivity.

Result: COLD or WARM START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:       |                        |
                   |      starts later when          |                        |
                   |      user taps notification)    |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        ๐Ÿ“ฑ ๐—ก๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฎ๐—ฟ๐—ฟ๐—ถ๐˜ƒ๐—ฒ๐˜€
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜๐—ฎ๐—ฝ๐˜€ ๐—ป๐—ผ๐˜๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป
                   |                                |                        |
T+5000ms           โ”œโ”€ instantiateService()          |                        |
                   |  โ””โ”€ serviceInstantiationBeforeActivity = true            |
                   |                                |                        |
T+5010ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ/๐—ณ๐—ฎ๐—น๐˜€๐—ฒ (COLD/WARM)      |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿฑ๐Ÿฌ๐Ÿญ๐Ÿฌ                        |
         โ”ƒ          |                                |                        |
T+5010ms โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+5060msโ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
         โ”ƒ          |                                |                        |
T+8510msโ”ƒ          |                                โ”œโ”€ Content renders       |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 5010ms                                               โ•‘
          โ•‘ TTI = [view visible time] - 5010ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9f: Long-press โ†’ Share Activity

Description: User long-presses โ†’ Process starts โ†’ User shares from another app โ†’ ShareActivity created before MainActivity.

Result: WARM START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:       |                        |
                   |      starts later when          |                        |
                   |      user shares from app)      |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜€๐—ต๐—ฎ๐—ฟ๐—ฒ๐˜€ ๐—ณ๐—ฟ๐—ผ๐—บ ๐—ฎ๐—ป๐—ผ๐˜๐—ต๐—ฒ๐—ฟ ๐—ฎ๐—ฝ๐—ฝ
                   |                                |                        |
T+5000ms           โ”œโ”€ instantiateActivity("ShareActivity")                  |
                   |  โ”œโ”€ endsWith(".MainActivity") = FALSE                   |
                   |  โ””โ”€ SKIPPED - No timestamp set |                        |
                   |                                |                        |
T+5050ms           โ”œโ”€ ShareActivity.onCreate()      |                        ๐Ÿ–ฅ๏ธ Share sheet
                   |                                |                           visible
                   |                                |                        |
                   |   ... user interacts with share screen ...               |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐˜€๐—ฒ๐—ฟ ๐—ฐ๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ๐˜€ ๐˜€๐—ต๐—ฎ๐—ฟ๐—ฒ,
                   |                                |                           ๐—ป๐—ฎ๐˜ƒ๐—ถ๐—ด๐—ฎ๐˜๐—ฒ๐˜€ ๐˜๐—ผ ๐—บ๐—ฎ๐—ถ๐—ป ๐—ฎ๐—ฝ๐—ฝ
                   |                                |                        |
T+10000ms ๐ŸŸข        โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ (init done during share) |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿญ๐Ÿฌ๐Ÿฌ๐Ÿฌ๐Ÿฌ                        |
         โ”ƒ          |                                |                        |
T+10000msโ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+10050msโ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
         โ”ƒ          |                                |                        |
T+13500msโ”ƒ          |                                โ”œโ”€ Content renders       |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 10000ms                                              โ•‘
          โ•‘ TTI = [view visible time] - 10000ms                                   โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9g: Long-press โ†’ Incoming Call - RARE

9g (COLD): Long-press โ†’ Incoming Call (COLD)

Description: User long-presses โ†’ Process starts โ†’ Incoming call arrives โ†’ MainActivity opens first โ†’ User answers call.

Result: COLD START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:       |                        |
                   |      starts later when          |                        |
                   |      call arrives)              |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ“ž ๐—œ๐—ป๐—ฐ๐—ผ๐—บ๐—ถ๐—ป๐—ด ๐—ฐ๐—ฎ๐—น๐—น
                   |                                |                        |
T+120ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐—ณ๐—ฎ๐—น๐˜€๐—ฒ (init still running!)  |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿญ๐Ÿฎ๐Ÿฌ                        |
         โ”ƒ          |                                |                        |
T+120ms  โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+160ms  โ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
                   |                                |                        |
                   |   (IncomingCallActivity may    |                        |
                   |    appear as overlay/system    |                        |
                   |    UI, not tracked in TTI)     |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—ฎ๐—ป๐˜€๐˜„๐—ฒ๐—ฟ๐˜€ ๐—ฐ๐—ฎ๐—น๐—น
                   |                                |                        |
T+3500ms โ”ƒ          โ””โ”€ initialize() complete         |                        |
         โ”ƒ                                           โ”œโ”€ Content renders       |
         โ”ƒ                                           |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appOpenedTime = 120ms                                                โ•‘
          โ•‘ appStartType = COLD (initialize not complete when MA opened)          โ•‘
          โ•‘ TTI = [view visible time] - 120ms                                    โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

9h (WARM): Long-press โ†’ Incoming Call (WARM)

Description: User long-presses โ†’ Process starts โ†’ User waits โ†’ Incoming call arrives after initialize() completes โ†’ MainActivity opens first.

Result: WARM START โœ…

Visual Diagram:

                 Process (NEW)                   MainActivity                User
                    |                                |                        |
                    |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—น๐—ผ๐—ป๐—ด ๐—ฝ๐—ฟ๐—ฒ๐˜€๐˜€๐—ฒ๐˜€ ๐—ถ๐—ฐ๐—ผ๐—ป
                    |                                |                           (Samsung: process starts here;
                    |                                |                            Pixel: process doesn't start)
                    |                                |                        |
T+0ms              โ”ฟโ”โ”โ” Process starts              |                        |
                   |     (Samsung only; Pixel:       |                        |
                   |      starts later when          |                        |
                   |      call arrives)              |                        |
                   |                                |                        |
T+50ms             โ”œโ”€ initialize() (bg thread)      |                        |
                   |                                |                        |
T+100ms            |                                |                        ๐Ÿ–ฅ๏ธ Shortcuts menu appears
                   |                                |                        |
                   |                                |                        โฑ๏ธ ๐—จ๐˜€๐—ฒ๐—ฟ ๐˜„๐—ฎ๐—ถ๐˜๐˜€
                   |                                |                        |
T+3500ms           โ””โ”€ initialize() complete         |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ“ž ๐—œ๐—ป๐—ฐ๐—ผ๐—บ๐—ถ๐—ป๐—ด ๐—ฐ๐—ฎ๐—น๐—น
                   |                                |                        |
T+4000ms  ๐ŸŸข         โ”œโ”€ instantiateActivity()         |                        |
         โ”ƒ          |  โ”œโ”€ endsWith(".MainActivity") = TRUE                    |
         โ”ƒ          |  โ”œโ”€ markActivityInstantiation()                         |
         โ”ƒ          |  โ”œโ”€ ๐˜„๐—ฎ๐˜€๐—œ๐—ป๐—ถ๐˜๐—ถ๐—ฎ๐—น๐—ถ๐˜‡๐—ฒ๐—–๐—ผ๐—บ๐—ฝ๐—น๐—ฒ๐˜๐—ฒ=๐˜๐—ฟ๐˜‚๐—ฒ (init finished)          |
         โ”ƒ          |  โ”œโ”€ staticMainActivityCreationTime == null = TRUE       |
         โ”ƒ          |  โ””โ”€ ๐˜€๐˜๐—ฎ๐˜๐—ถ๐—ฐ๐— ๐—ฎ๐—ถ๐—ป๐—”๐—ฐ๐˜๐—ถ๐˜ƒ๐—ถ๐˜๐˜†=๐Ÿฐ๐Ÿฌ๐Ÿฌ๐Ÿฌ                        |
         โ”ƒ          |                                |                        |
T+4000ms โ”ƒ          |                                โ—                        ๐Ÿ–ฅ๏ธ Splash screen
         โ”ƒ          |                                |                           visible
         โ”ƒ          |                                |                        |
T+4050msโ”ƒ          |                            onCreate()                   |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                โ”œโ”€ Inflate views         |
         โ”ƒ          |                                โ”œโ”€ Init React            |
                   |                                |                        |
                   |   (IncomingCallActivity may    |                        |
                   |    appear as overlay/system    |                        |
                   |    UI, not tracked in TTI)     |                        |
                   |                                |                        |
                   |                                |                        ๐Ÿ‘† ๐—จ๐˜€๐—ฒ๐—ฟ ๐—ฎ๐—ป๐˜€๐˜„๐—ฒ๐—ฟ๐˜€ ๐—ฐ๐—ฎ๐—น๐—น
                   |                                |                        |
T+4100msโ”ƒ          |                                โ”œโ”€ Content renders       |
         โ”ƒ          |                                |                        |
         โ”ƒ          |                                |                        |
         โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๐Ÿ”ด [๐—ง๐—ง๐—œ ๐—˜๐—ก๐——]

          โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
          โ•‘ TTI MEASUREMENT RANGE (๐ŸŸข start โ†’ ๐Ÿ”ด end)                            โ•‘
          โ•‘ appStartType = WARM (initialize complete when MainActivity opened)   โ•‘
          โ•‘ appOpenedTime = 4000ms                                               โ•‘
          โ•‘ TTI = [view visible time] - 4000ms                                    โ•‘
          โ•‘ IncomingCallActivity (overlay/system UI) correctly EXCLUDED           โ•‘
          โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Legend:
  ๐ŸŸข    = TTI measurement START (appOpenedTime)
  ๐Ÿ”ด    = TTI measurement END (calculated in JS)
  ๐Ÿ‘†    = User tap/interaction (triggers action)
  ๐Ÿ–ฅ๏ธ    = User sees UI (splash, main app, etc.)
  ๐Ÿ“ฑ    = System event (notification arrives)
  ๐Ÿ“ž    = Incoming call
  ๐Ÿ”„    = Configuration change (rotation)
  โ—     = MainActivity instance
  โ”ƒ     = TTI measurement in progress
  ๐—•๐—ผ๐—น๐—ฑ  = Values used in TTI calculation for this scenario
  Normal = Events that occur (helpful context)

API < 28 Support:

  • Manual tracking in onStartCommand() and onReceive() with API version checks
  • Fallback in MainActivity.onCreate() for timestamp capture
  • All scenarios work identically on older Android versions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment