/** Ċ Ġ* ĠCopyright ĠGoogle ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . google . firebase . ud acity . friendly chat . Message . view Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Intent Ċ import Ġandroid . databinding . Data Binding Util Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . Toast Ċ import Ġcom . firebase . ui . auth . Auth UI Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . database . Child EventListener Ċ import Ġcom . google . firebase . database . Data Snapshot Ċ import Ġcom . google . firebase . database . Database Error Ċ import Ġcom . google . firebase . ud acity . friendly chat . BR Ċ import Ġcom . google . firebase . ud acity . friendly chat . Message . model . Friendly Message Ċ import Ġcom . google . firebase . ud acity . friendly chat . Message . view model . Message ViewModel Ċ import Ġcom . google . firebase . ud acity . friendly chat . Message Contract Ċ import Ġcom . google . firebase . ud acity . friendly chat . R Ċ import Ġcom . google . firebase . ud acity . friendly chat . databinding . Activity Main Binding Ċ import Ġcom . google . firebase . ud acity . friendly chat . root . App Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . util .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠMessage Contract . View Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġm Message Adapter : ĠMessage Adapter ĊĊĊĠĠĠ Ġlateinit Ġvar Ġmessage ViewModel : ĠMessage ViewModel ĊĊĠĠĠ Ġprivate Ġvar Ġm Child EventListener : ĠChild EventListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Auth State Listener : ĠFirebase Auth . Auth State Listener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmessage Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ ĠApp . component . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġmessage ViewModel Ġ= ĠViewModel Providers . of ( this ). get ( Message ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbinding : ĠActivity Main Binding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġbinding . set Variable ( BR . activity , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġval Ġproviders Ġ= ĠArrays . asList < Auth UI . Id p Config >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . Id p Config . Builder ( Auth UI . EMAIL _ PROVIDER ). build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . Id p Config . Builder ( Auth UI . GOOGLE _ PROVIDER ). build () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġm Auth State Listener Ġ= ĠFirebase Auth . Auth State Listener Ġ{ Ġfirebase Auth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġfirebase Auth . currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" You 're Ġnow Ġsigned Ġin . ĠWelcome Ġto ĠFriend ly Chat .", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Signed In In icial ize ( user . displayName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Signed Out Cleanup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( Auth UI . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create SignIn Intent Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIs Smart Lock Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Providers ( providers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĠRC _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage ViewModel . fect h Config () ĊĠĠĠĠĠĠĠ Ġinitialize () ĊĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( Message Life Cycle Observer ( m Child EventListener !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĊĠĠĠĠĠĠĠ Ġ( App . component ). inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize (){ ĊĠĠĠĠĠĠĠ Ġval Ġfriendly Messages Ġ= ĠArrayList < Friendly Message >() ĊĠĠĠĠĠĠĠ Ġm Message Adapter Ġ= ĠMessage Adapter ( this , ĠR . layout . item _ message , Ġfriendly Messages ) ĊĠĠĠĠĠĠĠ Ġmessage ListView !!. adapter Ġ= Ġm Message Adapter ĊĊĠĠĠĠĠĠĠ ĠprogressBar !!. visibility Ġ= ĠProgress Bar . IN VISIBLE ĊĊĠĠĠĠĠĠĠ Ġmessage EditText !!. add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton State ( char Sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmessage EditText !!. filters Ġ= ĠarrayOf < Input Filter >( Input Filter . Length Filter ( DEFAULT _ MSG _ LENGTH _ LIMIT )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Signed In In icial ize ( username : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage ViewModel . m Username Ġ= Ġusername !! ĊĠĠĠĠĠĠĠ Ġattach Database Read Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach Database Read Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Child EventListener Ġ= Ġobject Ġ: ĠChild EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Added ( data Snapshot : ĠData Snapshot , Ġs : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Adapter . add ( data Snapshot . getValue ( Friendly Message :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Changed ( data Snapshot : ĠData Snapshot , Ġs : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Removed ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Moved ( data Snapshot : ĠData Snapshot , Ġs : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( database Error : ĠDatabase Error ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ViewModel . addChild Listener ( m Child EventListener Ġas ĠChild EventListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . main _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . sign _ out _ menu Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . getInstance (). sign Out ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġmessage ViewModel . m Firebase Auth . add Auth State Listener ( m Auth State Listener !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Auth State Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ViewModel . m Firebase Auth . remove Auth State Listener ( m Auth State Listener !! ) ĊĠĠĠĠĠĠĠ Ġm Message Adapter . clear () ĊĠĠĠĠĠĠĠ Ġdet atch Database Read Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Signed Out Cleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage ViewModel . m Username Ġ= ĠAN ONY MO US ĊĠĠĠĠĠĠĠ Ġm Message Adapter . clear () ĊĠĠĠĠĠĠĠ Ġif ( m Child EventListener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġdet atch Database Read Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdet atch Database Read Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage ViewModel . detach Database Read Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ SIGN _ IN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Signed Ġin !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Sign Ġin Ġcanceled ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Code Ġ== ĠRC _ PH OTO _ P ICK ER Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ViewModel . imageUrl Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ViewModel . sendMessage ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġopen Photo Picker () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" image / jpeg " ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ LOCAL _ ONLY , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( Intent . create Chooser ( intent , Ġ" Complete Ġaction Ġwith "), ĠRC _ PH OTO _ P ICK ER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbutton State ( char Sequence : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( char Sequence . toString (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġsend Button !!. isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġsend Button !!. isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Messages ( friendly Message : ĠFriend ly Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Message Adapter . add ( friendly Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsendMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage ViewModel . sendMessage ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Retrie ved Configuration () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew L enght Ġ= Ġmessage ViewModel . get Retrie ved Configuration () ĊĠĠĠĠĠĠĠ Ġmessage EditText !!. filters Ġ= ĠarrayOf < Input Filter >( Input Filter . Length Filter ( new L enght . toInt ())) ĊĠĠĠĠĠĠĠ ĠLog . i (" new L enght ", Ġ" new Ġl enght Ġis Ġ= Ġ" Ġ+ Ġnew L enght ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠAN ONY MO US Ġ= Ġ" anonymous " ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ MSG _ LENGTH _ LIMIT Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠRC _ SIGN _ IN Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠRC _ PH OTO _ P ICK ER Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ } Ċ