package Ġcom . ke v ind om . s ke ight . fragment Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity . RESULT _ OK Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . support . design . widget . Snackbar Ċ import Ġandroid . support . graphics . drawable . Animated Vector Drawable Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 4 . content . File Provider Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġbind Ċ import Ġcom . github . sal om on br ys . kode in . android . K ode in Support Fragment Ċ import Ġcom . github . sal om on br ys . kode in . android . app K ode in Ċ import Ġcom . github . sal om on br ys . kode in . instance Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . ke v ind om . s ke ight . R Ċ import Ġcom . ke v ind om . s ke ight . adapter . Chat Adapter Ċ import Ġcom . ke v ind om . s ke ight . adapter . Ch atter Adapter Ċ import Ġcom . ke v ind om . s ke ight . databinding . Fragment Room Binding Ċ import Ġcom . ke v ind om . s ke ight . firebase . Message Manager Ċ import Ġcom . ke v ind om . s ke ight . firebase . Room Manager Ċ import Ġcom . ke v ind om . s ke ight . firebase . Storage Manager Ċ import Ġcom . ke v ind om . s ke ight . firebase . User Manager Ċ import Ġcom . ke v ind om . s ke ight . model . Ch atter Ċ import Ġcom . ke v ind om . s ke ight . model . Message Ċ import Ġcom . ke v ind om . s ke ight . model . Room Ċ import Ġcom . ke v ind om . s ke ight . util . Naming Helper Ċ import Ġin Transaction Ċ import Ġloop Ċ import Ġon Done Clicked Ċ import Ġstr Ċ import Ġjava . io . File Ċ Ċ class ĠRoom Fragment Ġ: ĠK ode in Support Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRC _ FILE Ġ= Ġ 4 1 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRC _ PH OTO Ġ= Ġ 3 1 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRC _ PERMISSION Ġ= Ġ 3 1 4 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ ROOM Ġ= Ġ" extra _ room " ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( room : ĠRoom ): ĠRoom Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRoom Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . put Serializable ( EXTRA _ ROOM , Ġroom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġbundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmessage Manager : ĠMessage Manager Ġby Ġlazy Ġ{ Ġapp K ode in (). instance < Message Manager >() Ġ} ĊĠĠĠ Ġprivate Ġval Ġstorage Manager : ĠStorage Manager Ġby Ġlazy Ġ{ Ġapp K ode in (). instance < Storage Manager >() Ġ} ĊĠĠĠ Ġprivate Ġval Ġuser Manager : ĠUser Manager Ġby Ġlazy Ġ{ Ġapp K ode in (). instance < User Manager >() Ġ} ĊĠĠĠ Ġprivate Ġval Ġroom Manager : ĠRoom Manager Ġby Ġlazy Ġ{ Ġapp K ode in (). instance < Room Manager >() Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Room Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġch atter Adapter : ĠCh atter Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchat Adapter : ĠChat Adapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroom : ĠRoom ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠuserId : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġname : ĠString ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Photo Path Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠR . layout . fragment _ room . bind ( in flater , Ġcontainer ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView ?, ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser Ġ?: Ġthrow ĠIllegalStateException (" This Ġsection Ġrequires Ġan Ġauthenticated Ġuser .") ĊĊĠĠĠĠĠĠĠ Ġthis . room Ġ= Ġarguments . get Serializable ( EXTRA _ ROOM ) Ġas ĠRoom ĊĠĠĠĠĠĠĠ Ġthis . userId Ġ= Ġuser . uid ĊĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġuser . displayName Ġ?: Ġ" Anonymous " ĊĊĠĠĠĠĠĠĠ Ġsetup Adapters () ĊĠĠĠĠĠĠĠ Ġinit UI () ĊĠĠĠĠĠĠĠ Ġsubscribe Events () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġupload Image ( it . data ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Code Ġ== ĠRC _ PH OTO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠFile ( current Photo Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Image ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ PERMISSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( grant Results . isNotEmpty ()) Ġ&& Ġgrant Results . first () Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Photo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Adapters () Ġ{ ĊĠĠĠĠĠĠĠ Ġch atter Adapter Ġ= ĠCh atter Adapter ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġbinding . room Ch atter Recycler . layout Manager Ġ= ĠLinearLayoutManager ( context , ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . room Ch atter Recycler . adapter Ġ= Ġch atter Adapter ĊĊĠĠĠĠĠĠĠ Ġchat Adapter Ġ= ĠChat Adapter ( layout Inflater , ĠuserId ) ĊĠĠĠĠĠĠĠ Ġbinding . room Chat Recycler . layout Manager Ġ= ĠLinearLayoutManager ( context , ĠLinearLayoutManager . VERTICAL , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġbinding . room Chat Recycler . adapter Ġ= Ġchat Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . toolbar Title . text Ġ= Ġroom . name ĊĠĠĠĠĠĠĠ Ġbinding . room Btn Back . setOnClickListener Ġ{ Ġactivity . on Back Pressed () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . room Btn Add . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . in Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Custom Animations ( android . R . anim ator . fade _ in , Ġandroid . R . anim ator . fade _ out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( R . id . fragment _ container , ĠEdit Room Fragment . create ( room . id , Ġch atter Adapter . user Ids )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . room Btn Photo . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( activity , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĠRC _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtake Photo () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . room Btn File . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠRC _ FILE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . room Btn Send . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġbinding . room Edit Message . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Manager . addMessage ( Message ( room . id , ĠuserId , ĠN aming Helper . get FirstName ( name ) Ġ?: Ġname , Ġcontent , ĠSystem . currentTimeMillis ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . room Edit Message . text . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . room Edit Message . on Done Clicked Ġ{ Ġbinding . room Btn Send . perform Click () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġroom Manager . add On User Listener ( room . id , Ġadd Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Manager . add On User Listener ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch atter Adapter . add ( Ch atter ( it . id , Ġ( Naming Helper . get FirstName ( it . name ) Ġ?: Ġit . name ), Ġit . photoUrl )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġremove Listener Ġ= Ġ{ Ġch atter Adapter . remove ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġmessage Manager . add On Message Listener ( room . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Adapter . add ( it , Ġfirst Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . room Chat Recycler . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtake Photo () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Directory Ġ= Ġcontext . get External Files Dir ( Environment . DIRECTORY _ PI CTURE S ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠFile . create TempFile ( System . currentTimeMillis (). toString (), Ġ". jpg ", Ġstorage Directory ) ĊĠĠĠĠĠĠĠ Ġcurrent Photo Path Ġ= Ġimage . absolute Path ĊĠĠĠĠĠĠĠ Ġval Ġtake Picture Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠĠĠĠĠ Ġtake Picture . putExtra ( Media Store . EXTRA _ OUTPUT , ĠFile Provider . get Uri For File ( context , Ġ" com . ke v ind om . s ke ight . file provider ", Ġimage )) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( take Picture , ĠRC _ PH OTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Image ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= ĠAnimated Vector Drawable Compat . create ( context , ĠR . drawable . anim _ image _ upload ) ĊĠĠĠĠĠĠĠ Ġbinding . room Btn File . setImage Drawable ( drawable ) ĊĠĠĠĠĠĠĠ Ġdrawable ?. loop () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġmessage Manager . reserve Message () ĊĠĠĠĠĠĠĠ Ġstorage Manager . upload ( uri , Ġcontext . content Resolver , Ġkey , Ġcomplete Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġbinding . room Edit Message . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Manager . addMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage ( room . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN aming Helper . get FirstName ( name ) Ġ?: Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . isBlank ()) ĠR . string . room _ edit _ text _ default . str ( context ) Ġelse Ġcontent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . room Edit Message . text . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . room Btn File . setImage Drawable ( context . get Drawable ( R . drawable . ic _ file )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable ?. clear Animation Callbacks () ĊĠĠĠĠĠĠĠ Ġ}, Ġfailure Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . root , ĠR . string . general _ error _ upload , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . room Btn File . setImage Drawable ( context . get Drawable ( R . drawable . ic _ file )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable ?. clear Animation Callbacks () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }