package Ġcom . rst l ss . app . player store Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . rst l ss . app .* Ċ import Ġcom . rst l ss . app . planning . Pl anning Ċ import Ġorg . json . JSONObject Ċ import Ġjava . net . URL Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠPlayer Store Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġurl To Sc rape : ĠString ĊĠĠĠ Ġval Ġis Playing : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġis Service Started : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġvolume : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġplayback State : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval ĠcurrentTime : ĠMutable LiveData < Long > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġstream er Picture : ĠMutable LiveData < Bitmap > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġstream er Name : ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġcurrent Song Ġ: ĠSong Ġ= ĠSong () ĊĠĠĠ Ġval Ġcurrent Song Backup : ĠSong Ġ= ĠSong () ĊĠĠĠ Ġval Ġlp Ġ: ĠArrayList < Song > Ġ= ĠArrayList () ĊĠĠĠ Ġval Ġqueue Ġ: ĠArrayList < Song > Ġ= ĠArrayList () ĊĠĠĠ Ġval Ġis Queue Updated : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġis Lp Updated : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġis Mut ed Ġ: ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġlisteners Count : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġlatency Comp ens ator Ġ: ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġis Initialized : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Stream Down : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġplayback State . value Ġ= ĠPlay back State Compat . STATE _ STOP PED ĊĠĠĠĠĠĠĠ Ġis Playing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Service Started . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstream er Name . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvolume . value Ġ= Ġpreference Store . getInt (" volume ", Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠcurrentTime . value Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġis Queue Updated . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Lp Updated . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Mut ed . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrent Song . setTitle Artist ( no Connection Value ) ĊĠĠĠĠĠĠĠ Ġcurrent Song Backup . setTitle Artist ( no Connection Value ) ĊĠĠĠĠĠĠĠ Ġlisteners Count . value Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Url ( c : ĠContext ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġurl To Sc rape Ġ= Ġc . getString ( R . string . API _ URL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Timestamp ( s : ĠString ) Ġ: ĠLong ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" yyyy - MM - dd Ġhh : mm : ss Ġz ", ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt : ĠDate ? Ġ= ĠdateFormat . parse ("$ s Ġ${ Pl anning . instance . time Zone . get DisplayName ( Pl anning . instance . time Zone . use Day light Time (), ĠTime Zone . SHORT )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġ" date : Ġ$ s Ġ-> Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġt !!. time ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĠĠĠ Ġ// Ġ ################ # ĠAPI ĠFUNCTIONS Ġ ################ ## ĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Api ( res : ĠJSONObject , Ġis Comp ens ating Latency Ġ: ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġnot Ġin ĠP LAY ING Ġstate , Ġupdate Ġtitle Ġ/ Ġartist Ġmetadata . ĠIf Ġwe 're Ġplaying , Ġthe ĠI CY Ġwill Ġtake Ġcare Ġof Ġthat . ĊĊĠĠĠĠĠĠĠ Ġval Ġres Main Ġ= Ġres . getJSONObject (" tracks "). getJSONObject (" current ") ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġextract Song ( res Main ) ĊĠĠĠĠĠĠĠ Ġif Ġ( playback State . value Ġ!= ĠPlay back State Compat . STATE _ PLAY ING Ġ|| Ġcurrent Song . title . value . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġcurrent Song . title . value Ġ== Ġno Connection Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Song . setTitle Artist ("${ s . artist . value } Ġ- Ġ${ s . title . value }") ĊĊĠĠĠĠĠĠĠ Ġval Ġstarts Ġ= Ġs . startTime . value ĊĠĠĠĠĠĠĠ Ġval Ġends Ġ= Ġs . stop Time . value ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Song . startTime . value Ġ!= Ġstarts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Song . startTime . value Ġ= Ġstarts ĊĊĠĠĠĠĠĠĠ Ġcurrent Song . stop Time . value Ġ= Ġends ĊĊĠĠĠĠĠĠĠ Ġval Ġapi Time Ġ= Ġget Timestamp ( res . getJSONObject (" station "). getString (" scheduler Time ")) ĊĠĠĠĠĠĠĠ Ġ// ĠI Ġnoticed Ġthat Ġthe Ġserver Ġhas Ġa Ġbig Ġ( 3 Ġto Ġ 9 Ġseconds Ġ!! ) Ġoffset Ġfor Ġcurrent Ġtime . ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan Ġmeasure Ġit Ġwhen Ġthe Ġplayer Ġis Ġplaying , Ġto Ġcomp ens ate Ġit Ġand Ġhave Ġour Ġprogress Ġbar Ġperfectly Ġtimed ĊĠĠĠĠĠĠĠ Ġ// Ġlatency Comp ens ator Ġis Ġset Ġto Ġnull Ġwhen Ġbegin Playing () Ġ( we Ġcan 't Ġmeasure Ġit Ġat Ġthe Ġmoment Ġwe Ġstart Ġplaying , Ġsince Ġwe 're Ġin Ġthe Ġmiddle Ġof Ġa Ġsong ), ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġmoment , Ġwe Ġset Ġit Ġto Ġ 0 . ĠThen , Ġnext Ġtime Ġthe Ġupdate Api Ġis Ġcalled Ġwhen Ġwe 're Ġplaying , Ġwe Ġmeasure Ġthe Ġlatency Ġand Ġwe Ġset Ġout Ġlatency Comparator . ĊĠĠĠĠĠĠĠ Ġif ( is Comp ens ating Latency ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatency Comp ens ator Ġ= Ġapi Time Ġ- Ġ( current Song . startTime . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġ" latency Ġcomp ens ator Ġset Ġto Ġ${ ( latency Comp ens ator ). toFloat () Ġ/ Ġ 1 0 0 0 } Ġs ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠcurrentTime . value Ġ= Ġapi Time Ġ- Ġ( latency Comp ens ator ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġres Main . getInt (" listeners ") ĊĠĠĠĠĠĠĠ Ġlisteners Count . value Ġ= Ġlisteners ĊĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d (( tag , Ġplayer Store Tag Ġ+ Ġ Ġ" store Ġupdated ") ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsc rape Ġ: Ġ( Any ?) Ġ-> ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( url To Sc rape ). read Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġinit Api Ġis Ġcalled Ġ: ĊĠĠĠĠĠĠĠ Ġ- Ġat Ġstartup ĊĠĠĠĠĠĠĠ Ġ- Ġwhen Ġa Ġstream er Ġchanges . ĊĠĠĠĠĠĠĠ Ġthe Ġidea Ġis Ġto Ġfetch Ġthe Ġqueue Ġwhen Ġa Ġstream er Ġchanges Ġ( pot entially ĠH any uu ), Ġand Ġat Ġstartup . ĊĠĠĠĠĠĠĠ ĠThe ĠLast ĠPlay ed Ġis Ġonly Ġfetched Ġif Ġit 's Ġempty Ġ( so , Ġonly Ġat Ġstartup ), Ġnot Ġwhen Ġa Ġstream er Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit Api () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ: Ġ( parameter : ĠAny ?) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠJSONObject ( it Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . has (" tracks ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Api ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Song Backup . copy ( current Song ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Last Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Queue Updated . value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Lp Updated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Initialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcom . rst l ss . app . Async ( scrape , Ġpost ) Ġ// WARNING : ĠR STL SS ĠDO ES N ' T ĠHAVE ĠANY ĠAPI . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Api ( is Comp ens ating Latency : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpost : Ġ( parameter : ĠAny ?) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠJSONObject ( it Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . isNull (" tracks ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Api ( result , Ġis Comp ens ating Latency ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcom . rst l ss . app . Async ( scrape , Ġpost ) Ġ// WARNING : ĠR STL SS ĠDO ES N ' T ĠHAVE ĠANY ĠAPI . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Song ( song JSON : ĠJSONObject ) Ġ: ĠSong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsong Ġ= ĠSong () ĊĠĠĠĠĠĠĠ Ġsong . setTitle Artist ( song JSON . getString (" name ")) ĊĠĠĠĠĠĠĠ Ġsong . startTime . value Ġ= Ġget Timestamp ( song JSON . getString (" starts ")) ĊĠĠĠĠĠĠĠ Ġsong . stop Time . value Ġ= Ġget Timestamp ( song JSON . getString (" ends ")) ĊĠĠĠĠĠĠĠ Ġsong . type . value Ġ= Ġ 0 Ġ// Ġonly Ġused Ġfor ĠR / a / dio ĊĠĠĠĠĠĠĠ Ġreturn Ġsong ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĠĠĠ Ġ// Ġ######## ###### ĠQ UE UE Ġ/ ĠLP ĠFUNCTIONS Ġ######## ###### ĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĊĠĠĠ Ġfun Ġupdate Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġqueue . toString ()) ĊĠĠĠĠĠĠĠ Ġfetch Last Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Lp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnote Ġ: Ġlp Ġis Ġempty Ġat Ġinitialization . ĠThis Ġcheck Ġwas Ġneeded Ġwhen Ġwe Ġused Ġthe ĠR / a / dio ĠAPI . ĊĠĠĠĠĠĠĠ Ġ// if Ġ( lp . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠSong () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn . copy ( current Song Backup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Song : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Song Array . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Song Ġ= Ġis Song Ġ&& Ġ! n . toString (). contains ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . title . value Ġ!= Ġno Connection Value Ġ&& Ġn Ġ!= ĠSong ( stream Down Value ) Ġ&& Ġis Song ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlp . add ( 0 , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Song Backup . copy ( current Song ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Lp Updated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġplayer Store Tag Ġ+ Ġ Ġlp . toString ()) ĊĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġfetch Last Request () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġis Queue Updated . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsleep Sc rape : Ġ( Any ?) Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġwe Ġcan Ġmax imize Ġour Ġch ances Ġto Ġretrieve Ġthe Ġlast Ġqueued Ġsong Ġby Ġspecifically Ġwaiting Ġfor Ġthe Ġnumber Ġof Ġseconds Ġwe Ġmeasure Ġbetween ĠI CY Ġmetadata Ġand ĠAPI Ġchange . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġwe Ġadd Ġ 2 Ġseconds Ġjust Ġto Ġget Ġa Ġhigher Ġprobability Ġthat Ġthe ĠAPI Ġhas Ġcorrectly Ġupdated . Ġ( the Ġlatency Ġcomp ens ator Ġcan Ġhave Ġa Ġj itter Ġof Ġ 1 Ġsecond Ġusually ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf , Ġagainst Ġall Ġodd s , Ġthe ĠAPI Ġhasn 't Ġupdated Ġyet , Ġwe Ġwill Ġretry Ġin Ġthe Ġsame Ġamount Ġof Ġseconds . ĠSo Ġwe 'll Ġhave Ġthe Ġdata Ġanyway . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġway Ġto Ġfetch Ġat Ġthe Ġmost Ġprob able Ġtime Ġis Ġa Ġgood Ġcomp romise Ġbetween Ġfetch Ġspeed Ġand Ġfetch Ġfrequency ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWe Ġdon 't Ġfetch Ġtoo Ġoften , Ġand Ġwe Ġstart Ġto Ġfetch Ġat Ġthe Ġmost Ġ* prob able * Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthere 's Ġno Ġlatency Comp ens ator Ġmeasured Ġyet , Ġwe Ġonly Ġwait Ġfor Ġ 3 Ġseconds . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthe Ġsong Ġis Ġthe Ġsame , Ġit Ġwill Ġbe Ġcalled Ġagain . Ġ 3 Ġseconds Ġis Ġa Ġgood Ġcomp romise Ġbetween Ġspeed Ġand Ġfrequency : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġmight Ġbe Ġcalled Ġtwice , Ġrare ly Ġ 3 Ġtimes , Ġand Ġit 's Ġonly Ġthe Ġ 2 Ġfirst Ġsongs Ġ; Ġafter Ġthese , Ġthe Ġlatency Comp ens ator Ġis Ġset Ġto Ġfetch Ġat Ġthe Ġmost Ġprob able Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsleep Time : ĠLong Ġ= Ġif Ġ( latency Comp ens ator Ġ> Ġ 0 ) Ġlatency Comp ens ator Ġ+ Ġ 2 0 0 0 Ġelse Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( sleep Time ) Ġ// Ġwe Ġwait Ġa Ġbit Ġ( 1 0 s ) Ġfor Ġthe ĠAPI Ġto Ġget Ġupdated Ġon ĠR / a / dio Ġside ! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( url To Sc rape ). read Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpost : Ġ( parameter : ĠAny ?) Ġ-> ĠUnit ĊĊĠĠĠĠĠĠĠ Ġfun Ġpost Fun ( result : ĠJSONObject ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . has (" tracks ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Main Ġ= Ġresult . getJSONObject (" tracks ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( res Main . has (" is af k stream ") Ġ&& Ġ! res Main . getBoolean (" is af k stream ")) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . clear () Ġ// we 're Ġnot Ġrequesting Ġanything Ġanymore . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Queue Updated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( res Main . has (" is af k stream ") Ġ&& Ġres Main . getBoolean (" is af k stream ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Api () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Main . has (" next ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue JSON Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Main . getJSONObject (" next ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġextract Song ( queue JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . isNotEmpty () Ġ&& Ġ( t Ġ== Ġqueue . last () Ġ|| Ġt Ġ== Ġcurrent Song ) Ġ&& Ġis Queue Updated . value Ġ== Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġplayer Store Tag Ġ+ Ġ Ġ" Song Ġalready Ġin Ġthere : Ġ$ t \ n Queue :$ queue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom . rst l ss . app . Async ( sleep Sc rape , Ġpost ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . remove ( queue . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( queue . size , Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// [ REMOVE ĠLOG ĠCALL S ] Log . d ( tag , Ġplayer Store Tag Ġ+ Ġ Ġ" added Ġlast Ġqueue Ġsong : Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Queue Updated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// ĠF UU U CK ĠIT ĠW AS ĠCALL ING ĠTHE ĠAS Y NC ĠONE ĠMO RE ĠTIME ĠAFTER WAR DS Ġ! ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpost Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠJSONObject ( it Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠThe Ġgoal Ġis Ġto Ġpass Ġthe Ġresult Ġto Ġa Ġfunction Ġthat Ġwill Ġprocess Ġit Ġ( post Fun ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġmagic Ġtrick Ġis , Ġunder Ġcircumstances , Ġthe Ġlast Ġqueue Ġsong Ġmight Ġnot Ġhave Ġbeen Ġupdated Ġyet Ġwhen Ġwe Ġfetch Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSo Ġif Ġthis Ġis Ġdetected Ġ==> Ġif Ġ( t Ġ== Ġqueue . last () Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen Ġthe Ġfunction Ġre - schedule Ġan ĠAsync ( sleep Sc rape , Ġpost ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTo Ġdo Ġthat , Ġthe Ġ" post " Ġmust Ġbe Ġdefined ĠBE FORE Ġthe Ġfunction , Ġbut Ġthe Ġfunction Ġmust Ġbe Ġdefined ĠBE FORE Ġthe Ġ" post " Ġvalue . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSo ĠI Ġdeclare Ġ" post " Ġas Ġlateinit Ġvar , Ġdefine Ġthe Ġfunction , Ġthen Ġdefine Ġthe Ġ" post " Ġthat Ġcalls Ġthe Ġfunction . ĠIT ĠSHO ULD ĠWORK . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Fun ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcom . rst l ss . app . Async ( sleep Sc rape , Ġpost ) Ġ// ĠWARNING : ĠR STL SS ĠDO ES N ' T ĠHAVE ĠANY ĠAPI ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĠĠĠ Ġ// Ġ######## ###### ĠP ICT URE ĠFUNCTIONS Ġ ################ # ĊĠĠĠ Ġ// Ġ################################ ################ ## ĊĊĠĠĠ Ġfun Ġinit Picture ( c : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstream er Picture . value Ġ= ĠBitmap Factory . decode Resource ( c . resources , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . logo _ padded ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġplayer Store Tag Ġ= Ġ" ==== Player Store === =" ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Store () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ