package Ġcom . app . nik hil . cor out ined own loader . utils Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . appcompat . widget . AppCompat Button Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . app . nik hil . cor out ined own loader . R . layout Ċ import Ġcom . app . nik hil . cor out ined own loader . R . string Ċ import Ġcom . app . nik hil . cor out ined own loader . download utils . Download Manager Ċ import Ġcom . app . nik hil . cor out ined own loader . models . Download Item Ċ import Ġcom . app . nik hil . cor out ined own loader . models . Download Progress Ċ import Ġcom . app . nik hil . cor out ined own loader . models . Download State . COMPLETED Ċ import Ġcom . app . nik hil . cor out ined own loader . models . Download State . PA USED Ċ import Ġcom . app . nik hil . cor out ined own loader . utils . Download Item Recycler Adapter . Download Item ViewHolder Ċ import Ġkotlinx . android . synt hetic . main . layout _ download _ item . view .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠDownload Item Recycler Adapter ( ĊĠ Ġprivate Ġval Ġdownload Items : ĠArrayList < Download Item >, ĊĠ Ġprivate Ġval Ġdownload Manager : ĠDownload Manager Ċ ) Ġ: ĠRecyclerView . Adapter < Download Item ViewHolder >() Ġ{ ĊĊĠ Ġprivate Ġval Ġmain Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĠ Ġprivate Ġval Ġitem Map : ĠMutable Map < String , ĠDownload Item > Ġ= Ġmutable Map Of () ĊĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( ĊĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠ Ġview Type : ĠInt ĊĠ Ġ): ĠDownload Item ViewHolder Ġ{ ĊĠĠĠ Ġreturn ĠDownload Item ViewHolder ( ĊĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ). inflate ( ĊĠĠĠĠĠĠĠ Ġlayout . layout _ download _ item , Ġparent , Ġfalse ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget Download Progress List (): ĠList < Download Item > Ġ{ ĊĠĠĠ Ġreturn Ġitem Map . values . toList () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġdownload Items . size ĊĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( ĊĠĠĠ Ġholder : ĠDownload Item ViewHolder , ĊĠĠĠ Ġposition : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġholder . bind ( download Items [ position ]) ĊĠ Ġ} ĊĊĠ Ġfun Ġadd Item ( download Item : ĠDownload Item ) Ġ{ ĊĠĠĠ Ġdownload Items . add ( download Item ) ĊĠĠĠ Ġitem Map [ download Item . url ] Ġ= Ġdownload Item ĊĠĠĠ Ġnotify DataSet Changed () ĊĠ Ġ} ĊĊĠ Ġfun Ġadd All ( items : ĠList < Download Item >) Ġ{ ĊĠĠĠ Ġdownload Items . addAll ( items ) ĊĠĠĠ Ġfor Ġ( item : ĠDownload Item Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠ Ġitem Map [ item . url ] Ġ= Ġitem ĊĠĠĠ Ġ} ĊĠĠĠ Ġnotify DataSet Changed () ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠDownload Item ViewHolder ( private Ġval Ġitem : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item ) Ġ{ ĊĠĠĠ Ġfun Ġbind ( download Item : ĠDownload Item ) Ġ{ ĊĠĠĠĠĠ Ġitem . download ItemName . text Ġ= Ġdownload Item . fileName ĊĠĠĠĠĠ ĠsetData ( download Item . download Progress ) ĊĠĠĠĠĠ Ġset Pause Resume Listener ( download Item . url ) ĊĠĠĠĠĠ Ġconsume Download Progress Channel ( download Item . url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġprivate Ġfun ĠsetData ( download Progress : ĠDownload Progress ) Ġ{ ĊĠĠĠĠĠ Ġwith ( download Progress ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem . download Item Progress . text Ġ= Ġ"$ percentage Display %" ĊĠĠĠĠĠĠĠ Ġitem . download Size Status . text Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġ"${ mega Bytes Downloaded } MB Ġ/ Ġ${ total Me ga Bytes } MB " ĊĠĠĠĠĠĠĠ Ġitem . download Item State . text Ġ= Ġstate . toString () ĊĠĠĠĠĠĠĠ Ġitem . pause Resume Button . text Ġ= Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPA USED Ġ-> Ġitem . context . getText ( string . resume ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġitem . context . getText ( string . pause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsume Download Progress Channel ( url : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġdownload Manager . on Progress Changed ( url ) Ġ{ Ġupdate Download Progress ( url , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġprivate Ġfun Ġupdate Download Progress ( ĊĠĠĠĠĠ Ġurl : ĠString , ĊĠĠĠĠĠ Ġprogress : ĠDownload Progress ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Map [ url ]?. download Progress Ġ= Ġprogress ĊĠĠĠĠĠĠĠ ĠsetData ( progress ) ĊĠĠĠĠĠĠĠ Ġif Ġ( progress . state Ġ== ĠCOMP LETED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġitem . pause Resume Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Pause Resume Listener ( url : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġitem . pause Resume Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġ( it Ġas ĠAppCompat Button ). let Ġ{ Ġbutton Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( button . text . toString () Ġ== Ġit . context . getString ( string . pause ) Ġ&& Ġitem Map [ url ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Manager . pause ( item Map [ url ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . text Ġ= Ġit . context . getString ( string . resume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . text Ġ= Ġit . context . getString ( string . pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Manager . download ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Download Progress Channel ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . download Item State . text Ġ= Ġitem Map [ url ]?. download Progress !!. state . toString () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }