package Ġcom . br illi ances oft . m ush af . framework Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Keep Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġcom . br illi ances oft . m ush af . R Ċ import Ġcom . br illi ances oft . m ush af . framework . data . repo . Repository Ċ import Ġcom . br illi ances oft . m ush af . model . Downloading State Ċ import Ġcom . br illi ances oft . m ush af . model . Edition Ċ import Ġcom . br illi ances oft . m ush af . ui . common . shared Component . M ush af Application Ċ import Ġcom . br illi ances oft . m ush af . ui . library . manage . Manage Library Activity Ċ import Ġcom . br illi ances oft . m ush af . utils . extensions . bundle Of Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġjavax . inject . Inject Ċ Ċ @ Keep Ċ class ĠDownload Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġrepository : ĠRepository ĊĊĠĠĠ Ġprivate Ġvar Ġloading Disposable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġerror Disposable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotify Builder : ĠNotification Compat . Builder ĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠSuper visor Job () ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( Dispatch ers . IO Ġ+ Ġjob ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġedition : ĠEdition ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdownloading State : ĠDownloading State ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠM ush af Application . app Component . inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Progress Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Suppress (" EXPERIMENT AL _ API _ USAGE ") ĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . extras ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownloading State Ġ= ĠJson . decode FromString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownloading State . serializer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( DOWNLOAD ING _ STATE _ KEY ) Ġ?: Ġthrow Ġ ĠIllegal AccessException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġedition Ġ= ĠJson . decode FromString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdition . serializer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ED ITION _ KEY ) Ġ?: Ġthrow Ġ ĠIllegal AccessException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcreate Notification () ĊĠĠĠĠĠĠĠ Ġstart Download () ĊĠĠĠĠĠĠĠ Ġreturn ĠService . START _ STICK Y ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġstart Download () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġis Downloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġdownloading State . stop Point Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . download Ay at ( edition . identifier , Ġcurrent Progress ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġerror Disposable Ġ= Ġrepository . error Stream . filter Ġ{ Ġit Ġ!= Ġ"" Ġ}. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġnotification Manager : ĠNotification Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Notification () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠIntent ( application Context , ĠManage Library Activity :: class . java ). run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( bundle Of ( Manage Library Activity . DOWNLOAD _ ED ITION _ KEY Ġto Ġedition . identifier )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotify Builder Ġ= ĠNotification Compat . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ ID ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( edition . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( edition . language ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Big TextStyle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. big Text ( edition . identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). set O ngo ing ( true ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Builder . set Small Icon ( R . drawable . ic _ download ing _ notification ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġthe Ġchannel Ġwith Ġthe Ġsystem ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ NAME , Ġimportance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotify Builder . set Progress ( PROGRESS _ MAX , Ġcurrent Progress , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġnotification Id Ġis Ġa Ġunique Ġint Ġfor Ġeach Ġnotification Ġthat Ġyou Ġmust Ġdefine ĊĠĠĠĠĠĠĠ Ġstart Foreground ( notification Id , Ġnotify Builder . build ()) ĊĠĠĠĠĠĠĠ Ġactive Downloading Progress ( notify Builder ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġprivate Ġfun Ġactive Downloading Progress ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Disposable Ġ= Ġrepository . loading Stream . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Progress Ġ< ĠPROG RESS _ MAX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Progress ( PROGRESS _ MAX , Ġcurrent Progress , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnotification Id Ġis Ġa Ġunique Ġint Ġfor Ġeach Ġnotification Ġthat Ġyou Ġmust Ġdefine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( notification Id , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( getString ( R . string . download _ completed )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġrelease Process () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Downloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= ĠgetString ( R . string . cancelled )) Ġshow Toast ( message ) ĊĠĠĠĠĠĠĠ Ġnotification Manager . cancel ( notification Id ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġrelease Process () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġjob . cancel Children () ĊĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġshow Toast ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġmsg , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Downloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHAN NEL _ ID Ġ= Ġ" 1 2 3 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHAN NEL _ NAME Ġ= Ġ" DOWNLOAD _ SERVICE " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġnotification Id Ġ= ĠR . string . app _ name Ġ+ ĠR . string . download ing ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPROG RESS _ MAX Ġ= Ġ 3 0 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDOWN LOADING _ STATE _ KEY Ġ= Ġ" download ing State " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE DITION _ KEY Ġ= Ġ" edition _ key " ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( context : ĠContext , Ġedition : ĠEdition , Ġdownloading State : ĠDownloading State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Download State Ġ= ĠJson . encode ToString ( Downloading State . serializer (), Ġdownloading State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Edition Ġ= ĠJson . encode ToString ( Edition . serializer (), Ġedition ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠDownload Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . put Extras ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOWN LOADING _ STATE _ KEY Ġto Ġjson Download State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE DITION _ KEY Ġto Ġjson Edition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ