package Ġcom . nk up pan . g iphy browser . presentation . search list Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . paging . Load State Ċ import Ġcom . nk up pan . g iphy browser . R Ċ import Ġcom . nk up pan . g iphy browser . core . extension . Event Observer Ċ import Ġcom . nk up pan . g iphy browser . core . extension . auto Cle ared Ċ import Ġcom . nk up pan . g iphy browser . core . extension . clear Focus And Hide Keyboard Ċ import Ġcom . nk up pan . g iphy browser . core . extension . show Sn ackBar Message Ċ import Ġcom . nk up pan . g iphy browser . core . ui . fragment . Base Fragment Ċ import Ġcom . nk up pan . g iphy browser . databinding . Fragment G iphy Browse List Binding Ċ import Ġcom . nk up pan . g iphy browser . domain . model . G iphy Image Ċ import Ġcom . nk up pan . g iphy browser . domain . model . Type Ċ import Ġcom . nk up pan . g iphy browser . presentation . search . Search ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠG iphy Browser List Fragment Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġargs : ĠG iphy Browser List Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġval Ġtype : ĠType Ġby Ġlazy Ġ{ Ġargs . type Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠFragment G iphy Browse List Binding Ġby Ġauto Cle ared () ĊĊĠĠĠ Ġprivate Ġval Ġg iphy Search ViewModel : ĠG iphy Search ViewModel < G iphy Image > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . G IF Ġ-> Ġview Models < Gif Search ViewModel >(). value ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . STICK ERS Ġ-> Ġview Models < Stick ers Search ViewModel >(). value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġsearch Ġview Ġmodel Ġas Ġa Ġshared Ġview Ġmodel Ġfor Ġmultiple Ġfragments ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġsearch ViewModel : ĠSearch ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠG iphy ListAdapter Ġ{ Ġg iphy Image Ġ-> ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG iphy Browser List Fragment Directions . action G iphy Browse List To G iphy Image Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg iphy Image ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment G iphy Browse List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . search ViewModel Ġ= Ġsearch ViewModel ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġg iphy Search ViewModel . refresh Search With Query ( search ViewModel . queryString . value Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġsetup ViewModel () ĊĠĠĠĠĠĠĠ Ġsetup Swipe Refresh () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĠĠĠĠĠĠĠ Ġsetup Search View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Search View () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġbinding . search Container . query . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Editor ActionListener Ġ{ Ġ_, Ġaction Id , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Editor ActionListener Ġif Ġ( action Id Ġ== ĠEditor Info . IME _ ACTION _ SEARCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Search Action () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Key Listener Ġ{ Ġ_, Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . keyCode Ġ== ĠKeyEvent . KEYCODE _ ENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Search Action () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Key Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Key Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsearch ViewModel . search This Query . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g iphy Search ViewModel . refresh Search With Query ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg iphy Search ViewModel . getP aging Result (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Can Ġremove Ġthe Ġlifecycle Ġas Ġan Ġinput Ġto Ġthe Ġadapter Ġsubmit Ġdata Ġapi . ĠSince Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// using Ġthe Ġcoroutine Ġscope Ġand Ġflows ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Swipe Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġadapter . add Load State Listener Ġ{ Ġcombined Load States Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( combined Load States . refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoad State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . retry . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter . item Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loader . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loader . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoad State . Not Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . retry . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loader . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoad State . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . retry . isVisible Ġ= Ġadapter . item Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loader . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter . item Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . show Sn ackBar Message ( R . string . failed _ to _ refresh _ g iphy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . retry Button . setOnClickListener Ġ{ Ġadapter . retry () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Search Action () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( search ViewModel . process Query ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Container . query . clear Focus And Hide Keyboard () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . show Sn ackBar Message ( R . string . enter _ valid _ query _ string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ