package Ġcom . bre iter . mov iet ow atch app . ui . screen . search Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . bre iter . mov iet ow atch app . data . domain . Movie Ċ import Ġcom . bre iter . mov iet ow atch app . data . repository . IM ov ie Repository Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber ĊĊ Ċ enum Ġclass ĠNetwork Status Ġ{ ĠERROR , ĠDONE Ġ} Ċ Ċ class ĠSearch ViewModel ( private Ġval Ġrepository : ĠI Movie Repository ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( job Ġ+ ĠDispatch ers . Main ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ sear ched Movies Ġ= Ġrepository . sear ched Movies ĊĠĠĠ Ġval Ġsearched Movies : ĠLive Data < List < Movie >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ sear ched Movies ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Selected Movie Ġ= ĠMutable LiveData < Movie >() ĊĠĠĠ Ġval Ġnavigate To Selected Movie : ĠLive Data < Movie > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Selected Movie ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Saved Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġnavigate To Saved : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Saved ĊĊĠĠĠ Ġprivate Ġval Ġ_ status Ġ= ĠMutable LiveData < Network Status >() ĊĠĠĠ Ġval Ġstatus : ĠLive Data < Network Status > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ status ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġval Ġquery Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ clear Query Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġclear Query : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ clear Query ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList ens Ġany Ġof Ġthe Ġchanges Ġin Ġthe ĠEditText Ġand Ġsets Ġvalue Ġof Ġquery ĠLive Data Ġto Ġuser 's Ġinput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Query TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . value Ġ= Ġs ?. trim (). toString () ĊĠĠĠĠĠĠĠ Ġstart Searching () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInv okes Ġget Movie List Ġfunction Ġand Ġsets Ġvalue Ġof Ġ_ clear Query Ġto Ġfalse , ĊĠĠĠĠ Ġ* Ġif Ġthe Ġvalue Ġof Ġuser 's Ġinput Ġis Ġnot Ġan Ġempty Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Searching () Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Movie List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ clear Query . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġ_ sear ched Movies Ġfrom Ġnetwork Ġvia Ġrepository . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Movie List ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Movies ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠNetwork Status . DONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Error Ġmessage : Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠNetwork Status . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġonce Ġclear _ button Ġis Ġclicked Ġand Ġtriggers Ġclearing Ġof Ġthe ĠEditText Ġvia ĠBinding Adapter . ĊĠĠĠĠ Ġ* ĠT riggers Ġclearing Ġof Ġa Ġdata Ġlist Ġvia ĠBinding Adapter , Ġso Ġthe Ġre cycler Ġview Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Clear Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ clear Query . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġonce Ġa Ġmovie Ġis Ġselected . ĠT riggers Ġnavigation Ġto ĠDetail Fragment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdisplay Movie Details ( movie : ĠMovie ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Selected Movie . value Ġ= Ġmovie ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠRe sets Ġvalue Ġof Ġ_ navigate To Selected Movie Ġonce Ġthe Ġnavigation Ġhas Ġtaken Ġplace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnavigate To Details Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Selected Movie . value Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġonce Ġsaved _ movies Ġis Ġclicked Ġand Ġtriggers Ġnavigation Ġto ĠSaved Fragment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Saved Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Saved . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe sets Ġvalue Ġof Ġ_ navigate To Saved Ġonce Ġthe Ġnavigation Ġhas Ġtaken Ġplace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnavigate To Saved Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Saved . value Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġcoroutine , Ġwhen Ġview Ġmodel Ġis Ġfinished ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} Ċ }