package Ġcom . next gen broadcast . mobile . tv android Ċ Ċ import Ġandroid . content . Content Provider Client Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . core . database . getDouble OrNull Ċ import Ġandroidx . core . database . getInt OrNull Ċ import Ġandroidx . core . database . getString OrNull Ċ import Ġandroidx . core . net . to Uri Ċ import Ġcom . next gen broadcast . mobile . core . at sc 3 . Phy Info Constants Ċ import Ġcom . next gen broadcast . mobile . core . model .* Ċ import Ġjava . nio . ByteBuffer Ċ Ċ class ĠReceiver Content Resolver ( ĊĠĠĠ Ġcontext : ĠContext Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġval Ġob servers Ġ= Ġmutable ListOf < Content Observer >() ĊĊĠĠĠ Ġprivate Ġval Ġreceiver Route List Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ ROUTE _ LIST ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Route Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ ROUTE ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Frequency Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ FREQ UENCY ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Service Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ SERVICE ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Service List Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ SERVICE _ LIST ) ĊĠĠĠ Ġprivate Ġval Ġapp Data Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ APP _ DATA ) ĊĠĠĠ Ġprivate Ġval Ġapp State Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ APP _ STATE ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Player Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ MEDIA _ PLAYER ) ĊĠĠĠ Ġprivate Ġval Ġcertificate Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ SERVER _ CER TIFICATE ) ĊĠĠĠ Ġprivate Ġval Ġreceiver State Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ STATE ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Phy Info Uri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ PHY _ VERSION _ INFO ) ĊĊĠĠĠ Ġprivate Ġvar Ġprovider Client : ĠContent Provider Client ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Client Ġ= Ġcontent Resolver . acquire Content Provider Client ( app Data Uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ Ġobserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . unregister Content Observer ( observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprovider Client ?. close () ĊĠĠĠĠĠĠĠ Ġprovider Client Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Route List ( block : Ġ( List < Route Url >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock ( query Route List ()) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( receiver Route List Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( query Route List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Service List ( block : Ġ( List < AV Service >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock ( query Service List ()) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( receiver Service List Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( query Service List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Service Selection ( block : Ġ( AV Service ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock ( query Selected Service ()) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( receiver Service Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( query Selected Service ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Application Data ( block : Ġ( AppData ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock ( query AppData ()) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( app Data Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( query AppData ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Player State ( block : Ġ( Uri ?, ĠRPM Params , ĠPlay back State ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Player Data ()?. let Ġ{ Ġ( media Uri , Ġlayout Params , Ġstate ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( media Uri , Ġlayout Params , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( receiver Player Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Player Data ()?. let Ġ{ Ġ( media Uri , Ġlayout Params , Ġstate ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( media Uri , Ġlayout Params , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Receiver State ( block : Ġ( Receiver State ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock ( query Receiver State () Ġ?: ĠReceiver State . idle ()) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( receiver State Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( query Receiver State () Ġ?: ĠReceiver State . idle ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Route ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Route Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ ROUTE _ PATH , Ġpath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Route () Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Route Uri . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtune ( freq K hz : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Frequency Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ FREQ UENCY , Ġfreq K hz ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtune ( freq K hz List : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrequency List Bytes Ġ= ĠByteBuffer . allocate ( freq K hz List . size Ġ* ĠInt . SIZE _ BYTES ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfreq K hz List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre wind () ĊĠĠĠĠĠĠĠ Ġ}. array () ĊĊĠĠĠĠĠĠĠ Ġreceiver Frequency Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ FREQ UENCY _ LIST , Ġfrequency List Bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect Service ( service : ĠAV Service ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Service Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ SERVICE _ BS ID , Ġservice . bs id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ SERVICE _ ID , Ġservice . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ SERVICE _ GLOBAL _ ID , Ġservice . global Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Player State ( state : ĠPlay back State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Player Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ PLAYER _ STATE , Ġstate . state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Player State () Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Player Uri . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpublish Application State ( state : ĠApplication State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp State Uri . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ APP _ STATE _ VALUE , Ġstate . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpublish Player State ( state : ĠPlay back State , Ġposition : ĠLong , Ġrate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver Player Uri . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ PLAYER _ STATE , Ġstate . state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ PLAYER _ POSITION , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put ( COLUMN _ PLAYER _ RATE , Ġrate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Route List (): ĠList < Route Url > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf < Route Url >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Route List Uri . query Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getString OrNull ( COLUMN _ ROUTE _ ID ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcursor . getString OrNull ( COLUMN _ ROUTE _ PATH ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġcursor . getString OrNull ( COLUMN _ ROUTE _ NAME ) Ġ?: Ġid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Route Url ( id , Ġpath , Ġtitle )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Selected Service (): ĠAV Service ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver Service Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb sid Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ BS ID ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Id Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ ID ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Global Id Ġ= Ġcursor . getString OrNull ( COLUMN _ SERVICE _ GLOBAL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= Ġcursor . getString OrNull ( COLUMN _ SERVICE _ SHORT _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ CATEGORY ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmajor Channel No Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ MAJOR _ NO ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminor Channel No Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ MINOR _ NO ) Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAV Service ( bs id , Ġservice Id , Ġshort Name , Ġservice Global Id , Ġmajor Channel No , Ġminor Channel No , Ġcategory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Service List (): ĠList < AV Service > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf < AV Service >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Service List Uri . query Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb sid Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ BS ID ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Id Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ ID ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Global Id Ġ= Ġcursor . getString OrNull ( COLUMN _ SERVICE _ GLOBAL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= Ġcursor . getString OrNull ( COLUMN _ SERVICE _ SHORT _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ CATEGORY ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmajor Channel No Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ MAJOR _ NO ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminor Channel No Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ MINOR _ NO ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Default Ġ= Ġcursor . getInt OrNull ( COLUMN _ SERVICE _ DEFAULT ) Ġ== Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( AV Service ( bs id , Ġservice Id , Ġshort Name , Ġservice Global Id , Ġmajor Channel No , Ġminor Channel No , Ġcategory , Ġdefault Ġ= Ġis Default )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Server Certificate (): ĠList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcertificate Uri . query Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < String >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString OrNull ( COLUMN _ CER TIFICATE )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Receiver Frequency (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver Frequency Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getInt OrNull ( COLUMN _ FREQ UENCY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery AppData (): ĠApp Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapp Data Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Context ID Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ CONTEXT _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp BaseUrl Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp BB and Entry Page Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ BB AND _ ENTRY _ PAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp BC ast Entry Page Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ B CAST _ ENTRY _ PAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Service Ids Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ SERVICE _ IDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Cache Path Ġ= Ġcursor . getString OrNull ( COLUMN _ APP _ CACHE _ PATH ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Context ID Ġ!= Ġnull Ġ&& Ġapp BaseUrl Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ids Ġ= Ġapp Service Ids ?. split (" Ġ") ?. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Data ( app Context ID , Ġapp BaseUrl , Ġapp BB and Entry Page , Ġapp BC ast Entry Page , Ġ Ġservice Ids , Ġapp Cache Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// TODO : Ġcombine Ġto Ġone Ġlocal Ġmodel ĊĠĠĠ Ġfun Ġquery Player Data (): ĠTrip le < Uri ?, ĠRPM Params , ĠPlay back State >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver Player Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Uri Ġ= Ġcursor . getString OrNull ( COLUMN _ PLAYER _ MEDIA _ URL )?. to Uri () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġcursor . getDouble OrNull ( COLUMN _ PLAYER _ LAYOUT _ SCALE ) Ġ?: Ġ 1 0 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcursor . getInt OrNull ( COLUMN _ PLAYER _ LAYOUT _ X ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġcursor . getInt OrNull ( COLUMN _ PLAYER _ LAYOUT _ Y ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcursor . getInt OrNull ( COLUMN _ PLAYER _ STATE )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State . valueOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠPlay back State . IDLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( media Uri , ĠRPM Params ( scale , Ġx , Ġy ), Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Receiver State (): ĠReceiver State ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver State Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Code Ġ= Ġcursor . getInt OrNull ( COLUMN _ STATE _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Index Ġ= Ġcursor . getInt OrNull ( COLUMN _ STATE _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Count Ġ= Ġcursor . getInt OrNull ( COLUMN _ STATE _ COUNT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠReceiver State . State . values (). first OrNull Ġ{ Ġit . code Ġ== Ġstate Code Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReceiver State ( state , Ġstate Index Ġ?: Ġ 0 , Ġstate Count Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Phy Info (): ĠMap < String , ĠString ?> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver Phy Info Uri . query First Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of < String , ĠString ?> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Phy Info Constants . INFO _ DEVICE _ ID , Ġcursor . getString OrNull ( Phy Info Constants . INFO _ DEVICE _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Phy Info Constants . INFO _ SDK _ VERSION , Ġcursor . getString OrNull ( Phy Info Constants . INFO _ SDK _ VERSION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Phy Info Constants . INFO _ FIRM WARE _ VERSION , Ġcursor . getString OrNull ( Phy Info Constants . INFO _ FIRM WARE _ VERSION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Phy Info Constants . INFO _ PHY _ TYPE , Ġcursor . getString OrNull ( Phy Info Constants . INFO _ PHY _ TYPE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCursor . getString OrNull ( columnName : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Column Index OrNull ( columnName )?. let Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString OrNull ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCursor . getInt OrNull ( columnName : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Column Index OrNull ( columnName )?. let Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Int OrNull ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCursor . getDouble OrNull ( columnName : ĠString ): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Column Index OrNull ( columnName )?. let Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Double OrNull ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCursor . getColumnIndex OrNull ( columnName : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Column Index ( columnName ). take If Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠContent Resolver . register Content Observer ( uri : ĠUri , Ġcross inline ĠonChange : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Content Observer ( uri , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠContent Observer ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean , Ġuri : ĠUri ?) Ġ= ĠonChange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob servers . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< R > ĠUri . query First ( action : Ġ( cursor : ĠCursor ) Ġ-> ĠR ?): ĠR ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprovider Client ?. query ( this , Ġnull , Ġnull , Ġnull )?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġaction ( cursor ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< R > ĠUri . query ( action : Ġ( cursor : ĠCursor ) Ġ-> ĠR ?): ĠR ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprovider Client ?. query ( this , Ġnull , Ġnull , Ġnull )?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( cursor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠUri . insert ( action : Ġ( values : ĠContent Values ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Client ?. insert ( this , ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( this ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠUri . update ( action : Ġ( values : ĠContent Values ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Client ?. update ( this , ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( this ) ĊĠĠĠĠĠĠĠ Ġ}, Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠUri . delete () Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Client ?. delete ( this , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ ROUTE _ LIST Ġ= Ġ" receiver Route List " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ ROUTE Ġ= Ġ" receiver Open Route " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ FREQ UENCY Ġ= Ġ" receiver Frequency " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ SERVICE Ġ= Ġ" receiver Service " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ SERVICE _ LIST Ġ= Ġ" receiver Service List " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ PHY _ VERSION _ INFO Ġ= Ġ" receiver Phy Info " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ APP _ DATA Ġ= Ġ" app Data " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ APP _ STATE Ġ= Ġ" app State " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ SERVER _ CER TIFICATE Ġ= Ġ" server Certificate " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ STATE Ġ= Ġ" receiver State " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ RECE IVER _ MEDIA _ PLAYER Ġ= Ġ" receiver MediaPlayer " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ CONTEXT _ ID Ġ= Ġ" app Context Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ BASE _ URL Ġ= Ġ" app BaseUrl " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ BB AND _ ENTRY _ PAGE Ġ= Ġ" app BB and Entry Page " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ B CAST _ ENTRY _ PAGE Ġ= Ġ" app BC ast Entry Page " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ STATE _ VALUE Ġ= Ġ" app State Value " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ SERVICE _ IDS Ġ= Ġ" app Service Ids " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ APP _ CACHE _ PATH Ġ= Ġ" app Cache Path " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ CER TIFICATE Ġ= Ġ" certificate " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ STATE _ CODE Ġ= Ġ" receiver State Value " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ STATE _ INDEX Ġ= Ġ" receiver State Index " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ STATE _ COUNT Ġ= Ġ" receiver State Count " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ ROUTE _ ID Ġ= Ġ" receiver Route Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ ROUTE _ PATH Ġ= Ġ" receiver Route Path " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ ROUTE _ NAME Ġ= Ġ" receiver Route Name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ FREQ UENCY Ġ= Ġ" receiver Frequency " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ FREQ UENCY _ LIST Ġ= Ġ" receiver Frequency List " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ BS ID Ġ= Ġ" receiver Service B sid " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ ID Ġ= Ġ" receiver Service Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ GLOBAL _ ID Ġ= Ġ" receiver Service Global Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ SHORT _ NAME Ġ= Ġ" receiver Service ShortName " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ CATEGORY Ġ= Ġ" receiver Service Category " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ MAJOR _ NO Ġ= Ġ" receiver Service Major No " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ MINOR _ NO Ġ= Ġ" receiver Service Minor No " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ SERVICE _ DEFAULT Ġ= Ġ" receiver Service Default " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ MEDIA _ URL Ġ= Ġ" receiver Player Media Url " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ LAYOUT _ SCALE Ġ= Ġ" receiver Player Layout Scale " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ LAYOUT _ X Ġ= Ġ" receiver Player Layout X " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ LAYOUT _ Y Ġ= Ġ" receiver Player Layout Y " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ STATE Ġ= Ġ" receiver Player State " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ POSITION Ġ= Ġ" receiver Player Position " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ PLAYER _ RATE Ġ= Ġ" receiver Player Rate " ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Uri For Path ( context : ĠContext , Ġpath : ĠString ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUri . Builder (). scheme ( Content Resolver . SCHEME _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. authority ( context . getString ( R . string . receiver Content Provider )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. encoded Path ( path ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget DeviceId ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġget Uri For Path ( context , ĠCONTENT _ PHY _ VERSION _ INFO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . content Resolver . query ( uri , Ġnull , Ġnull , Ġnull )?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString OrNull ( cursor . getColumnIndex ( Phy Info Constants . INFO _ DEVICE _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġopen Route ( context : ĠContext , Ġuri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ ROUTE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( COLUMN _ ROUTE _ PATH , Ġuri . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset Player State ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . delete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Uri For Path ( context , ĠCONTENT _ RECE IVER _ MEDIA _ PLAYER ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }