package Ġcom . mar cod all aba . poke app . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . paging . Experimental Paging Api Ċ import Ġandroidx . paging . Load State Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġcom . mar cod all aba . poke app . data . Pokemon Repository Ċ import Ġcom . mar cod all aba . poke app . databinding . Activity Main Binding Ċ import Ġcom . mar cod all aba . poke app . ui . adapters . Pokemon Adapter Ċ import Ġcom . mar cod all aba . poke app . ui . adapters . Pokemon Load State Adapter Ċ import Ġcom . mar cod all aba . poke app . utils . set Safe OnClickListener Ċ import Ġcom . mar cod all aba . poke app . view models . Pokemon ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ Ċ @ Experimental Cor outines Api Ċ class ĠPokemon List Activity Ġ: ĠAppCompatActivity (), ĠPokemon Adapter . On Pokemon ClickListener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĠĠĠ Ġprivate Ġval Ġpokemon ViewModel : ĠPokemon ViewModel Ġby ĠviewModel () ĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠPokemon Adapter ( this ) ĊĊĠĠĠ Ġprivate Ġvar Ġload Job : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsearch Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Experimental Paging Api ĊĠĠĠ Ġprivate Ġfun Ġload Pokemon () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġcancel Ġthe Ġprevious Ġjob Ġbefore Ġcreating Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠ Ġload Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġload Job Ġ= Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon ViewModel . load Pokemon (). collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Paging Api ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġdiv iders Ġbetween ĠRecyclerView 's Ġrow Ġitems ĊĠĠĠĠĠĠĠ Ġval Ġdecoration Ġ= ĠDiv ider Item Decoration ( this , ĠDiv ider Item Decoration . VERTICAL ) ĊĠĠĠĠĠĠĠ Ġbinding . list . addItem Decoration ( decoration ) ĊĊĠĠĠĠĠĠĠ Ġinit Adapter () ĊĊĠĠĠĠĠĠĠ Ġload Pokemon () ĊĊĠĠĠĠĠĠĠ Ġbinding . retry Button . set Safe OnClickListener Ġ{ Ġadapter . retry () Ġ} ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . list . adapter Ġ= Ġadapter . with Load State Header And Footer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= ĠPokemon Load State Adapter Ġ{ Ġadapter . retry () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Ġ= ĠPokemon Load State Adapter Ġ{ Ġadapter . retry () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadapter . add Load State Listener Ġ{ Ġload State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġloading Ġspinner Ġduring Ġinitial Ġload Ġor Ġrefresh . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . isVisible Ġ= Ġload State . source . refresh Ġis ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġretry Ġstate Ġif Ġinitial Ġload Ġor Ġrefresh Ġfails . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . retry Button . isVisible Ġ= Ġload State . source . refresh Ġis ĠLoad State . Error ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToast Ġon Ġany Ġerror , Ġregardless Ġof Ġwhether Ġit Ġcame Ġfrom ĠRemote Mediator Ġor ĠP aging Source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror State Ġ= Ġload State . source . append Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . source . prepend Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . append Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . prepend Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror State ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ uD 8 3 D \ u DE 2 8 ĠW oo ops Ġ${ it . error }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( pokemon Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġcancel Ġthe Ġprevious Ġjob Ġbefore Ġcreating Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠ Ġsearch Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġsearch Job Ġ= Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpokemon Detail Ġ= Ġpokemon ViewModel . get Pokemon Detail ( pokemon Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pokemon Detail Ġis ĠPokemon Repository . Pokemon Detail Result . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpokemon Bottom Sheet Dialog Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPokemon Bottom Sheet Dialog Fragment ( pokemon Detail Ġ= Ġpokemon Detail . result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Bottom Sheet Dialog Fragment . show ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPokemon Bottom Sheet Dialog Fragment :: class . java . canonical Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( pokemon Detail Ġis ĠPokemon Repository . Pokemon Detail Result . Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Pokemon List Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ uD 8 3 D \ u DE 2 8 ĠW oo ops Ġ${ pokemon Detail . throwable }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠPokemon List Activity :: class . java . simple Name ĊĠĠĠ Ġ} Ċ }