package Ġcom . tech care er . mobile app hack athon . chat app . repository . home Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . gms . tasks . On Complete Listener Ċ import Ġcom . google . firebase . firestore . FieldValue Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Query Ċ import Ġcom . google . firebase . messaging . Firebase Messaging Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġcom . tech care er . mobile app hack athon . chat app . repository . login . User Model Ċ import Ġcom . tech care er . mobile app hack athon . common . base . Base Repository Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . await Close Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . callback Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject ĊĊ Ċ /** Ċ Ġ* Ġ@ author : ĠHas an ĠK Ã¼ Ã§ Ã¼k Ġon Ġ 1 0 . 1 0 . 2 0 2 1 Ċ Ġ*/ Ċ interface ĠFirebase Dao Repository Ġ{ ĊĊĠĠĠ Ġfun Ġcreate User ( user Model : ĠUser Model , Ġcall Back : Ġ( create Status : ĠBoolean ) Ġ-> ĠUnit ) ĊĠĠĠ Ġsuspend Ġfun Ġis UserName Available ( userName : ĠString , Ġcall Back : Ġ( username Status : ĠBoolean ) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġget Chat Room ( roomId : ĠString , Ġsender : ĠChat Model , Ġreceiver : ĠChat Model ) ĊĠĠĠ Ġfun Ġsend Voice Message ( ĊĠĠĠĠĠĠĠ Ġaudio Path : ĠString , ĊĠĠĠĠĠĠĠ Ġaudio Duration : ĠLong , ĊĠĠĠĠĠĠĠ Ġchat Model : ĠChat Model ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġsuspend Ġfun Ġsearch User ( text : ĠString ): ĠFlow < List < User Model >> ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget Chat Room Message List ( chat Model : ĠChat Model ): ĠFlow < ArrayList < Voice Message >> ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget Chat Room List ( userId : ĠString ): ĠFlow < ArrayList < Chat Model > ?> Ċ } Ċ Ċ class ĠFirebase Dao Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġfirebase Fire store : ĠFirebase Fire store , ĊĠĠĠ Ġprivate Ġval Ġfirebase Remote Config : ĠFirebase Remote Config , ĊĠĠĠ Ġprivate Ġval Ġfirebase Storage : ĠFirebase Storage Ċ ) Ġ: ĠBase Repository (), ĠFirebase Dao Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdb Ref User names Ġby Ġlazy Ġ{ Ġfirebase Fire store . collection (" user Names List ") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Ref Users Ġby Ġlazy Ġ{ Ġfirebase Fire store . collection (" users ") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Ref User Names Ġby Ġlazy Ġ{ Ġfirebase Fire store . collection (" user Names ") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstorage Ref Records Ġby Ġlazy Ġ{ Ġfirebase Storage . reference . child (" chat Records ") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Ref Chat Rooms Ġby Ġlazy Ġ{ Ġfirebase Fire store . collection (" chat Rooms ") Ġ} ĊĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġis UserName Available ( ĊĠĠĠĠĠĠĠ ĠuserName : ĠString , ĊĠĠĠĠĠĠĠ Ġcall Back : Ġ( username Status : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserName Lower case Ġ= ĠuserName . lowercase ( Locale . ROOT ) ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdb Ref User names . document ( userName Lower case ). get (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate User ( ĊĠĠĠĠĠĠĠ Ġuser Model : ĠUser Model , ĊĠĠĠĠĠĠĠ Ġcall Back : Ġ( create Status : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFirebase Messaging . getInstance (). token . add On Complete Listener ( On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" TOKEN _", Ġ" Fetching ĠF CM Ġregistration Ġtoken Ġfailed ", Ġtask . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Complete Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtask . result ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Lower case Ġ= Ġuser Model . displayName ?. lowercase ( Locale . ROOT ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Model . userName For Search Ġ= Ġuser Model . map String ToList ( userName Lower case ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Model . fc m Token Ġ= Ġtoken ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref User names . document ( userName Lower case ). set ( user Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// username Ġy ok sa Ġe kle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref Users . document ( user Model . uid !! ). set ( user Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsearch User ( text : ĠString ): ĠFlow < List < User Model >> Ġ= Ġrequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Snapshot Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref Users . where Array Contains (" userName For Search ", Ġtext ). get (). await () ĊĊĠĠĠĠĠĠĠ Ġquery Snapshot . to Objects ( User Model :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Chat Room ( roomId : ĠString , Ġsender : ĠChat Model , Ġreceiver : ĠChat Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Ref Users . document ( sender . sender Id !! ). collection (" chat Rooms "). document ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġdocument Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! document Snapshot . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sender Chat Room ( sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdb Ref Users . document ( receiver . receiver Id !! ). collection (" chat Rooms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( roomId ). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġdocument Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! document Snapshot . exists ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Receiver Chat Room ( receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Sender Chat Room ( chat Model : ĠChat Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchat Model . chat Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref Users . document ( chat Model . sender Id !! ). collection (" chat Rooms "). document ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( chat Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Receiver Chat Room ( receiver : ĠChat Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiver . chat Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref Users . document ( receiver . sender Id !! ). collection (" chat Rooms "). document ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Voice Message ( ĊĠĠĠĠĠĠĠ Ġaudio Path : ĠString , ĊĠĠĠĠĠĠĠ Ġaudio Duration : ĠLong , ĊĠĠĠĠĠĠĠ Ġchat Model : ĠChat Model ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvoice Message Uri Ġ= ĠUri . from File ( File ( audio Path )) ĊĠĠĠĠĠĠĠ Ġ// send Ġvoice Ġstorage ĊĠĠĠĠĠĠĠ Ġstorage Ref Records . child ( voice Message Uri . last Path Segment !! ). put File ( voice Message Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġtask Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Task Ġ= Ġtask Snapshot . storage . download Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Task . add On Success Listener Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Voice Message For Chat Room ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Url Ġ= Ġuri . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio File Ġ= Ġaudio Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Duration Ġ= Ġaudio Duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Model Ġ= Ġchat Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġsend Voice Message For Chat Room ( ĊĠĠĠĠĠĠĠ Ġaudio Url : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaudio File : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaudio Duration : ĠLong ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġchat Model : ĠChat Model ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchat Model . chat Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfriendly Message Ġ= ĠVoice Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Id Ġ= Ġchat Model . sender Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Id Ġ= Ġchat Model . receiver Id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġuser ?. username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Url Ġ= Ġaudio Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio File Ġ= Ġaudio File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Duration Ġ= Ġaudio Duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠField Value . server Timestamp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ref Chat Rooms . document ( chat Model . chat Id ). collection (" chat Room "). document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( friendly Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis New Sender Chat Room ?. let Ġ{ Ġif Ġ( it ) Ġadd Sender Chat Room () Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis New Receiver Chat Room ?. let Ġ{ Ġif Ġ( it ) Ġadd Receiver Chat Room () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Chat Room Ref ( chat Room Id : ĠString ): ĠQuery Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb Ref Chat Rooms . document ( chat Room Id ). collection (" chat Room ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy (" timestamp ", ĠQuery . Direction . ASC ENDING ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Chat Room List Ref ( userId : ĠString ): ĠQuery Ġ= ĊĠĠĠĠĠĠĠ Ġdb Ref Users . document ( userId ). collection (" chat Rooms ") ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġfun Ġget Chat Room Message List x ( chat Model : ĠChat Model ): ĠFlow < ArrayList < Voice Message >> Ġ= ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvoice Message List Ġ= Ġarray ListOf < Voice Message >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Model . chat Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Chat Room Ref ( it ). add Snapshot Listener Ġ{ Ġvalue , Ġerror Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( document Snapshot Ġin Ġvalue . documents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Snapshot . toObject ( Voice Message :: class . java ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . setMessage Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . is Owner Ġ= Ġmsg . sender Id !! Ġ== Ġchat Model . sender Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoice Message List . add ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Snapshot . metadata . is From Cache ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Snapshot . metadata . has Pending Writes ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . read Timestamp Ġ!= Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . is Owner !!. not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [" read Timestamp "] Ġ= ĠField Value . server Timestamp () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Snapshot . reference . update ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvoice Message List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġoverride Ġfun Ġget Chat Room Message List ( chat Model : ĠChat Model ): ĠFlow < ArrayList < Voice Message >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcallback Flow Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Model . chat Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxx Ġ= Ġget Chat Room Ref ( it ). add Snapshot Listener Ġ{ Ġvalue , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvoice Message List Ġ= Ġarray ListOf < Voice Message >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( document Snapshot Ġin Ġvalue . documents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Snapshot . toObject ( Voice Message :: class . java ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . setMessage Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . is Owner Ġ= Ġmsg . sender Id !! Ġ== Ġchat Model . sender Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoice Message List . add ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Snapshot . metadata . is From Cache ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Snapshot . metadata . has Pending Writes ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . read Timestamp Ġ!= Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . is Owner !!. not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [" read Timestamp "] Ġ= ĠField Value . server Timestamp () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Snapshot . reference . update ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( voice Message List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Close Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxx . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġoverride Ġfun Ġget Chat Room List ( userId : ĠString ): ĠFlow < ArrayList < Chat Model >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcallback Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxx Ġ= Ġget Chat Room List Ref ( userId ). add Snapshot Listener Ġ{ Ġvalue , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Room List Ġ= Ġarray ListOf < Chat Model >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Room List . addAll ( it . to Objects ( Chat Model :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( chat Room List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Close Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxx . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }