package Ġcom . tech be lo ved . h ym nb ook . search Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . ui . Navigation UI Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . tech be lo ved . h ym nb ook . R Ċ import Ġcom . tech be lo ved . h ym nb ook . databinding . Fragment Search Binding Ċ import Ġcom . tech be lo ved . h ym nb ook . h ym n listing . H ym n Item Model Ċ import Ġcom . tech be lo ved . h ym nb ook . use cases . L ce Ċ import Ġcom . tech be lo ved . h ym nb ook . utils . DEFAULT _ CATEGORY _ URI Ċ import Ġcom . tech be lo ved . h ym nb ook . utils . append H ym n Id Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġtim ber . log . Tim ber Ċ Ċ @ Android EntryPoint Ċ class ĠSearch Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclick Listener : ĠH ym n Item Model . ClickListener < H ym n Item Model > Ġ= Ġobject Ġ: ĠH ym n Item Model . ClickListener < H ym n Item Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( view : ĠView , Ġitem : ĠH ym n Item Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Search Fragment Directions . action Search Fragment To Detail Pager Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ CATEGORY _ URI . append H ym n Id ( item . id ) !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsearch Query Listener Ġ= Ġobject Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch H ym ns ( query Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠSearch ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Search Binding ĊĊĠĠĠ Ġlateinit Ġvar Ġsearch Results Adapter : ĠSearch Results Adapter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ search , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ ĠNavigation UI . setup With Nav Controller ( binding . toolbar Search , Ġfind Nav Controller ()) ĊĊĠĠĠĠĠĠĠ Ġbinding . search view Search . setOn Query Text Listener ( search Query Listener ) ĊĠĠĠĠĠĠĠ Ġbinding . search view Search . setOn Focus ChangeListener Ġ{ Ġview , Ġhas Focus Ġ-> Ġif Ġ(! has Focus ) Ġhide Keyboard ( view ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġsearch Results Adapter Ġ= ĠSearch Results Adapter ( click Listener ) ĊĊĠĠĠĠĠĠĠ Ġbinding . recyclerview SearchResults . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġsearch Results Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . recyclerview SearchResults . addItem Decoration ( Divider Item Decoration ( activity , ĠDiv ider Item Decoration . VERTICAL )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel . monitor Search () ĊĊĠĠĠĠĠĠĠ ĠviewModel . search Results . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Loading Ġ-> Ġshow Loading Progress ( it . loading ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Content Ġ-> Ġshow Results ( it . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Error Ġ-> Ġshow Error ( it . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch H ym ns ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . search ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error ( error : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Loading Progress ( false ) ĊĠĠĠĠĠĠĠ ĠTim ber . e ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Results ( content : ĠList < SearchResult Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Loading Progress ( false ) ĊĠĠĠĠĠĠĠ Ġsearch Results Adapter . submit List ( content ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading Progress ( loading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ) Ġbinding . progressbar Search Loading . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġelse Ġbinding . progressbar Search Loading . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Keyboard ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Method Manager Ġ= Ġrequire Activity (). getSystem Service ( Activity . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Method Manager . hide Soft Input From Window ( view . window Token , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ