package Ġcom . u os . sms ms m . view model Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . h ilt . Ass isted Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . u os . sms ms m . data .* Ċ import Ġcom . u os . sms ms m . repository . Background Repository Ċ import Ġcom . u os . sms ms m . repository . Chat Repository Ċ import Ġcom . u os . sms ms m . repository . Content Repository Ċ import Ġcom . u os . sms ms m . repository . UserRepository Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . first OrNull Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . flow . on Empty Ċ import Ġkotlinx . coroutines . launch Ċ Ċ // Ġì± Ħ íĮ ħ Ġ/ ĠTimeline Ġ/ Ġì¹ ľ êµ¬ Ġì° ¾ ê¸° ëĵ ± ĠìĨĮ ìħ ľ ĠëĦ ¤íĬ¸ ìĽĮ íģ¬ Ġê¸°ëĬ¥ Ġview model Ċ class ĠS NS Util ViewModel Ġ@ ViewModel Inject Ġconstructor (@ Ass isted Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle ) Ġ: ĠViewModel (){ ĊĊĠĠĠ Ġvar Ġre cycler Data Ġ: ĠMutable LiveData < ArrayList < Recycler Default Model >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġedit text Text Ġ: ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġchat Room Uid Ġ: ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġchat List Ġ: ĠMutable LiveData < ArrayList < Chat DTO . Comment >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġsearch User Result Ġ: ĠMutable LiveData < ArrayList < User DTO >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġsearch Content Result Ġ: ĠMutable LiveData < ArrayList < Recycler Default Model >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġchat Room List Ġ: ĠMutable LiveData < ArrayList < Chat DTO >> Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġ// íħ Į ìĬ¤íĬ¸ Ġëª© ìłģ ĊĠĠĠ Ġvar Ġtest UserList Ġ: ĠMutable LiveData < ArrayList < User DTO >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġ// ë³¸ ëª© ìłģ ĊĠĠĠ Ġvar Ġuser List Ġ: ĠMutable LiveData < ArrayList < User DTO >> Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġ// ì¹ ľ êµ¬ Ġëª© ë¡Ŀ Ġë¦¬ ìĬ¤íĬ¸ ìĿĺ Ġìĥģíĥľ ĊĠĠĠ Ġvar Ġfriends List State Ġ: ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġval Ġuser Repository Ġ= ĠUser Repository () ĊĠĠĠ Ġval Ġchat Repository Ġ= ĠChat Repository () ĊĠĠĠ Ġval Ġcontent Repository Ġ= ĠContent Repository () ĊĊĊĠĠĠ Ġval Ġauth Ġ= ĠFirebase Auth . getInstance () ĊĊĠĠĠ Ġvar Ġtimeline DataList Ġ= ĠMutable LiveData < Map < String , Content DTO >>() ĊĊĠĠĠ Ġfun ĠgetTime Line Data (){ ĊĊĠĠĠĠĠĠĠ Ġvar Ġcontents Ġ: ĠMutable Map < String , Content DTO > Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠ Ġ// # 1 ĠëĤ´ Ġêµ¬ ëı ħ íķ¨ ê³¼ ĠëĤ´ ê°Ģ ĠìŀĳìĦ± íķľ Ġê¸ Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Repository . get Subscribe Contents With My Contents ( auth . currentUser !!. uid ). collect Ġ{ content IdList Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ê°Ģ ìł¸ ìĺ ¨ Ġid Ġlist Ġ${ content IdList . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content IdList Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 2 Ġê°Ģ ìł¸ ìĺ ¨ Ġêµ¬ ëı ħ Ġê² Į ìĭľ ê¸ Ģ Ġë¦¬ ìĬ¤íĬ¸ ĠëĮĢ ë¡ľ Ġê² Į ìĭľ ê¸ Ģ ĠìĽĲ ë³¸ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("# 2 Ġìĭ¤íĸī ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent IdList . forEach Ġ{ Ġcontent Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Repository . get Contents ( content Id ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents . put All ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content IdList . size Ġ== Ġcontents . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 3 ĠëĤ´ Ġê² Į ìĭľ ê¸ Ģ Ġê°Ģ ìł¸ ìĻĢ ìĦľ Ġcontents ìĹĲ ĠëĦ £ ê³ł Ġtimestamp ë¥¼ Ġê¸° ì¤Ģ ìľ¼ë¡ľ Ġìłķ ëł ¬ íķĺê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("# 3 Ġìĺ¤ ìĺ¤ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Repository . getUser Post Content ( auth . currentUser !!. uid ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ëĤ´ Ġíı¬ ìĬ¤íĬ¸ ëıĦ Ġê°Ģ ìł¸ ìĺ¤ ê¸° Ġ${ it . values . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents . put All ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 3 - 1 Ġìłķ ëł ¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġcontents . toList (). sorted By Descending Ġ{ Ġ(_, value ) Ġ-> Ġvalue . timestamp Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 4 ĠìĻ Ħ ìĦ± ëĲľ Ġê² Į ìĭľ ê¸ Ģ ĠìĽĲ ë³¸ Ġre cycler view ìĹĲ ĠìĹ° ê²° íķĺê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline DataList . post Value ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("# 3 Ġìĺ¤ ìĺ¤ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Repository . getUser Post Content ( auth . currentUser !!. uid ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ëĤ´ Ġíı¬ ìĬ¤íĬ¸ ëıĦ Ġê°Ģ ìł¸ ìĺ¤ ê¸° Ġ${ it . values . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents . put All ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 3 - 1 Ġìłķ ëł ¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġcontents . toList (). sorted By Descending Ġ{ Ġ(_, value ) Ġ-> Ġvalue . timestamp Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// # 4 ĠìĻ Ħ ìĦ± ëĲľ Ġê² Į ìĭľ ê¸ Ģ ĠìĽĲ ë³¸ Ġre cycler view ìĹĲ ĠìĹ° ê²° íķĺê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline DataList . post Value ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġëĭ¤ìĿĮ ê³¼ Ġê°Ļ ìĿ´ ĠìĪĺ ìłķ íķ´ìķ¼ íķ¨ . ĊĠĠĠĠĠĠĠĠ Ġ# 1 . Ġë¦¬ ìĤ¬ ìĿ´ íģ ´ë Ł ¬ ë · ° ìĹĲ Ġê ½ Ĥ ìķĦ ëĦ £ ìĸ´ ìķ¼ íķł Ġlist ê°Ģ Ġì ¡´ ìŀ¬ íķ¨ . ĊĠĠĠĠĠĠĠĠ Ġ# 2 . Ġlist ìĹĲ Ġêµ¬ ëı ħ íķĺê³ł ĠìŀĪëĬĶ ĠPost Id ìĿĺ ĠìĽĲ ë³¸ ìĿĦ ĠëĦ £ ìĸ´ ì¤ Į . ĊĠĠĠĠĠĠĠĠ Ġ# 3 . ĠìĽĲ ë³¸ ìĿĦ ĠëĦ £ ìĸ´ ì¤ ¬ ìľ¼ ë©´ ĠëĤ´ ê°Ģ ĠìŀĳìĦ± íķľ Ġê² Į ìĭľ ê¸ Ģ ìĿĦ ĠëĦ £ ìĸ´ ì¤ Į . ĊĠĠĠĠĠĠĠĠ Ġ# 4 . Ġìłķ ëł ¬ Ġíķ¨ . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġ// ìľł ìłĢ Ġê²Ģ ìĥī ĠìĦľ ì¹ĺ Ġë · ° Ġë¦¬ ìĬ¤ ëĦ Ī ĊĠĠĠ Ġfun Ġsearch User Query Text Listener () Ġ= Ġobject Ġ: ĠSearch View . On Query Text Listener { ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ê² Ģ ìĥī Ġë²Ħ íĬ ¼ Ġíģ ´ ë¦ Ń ìĭľ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġempty List Ġ= Ġempty List < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Search UserList ( query !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ê² Ģ ìĥī ìĸ´ Ġë³Ģê²½ Ġìĭľ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltering UserList ( new Text !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfiltering UserList ( new Text : ĠString ){ ĊĠĠĠĠĠĠĠ Ġ// new Text Ġê¸° ë°ĺ ìľ¼ë¡ľ Ġìľł ìłĢ Ġëį°ìĿ´íĦ° ĠíķĦ íĦ° ë§ģ ĊĠĠĠĠĠĠĠ Ġvar Ġpath List Ġ= Ġarray ListOf < User DTO >() ĊĠĠĠĠĠĠĠ Ġuser List . value ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . toString (). contains ( new Text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath List . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsearch User Result . post Value ( path List ) ĊĠĠĠĠĠĠĠ Ġsearch User Result Data Convert Recycler Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch User Result Data Convert Recycler Data (){ ĊĊĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= Ġarray ListOf < Recycler Default Model >() ĊĊĊĠĠĠĠĠĠĠ Ġsearch User Result . value ?. forEach Indexed { Ġindex Ġ, it Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Recycler Default Model ( Recycler Default Model . FR I END S _ LIST _ TYPE _ TITLE ," ", search User Result . value ! ![ index ]. uid , null , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch User Result . value ! ![ index ]. userName !! , "" )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre cycler Data . post Value ( list ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Search UserList ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getUser ( query ). collect { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetAll User SearchResult (){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getAll User (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser List . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Test User SearchResult (){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getTest UserList (). collect Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest UserList . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ê²Į ìĭľ ê¸ Ģ Ġê²Ģ ìĥī ĠìĦľ ì¹ĺ ë · ° Ġë¦¬ ìĬ¤ ëĦ Ī ĊĠĠĠ Ġfun Ġsearch Content Query Text Listener () Ġ= Ġobject Ġ: ĠSearch View . On Query Text Listener { ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ê² Ģ ìĥī Ġë²Ħ íĬ ¼ Ġíģ ´ ë¦ Ń ìĭľ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġempty List Ġ= Ġempty List < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( emptyList . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Search UserList ( query !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ê² Ģ ìĥī ìĸ´ Ġë³Ģê²½ Ġìĭľ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltering Content List ( new Text !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfiltering Content List ( new Text : ĠString ){ ĊĠĠĠĠĠĠĠ Ġ// new Text Ġê¸° ë°ĺ ìľ¼ë¡ľ Ġìľł ìłĢ Ġëį°ìĿ´íĦ° ĠíķĦ íĦ° ë§ģ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Search Content List () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ìĹĲ ëĶ § Ġíħ į ìĬ¤íĬ¸ ĠText Watcher ĊĠĠĠ Ġfun Ġtext Watcher () Ġ= Ġobject Ġ: Text Watcher { ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit text Text . post Value ( s . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit text Text . post Value ( s . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit text Text . post Value ( s . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © ĠìŀĪëĬĶ ì§Ģ ĠíĻķìĿ¸ íķĺê³ł ĠìŀĪ ìľ¼ ë©´ Ġsnapshot Ġid Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġfun Ġcheck Chat Room ( destination Uid Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠChat Repository () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . check Chat Room ( destination Uid ). collect Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Room Uid . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ë© Ķ ìĦ¸ ì§Ģ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġfun ĠgetMessage List (){ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠChat Repository () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Chat ( chat Room Uid . value . toString ()). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat List . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Chat Room ( destination Uid : ĠString ){ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠChat Repository () ĊĠĠĠĠĠĠĠ Ġvar Ġchat DTO s Ġ= ĠChat DTO () ĊĠĠĠĠĠĠĠ Ġchat DTO s . users [ auth . currentUser ?. uid !! ] Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġchat DTO s . comment Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġchat DTO s . users [ destination Uid !! ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © Ġid ê°Ģ ĠìĹĨ ëĭ¤ ë©´ Ġì± Ħ íĮ ħ ë° © ĠìĥĿìĦ± ĠíĽĦ Ġë©Ķ ìĦ¸ ì§Ģ ĠìłĦ ëĭ ¬ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat Room Uid . value Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . create Chat Room ( destination Uid , Ġchat DTO s ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġprintln (" ì ± Ħ íĮ ħ ë° © ĠìĥĿìĦ± ĠìĦ± ê³µ ") Ġelse Ġprintln (" ì ± Ħ íĮ ħ ë° © ĠìĥĿìĦ± Ġìĭ¤ íĮ ¨ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © ìĿ´ ĠìŀĪëĭ¤ ë©´ Ġê·¸ ë ĥ ¥ Ġë©Ķ ìĦ¸ ì§Ģ ĠìłĦ ëĭ ¬ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ì ± Ħ íĮ ħ Ġë³ ´ë Ĥ´ ê¸° ĊĠĠĠ Ġfun ĠsendMessage ( destination Uid : ĠString ){ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠChat Repository () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chat List . value !!. isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat List . value !!. clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġchat DTO s Ġ= ĠChat DTO () ĊĠĠĠĠĠĠĠ Ġchat DTO s . users [ auth . currentUser ?. uid !! ] Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġchat DTO s . comment Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġchat DTO s . users [ destination Uid !! ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © Ġid ê°Ģ ĠìĹĨ ëĭ¤ ë©´ Ġì± Ħ íĮ ħ ë° © ĠìĥĿìĦ± ĠíĽĦ Ġë©Ķ ìĦ¸ ì§Ģ ĠìłĦ ëĭ ¬ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat Room Uid . value Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . create Chat Room ( destination Uid , chat DTO s ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġprintln (" ì ± Ħ íĮ ħ ë° © ĠìĥĿìĦ± ĠìĦ± ê³µ ") Ġelse Ġprintln (" ì ± Ħ íĮ ħ ë° © ĠìĥĿìĦ± Ġìĭ¤ íĮ ¨ ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © ĠìĥĿìĦ± íķĺê³ł Ġì± Ħ íĮ ħ ë° © Ġuid Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Chat Room ( destination Uid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . check Chat Room ( destination Uid ). collect { ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © ìĿĦ ĠìĥĿìĦ± íķĺê³ł ëıĦ ĠìĹĲ ëĶ § íħ į ìĬ¤íĬ¸ ìĹĲ Ġê°Ĵ ìĿ´ Ġë Ĥ¨ ìķĦ ìŀ Īëĭ¤ ë©´ Ġë©Ķ ìĦ¸ ì§Ģ ĠìłĦ ëĭ ¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edit text Text . value !!. isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomment Ġ= ĠChat DTO . Comment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . uid Ġ= Ġauth . currentUser !!. uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . message Ġ= Ġedit text Text . value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . timestamp Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . add Chat ( it . toString (), comment ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġprintln (" ì ± Ħ íĮ ħ ĠìłĢìŀ¥ ĠìĦ± ê³µ ") Ġ Ġelse Ġprintln (" ì ± Ħ íĮ ħ ĠìłĢìŀ¥ Ġìĭ¤ íĮ ¨ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ Ġëĭ¤ Ġë³ ´ë Ĥ ¸ ë Ĵ ¤ Ġedit text Text Ġêµ Ĳ ì²´ íķ´ ì£¼ ê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit text Text . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © ìĿ´ ĠìŀĪëĭ¤ ë©´ Ġê·¸ ë ĥ ¥ Ġë©Ķ ìĦ¸ ì§Ģ ĠìłĦ ëĭ ¬ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomment Ġ= ĠChat DTO . Comment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . uid Ġ= Ġauth . currentUser !!. uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . message Ġ= Ġedit text Text . value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . timestamp Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . add Chat ( chat Room Uid . value . toString (), comment ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġprintln (" ì ± Ħ íĮ ħ ĠìłĢìŀ¥ ĠìĦ± ê³µ ") Ġ Ġelse Ġprintln (" ì ± Ħ íĮ ħ ĠìłĢìŀ¥ Ġìĭ¤ íĮ ¨ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ì ± Ħ íĮ ħ Ġëĭ¤ Ġë³ ´ë Ĥ ¸ ë Ĵ ¤ Ġedit text Text Ġêµ Ĳ ì²´ íķ´ ì£¼ ê¸° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit text Text . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ì ± Ħ íĮ ħ ë° © Ġëª© ë¡Ŀ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġfun Ġinit My Chat Room List ( uid : ĠString ){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Repository . get Chat Room List ( uid ). collect { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Room List . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// íķ´ ëĭ¹ Ġìľł ìłĢ ìĿĺ Ġì¹ ľ êµ¬ Ġëª© ë¡Ŀ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġfun Ġinit User Friends List ( uid Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getF riends List ( uid ). collect { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ê°Ģ ìł¸ ìĺ ¨ Ġì¹ ľ êµ¬ Ġëª© ë¡Ŀ Ġ= Ġ${ it . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget UserData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ// ìľł ìłĢ Ġìłķë³´ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġfun Ġget UserData ( uid Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ Ġfriends List State . post Value (" getting ") ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getUser ( uid ). collect Ġ{ ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ê°Ģ ìł¸ ìĺ ¨ Ġìľł ìłĢ Ġìłķë³´ Ġ= Ġ${ userData }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getUser Profile Image ( uid ). collect { Ġuser Profile ImageUrl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ê°Ģ ìł¸ ìĺ ¨ Ġìľł ìłĢ ĠíĶĦë¡ľ íķ Ħ ĠìĿ´ë¯¸ ì§Ģ Ġìłķë³´ Ġ= Ġ${ user Profile ImageUrl }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarray List Ġ= Ġarray ListOf < Recycler Default Model >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Profile ImageUrl Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Default Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Default Model . FR I END S _ LIST _ TYPE _ TITLE _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile ImageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . uid . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . userName . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ìŀĦ ìĭľ ĠíĶĦë¡ľ íķ Ħ ĠìĦ¤ ëªħ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Default Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Default Model . FR I END S _ LIST _ TYPE _ TITLE _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . uid . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . userName . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ìŀĦ ìĭľ ĠíĶĦë¡ľ íķ Ħ ĠìĦ¤ ëªħ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler Data . post Value ( array List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfriends List State . post Value (" complete ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }