/* Ċ Ġ* Ġ ĠRadio Player Plugin . kt Ċ Ġ* Ċ Ġ* Ġ ĠCreated Ġby ĠI ly a ĠCh irk un ov Ġ< xc @ yar . net > Ġon Ġ 2 8 . 1 2 . 2 0 2 0 . Ċ Ġ*/ Ċ Ċ package Ġcom . che ebe ez . radio _ player Ċ Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġio . flutter . embedding . engine . plugins . Flutter Plugin Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġio . flutter . plugin . common . Binary Messenger Ċ import Ġio . flutter . plugin . common . Event Channel Ċ import Ġio . flutter . plugin . common . Event Channel . Event Sink Ċ import Ġio . flutter . plugin . common . Event Channel . Stream Handler Ċ import Ġio . flutter . plugin . common . Basic Message Channel Ċ import Ġio . flutter . plugin . common . Binary Codec Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . os . IB inder Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ Ċ /** ĠRadio Player Plugin Ġ*/ Ċ class ĠRadio Player Plugin Ġ: ĠFlutter Plugin , ĠMethod Call Handler Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchannel : ĠMethod Channel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstate Channel : ĠEvent Channel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmetadata Channel : ĠEvent Channel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdefault Artwork Channel : ĠBasic Message Channel < ByteBuffer > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmetadata Artwork Channel : ĠBasic Message Channel < ByteBuffer > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġintent : ĠIntent ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠRadio Player Service ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Engine (@ NonNull Ġflutter Plugin Binding : ĠFlutter Plugin . Flutter Plugin Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġflutter Plugin Binding . application Context ĊĠĠĠĠĠĠĠ Ġchannel Ġ= ĠMethod Channel ( flutter Plugin Binding . binary Messenger , Ġ" radio _ player ") ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( this ) ĊĊĠĠĠĠĠĠĠ Ġstate Channel Ġ= ĠEvent Channel ( flutter Plugin Binding . binary Messenger , Ġ" radio _ player / state Events ") ĊĠĠĠĠĠĠĠ Ġstate Channel . set Stream Handler ( state Stream Handler ) ĊĠĠĠĠĠĠĠ Ġmetadata Channel Ġ= ĠEvent Channel ( flutter Plugin Binding . binary Messenger , Ġ" radio _ player / metadata Events ") ĊĠĠĠĠĠĠĠ Ġmetadata Channel . set Stream Handler ( metadata Stream Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠChannel Ġfor Ġdefault Ġart work ĊĠĠĠĠĠĠĠ Ġdefault Artwork Channel Ġ= ĠBasic Message Channel ( flutter Plugin Binding . binary Messenger , Ġ" radio _ player / set Artwork ", ĠBinary Codec . INSTANCE ) ĊĠĠĠĠĠĠĠ Ġdefault Artwork Channel . setMessage Handler Ġ{ Ġmessage , Ġresult Ġ-> Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġmessage !!. array (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠBitmap Factory . decode ByteArray ( array , Ġ 0 , Ġarray . size ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . setDefault Artwork ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . reply ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠChannel Ġfor Ġmetadata Ġart work ĊĠĠĠĠĠĠĠ Ġmetadata Artwork Channel Ġ= ĠBasic Message Channel ( flutter Plugin Binding . binary Messenger , Ġ" radio _ player / get Artwork ", ĠBinary Codec . INSTANCE ) ĊĠĠĠĠĠĠĠ Ġmetadata Artwork Channel . setMessage Handler Ġ{ Ġmessage , Ġresult Ġ-> Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service . metadata Artwork Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . reply ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . metadata Artwork !!. compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġstream . toByteArray (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Buffer Ġ= ĠByteBuffer . allocate Direct ( array . size ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buffer . put ( array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . reply ( byte Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġservice ĊĠĠĠĠĠĠĠ Ġintent Ġ= ĠIntent ( context , ĠRadio Player Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġcontext . bind Service ( intent , Ġservice Connection , ĠContext . BIND _ AUTO _ CREATE Ġor ĠContext . BIND _ IMPORTANT ) ĊĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Engine (@ NonNull Ġbinding : ĠFlutter Plugin . Flutter Plugin Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( null ) ĊĠĠĠĠĠĠĠ Ġstate Channel . set Stream Handler ( null ) ĊĠĠĠĠĠĠĠ Ġmetadata Channel . set Stream Handler ( null ) ĊĠĠĠĠĠĠĠ Ġdefault Artwork Channel . setMessage Handler ( null ) ĊĠĠĠĠĠĠĠ Ġmetadata Artwork Channel . setMessage Handler ( null ) ĊĠĠĠĠĠĠĠ Ġcontext . unbind Service ( service Connection ) ĊĠĠĠĠĠĠĠ Ġcontext . stop Service ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall (@ NonNull Ġcall : ĠMethod Call , Ġ@ NonNull Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( call . method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" set " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . arguments < ArrayList < String >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . set Media Item ( args [ 0 ], Ġargs [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" play " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pause " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresult . success ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDefines Ġcallbacks Ġfor Ġservice Ġbinding , Ġpassed Ġto Ġbind Service () Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġservice Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( component Name : ĠComponent Name , Ġi Binder : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġi Binder Ġas ĠRadio Player Service . Local Binder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Ġ= Ġbinder . getService () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġservice Ġdisconnect s Ġunexpected ly . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġservice Ġshould Ġbe Ġrunning Ġin Ġa Ġdifferent Ġprocess . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( component Name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠHandler Ġfor Ġplayback Ġstate Ġchanges , Ġpassed Ġto Ġset Stream Handler () Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġstate Stream Handler Ġ= Ġobject Ġ: ĠStream Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġevent Sink : ĠEvent Sink ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Listen ( arguments : ĠAny ?, Ġevents : ĠEvent Sink ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink Ġ= Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). register Receiver ( broadcast Receiver , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Radio Player Service . ACTION _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel ( arguments : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). unregister Receiver ( broadcast Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBroadcast Ġreceiver Ġfor Ġplayback Ġstate Ġchanges , Ġpassed Ġto Ġregister Receiver () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Ġ= Ġintent . getBoolean Extra ( Radio Player Service . ACTION _ STATE _ CHANGED _ EXTRA , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink ?. success ( received ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠHandler Ġfor Ġnew Ġmetadata , Ġpassed Ġto Ġset Stream Handler () Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmetadata Stream Handler Ġ= Ġobject Ġ: ĠStream Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġevent Sink : ĠEvent Sink ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Listen ( arguments : ĠAny ?, Ġevents : ĠEvent Sink ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink Ġ= Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). register Receiver ( broadcast Receiver , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Radio Player Service . ACTION _ NEW _ METADATA )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel ( arguments : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). unregister Receiver ( broadcast Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBroadcast Ġreceiver Ġfor Ġnew Ġmetadata , Ġpassed Ġto Ġregister Receiver () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Ġ= Ġintent . getString ArrayList Extra ( Radio Player Service . ACTION _ NEW _ METADATA _ EXTRA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink ?. success ( received ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ