package Ġcom . y uch en . how yo . plan . comp anion Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . y uch en . how yo . data . Plan Ċ import Ġcom . y uch en . how yo . data . Result Ċ import Ġcom . y uch en . how yo . data . User Ċ import Ġcom . y uch en . how yo . data . source . How Yo Repository Ċ import Ġcom . y uch en . how yo . network . Load Api Status Ċ import Ġcom . y uch en . how yo . signin . User Manager Ċ import Ġkotlinx . coroutines .* Ċ Ċ class ĠComp anion ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġhow Yo Repository : ĠHow Yo Repository , ĊĠĠĠ Ġprivate Ġval Ġargument Plan : ĠPlan ? Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ plan Ġ= ĠMutable LiveData < Plan ?> () ĊĊĠĠĠ Ġval Ġplan : ĠLive Data < Plan ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ plan ĊĊĠĠĠ Ġ// ĠCurrent Ġuser Ġdata ĊĠĠĠ Ġprivate Ġvar Ġ_ currentUser Ġ= ĠMutable LiveData < User ?> () ĊĊĠĠĠ Ġval ĠcurrentUser : ĠLive Data < User ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ currentUser ĊĊĠĠĠ Ġprivate Ġval Ġ_ friends Ġ= ĠMutable LiveData < List < User >>() ĊĊĠĠĠ Ġval Ġfriends : ĠLive Data < List < User >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ friends ĊĊĠĠĠ Ġprivate Ġval Ġ_ friends For Display Ġ= ĠMutable LiveData < List < User >>() ĊĊĠĠĠ Ġval Ġfriends For Display : ĠLive Data < List < User >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ friends For Display ĊĊĠĠĠ Ġval Ġkeywords Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġ// ĠHandle Ġleave Ġcompanion ĊĠĠĠ Ġprivate Ġval Ġ_ leave Ġ= ĠMutable LiveData < Boolean ?> () ĊĊĠĠĠ Ġval Ġleave : ĠLive Data < Boolean ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ leave ĊĊĠĠĠ Ġprivate Ġval Ġ_ status Ġ= ĠMutable LiveData < Load Api Status >() ĊĊĠĠĠ Ġval Ġstatus : ĠLive Data < Load Api Status > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ status ĊĊĠĠĠ Ġprivate Ġvar ĠviewModel Job Ġ= ĠJob () ĊĊĠĠĠ Ġ// Ġthe ĠCor outine Ġruns Ġusing Ġthe ĠMain Ġ( UI ) Ġdispatcher ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( viewModel Job Ġ+ ĠDispatch ers . Main ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ ĠviewModel Job . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Live Plan Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetCurrent User () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= ĠUser Manager . userId ?. let Ġ{ Ġhow Yo Repository . getUser ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġ_ currentUser . post Value ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Live Plan Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠLoad Api Status . LOADING ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( argument Plan ?. id ?. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ_ plan Ġ= Ġhow Yo Repository . get Live Plan ( argument Plan . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Friends Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfriend DataList Ġ= Ġmutable ListOf < User >() ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser . value ?. following List ?. forEach Ġ{ Ġfriend Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġhow Yo Repository . getUser ( friend Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġfriend DataList . add ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ friends . value Ġ= Ġfriend DataList ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Companion ( userId : ĠString , Ġtype : ĠComp anion Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Plan Ġ= Ġplan . value ĊĠĠĠĠĠĠĠ Ġval Ġcompanion List Ġ= Ġnew Plan ?. comp anion List ?. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion Type . ADD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Plan ?. comp anion List ?. contains ( userId ) Ġ!= Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion List ?. add ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion Type . REMOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Plan ?. comp anion List ?. contains ( userId ) Ġ== Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion List ?. remove At ( comp anion List . indexOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Plan ?. comp anion List Ġ= Ġcompanion List ĊĊĠĠĠĠĠĠĠ Ġ_ plan . value Ġ= Ġnew Plan ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ plan . value ?. let Ġ{ Ġhow Yo Repository . update Plan ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Friends For Display () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ friends For Display . value Ġ= Ġfriends . value ?. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfiltered Users Ġ= ĠlistOf < User >() ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( keywords . value ?. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġfiltered Users Ġ= Ġfriends . value Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Users Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfriends . value ?. filter Ġ{ Ġit . id . contains ( keywords . value Ġ?: Ġ"") Ġ} Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ friends For Display . value Ġ= Ġfiltered Users ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetStatus Done () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠLoad Api Status . DONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġleave () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ leave . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Leave Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ leave . value Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ