This page illustrates sequence diagrams to be implemented by RDK App Infrastructure Thunder plugins.
References
Repository: https://github.com/rdkcentral/entservices-infra
Firebolt Lifecycle 2.0: Simplified Lifecycle 2.0

Sequence diagrams are designed to adhere to the Single Responsibility Principle (SRP), ensuring each diagram focuses on a unique feature.
By numbering each step, the flow remains clear and easy to follow, enhancing both readability and analysis.
For simplicity sequence diagrams are categorized yet the order of operation is numbered in sequence for continuity.
Step 0 - 3 are common for any type of launches with small adjustments.
For eg if Step 3 ends with 38 the next set of processing will continue from 39.
@startuml autonumber "[0]" 'hide footbox title Setup Listeners for AI 2.0 participant ":SystemApp" as SystemApp participant ":Package Manager" as PM participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":Ripple" as Ripple SystemApp -> AM: Listen for \nonAppLifecycleStateChanged() AM -> LM: Listen for\nonAppLifecycleStateChanged() AM -> PM: Listen for\nonAppInstallationStatus() Ripple -> LM: Listen for\nonAppLifecycleStateChanged() LM -> WM: Listen for\n onReady() LM -> RM: Listen for\n onStateChanged() @enduml |
@startuml
autonumber 7 "[0]"
'hide footbox
title General Package Handling
participant ":SystemApp" as SystemApp
participant ":Package Manager" as PM
participant ":App Manager" as AM
participant ":Lifecycle Manager" as LM
SystemApp -> AM: launchApp/preloadApp
AM -> LM: isAppLoaded( appId )
LM -->> AM: false
AM -> AM: Check Package loaded
AM -> PM: lock( packageId )
opt For Browser/Cobalt apps with runtime
note right of PM: Package is already locked so replies faster
PM -> PM: lock( runtimePackageId )
end
PM -->> AM: 1. Unpacked path \n2. Configuration Object\n3. App Metadata
@enduml |
@startuml autonumber 14 "[0]" 'hide footbox title Spawning participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Ripple" as Ripple AM -> LM: spawnApp( appId, targetLifecycleState X ) note right of AM: Target lifecycle state could be ACTIVE/PAUSED/SUSPEND AM --> SystemApp: return true activate LM LM -> LM: allocate appInstanceId LM -> LM: newAppLifecycleState = LOADING LM ->> AM: onAppLifecycleStateChanged LOADING AM ->> SystemApp: onAppLifecycleStateChanged LOADING note left LM: Need to pass appId - for SecureStorage integration LM ->> Ripple: onAppLifecycleStateChanged\nLOADING Ripple -> Ripple: createSession note right of Ripple: Use appInstanceId for Session LM -> LM: Add environment variable\n for FIREBOLT_ENDPOINT and \npreload target state deactivate LM @enduml |
@startuml autonumber 23 "[0]" 'hide footbox title Container Launch participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":OCI" as OCI participant ":Ripple" as Ripple LM -> RM: run( appId, env ) activate RM RM ->> LM: onStateChanged(Starting) RM -> RM: Create Dobby Spec\n from Config Object RM -> RM: Create User Id Note left of RM: Add Storage Manager.get using user Id RM -> WM: createDisplay(appInstanceId) RM -> OCI: startContainer(spec) OCI -> App: exec() OCI ->> RM: onStarted RM ->> LM : onStateChanged(Running) LM -> LM: newAppLifecycleState = INITIALIZING LM ->> AM: onAppLifecycleStateChanged\nINITIALIZING LM ->> Ripple: onAppLifecycleStateChanged\n INITIALIZING Ripple ->> Ripple: Update app state deactivate RM @enduml |
@startuml autonumber 36 "[0]" 'hide footbox title Launch for an Active Interactive App participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":Ripple" as Ripple participant ":Firebolt App" as App note right of SystemApp: Launch with target lifecycle state of ACTIVE == 1. App Lifecycle Start up == activate App note right of Ripple: url = getenv( "FIREBOLT_ENDPOINT" ) activate Ripple App -> Ripple: Setup Lifecycle Listeners App -> Ripple: Lifecycle.ready Ripple -> LM: appReady() [JQ] LM -> LM: newAppLifecycleState = PAUSED LM ->> AM: onAppLifecycleStateChanged\nPAUSED LM ->> Ripple: onAppLifecycleStateChanged\n PAUSED Ripple ->> App: onStart() opt If frame is already rendered LM -> WM: renderReady() WM --> LM: true end opt else note right of WM: Render first frame App ->> WM: Wayland event WM ->> LM: onReady(appInstanceId) end LM -> LM: newAppLifecycleState = ACTIVE LM ->> Ripple : onAppLifecycleStateChanged\nACTIVE Ripple ->> App: onActivate() LM ->> AM: onAppLifecycleStateChanged\nACTIVE AM ->> SystemApp: onAppLifecycleStateChanged\nACTIVE opt SystemApp handling visibility and focus SystemApp -> WM: wayland set_properties(appInstanceId,visible) SystemApp -> WM: wayland set_client_focus(appInstanceId) end deactivate Ripple deactivate App @enduml |
@startuml autonumber 36 "[0]" 'hide footbox title Launch for an Suspended Interactive App participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":Ripple" as Ripple participant ":Firebolt App" as App note right of SystemApp: Preloaded with target lifecycle state of SUSPENDED activate App note right of Ripple: url = getenv( "FIREBOLT_ENDPOINT" ) activate Ripple App -> Ripple: Setup Lifecycle Listeners App -> Ripple: Lifecycle.ready Ripple -> LM: appReady() [JQ] LM -> LM: newAppLifecycleState = SUSPENDED LM -> RM: suspend(appInstanceId) LM -> WM: enableDisplayRender(appInstanceId, false) RM -> OCI: LM ->> AM: onAppLifecycleStateChanged\nSUSPENDED LM ->> Ripple: onAppLifecycleStateChanged\n SUSPENDED Ripple ->> App: onStartSuspend deactivate Ripple deactivate App @enduml |
@startuml autonumber 46 "[0]" 'hide footbox title Launch for an Suspended Interactive App participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":Ripple" as Ripple participant ":Firebolt App" as App note right of SystemApp: Contd from Step 4B SystemApp -> AM: launchApp AM -> AM : isAppLoaded(appId) = true AM -> LM: setTargetAppState(ACTIVE) note right of LM: Current state is SUSPENDED LM -> LM: newAppLifecycleState = PAUSED LM -> RM: resume(appInstanceId) LM ->> AM: onAppLifecycleStateChanged\nPAUSED LM ->> Ripple: onAppLifecycleStateChanged\n PAUSED Ripple ->> App: onResume() opt If frame is already rendered LM -> WM: renderReady() WM --> LM: true end opt else note right of WM: Render first frame App ->> WM: Wayland event WM ->> LM: onReady(appInstanceId) end LM -> LM: newAppLifecycleState = ACTIVE LM ->> Ripple : onAppLifecycleStateChanged\nACTIVE Ripple ->> App: onActivate() LM ->> AM: onAppLifecycleStateChanged\nACTIVE AM ->> SystemApp: onAppLifecycleStateChanged\nACTIVE opt SystemApp handling visibility and focus SystemApp -> WM: wayland set_properties(appInstanceId,visible) WM ->> LM: onVisible(appInstanceId) SystemApp -> WM: wayland set_client_focus(appInstanceId) end @enduml |
@startuml autonumber 54 "[0]" 'hide footbox title Launch for an Suspended Interactive App participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Window Manager" as WM participant ":Ripple" as Ripple participant ":Firebolt App" as App note right of SystemApp: Contd from Step 4A note right of SystemApp: If contd from Step 4b its 66 SystemApp -> AM: closeApp AM -> LM: setTargetAppState(PAUSED) LM -> LM: newAppLifecycleState = PAUSED LM ->> Ripple: onAppLifecycleStateChanged\n PAUSED Ripple ->> App: onPause LM ->> AM: onAppLifecycleStateChanged\nPAUSED note right of AM: check for InstallBlocked/UninstallBlocked and move the app to terminate AM ->> SystemApp: onAppLifecycleStateChanged\nPAUSED AM -> LM: unloadApp LM -> LM: newAppLifecycleState = TERMINATING LM ->> Ripple: onAppLifecycleStateChanged\n TERMINATING note right of Ripple: No guarantee for this dispatch Ripple -> Ripple: Cleanup Ripple ->> App: onDestroy LM -> LM: Cleanup LM -> RM: terminate RM -> OCI: stopContainer @enduml |
@startuml autonumber 66 "[0]" 'hide footbox title Launch for an Suspended Interactive App participant ":SystemApp" as SystemApp participant ":App Manager" as AM participant ":Lifecycle Manager" as LM participant ":Runtime Manager" as RM participant ":Window Manager" as WM participant ":Ripple" as Ripple participant ":Firebolt App" as App note right of SystemApp: Contd from Step 4B contd SystemApp -> AM: closeApp AM -> LM: setTargetAppState(PAUSED) LM -> LM: newAppLifecycleState = PAUSED LM ->> Ripple: onAppLifecycleStateChanged\n PAUSED Ripple ->> App: onPause LM ->> AM: onAppLifecycleStateChanged\nPAUSED note right of AM: check for InstallBlocked/UninstallBlocked and move the app to terminate AM ->> SystemApp: onAppLifecycleStateChanged\nPAUSED note right of AM: Based on Suspension Policy note right of AM: Need some methods in App Manager to support this TBD AM -> LM: setAppTargetState(SUSPENDED) LM -> LM: newAppLifecycleState = SUSPENDED LM -> RM: suspend(appInstanceId) LM ->> Ripple: onAppLifecycleStateChanged\n SUSPENDED Ripple ->> App: onSuspend opt If App is enabled for Hibernation note right of AM: Based on Hibernation Policy note right of AM: Need some methods in App Manager to support this TBD AM -> LM: setAppTargetState(HIBERNATED) LM -> LM: newAppLifecycleState = HIBERNATED LM -> RM: hibernate(appInstanceId) end opt Termination SystemApp -> AM: terminateApp AM -> LM: unloadApp opt Given current state is HIBERNATED LM -> LM: newAppLifecycleState = SUSPENDED LM -> RM: wake(appInstanceId,suspended) LM -> LM: newAppLifecycleState = SUSPENDED LM ->> Ripple: onAppLifecycleStateChanged\n SUSPENDED Ripple ->> App: onRestore end LM -> LM: newAppLifecycleState = TERMINATING LM ->> Ripple: onAppLifecycleStateChanged\n TERMINATING note right of Ripple: No guarantee for this dispatch Ripple -> Ripple: Cleanup Ripple ->> App: onDestroy LM -> LM: Cleanup end @enduml |