/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . t ivi . home . search Ċ Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . t ivi . T ivi Mv Rx ViewModel Ċ import Ġapp . t ivi . domain . inter actors . Search Shows Ċ import Ġapp . t ivi . domain . launch Ob serve Ċ import Ġapp . t ivi . util . Observable Loading Counter Ċ import Ġcom . air bnb . mv rx . Fragment ViewModel Context Ċ import Ġcom . air bnb . mv rx . Mv Rx ViewModel Factory Ċ import Ġcom . air bnb . mv rx . ViewModel Context Ċ import Ġcom . squareup . inject . ass isted . Ass isted Ċ import Ġcom . squareup . inject . ass isted . Ass isted Inject Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . channels . send Blocking Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . flow . de bounce Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠSearch ViewModel Ġ@ Ass isted Inject Ġconstructor ( ĊĠĠĠ Ġ@ Ass isted ĠinitialState : ĠSearch ViewState , ĊĠĠĠ Ġprivate Ġval Ġsearch Shows : ĠSearch Shows Ċ ) Ġ: ĠT ivi Mv Rx ViewModel < Search ViewState >( initialState ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsearch Query Ġ= ĠCon fl ated Broadcast Channel < String >() ĊĠĠĠ Ġprivate Ġval Ġloading State Ġ= ĠObservable Loading Counter () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Query . as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Latest Ġ{ Ġquery Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State . add Loader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġasync ( search Shows . dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Shows ( Search Shows . Params ( query )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . invoke On Completion Ġ{ Ġloading State . remove Loader () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading State . observable . collect Ġ{ ĠsetState Ġ{ Ġcopy ( refresh ing Ġ= Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ob serve ( search Shows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute Ġ{ Ġcopy ( search Results Ġ= Ġit ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Search Query ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Query . send Blocking ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Query () Ġ= Ġset Search Query ("") ĊĊĠĠĠ Ġ@ Ass isted Inject . Factory ĊĠĠĠ Ġinterface ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( initialState : ĠSearch ViewState ): ĠSearch ViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠM v Rx ViewModel Factory < Search ViewModel , ĠSearch ViewState > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( viewModel Context : ĠViewModel Context , Ġstate : ĠSearch ViewState ): ĠSearch ViewModel ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment : ĠSearch Fragment Ġ= Ġ( viewModel Context Ġas ĠFragment ViewModel Context ). fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment . search ViewModel Factory . create ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ