package Ġcom . android . mar vel . ui . characters Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . android . mar vel . R Ċ import Ġcom . android . mar vel . databinding . Characters Fragment Binding Ċ import Ġcom . android . mar vel . domain . models . Character Ċ import Ġcom . android . mar vel . services . util . Character ListAdapter Ċ import Ġcom . android . mar vel . services . util . character List . Character ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠChar acters Fragment : ĠFragment (), ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠChar acters Fragment () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch Term : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠChar acters Fragment Binding ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠCharacter ViewModel Ġby Ġview Models () ĊĠĠĠ Ġvar Ġflag Ġ= Ġ 3 ĊĠĠĠ Ġvar Ġpag inated Value Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠCharacter ListAdapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout Manager : ĠGrid LayoutManager ĊĠĠĠ Ġprivate Ġval Ġtemp List Ġ= Ġarray ListOf < Character >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 1 Ġok ") ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠChar acters Fragment Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġroot : ĠView Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" Deprecated Ġin ĠJava ") ĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠChar acters Fragment Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġbinding . characters RecyclerView ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 2 Ġok ") ĊĠĠĠĠĠĠĠ Ġrequire Context (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( it , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 3 Ġok ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView Characters () ĊĠĠĠĠĠĠĠ Ġbinding . bt Sort . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp List . sort With () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( temp List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" pr ue b aaaaaaaa aaaa aa Ġ$ temp List ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 5 Ġok ") ĊĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( object : RecyclerView . On Scroll Listener (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( layout Manager . find Last Visible Item Position ()== layout Manager . item Count - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 6 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpag inated Value Ġ+= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getAll Characters Data ( pag inated Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Api () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUse Ġthe ĠViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Api () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 7 Ġok ") ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( flag ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ._ mar vel Value . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isLoading Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 7 . 1 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . error . isNotBlank () Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 7 . 2 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Toast . makeText ( this @ Characters Fragment , it . error , Toast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . character List . isNotEmpty () Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 7 . 3 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp List . addAll ( it . character List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( it . character List Ġas ĠArrayList < Character >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ){ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . main , menu ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch Ġ= Ġmenu . find Item ( R . id . menu Search ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch ?. action View Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View . is Submit Button Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsearch View . setOn Query Text Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre cyclerView Characters () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġ 4 Ġok ") ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġbinding . characters RecyclerView ĊĠĠĠĠĠĠĠ Ġrequire Context (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠCharacter ListAdapter ( it , ĠArrayList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( query != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e ĠS . 1 Ġok Ġ$ query ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġquery ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( search Term . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e ĠS . 2 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( new Text != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e ĠS . C . 1 Ġok Ġ$ new Text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġnew Text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( search Term . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" part e ĠS . C . 2 Ġok ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" part e Ġsearch ") ĊĠĠĠĠĠĠĠ ĠviewModel . getAll Se ar ched Character Data ( search Term ) ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ._ mar vel Value . collect { Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isLoading Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . error . isNotBlank () Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . character List . isNotEmpty () Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( it . character List Ġas ĠArrayList < Character >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ ĠviewModel . getAll Characters Data ( pag inated Value ) ĊĠĠĠĠĠĠĠ Ġcall Api () ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ