/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġe Al va . com Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . e al va . to que . service Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . os . IB inder Ċ import Ġcom . e al va . e al val og . lazy Logger Ċ import Ġcom . e al va . to que . service . controller . Null Media Controller Ċ import Ġcom . e al va . to que . service . controller . To que Media Controller Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ Ċ private Ġval ĠLOG Ġby Ġlazy Logger ( MediaPlayer Service Connection Impl :: class ) Ċ Ċ interface ĠMedia Player Service Connection Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠStarts Ġas Ġ[ Null Media Controller ], Ġset Ġto Ġthe Ġcontroller Ġinstance Ġon Ġsuccessful Ġbind , Ġand Ġthen ĊĠĠ Ġ* Ġset Ġto Ġ[ Null Media Controller ] Ġif Ġthe Ġservice Ġbecomes Ġunavailable ĊĠĠ Ġ*/ ĊĠ Ġval Ġmedia Controller : ĠState Flow < To que Media Controller > ĊĊĠ Ġfun Ġbind (): ĠBoolean ĊĠ Ġfun Ġun bind () ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( context : ĠContext ): ĠMedia Player Service Connection Ġ= ĊĠĠĠĠĠ ĠMedia Player Service Connection Impl ( context ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠEn caps ulates Ġbinding Ġto Ġthe Ġmedia Ġplayer Ġservice Ċ Ġ*/ Ċ private Ġclass ĠMedia Player Service Connection Impl ( ĊĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠMedia Player Service Connection Ġ{ ĊĠ Ġprivate Ġvar Ġservice Connection : ĠService Connection ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġis Bound : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġoverride Ġval Ġmedia Controller Ġ= ĠMutable State Flow < To que Media Controller >( Null Media Controller ) ĊĊĠ Ġoverride Ġfun Ġbind (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! is Bound ) Ġ{ ĊĠĠĠĠĠ Ġservice Connection Ġ= Ġbind To Service ( context , Ġcontext . java Class . name ) ĊĠĠĠĠĠ Ġis Bound Ġ= Ġservice Connection Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġis Bound ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġun bind () Ġ{ ĊĠĠĠ Ġif Ġ( is Bound ) Ġ{ ĊĠĠĠĠĠ Ġis Bound Ġ= Ġfalse ĊĠĠĠĠĠ Ġmedia Controller . value Ġ= ĠNull Media Controller ĊĠĠĠĠĠ Ġservice Connection ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . unbind Service ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġservice Connection Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbind To Service ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġbinder Name : ĠString ĊĠ Ġ): ĠService Connection ? Ġ{ ĊĠĠĠ Ġval Ġconnection Ġ= Ġmake Service Connection ( binder Name ) ĊĠĠĠ Ġis Bound Ġ= Ġcontext . bind Service ( ĊĠĠĠĠĠ ĠMedia Player Service . make Start Intent ( ĊĠĠĠĠĠĠĠ Ġcontext . application Context , ĊĠĠĠĠĠĠĠ ĠMedia Player Service . Action . None , ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġconnection , ĊĠĠĠĠĠ ĠContext . BIND _ AUTO _ CREATE Ġor ĠContext . BIND _ IMPORTANT ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġif Ġ( is Bound ) Ġconnection Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmake Service Connection ( binder Name : ĠString ): ĠService Connection Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( ĊĠĠĠĠĠĠĠ Ġname : ĠComponent Name , ĊĠĠĠĠĠĠĠ Ġservice : ĠI Binder ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġservice Ġas ĠMedia Player Service . Media Service Binder ĊĠĠĠĠĠĠĠ Ġmedia Controller . value Ġ= Ġbinder . controller ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Controller . value Ġ= ĠNull Media Controller ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ