package Ġcom . sm ar Tech . assignment . main . view Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . sm ar Tech . assignment . main . viewModel . MainActivity ViewModel Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . view . View .* Ċ import Ġcom . sm ar Tech . assignment . R Ċ import Ġcom . sm ar Tech . assignment . broadcast Re ceiv ers . Connection State Ċ import Ġcom . sm ar Tech . assignment . broadcast Re ceiv ers . Connection State Broad Cast Receiver Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . sm ar Tech . assignment . main . model . GitHub Repo Ċ import Ġcom . sm ar Tech . assignment . main . repository . db . Repos Database Ċ import Ġcom . sm ar Tech . assignment . main . view . repos Recycler . GitHub Repos Paged Adapter Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġorg . jetbrains . ank o . ui Thread Ċ import Ġjava . lang . Thread . sleep ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠMainActivity ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠGitHub Repos Paged Adapter ĊĠĠĠ Ġprivate Ġvar Ġis First Load Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġconnection State Receiver Ġ= ĠConnection State Broad Cast Receiver () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoffline Sn ackBar : ĠSn ackbar ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġget ViewModel () ĊĠĠĠĠĠĠĠ Ġupdate Repos Adapter () ĊĠĠĠĠĠĠĠ Ġobserve Repos Changes () ĊĠĠĠĠĠĠĠ Ġobserve Loading Errors () ĊĠĠĠĠĠĠĠ Ġobserve Loading () ĊĠĠĠĠĠĠĠ Ġobserve Connection State Changes () ĊĠĠĠĠĠĠĠ Ġregister Connection State Receiver () ĊĠĠĠĠĠĠĠ Ġcreate Sn ackBar () ĊĠĠĠĠĠĠĠ Ġrefresh Connection State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Loading () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . observable Is Loading . observe ( this , ĠObserver Ġ{ ĠisLoading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Repos Loader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Repos Loader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Loading Errors () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . observable Has Error . observe ( this , ĠObserver Ġ{ ĠhasError Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Loading Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Sn ackBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffline Sn ackBar Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord inator Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . no _ up _ to _ date ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Receiver . refresh State ( this @ MainActivity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Connection State Changes () Ġ{ ĊĠĠĠĠĠĠĠ ĠConnection State Broad Cast Receiver . connection State . observe ( this , ĠObserver Ġ{ Ġconnection State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection State Ġ== ĠConnection State . Offline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Go ing Offline () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Being Online () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Being Online () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( offline Sn ackBar . is Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffline Sn ackBar . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! already Have Data ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis First Load Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Repos Loader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Repos () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretry Loading Repos () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . retry Loading Repos () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Go ing Offline () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( already Have Data ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Offline Sn ackBar () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Offline Message () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Offline Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepos RecyclerView ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġextras Container ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġoffline Message Container ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġretry Container . visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Offline Sn ackBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffline Sn ackBar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġalready Have Data (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġadapter . item Count Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Connection State Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Filter Ġ= ĠIntent Filter (" android . net . conn . CONNECT IVITY _ CHANGE ") ĊĠĠĠĠĠĠĠ Ġregister Receiver ( connection State Receiver , Ġintent Filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( connection State Receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Connection State () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Receiver . refresh State ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Repos Changes () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . observable Repos . observe ( this , ĠObserver Ġ{ Ġrepos Paged List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( repos Paged List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( repos Paged List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is First Load ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Repos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Load Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Repos Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠGitHub Repos Paged Adapter () ĊĠĠĠĠĠĠĠ Ġrepos RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ViewModel (): ĠMainActivity ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠViewModel Providers . of ( this , ViewModel Provider . New Instance Factory ()). get ( MainActivity ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Repos Loader () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffline Message Container ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġextras Container ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġretry Container ?. visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Repos Loader () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffline Message Container ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġextras Container ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġretry Container ?. visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffline Message Container ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ ĠprogressBar ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġretry Container ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġextras Container ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġretry Button ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Loading Repos () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġretry Container ?. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġextras Container ?. visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Repos () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepos RecyclerView ?. visibility Ġ= ĠVIS IBLE ĊĠĠĠ Ġ} Ċ }