package Ġcom . d ario br ux . pokemon . app . ui . main Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . d ario br ux . pokemon . app . data . local . Pokemon Dao Ċ import Ġcom . d ario br ux . pokemon . app . data . models . Contact Data Ċ import Ġcom . d ario br ux . pokemon . app . data . models . Data Info Ċ import Ġcom . d ario br ux . pokemon . app . data . remote . Pokemon Api Helper Ċ import Ġcom . d ario br ux . pokemon . app . other . Constants Ċ import Ġcom . d ario br ux . pokemon . app . other . Resource Ċ import Ġcom . d ario br ux . pokemon . app . other . extensions . getId From Url Ċ import Ġcom . d ario br ux . pokemon . app . other . extensions . to Contact Data Ċ import Ġcom . github . tam ir 7 . contacts . Contacts Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠD ario ĠB ru z ze se Ġon Ġ 2 2 / 1 0 / 2 0 2 0 . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġthe Ġrepository Ġthat Ġhandles Ġthe Ġcommunication Ċ Ġ* Ġbetween Ġthe Ġrest ful Ġapi Ġand Ġthe Ġdatabase . Ċ Ġ* Ċ Ġ*/ Ċ class ĠMain Repository Ġ@ Inject Ġconstructor ( private Ġval Ġpokemon Api Helper : ĠPokemon Api Helper , Ġprivate Ġval Ġpokemon Dao : ĠPokemon Dao ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIncrement Ġit Ġto Ġdisplay Ġthe Ġnext Ġset Ġof Ġitems . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġoffset Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMax Ġnumber Ġof Ġitems Ġto Ġdownload Ġin Ġonce . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlimit Ġ= Ġ 1 0 5 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġthe Ġoffset Ġto Ġstart Ġfrom Ġthe Ġfirst Ġpokemon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset Offset () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġlist Ġof Ġthe Ġpokemon Ġfrom Ġa Ġrest ful Ġapi Ġor Ġfrom Ġthe Ġdatabase . ĊĠĠĠĠ Ġ* ĠRead Ġfirst Ġthe Ġlocal Ġpokemon Ġlist Ġfrom Ġdb . ĠIf Ġthis Ġlist Ġis Ġnot Ġempty , ĊĠĠĠĠ Ġ* Ġnotify Ġthat Ġsome Ġpokemon Ġare Ġavailable . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġlocal Ġlist Ġis Ġempty , Ġdownload Ġthe Ġpokemon Ġfrom Ġthe Ġapi . ĠThen , ĊĠĠĠĠ Ġ* Ġstore Ġthis Ġlist Ġin Ġthe Ġdatabase . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ Data Info ] Ġobject Ġmapped Ġinto Ġa Ġ[ Resource ], Ġinside Ġa Ġ[ LiveData ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Pokemon (): ĠLive Data < Resource < Data Info >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable LiveData : ĠMutable LiveData < Resource < Data Info >> Ġ= ĠMutable LiveData () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġruns Ġinto Ġa ĠCor outine ĠScope ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdata Info : ĠData Info ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġfirst Ġthe Ġlocal Ġpokemon Ġlist Ġfrom Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Pokemon List Ġ= Ġpokemon Dao . get Pokemon List ( offset , Ġlimit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis Ġnot Ġempty , Ġread Ġand Ġpass Ġthe Ġdata Ġretrieved Ġfrom Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! local Pokemon List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Read Ġthe Ġpokemon Ġlist Ġfrom Ġthe Ġdatabase .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Info Ġ= ĠData Info (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon List Ġ= Ġlocal Pokemon List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Trying Ġto Ġretrieve Ġthe Ġpokemon Ġlist Ġfrom Ġurl .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġdatabase Ġis Ġempty , Ġdownload Ġthe Ġpokemon Ġfrom Ġthe Ġonline ĠAPI Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstore Ġthem Ġin Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Api Helper . get Pokemon ( offset , Ġlimit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Info Ġ= Ġif Ġ( it . status Ġ== ĠResource . Status . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġin Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Info ?. pokemon List ?. let Ġ{ Ġpokemon List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon List . forEach Ġ{ Ġpokemon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon . num Ġ= Ġpokemon . url ?. getId From Url () Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon . url Picture Ġ= ĠString . format ( Constants . BASE _ PI CTURE _ URL , Ġpokemon . num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Insert Ġthe Ġpokemon Ġlist Ġin Ġthe Ġdatabase .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Dao . insert Pokemon List ( pokemon List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" Problems Ġwhile Ġretrieve Ġthe Ġpokemon Ġlist .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinish ĠCor outine Ġand Ġpass Ġon Ġthe ĠMain ĠThread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable LiveData . value Ġ= ĠResource ( Resource . Status . SUCCESS , Ġdata Info , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Info ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutable LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġcontacts Ġfrom Ġan Ġoffset , Ġshowing Ġalways Ġa Ġtot Ġof Ġitems . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Contact List (): ĠList < Contact Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContact s . getQuery (). find (). toList (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Contact Data () ĊĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . displayName . isNull OrEmpty () Ġ&& Ġ! it . phone Numbers . isNull OrEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }