package Ġcom . chi . server application . binder pool čĊč Ċ import Ġandroid . app . Service č Ċ import Ġandroid . content . Component Name č Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . content . Service Connection č Ċ import Ġandroid . os . Handler č Ċ import Ġandroid . os . IB inder č Ċ import Ġandroid . os . Looper č Ċ import Ġandroid . util . Log čĊč Ċ object ĠB inder Pool Ġ{ čĊčĊĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Binder Pool " čĊčĊĠĠĠ Ġconst Ġval ĠPL US Ġ= ĠB inder Pool Impl . PLUS čĊčĊĠĠĠ Ġconst Ġval ĠMIN US Ġ= ĠB inder Pool Impl . MINUS čĊčĊĠĠĠ Ġprivate Ġvar Ġi Binder Pool Interface : ĠI Binder Pool Interface ? Ġ= Ġnull čĊčĊĠĠĠ Ġprivate Ġval Ġquery Binder Request List Ġ= ĠArrayList < Query Binder Request >() čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġl Context : ĠContext čĊčĊĠĠĠ Ġprivate Ġval Ġservice Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name ?, Ġservice : ĠI Binder ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG ," query Binder ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Binder Pool Interface Ġ= ĠI Binder Pool Interface . Stub . as Interface ( service ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( query Binder Request List . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Binder Request Ġ= Ġquery Binder Request List . remove At ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Binder Request . listener . on Query Binder Result ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Binder Request . binder Code , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Binder Pool Interface ?. query Binder ( query Binder Request . binder Code ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Binder Pool Interface Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Service () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) čĊčĊĠĠĠ Ġprivate Ġconst Ġval ĠQUERY _ TIMEOUT : ĠLong Ġ= Ġ 1 0 Ġ* Ġ 1 0 0 0 čĊčĊĠĠĠ Ġprivate Ġval Ġtimeout Runnable Ġ= ĠRunnable Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Query Binder Request >() čĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġquery Binder Request List ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( System . currentTimeMillis () Ġ- Ġitem . create Time ) Ġ>= ĠQUERY _ TIMEOUT ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( item ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġquery Binder Request List . removeAll ( list ) čĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . listener . on Query Binder Result ( item . binder Code , Ġnull ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġquery Binder ( context : ĠContext , Ġbinder Code : ĠInt , Ġlistener : ĠListener ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! :: l Context . isInitialized ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Context Ġ= Ġcontext . application Context čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( i Binder Pool Interface Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Binder Request Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Binder Request ( System . currentTimeMillis (), Ġbinder Code , Ġlistener ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Binder Request List . add ( query Binder Request ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Service () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġi Binder Pool Interface ?. query Binder ( binder Code ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Query Binder Result ( binder Code , Ġbinder ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġbind Service () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" com . chi . server application . ACTION _ A IDL _ SERVICE ") čĊĠĠĠĠĠĠĠ Ġintent . set Package (" com . chi . server application ") čĊĠĠĠĠĠĠĠ Ġval Ġis Bind Ġ= Ġl Context . bind Service ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Connection , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠService . BIND _ AUTO _ CREATE čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġif Ġ(! is Bind ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" ç»ĳå®ļ å¤±è´¥ ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( query Binder Request List . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Binder Request Ġ= Ġquery Binder Request List . remove At ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Binder Request . listener . on Query Binder Result ( query Binder Request . binder Code , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( timeout Runnable , ĠQUERY _ TIMEOUT ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġdata Ġclass ĠQuery Binder Request ( val ĠcreateTime : ĠLong , Ġval Ġbinder Code : ĠInt , Ġval Ġlistener : ĠListener ) čĊčĊĠĠĠ Ġinterface ĠListener Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġfun Ġon Query Binder Result ( binder Code : ĠInt , Ġbinder : ĠI Binder ?) čĊĠĠĠ Ġ} č Ċ }