// ĠCopyright Ġ 2 0 2 1 , ĠQual comm ĠIn novation ĠCenter , ĠInc . Ċ // ĠSPDX - License - Identifier : ĠB SL - 1 . 0 Ċ /*! Ċ Ġ* Ġ@ file Ċ Ġ* Ġ@ brief Ġ ĠMonitor Ġclient Ġconnections . Ċ Ġ* Ġ@ author ĠJar vis ĠHu ang Ċ Ġ* Ġ@ ingroup Ġipc _ android Ċ Ġ*/ Ċ package Ġorg . free desktop . mon ado . ipc Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . Message Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* ĠClient Ġwatch dog , Ġto Ġdetermine Ġwhether Ġruntime Ġservice Ġshould Ġbe Ġstopped . Ċ Ġ*/ Ċ class ĠWatch dog ( ĊĠĠĠ Ġprivate Ġval Ġshutdown Delay Milliseconds : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġshutdown Listener : ĠShutdown Listener Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterface Ġdefinition Ġfor Ġcallbacks Ġto Ġbe Ġinvoked Ġwhen Ġthere 's Ġno Ġclient Ġconnected . ĠNot ed Ġthat ĊĠĠĠĠ Ġ* Ġall Ġthe Ġcallbacks Ġrun Ġon Ġbackground Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠShutdown Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġto Ġbe Ġinvoked Ġwhen Ġlast Ġclient Ġdisconnected . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Prepare Shutdown () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġto Ġbe Ġinvoked Ġwhen Ġshutdown Ġdelay Ġended Ġand Ġthere 's Ġno Ġnew Ġclient Ġconnected . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġclient Count Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshutdown Handler : ĠHandler ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshutdown Thread : ĠHandler Thread ĊĊĠĠĠ Ġfun Ġstart Monitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġshutdown Thread Ġ= ĠHandler Thread (" mon ado - client - watch dog ") ĊĠĠĠĠĠĠĠ Ġshutdown Thread . start () ĊĠĠĠĠĠĠĠ Ġshutdown Handler Ġ= Ġobject Ġ: ĠHandler ( shutdown Thread . lo oper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ SHUT DOWN Ġ-> Ġif Ġ( client Count . get () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshutdown Listener . on Shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Monitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġshutdown Thread . quit S af ely () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Client Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Count . increment AndGet () ĊĠĠĠĠĠĠĠ Ġshutdown Handler . remove Messages ( MSG _ SHUT DOWN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Client Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( client Count . decrement AndGet () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshutdown Listener . on Prepare Shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshutdown Handler . send Empty Message Delayed ( MSG _ SHUT DOWN , Ġshutdown Delay Milliseconds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ SHUT DOWN Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġ} Ċ } Ċ