package Ġeu . kan ade . t ach iy omi . data . download Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . core . content . edit Ċ import Ġeu . kan ade . t ach iy omi . anime source . An ime Source Manager Ċ import Ġeu . kan ade . t ach iy omi . anime source . online . An ime Http Source Ċ import Ġeu . kan ade . t ach iy omi . data . database . An ime Database Helper Ċ import Ġeu . kan ade . t ach iy omi . data . database . models . An ime Ċ import Ġeu . kan ade . t ach iy omi . data . download . model . An ime Download Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġused Ġto Ġpersist Ġactive Ġdownloads Ġacross Ġapplication Ġrestart s . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext Ġthe Ġapplication Ġcontext . Ċ Ġ*/ Ċ class ĠAn ime Download Store ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġsource Manager : ĠAn ime Source Manager , Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPreference Ġfile Ġwhere Ġactive Ġdownloads Ġare Ġstored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpreferences Ġ= Ġcontext . get SharedPreferences (" active _ downloads ", ĠContext . MODE _ PRIVATE ) ĊĊĠĠĠ Ġprivate Ġval Ġjson : ĠJson Ġby Ġinject Lazy () ĊĠĠĠ Ġprivate Ġval Ġdb : ĠAn ime Database Helper Ġby Ġinject Lazy () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCounter Ġused Ġto Ġkeep Ġthe Ġqueue Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcounter Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġlist Ġof Ġdownloads Ġto Ġthe Ġstore . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdownloads Ġthe Ġlist Ġof Ġdownloads Ġto Ġadd . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd All ( downloads : ĠList < An ime Download >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownloads . forEach Ġ{ Ġput String ( getKey ( it ), Ġserialize ( it )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġa Ġdownload Ġfrom Ġthe Ġstore . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdownload Ġthe Ġdownload Ġto Ġremove . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( download : ĠAn ime Download ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( getKey ( download )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġthe Ġdownloads Ġfrom Ġthe Ġstore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġpreference 's Ġkey Ġfor Ġthe Ġgiven Ġdownload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdownload Ġthe Ġdownload . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetKey ( download : ĠAn ime Download ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdownload . episode . id !!. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġdownloads Ġto Ġrestore . ĠIt Ġshould Ġbe Ġcalled Ġin Ġa Ġbackground Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestore (): ĠList < An ime Download > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobjs Ġ= Ġpreferences . all ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . value Ġas ? ĠString Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġdeserialize ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . order Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdownloads Ġ= Ġmutable ListOf < An ime Download >() ĊĠĠĠĠĠĠĠ Ġif Ġ( objs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached An ime Ġ= Ġmutable Map Of < Long , ĠAn ime ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( anime Id , Ġchapter Id ) Ġin Ġobjs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan ime Ġ= Ġcached An ime . get Or Put ( anime Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . get An ime ( anime Id ). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġsource Manager . get ( anime . source ) Ġas ? ĠAn ime Http Source Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepisode Ġ= Ġdb . get Episode ( chapter Id ). execute As Blocking () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownloads . add ( An ime Download ( source , Ġan ime , Ġepisode )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġthe Ġstore , Ġdownloads Ġwill Ġbe Ġadded Ġagain Ġimmediately . ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġreturn Ġdownloads ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġdownload Ġto Ġa Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdownload Ġthe Ġdownload Ġto Ġserialize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġserialize ( download : ĠAn ime Download ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= ĠAn ime Download Object ( download . anime . id !! , Ġdownload . episode . id !! , Ġcounter ++) ĊĠĠĠĠĠĠĠ Ġreturn Ġjson . encode ToString ( obj ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġa Ġdownload Ġfrom Ġa Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstring Ġthe Ġdownload Ġas Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdeserialize ( string : ĠString ): ĠAn ime Download Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . decode FromString < An ime Download Object >( string ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClass Ġused Ġfor Ġdownload Ġserialization ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġan ime Id Ġthe Ġid Ġof Ġthe Ġan ime . ĊĠĠĠĠ Ġ* Ġ@ param Ġchapter Id Ġthe Ġid Ġof Ġthe Ġchapter . ĊĠĠĠĠ Ġ* Ġ@ param Ġorder Ġthe Ġorder Ġof Ġthe Ġdownload Ġin Ġthe Ġqueue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠAn ime Download Object ( val Ġan ime Id : ĠLong , Ġval Ġchapter Id : ĠLong , Ġval Ġorder : ĠInt ) Ċ } Ċ