Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

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 

HLA

draw.io Diagram
bordertrue
diagramNameHLA
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth751
height429
revision1

General Information

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.

Step 0-3 Common Prelaunch

...

PlantUML Macro
@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 -> WM: Listen for\n onVisible()
LM -> RM: Listen for\n onStateChanged()
@enduml

...

PlantUML Macro
@startuml

autonumber 87 "[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

...

PlantUML Macro
@startuml

autonumber 1514 "[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

...

PlantUML Macro
@startuml

autonumber 2423 "[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)
WM --> RM: Wayland env variable display name using user Id
RM -> RM WM: Update display namecreateDisplay(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

...

PlantUML Macro
@startuml

autonumber 3936 "[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)
WM ->> LM: onVisible(appInstanceId)
SystemApp -> WM: wayland set_client_focus(appInstanceId)
end

deactivate Ripple
deactivate App


@enduml

...

PlantUML Macro
@startuml

autonumber 3936 "[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

...

PlantUML Macro
@startuml

autonumber 5854 "[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 ->> SystemApp: onAppLifecycleStateChanged\nPAUSED
opt Termination
SystemApp -> AM: terminateApp: 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
end
LM -> RM: terminate
RM -> OCI: stopContainer

@enduml


Step 5B Deactivate for Suspendable Apps

...

PlantUML Macro
@startuml

autonumber 6566 "[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

...