package Ġto ky o . over software . book explorer . view model Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . kotlin . addTo Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġto ky o . over software . book explorer . entity . Display able Book Ċ import Ġto ky o . over software . book explorer . model . repository . Books Repository Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠSearch ViewModel Factory ( private Ġval Ġrepository : ĠBooks Repository ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSearch ViewModel ( repository Ġ= Ġrepository ) Ġas ĠT ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠæĽ ¸ ç± į æ¤ ľç´¢ çĶ¨ ViewModel Ċ Ġ*/ Ċ class ĠSearch ViewModel ( private Ġval Ġrepository : ĠBooks Repository ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġval Ġ_ items Ġ= ĠMutable LiveData < List < Display able Book >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠList è¡¨ç¤º çĶ¨ ãģ® ãĥĩãĥ¼ãĤ¿ ĊĠĠĠ Ġval Ġitems : ĠLive Data < List < Display able Book >> Ġ= Ġ_ items ĊĊĠĠĠ Ġprivate Ġval Ġ_ isLoading Ġ= ĠMutable LiveData < Boolean >( true ) ĊĊĠĠĠ Ġ// Ġ èªŃãģ¿ è¾¼ ãģ¿ ä¸Ń ãĥķ ãĥ© ãĤ° ĊĠĠĠ Ġval ĠisLoading : ĠLive Data < Boolean > Ġ= Ġ_ isLoading ĊĊĠĠĠ Ġprivate Ġval Ġ_ onError Ġ= ĠMutable LiveData < Boolean >( false ) ĊĊĠĠĠ Ġ// ĠãĤ¨ ãĥ© ãĥ¼ è¡¨ç¤º ĊĠĠĠ Ġval ĠonError : ĠLive Data < Boolean > Ġ= Ġ_ onError ĊĊĠĠĠ Ġprivate Ġvar Ġ_ about Dialog Dis missed : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ// Ġãĥ Ģ ãĤ¤ ãĤ¢ ãĥŃãĤ° ãĤĴ éĸ ī ãģĺ ãģŁ ãģĭ ĊĠĠĠ Ġval Ġabout Dialog Dis missed Ġget () Ġ= Ġ_ about Dialog Dis missed ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĽ ¸ ç± į ãģ® æ¤ ľç´¢ ãĤĴè¡Į ãģĨ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeyword ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Search ( search Keyword : ĠObservable < CharSequence >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ ä»Ĭ åĽŀ ãģ¯ æĻĤéĸĵ ãģĮ ãģªãģĦ ãģ®ãģ§ ãĤĦ ãĤģ ãģ¦ ãģĬ ãģı ãģĮ ãĢģ onError ãģ« ãģªãĤĭ ãģ¨ Stream ãģĮ éĢ Ķ åĪĩ ãĤĮ ãģ¦ ãģĹãģ¾ ãģĨ ãģ®ãģ§ ãĢģ ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠTuple < Books , ĠThrowable > ãģ® ãĤĪãģĨ ãģª å½¢ ãģ§ Repository ãģĮ è¿Ķ ãģĹãģŁ ãģ » ãģĨ ãģĮ èī¯ ãģĦ ãģĭ ãĤĤ ĊĠĠĠĠĠĠĠ Ġsearch Keyword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åħ¥åĬĽ ãģķãĤĮ ãģ¦ 7 0 0 m sec çµ Į éģİ ãģĹãģŁ Text ãĤĴ æ¤ ľç´¢ ãģĻãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 7 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ onError . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ items . post Value ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æľĢæĸ° ãģ® ãĥĩãĥ¼ãĤ¿ ãģ® ãģ¿ åĩ¦çĲĨ ãģĹãģ¦ ãģĿãģ® ä»ĸ ãģ¯ çł´ æ£ Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . find Books ( it . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġbooks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ items . post Value ( books . items ?. map Ġ{ Ġbook Ġ-> ĠDisplay able Book ( book Ġ= Ġbook ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ onError . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdismiss About Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ about Dialog Dis missed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠ Ġ} Ċ } ĊĊ