package Ġnet . x black y . anime x stream . ui . main . search Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . ob servers . Disposable Observer Ċ import Ġnet . x black y . anime x stream . utils . Common ViewModel 2 Ċ import Ġnet . x black y . anime x stream . utils . constants . C Ċ import Ġnet . x black y . anime x stream . utils . model . An ime Meta Model Ċ import Ġnet . x black y . anime x stream . utils . model . Suggestion Model Ċ import Ġnet . x black y . anime x stream . utils . parser . Html Parser Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ Ċ class ĠSearch ViewModel Ġ: ĠCommon ViewModel 2 (), Ġretrofit 2 . Callback < Suggestion Model > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsearch Repository Ġ= ĠSearch Repository () ĊĠĠĠ Ġprivate Ġvar Ġ_ search List : ĠMutable LiveData < ArrayList < An ime Meta Model >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġvar Ġ_ suggestions List : ĠMutable LiveData < ArrayList < String >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġvar Ġpage Number : ĠInt Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġkeyword : ĠString ĊĠĠĠ Ġprivate Ġvar Ġ_ can Next Page Loaded Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġcomposite Disposable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġvar Ġsearch List : ĠLive Data < ArrayList < An ime Meta Model >> Ġ= Ġ_ search List ĊĠĠĠ Ġvar Ġsuggestions List : ĠLive Data < ArrayList < String >> Ġ= Ġ_ suggestions List ĊĊĠĠĠ Ġfun Ġfetch Suggestions List ( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġ_ suggestions List . value ĊĠĠĠĠĠĠĠ Ġlist ?. clear () ĊĠĠĠĠĠĠĠ Ġ_ suggestions List . value Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġsearch Repository . fetch Search Suggestions ( keyword ). enqueue ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Search List ( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġthis . keyword Ġ= Ġkeyword ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġ_ search List . value ĊĠĠĠĠĠĠĠ Ġlist ?. clear () ĊĠĠĠĠĠĠĠ Ġ_ search List . value Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġif Ġ(! super . isLoading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Repository . fetch Search List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe With ( get Search Observer ( C . TYPE _ SEARCH _ NEW )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Loading State ( loading Ġ= ĠLoading . LOADING , Ġe Ġ= Ġnull , Ġis List Empty Ġ= Ġis List Empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Next Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ can Next Page Loaded Ġ&& Ġ! super . isLoading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Repository . fetch Search List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe With ( get Search Observer ( C . TYPE _ SEARCH _ UPDATE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Loading State ( loading Ġ= ĠLoading . LOADING , Ġe Ġ= Ġnull , Ġis List Empty Ġ= Ġis List Empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Search Observer ( search Type : ĠInt ): ĠDis posable Observer < ResponseBody > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠDis posable Observer < ResponseBody >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Loading State ( loading Ġ= ĠLoading . COMPLETED , Ġe Ġ= Ġnull , Ġis List Empty Ġ= Ġis List Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( response : ĠResponse Body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHtml Parser . parse Movie ( response Ġ= Ġresponse . string (), Ġtype Value Ġ= ĠC . TYPE _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isNull OrEmpty () Ġ|| Ġlist . size Ġ< Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ can Next Page Loaded Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Type Ġ== ĠC . TYPE _ SEARCH _ NEW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ search List . value Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( search Type Ġ== ĠC . TYPE _ SEARCH _ UPDATE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated List Ġ= Ġ_ search List . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated List ?. addAll ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ search List . value Ġ= Ġupdated List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Number ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Loading State ( loading Ġ= ĠLoading . ERROR , Ġe Ġ= Ġe , Ġis List Empty Ġ= Ġis List Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! composite Disposable . is Disposed ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis List Empty (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ search List . value . isNull OrEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Suggestion Model >, Ġt : ĠThrowable ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Suggestion Model >, Ġresponse : ĠResponse < Suggestion Model >) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . body ()?. content ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠHtml Parser . parse Suggestions ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ suggestions List . value Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }