package Ġcom . mb ur ak c ak ir . crypt op rice tracker . ui . coin Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . R Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . databinding . Fragment Coin Binding Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . ui . Base Fragment Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . util . Network Controller Utils Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . util . SharedPreferences Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . util . enums . Status Ċ import Ġcom . mb ur ak c ak ir . crypt op rice tracker . util . navigate Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠCoin Fragment Ġ: ĠBase Fragment < Fragment Coin Binding >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcoin Adapter Ġ= ĠCoin Adapter () ĊĠĠĠ Ġprivate Ġval Ġcoin ViewModel : ĠCoin ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠĠĠ Ġprivate Ġval Ġnetwork Controller : ĠNetwork Controller Utils Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork Controller Utils ( require Context ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Network Callback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fragment View (): ĠInt Ġ= ĠR . layout . fragment _ coin ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġcheck If User LoggedIn () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġset Toolbar () ĊĊĠĠĠĠĠĠĠ Ġset Swipe Refresh Layout () ĊĊĠĠĠĠĠĠĠ Ġcheck Internet Connection And Fetch Data () ĊĊĠĠĠĠĠĠĠ Ġset RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġobserve Coins () ĊĊĠĠĠĠĠĠĠ Ġrepeat Request By Refresh Interval () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If User LoggedIn () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession State Ġ= Ġcoin ViewModel . check If User LoggedIn () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( session State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . navigate ( Coin Fragment Directions . action Coin Fragment To Login Fragment ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Swipe Refresh Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . state Ġ= ĠCoin ViewState ( Status . LOADING ) ĊĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . is Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoin ViewModel . getAll Coins () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Internet Connection And Fetch Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork Controller . is Network Connected . observe ( view Lifecycle Owner ) Ġ{ Ġinternet Connected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( internet Connected ) Ġcheck Is Data F etched () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġbinding . state Ġ= ĠCoin ViewState ( Status . ERROR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Is Data F etched () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( coin ViewModel . all Coins . value ?. data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoin ViewModel . getAll Coins () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . state Ġ= ĠCoin ViewState ( Status . SUCCESS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . rv Coin List . adapter Ġ= Ġcoin Adapter ĊĊĠĠĠĠĠĠĠ Ġcoin Adapter . set Coin OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . navigate ( Coin Fragment Directions . action Coin Fragment To Coin Detail Fragment ( it . crypto ID )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcoin Adapter . register Adapter Data Observer ( object Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Item Range Inserted ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . rv Coin List . smooth Scroll To Position ( position Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Coins () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoin ViewModel . all Coins . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin Adapter . submit List ( it . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin ViewModel . insert All Coins ( it . data !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . state Ġ= ĠCoin ViewState ( it . status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrepeat Request By Refresh Interval () Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= ĠSharedPreferences ( require Context ()) ĊĠĠĠĠĠĠĠ Ġshared Preferences . get Refresh Interval ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin ViewModel . getAll Coins () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Integer . parseInt ( it ). to Long () Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu _ coin _ list , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Item Ġ= Ġmenu . find Item ( R . id . action _ search ). apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Action View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch Item ?. action View Ġas ĠSearch View ĊĊĠĠĠĠĠĠĠ Ġsearch View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Hint Ġ= ĠgetString ( R . string . coin _ search ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Query Text Listener ( on Query Text Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Query Text Listener Ġ= Ġobject Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text . isNull OrEmpty (). not ()) Ġcoin ViewModel . getC oin sBy Parameter ( new Text !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcoin ViewModel . getAll Coins () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ exit _ app Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin ViewModel . end Session () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . navigate ( Coin Fragment Directions . action Coin Fragment To Login Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ }