package Ġcom . ar j uj . poke facts . ui . common Ċ Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . palette . graphics . Palette Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . ar j uj . domain . model . Pokemon Ċ import Ġcom . ar j uj . poke facts . R Ċ import Ġcom . ar j uj . poke facts . databinding . Pokemon Item Binding Ċ import Ġcom . ar j uj . poke facts . databinding . Sh im mer Progress Animation Binding Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . load . DataSource Ċ import Ġcom . bump tech . glide . load . engine . G lide Exception Ċ import Ġcom . bump tech . glide . request . RequestListener Ċ import Ġcom . bump tech . glide . request . target . Target Ċ Ċ class ĠPo ke RecyclerView Adapter ( ĊĠĠĠ Ġprivate Ġval Ġclick Listener : Ġ( Pokemon ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġfavorite Button ClickListener : Ġ( Pokemon , ĠBoolean ) Ġ-> ĠUnit , ĊĠĠĠ Ġvar Ġshow Loading Animation : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġis Pokemon Favorite : Ġ( Int ) Ġ-> ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġlast Position : ĠInt ? Ċ ) Ġ: ĠList Adapter < Pokemon , ĠPo ke RecyclerView Adapter . Pokemon ViewHolder >( REPO _ COMP AR ATOR ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠPokemon ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( view Type Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Binding Ġ= ĠPokemon Item Binding . inflate ( LayoutInflater . from ( parent . context ), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPokemon ViewHolder ( item Binding ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( view Type Ġ== Ġ 2 Ġ|| Ġview Type Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Binding Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSh im mer Progress Animation Binding . inflate ( LayoutInflater . from ( parent . context ), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPokemon ViewHolder ( item Binding ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPokemon ViewHolder ( view !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠPokemon ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( holder . item ViewType Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . layout Params . height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( holder . item ViewType Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getItem ( position ) Ġ!= Ġnull ) Ġholder . bind ( getItem ( position )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠPokemon ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġpokemon Item Binding : ĠPokemon Item Binding ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġshim mer Progress Animation Binding : ĠSh im mer Progress Animation Binding ĊĊĠĠĠĠĠĠĠ Ġconstructor ( item Binding : ĠPokemon Item Binding ) Ġ: Ġthis ( item Binding . root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pokemon Item Binding Ġ= Ġitem Binding ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconstructor ( item Binding : ĠSh im mer Progress Animation Binding ) Ġ: Ġthis ( item Binding . root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shim mer Progress Animation Binding Ġ= Ġitem Binding ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdom inant Color : ĠInt Ġ= ĠColor . GRAY ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( pokemon : ĠPokemon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( pokemon Item Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pokemon . dom inant _ color Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . set Card BackgroundColor ( pokemon . dom inant _ color !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . set Card BackgroundColor ( dom inant Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Pokemon Images ( pokemon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Button . isChecked Ġ= Ġis Pokemon Favorite ( pokemon . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Button . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( favorite Button . is Pressed ) Ġfavorite Button ClickListener ( pokemon , Ġ! isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Number . text Ġ= Ġpokemon Name . context . getString ( R . string . pokemon _ number _ format , Ġpokemon . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon . name Ġ= Ġpokemon . name . replace First Char Ġ{ Ġit . uppercase () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Name . text Ġ= Ġpokemon . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoke Info Type One . text Ġ= Ġpokemon . types [ 0 ]. type . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pokemon . types . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoke Info Type Two . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoke Info Type Two . text Ġ= Ġpokemon . types [ 1 ]. type . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġpoke Info Type Two . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon . dom inant _ color Ġ= Ġdom inant Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener ( pokemon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Pokemon Images ( pokemon : ĠPokemon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( item View . context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Bitmap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( pokemon . sprites . other . official _ art work . front _ default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. listener ( object Ġ: ĠRequest Listener < Bitmap > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe : ĠG lide Exception ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget : ĠTarget < Bitmap > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Resource : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resource Ready ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource : ĠBitmap ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget : ĠTarget < Bitmap > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource : ĠDataSource ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Resource : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bg Color ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( pokemon Item Binding . pokemon Image ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Bg Color ( resource : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPalette . Builder ( resource ). generate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ Ġpalette Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pokemon Item Binding . pokemon Image . context . resources ?. configuration ?. ui Mode ?. and ( Configuration . UI _ MODE _ N IGHT _ MASK )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . UI _ MODE _ N IGHT _ YES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdom inant Color Ġ= Ġpalette . get Mut ed Color ( Color . GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . UI _ MODE _ N IGHT _ NO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdom inant Color Ġ= Ġpalette . get Light Mut ed Color ( Color . GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Item Binding . card View . set Card BackgroundColor ( dom inant Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( last Position Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlast Position ) Ġ 3 Ġelse Ġif Ġ( position Ġ== Ġcurrent List . size ) Ġ 2 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġcurrent List . size ) Ġ 2 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( super . getItem Count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Count () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( show Loading Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Count () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRE PO _ COMP AR ATOR Ġ= Ġobject Ġ: ĠDiff Util . Item Callback < Pokemon >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠPokemon , Ġnew Item : ĠPokemon ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . id Ġ== Ġnew Item . id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠPokemon , Ġnew Item : ĠPokemon ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ