@startuml skinparam BackgroundColor F0F0F0 participant "Service Cellular" as srvclr participant "Application Manager" as appmgr participant "ApplicaionDesktop" as appdsktp participant "PinLockWindow" as pinwin actor User == PIN required - invalid PIN flow == note left of srvclr Cellular side data: State: PIN required SIM: SIM1 phone: +48500500500 attempts: 4 end note / note left of appdsktp Desktop side state: Screen Locked end note / note left of pinwin Desktop side data: None end note [o->srvclr : need PIN1 activate srvclr srvclr -> appmgr : ActionMessage{RequestPin1, {SIM1, attempts}} via sys::bus message activate appmgr deactivate srvclr appmgr -> appmgr : translate request to action appmgr -> appdsktp : forward action activate appdsktp deactivate appmgr appdsktp -> appdsktp : handle(RequestPinAction) -> queued deactivate appdsktp ... ... appdsktp <- User : Unlock screen activate appdsktp note left of pinwin Desktop side data: State: PIN required SIM: SIM1 attempts: 4 end note / note left of appdsktp Desktop side state: Screen Unlocked end note appdsktp -> pinwin ** : switchWindow(SIM1, reqPIN, attempts) activate pinwin deactivate appdsktp pinwin -> pinwin : setVisiblePinRequired pinwin <- User : Enters PIN (invalid) pinwin <- User : Confirm appdsktp <- pinwin : handlePasscode(pinValue) activate appdsktp deactivate pinwin srvclr <- appdsktp : PinData(pinValue) via sys::bus message activate srvclr deactivate appdsktp srvclr -> srvclr : verification failed, srvclr -> srvclr : attempts-- deactivate srvclr note over of srvclr Cellular side data: State: PIN required SIM: SIM1 phone: +48500500500 attempts: 3 end note == Pin invalid: Retry with 3 attempts left == [o->srvclr : need PIN1 activate srvclr srvclr -> appmgr : ActionMessage{RequestPin1, {SIM1, attempts}} via sys::bus message activate appmgr deactivate srvclr appmgr -> appmgr : translate request to action appmgr -> appdsktp : forward action activate appdsktp deactivate appmgr appdsktp -> appdsktp : handle(SimUnlockedAction) -> compare cards, attempts? note left of pinwin Desktop side data: State: PIN required SIM: SIM1 attempts: 3 end note / note left of appdsktp Desktop side state: Screen Unlocked end note appdsktp -> pinwin : switchWindow(SIM1, invalidPIN, attempts) activate pinwin deactivate appdsktp pinwin -> pinwin : rebuild pinwin -> pinwin : setVisibleInvalidPin pinwin <- User : Confirm pinwin -> pinwin : setVisiblePinRequired pinwin <- User : Enters PIN (invalid) pinwin <- User : Confirm appdsktp <- pinwin : handlePasscode(pinValue) activate appdsktp deactivate pinwin srvclr <- appdsktp : PinData(pinValue) via sys::bus message activate srvclr deactivate appdsktp srvclr -> srvclr : verification failed srvclr -> srvclr : attempts-- deactivate srvclr note over of srvclr Cellular side data: State: PIN required SIM: SIM1 phone: +48500500500 attempts: 2 end note == Pin invalid: Retry with 2 attempts left == ... ... == Pin invalid: Retry with 1 attempts left == ... ... srvclr <- appdsktp : PinData(pinValue) via sys::bus message activate srvclr srvclr -> srvclr : verification failed, srvclr -> srvclr : attempts-- deactivate srvclr == Pin invalid: 0 attempts left, PUK required == [o->srvclr : need PUK1 activate srvclr srvclr -> appmgr : ActionMessage{RequestPuk1, {SIM1, attempts}} via sys::bus message activate appmgr deactivate srvclr ... PUK Flow ... @enduml