/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠL ittle ĠD rops Ġof ĠR ain ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT ĠLicense Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// opensource . org / licenses / MIT Ċ Ġ* Ċ Ġ* Ġ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 . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . send _ message Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . core . app . Nav Utils Ċ import Ġandroidx . core . view . children Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . R Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . dao . Message Dao Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . dao . User Dao Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . entities . Message Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . entities . MessageType Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . entities . User Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . interfaces . On Data ChangeListener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . interfaces . On Users Loaded Listener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . databinding . Fragment SendMessage Binding Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers .* Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . helper . view Lifecycle Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . firebase . firestore . Document Reference Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . k oin . android x . view model . ext . android . state ViewModel Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠSend Message Fragment Ġ: ĊĠĠĠ ĠFragment (), ĊĠĠĠ ĠOn Users Loaded Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠSend Message Fragment () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠSend Message Fragment :: class . simple Name ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ SEND _ KEY Ġ= Ġ" ACTION _ SEND " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ SEND Ġ= Ġ" app . web . die g of lass a _ site . lit tled rop so fr ain . action . ACTION _ SEND " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ REPLY _ KEY Ġ= Ġ" ACTION _ REPLY " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ REPLY Ġ= Ġ" app . web . die g of lass a _ site . lit tled rop so fr ain . action . ACTION _ REPLY " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ MESSAGE Ġ= Ġ" message " ĊĠĠĠĠĠĠĠ Ġvar Ġm Saved InstanceState : ĠBundle ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠviewModel : ĠSend Message ViewModel Ġby Ġstate ViewModel () ĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠFragment SendMessage Binding Ġby Ġview Lifecycle () ĊĠĠĠ Ġprivate Ġval Ġio Scope Ġ= ĠCor outine Scope ( Dispatch ers . IO ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoggle : ĠAction Bar Drawer Toggle ĊĠĠĠ Ġprivate Ġvar Ġis Stopped Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Experimental Std lib Api ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment SendMessage Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġbinding . btn Send . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠCallback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCor outine Ġhas Ġmultiple Ġdispatch ers Ġsuit ed Ġfor Ġdifferent Ġtype Ġof Ġwork loads ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( viewModel . send Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend Message ViewModel . Send Method . MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . email Sender Ġ= ĠLog ged User . user LiveData . value !!. email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . sender Ġ= ĠLog ged User . user LiveData . value !!. name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . sender Id Ġ= ĠLog ged User . user LiveData . value !!. uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . reply Uid Ġ= ĠviewModel . reply Uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . owners . add ( viewModel . sender . email . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . reply Uid Ġ= ĠviewModel . reply Uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . message Ġ= Ġbinding . ml txt Message . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . dest . email . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . email To Ġ= ĠviewModel . dest . email . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . is User Admin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . owners . add ( viewModel . dest . email . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . type Ġ= ĠMessageType . MESSAGE . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . sender Id Ġ= ĠviewModel . sender . uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . sender Ġ= ĠviewModel . sender . email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . read Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Dao . insert ( message , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend Message ViewModel . Send Method . EMAIL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend T os Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend T os . add ( binding . sp nr Contacts . selected Item . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHelper . send Email ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend T os , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ml txt Message . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend Message ViewModel . Send Method . UNKNOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . no _ send _ method _ selected ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Send . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ml txt Message . text . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . ml txt Message . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ Ġ/* Unused */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs : ĠCharSequence ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ/* Unused */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Send . isEnabled Ġ= Ġbinding . ml txt Message . text . toString (). trim (). isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġfab Ġ= Ġactivity ?. findViewById < Floating ActionButton >( R . id . fab ) ĊĠĠĠĠĠĠĠ Ġfab ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ ĠUser Dao . load All ( this ) ĊĠĠĠĠĠĠĠ Ġm Saved InstanceState Ġ= ĠsavedInstanceState ĊĠĠĠĠĠĠĠ Ġhandle Bundle () ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. findViewById < Toolbar >( R . id . toolbar ) Ġas Ġandroidx . appcompat . widget . Toolbar ? ĊĠĠĠĠĠĠĠ Ġtoolbar ?. set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout Ġ= Ġactivity ?. findViewById < Drawer Layout >( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ open , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ close ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout ?. add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawer Layout Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. find Nav Controller ( R . id . nav _ host _ fragment )?. navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsetup Radio Group Send Methods () ĊĠĠĠĠĠĠĠ Ġsetup View ForUser () ĊĠĠĠĠĠĠĠ Ġbinding . btn Send . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" SendMessage Fragment Ġactivity Ġcreated !") ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Stopped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġis Stopped Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: toggle . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout : ĠDraw er Layout Ġ= Ġrequire Activity (). findViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . remove Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Safe To Access ViewModel () Ġ&& Ġ! is Stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . title Ġ= Ġbinding . ed t txt Title . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . body Ġ= Ġbinding . ml txt Message . text . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon ViewState Restore d ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on ViewState Restore d ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġupdate UI ( viewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup View ForUser () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . sender Ġ= ĠLog ged User . user LiveData . value Ġ?: ĠUser () ĊĠĠĠĠĠĠĠ ĠviewModel . is User Admin Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!( Logged User . user LiveData . value Ġ== Ġnull Ġ|| Ġ! Logged User . user LiveData . value !!. isAdmin ) ĊĠĠĠĠĠĠĠ Ġbinding . btn Send . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġupdate UI ( viewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Std lib Api ĊĠĠĠ Ġprivate Ġfun Ġsetup Radio Group Send Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsend Modes Ġ= Ġactivity ?. resources ?. getString Array ( R . array . send _ modes _ entries ) ĊĠĠĠĠĠĠĠ Ġval Ġsend Modes Values Ġ= Ġactivity ?. resources ?. getString Array ( R . array . send _ modes _ values ) ĊĠĠĠĠĠĠĠ Ġif Ġ( send Modes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġsend Mode ) Ġin Ġsend Modes . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrd Mode Ġ= ĠRadio Button ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send Modes Values ! ![ index ] Ġ== ĠSend Message ViewModel . Send Method . MESSAGE . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrd Mode . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrd Mode . text Ġ= Ġsend Mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrd Mode . tag Ġ= Ġsend Modes Values [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . rd Grp Send Method . addView ( rd Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . rd Grp Send Method . setOn Checked ChangeListener Ġ{ Ġradio Group : ĠRadio Group , Ġchecked Id : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradio Button Ġ= Ġradio Group . findViewById < RadioButton >( checked Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend Method Ġ= Ġradio Button . tag Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( SendMessage ViewModel . Send Method . valueOf ( send Method . uppercase ( Locale . ROOT ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend Message ViewModel . Send Method . EMAIL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send Method Ġ= ĠSend Message ViewModel . Send Method . valueOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Method . uppercase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( view State : ĠSend Message ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe ĠUI ĊĠĠĠĠĠĠĠ Ġif Ġ( view State . send Method Ġ== ĠSend Message ViewModel . Send Method . EMAIL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . ed t txt Title . setText ( view State . title ) ĊĠĠĠĠĠĠĠ Ġbinding . ml txt Message . setText ( view State . body ) ĊĠĠĠĠĠĠĠ Ġupdate UI ForUser Admin ( view State ) ĊĠĠĠĠĠĠĠ Ġval Ġb nv Ġ= Ġactivity ?. findViewById < Bottom Navigation View >( R . id . nav _ bottom ) ĊĠĠĠĠĠĠĠ Ġb nv ?. visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ForUser Admin ( view State : ĠSend Message ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view State . is User Admin Ġ&& Ġbinding . sp nr Contacts . adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġview State . dest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Adapter : ĠArray Adapter < User > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . adapter Ġas ĠArray Adapter < User > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspinner Position : ĠInt Ġ= Ġdata Adapter . getPosition ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . setSelection ( spinner Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . setSelection (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view State . is User Admin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġbinding . rd Grp Send Method . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradio Button Ġ= Ġview Ġas ĠRadio Button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . isChecked Ġ= Ġ( radioButton . tag Ġ== Ġview State . send Method . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġbinding . rd Grp Send Method . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradio Button Ġ= Ġview Ġas ĠRadio Button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( radioButton . text Ġ== ĠSend Message ViewModel . Send Method . MESSAGE . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Radio Group User Admin ( view State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Radio Group User Admin ( view State : ĠSend Message ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! view State . is User Admin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . rd Grp Send Method . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . rd Grp Send Method . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun ĠsetSelected Message Sender () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Saved InstanceState Ġ!= Ġnull Ġ&& Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Saved InstanceState ?. getString ( ACTION _ REPLY _ KEY ) Ġ== ĠACTION _ REPLY Ġ|| Ġm Saved InstanceState ?. getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ SEND _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġm Saved InstanceState ?. get Parcelable < Message >( KEY _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġmessage . sender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . sender ?. contains (": ") !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġmessage . sender ?. split (": ") ?. get ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . name Ġ= Ġname ?. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . uid Ġ= Ġmessage . sender Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . email Ġ= Ġmessage . email Sender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Adapter : ĠArray Adapter < User > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . adapter Ġas ĠArray Adapter < User > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspinner Position : ĠInt Ġ= Ġdata Adapter . getPosition ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . setSelection ( spinner Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Bundle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Saved InstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Saved InstanceState ?. getString ( ACTION _ REPLY _ KEY ) Ġ== ĠACTION _ SEND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected Message Sender () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Saved InstanceState ?. getString ( ACTION _ REPLY _ KEY ) Ġ== ĠACTION _ REPLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġm Saved InstanceState ?. get Parcelable < Message >( KEY _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reply Uid Ġ= Ġmessage . uid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . body Ġ= Ġmessage . message . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ml txt Message . setText ( message . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected Message Sender () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġarrow Ġclick Ġhere ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNav Utils . navigate Up From Same Task ( require Activity ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCallback ( var Ġfragment : ĠSend Message Fragment ) Ġ: ĊĠĠĠĠĠĠĠ ĠOn Data ChangeListener < Document Reference > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Changed ( item : ĠDocument Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . binding . btn Send . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . require Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Message Ġsent Ġsuccessfully ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Users Loaded ( users : ĠList < User >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Safe To Access ViewModel () Ġ&& Ġ! is Stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers WithDefault Ġ= ĠArrayList < User >( users . size Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . name Ġ= ĠgetString ( R . string . no _ selection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . email Ġ= ĠgetString ( R . string . none ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers WithDefault . add ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers WithDefault . addAll ( users ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( local User Ġin Ġusers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local User . email Ġ== ĠLog ged User . user LiveData . value ?. email ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On ItemSelected For Spinner Contacts () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If Spinner Contacts IsEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If Spinner Contacts IsEmpty () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding . sp nr Contacts . adapter . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( radio Ġin Ġbinding . rd Grp Send Method . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( radio . tag Ġ== ĠSend Message ViewModel . Send Method . EMAIL . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradio . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( radio . tag Ġ== ĠSend Message ViewModel . Send Method . MESSAGE . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend Message ViewModel . Send Method . MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( radio Ġas ĠRadio Button ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected Message Sender () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd On ItemSelected For Spinner Contacts () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . on ItemSelected Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠAdapter View . On ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠAdapter View <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . dest Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sp nr Contacts . adapter . getItem ( pos ) Ġas ĠUser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < out ĠAdapter > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . dest Ġ= ĠUser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ