package Ġcom . e ag les ak ura . fire arm . rpc . service . internal Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context . BIND _ AUTO _ CREATE Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . IB inder Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Registry Ċ import Ġcom . e ag les ak ura . ar my knife . android . extensions . UI Handler Ċ import Ġcom . e ag les ak ura . ar my knife . android . extensions . assert UIT hread Ċ import Ġcom . e ag les ak ura . ar my knife . android . extensions . assert Worker Thread Ċ import Ġcom . e ag les ak ura . ar my knife . android . extensions . post Or Run Ċ import Ġcom . e ag les ak ura . ar my knife . android . extensions . run Blocking On Ui Thread Ċ import Ġcom . e ag les ak ura . fire arm . aid l . I Remote Procedure Client Ċ import Ġcom . e ag les ak ura . fire arm . aid l . I Remote Procedure Service Ċ import Ġcom . e ag les ak ura . fire arm . rpc . Procedure Connection Ċ import Ġcom . e ag les ak ura . fire arm . rpc . internal . blocking Run In Worker Ċ import Ġcom . e ag les ak ura . fire arm . rpc . service . Procedure Client Callback Ċ import Ġcom . e ag les ak ura . fire arm . rpc . service . Procedure Server Connection Ċ import Ġkotlin . coroutines . coroutine Context Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlinx . coroutines . yield Ċ Ċ internal Ġclass ĠServer Connection Impl ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIntent Ġfor Ġconnect Ġto Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġintent : ĠIntent , ĊĊĠĠĠ Ġprivate Ġval Ġcallback : ĠProcedure Client Callback Ċ ) Ġ: ĠI Remote Procedure Client . Stub (), ĊĠĠĠ ĠService Connection , ĊĠĠĠ ĠProcedure Connection , ĊĠĠĠ ĠProcedure Server Connection Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġname : ĠComponent Name ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġa idl : ĠI Remote Procedure Service ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġ_ connection Id : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġ_ connection Hints : ĠBundle ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġconnection Id : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ connection Id !! ĊĊĠĠĠ Ġoverride Ġval Ġconnection Hints : ĠBundle ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ connection Hints !! ĊĊĠĠĠ Ġprivate Ġval Ġregistry Ġ= ĠLifecycle Registry ( this ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠUI Handler . post Or Run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . currentState Ġ= ĠLifecycle . State . CREATED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġremote Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġconnect ( options : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert UIT hread () ĊĠĠĠĠĠĠĠ Ġcontext . bind Service ( intent , Ġthis @ Server Connection Impl , ĠB IND _ AUTO _ CREATE ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( coroutine Context . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( aid l Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa idl !!. register ( this @ Server Connection Impl , Ġoptions ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegister Result ( result ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ connection Id Ġ= Ġit . connection Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ connection Hints Ġ= Ġit . connection H ings !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . registry . currentState Ġ= ĠLifecycle . State . RE SU MED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Connection Ġfailed ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name ?, Ġservice : ĠI Binder ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġthis . aid l Ġ= ĠI Remote Procedure Service . Stub . as Interface ( service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCl ash Ġin Ġremote Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġon ĠCrash Ġremote Ġprocess . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Worker Thread () ĊĠĠĠĠĠĠĠ Ġa idl ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . unregister ( connection Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unbind Service ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa idl Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ connection Id Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ connection Hints Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . currentState Ġ= ĠLifecycle . State . DESTROY ED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġto Ġserver ( from Ġclient ). ĊĠĠĠĠ Ġ* Ġrun Ġserver Ġtask . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġexecute On Server ( path : ĠString , Ġarguments : ĠBundle ): ĠBundle Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa idl Ġ= Ġthis . aid l Ġ?: Ġthrow ĠIllegalStateException (" Server Ġnot Ġconnected [$ intent ]") ĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġremote Ġtask . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġblocking Run In Worker (" Client : [$ connection Id ]-> [ Server ]: $ path ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa idl . request From Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Request (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . path Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . arguments Ġ= Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. bundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠRemote Request . Result ( result ). result !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġfrom Ġserver . ĊĠĠĠĠ Ġ* Ġrun Ġclient Ġtask . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġrequest From Service ( arguments : ĠBundle ): ĠBundle Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRemote Request ( arguments ) ĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġclient Ġtask . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocking Run In Worker (" Client :[ Server ]-> [$ connection Id ]: ${ request . path }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . execute On Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Server Connection Impl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . arguments !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRemote Request . Result (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . result Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġ}. bundle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Lifecycle (): ĠLifecycle Ġ= Ġregistry Ċ } Ċ