package Ġv mode v . clear keep . fragments Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ Ċ import Ġim . vector . R Ċ import Ġim . vector . databinding . Fragment Search Messages Binding Ċ import Ġim . vector . databinding . Fragment Search Messages In Room Binding Ċ import Ġim . vector . extensions . hide Keyboard Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġv mode v . clear keep . activities . Room Activity Ċ import Ġv mode v . clear keep . adapters . List Search Message In Room RecyclerView Adapter Ċ import Ġv mode v . clear keep . adapters . List Search Message RecyclerView Adapter Ċ import Ġv mode v . clear keep . exec utors . App Executors Ċ import Ġv mode v . clear keep . factories . view models . interfaces . I ViewModel Factory Ċ import Ġv mode v . clear keep . fragments . Interfaces . I Search Fragment Ċ import Ġv mode v . clear keep . view modelo bject s . Message Room User Ċ import Ġv mode v . clear keep . view models . interfaces . Abstract Search Message Fragment ViewModel Ċ import Ġv mode v . clear keep . view models . interfaces . Abstract Search Message In room Fragment ViewModel Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ // ĠTODO : ĠRename Ġparameter Ġarguments , Ġchoose Ġnames Ġthat Ġmatch Ċ // Ġthe Ġfragment Ġinitialization Ġparameters , Ġe . g . ĠARG _ ITEM _ NUMBER Ċ private Ġconst Ġval ĠUSER _ ID Ġ= Ġ" USER _ ID " Ċ private Ġconst Ġval ĠRO OM _ ID Ġ= Ġ" ROOM _ ID " Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġ[ Fragment ] Ġsubclass . Ċ Ġ* ĠActiv ities Ġthat Ġcontain Ġthis Ġfragment Ġmust Ġimplement Ġthe Ċ Ġ* Ġ[ Search Messages Fragment . On Fragment Interaction Listener ] Ġinterface Ċ Ġ* Ġto Ġhandle Ġinteraction Ġevents . Ċ Ġ* ĠUse Ġthe Ġ[ Search Messages Fragment . newInstance ] Ġfactory Ġmethod Ġto Ċ Ġ* Ġcreate Ġan Ġinstance Ġof Ġthis Ġfragment . Ċ Ġ* Ċ Ġ*/ Ċ class ĠSearch Messages In Room Fragment Ġ: ĠData Binding D agger Fragment (), ĠI Search Fragment Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠRename Ġand Ġchange Ġtypes Ġof Ġparameters ĊĠĠĠ Ġprivate Ġvar ĠuserId : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġroom Id : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠOn Fragment Interaction Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġquery Text Ġ: ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠI ViewModel Factory < Abstract Search Message In room Fragment ViewModel >; ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġapp Executors : ĠApp Executors ; ĊĊĠĠĠ Ġlateinit Ġvar Ġbinding : ĠFragment Search Messages In Room Binding ; ĊĠĠĠ Ġprivate Ġvar Ġdis posable EditText : ĠDis posable ? Ġ= Ġnull ; ĊĠĠĠ Ġprivate Ġval Ġlist Message Ġ= ĠArrayList < Message Room User >(); ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlist Search Adapter : ĠList Search Message In Room RecyclerView Adapter ; ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġarguments ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġit . getString ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id Ġ= Ġit . getString ( ROOM _ ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ search _ messages _ in _ room , Ġcontainer , Ġfalse , Ġdata Binding . getData Binding Component ()); ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ", Ġ" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . addItem Decoration ( Divider Item Decoration ( this . context , ĠDiv ider Item Decoration . VERTICAL )) ĊĠĠĠĠĠĠĠ ĠviewModel Factory . get ViewModel (). get Room Id ( roomId !! ) ĊĠĠĠĠĠĠĠ Ġlist Search Adapter Ġ= ĠList Search Message In Room RecyclerView Adapter ( app Executors Ġ= Ġapp Executors , Ġdiff Callback Ġ= Ġobject Ġ: ĠDiff Util . Item Callback < Message Room User >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( p 0 : ĠMessage Room User , Ġp 1 : ĠMessage Room User ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp 0 . message ?. id Ġ== Ġp 1 . message ?. id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( p 0 : ĠMessage Room User , Ġp 1 : ĠMessage Room User ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp 0 . room ?. get ( 0 )?. avatar Url Ġ== Ġp 1 . room ?. get ( 0 )?. avatar Url Ġ&& Ġp 0 . message ?. encrypted Content Ġ== Ġp 1 . message ?. encrypted Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġp 0 . user ?. get ( 0 )?. name Ġ== Ġp 1 . user ?. get ( 0 )?. name ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġdata Binding Component Ġ= Ġdata Binding ) Ġ{ Ġmessage Search Text Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Room Ġ= ĠIntent ( this . activity , ĠRoom Activity :: class . java ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Search Text . room ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent Room . putExtra ( Room Activity . EXTRA _ ROOM _ ID , Ġit [ 0 ]. id ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Room . putExtra ( Room Activity . EXTRA _ MATRIX _ ID , ĠuserId ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Search Text . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent Room . putExtra ( Room Activity . EXTRA _ EVENT _ ID , Ġit . id ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent Room ); ĊĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . adapter Ġ= Ġlist Search Adapter ; ĊĠĠĠĠĠĠĠ ĠviewModel Factory . get ViewModel (). getList Message Room User In Room (). observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Factory . get ViewModel (). decrypt List Message ( it ). observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Message . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Message . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġbinding . list Message Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ ĠviewModel Factory . get ViewModel (). setTime For Refresh Load Message ( Calendar . getInstance (). time In Millis ); ĊĠĠĠĠĠĠĠ Ġget Search View Text Change ()?. subscribe Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Search Adapter . get Search Text ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Filter Ġ= Ġlist Message . filter Ġ{ Ġmessage Room User Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Room User . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . encrypted Content . toLowerCase ( Locale . US ). contains ( s . toLowerCase ( Locale . US )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Search Adapter . submit List ( list Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . list Message Ġ= Ġ Ġlist Filter . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Search Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . nest Scroll . setOn Scroll ChangeListener Ġ{ Ġv : ĠNested ScrollView ?, Ġscroll X : ĠInt , Ġscroll Y : ĠInt , Ġold Scroll X : ĠInt , Ġold Scroll Y : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġview Lifecycle Owner ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠRename Ġmethod , Ġupdate Ġargument Ġand Ġhook Ġmethod Ġinto ĠUI Ġevent ĊĠĠĠ Ġfun Ġget Search View Text Change (): ĠObservable < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ?. get Search View Text Change (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠOn Fragment Interaction Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( context . toString () Ġ+ Ġ" Ġmust Ġimplement ĠOn Fragment Interaction Listener ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġinterface Ġmust Ġbe Ġimplemented Ġby Ġactivities Ġthat Ġcontain Ġthis ĊĠĠĠĠ Ġ* Ġfragment Ġto Ġallow Ġan Ġinteraction Ġin Ġthis Ġfragment Ġto Ġbe Ġcommunic ated ĊĠĠĠĠ Ġ* Ġto Ġthe Ġactivity Ġand Ġpotentially Ġother Ġfragments Ġcontained Ġin Ġthat ĊĠĠĠĠ Ġ* Ġactivity . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġthe ĠAndroid ĠTraining Ġlesson Ġ[ Com munic ating Ġwith ĠOther ĠF rag ments ] ĊĠĠĠĠ Ġ* Ġ( http :// developer . android . com / training / basics / fragments / com munic ating . html ) ĊĠĠĠĠ Ġ* Ġfor Ġmore Ġinformation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOn Fragment Interaction Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUpdate Ġargument Ġtype Ġand Ġname ĊĠĠĠĠĠĠĠ Ġfun Ġget Search View Text Change (): ĠObservable < String >; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUse Ġthis Ġfactory Ġmethod Ġto Ġcreate Ġa Ġnew Ġinstance Ġof ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġfragment Ġusing Ġthe Ġprovided Ġparameters . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparam 2 ĠParameter Ġ 1 . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew Ġinstance Ġof Ġfragment ĠSearch Messages Fragment . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠRename Ġand Ġchange Ġtypes Ġand Ġnumber Ġof Ġparameters ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( userId : ĠString , roomId Ġ: ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Messages In Room Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( USER _ ID , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ROOM _ ID , Ġroom Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġselected Fragment ( query : ĠString ): ĠI Search Fragment Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Text Ġ= Ġquery ĊĠĠĠĠĠĠĠ Ġval Ġlist Message Filter Ġ= Ġlist Message . filter Ġ{ Ġmessage Room User Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Room User . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Search Adapter . get Search Text ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . encrypted Content . toLowerCase ( Locale . US ). contains ( query . toLowerCase ( Locale . US )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( query . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Search Adapter . submit List ( list Message Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . list Message Ġ= Ġlist Message Filter . size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fragment (): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun Selected Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable EditText ?. dispose (); ĊĠĠĠ Ġ} Ċ } Ċ