package Ġcom . app . nik hil . cor out ined own loader . download utils Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . IB inder Ċ import Ġcom . app . nik hil . cor out ined own loader . models . Download Item Ċ import Ġcom . app . nik hil . cor out ined own loader . utils . Notification Utils Ċ import Ġdagger . android . D agger Service Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . channels . consume Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠDownload Service Ġ: ĠD agger Service () Ġ{ ĊĊĠ Ġprivate Ġval Ġservice Scope Ġby Ġlazy Ġ{ ĠCor outine Scope ( Dispatch ers . IO ) Ġ} ĊĠ Ġprivate Ġval Ġmain Scope Ġby Ġlazy Ġ{ ĠCor outine Scope ( Dispatch ers . Main ) Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ PROGRESS Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ ID Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ MESSAGE Ġ= Ġ" Download ĠManager Ġactive ." ĊĠ Ġ} ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġdownload Manager : ĠDownload Manager ĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġnotification Utils : ĠNotification Utils ĊĊĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠ Ġsuper . onCreate () ĊĠĠĠ Ġstart Foreground ( NOTIFICATION _ ID , Ġnotification Utils . create Notification ( ĠNOT IFICATION _ MESSAGE )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonStart Command ( ĊĠĠĠ Ġintent : ĠIntent ?, ĊĠĠĠ Ġflags : ĠInt , ĊĠĠĠ Ġstart Id : ĠInt ĊĠ Ġ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bind ( p 0 : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠ Ġfun Ġdownload ( url : ĠString ): ĠDownload Item Ġ{ ĊĠĠĠ Ġval Ġdownload Item Ġ= Ġdownload Manager . download ( url ) ĊĠĠĠ Ġval Ġreceive Channel Ġ= Ġdownload Item . channel . open Subscription () ĊĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠ Ġreceive Channel . consume Each Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . percentage Ġ% Ġ 2 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġnotification Utils . getSimple Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress ( MAX _ PROGRESS , Ġit . percentage , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . percentage Ġ== ĠMAX _ PROGRESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title (" Downloading ") ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title (" Downloaded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Channel . cancel () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġnotification Utils . show Notification ( builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdownload Item ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ Ġdownload Manager . dispose All () ĊĠĠĠ Ġservice Scope . cancel () ĊĠĠĠ Ġsuper . on Destroy () ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠDownload Service Binder Ġ: ĠB inder () Ġ{ ĊĠĠĠ Ġfun Ġget Service (): ĠDownload Service Ġ= Ġthis @ Download Service ĊĠ Ġ} Ċ }