package Ġcom . example . h obby fi . ui . main Ċ Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . signature . Object Key Ċ import Ġcom . example . h obby fi . R Ċ import Ġcom . example . h obby fi . databinding . Fragment UserProfile Binding Ċ import Ġcom . example . h obby fi . int ents . User Intent Ċ import Ġcom . example . h obby fi . models . data . Tag Ċ import Ġcom . example . h obby fi . shared .* Ċ import Ġcom . example . h obby fi . ui . base . TextField Input Validation On us Ċ import Ġcom . example . h obby fi . utils . Image Utils Ċ import Ġcom . example . h obby fi . utils . Worker Utils Ċ import Ġcom . example . h obby fi . view models . factories . Tag List ViewModel Factory Ċ import Ġcom . example . h obby fi . view models . main . UserProfile Fragment ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Experimental Cor outines Api Ċ class ĠUser Profile Fragment Ġ: ĠMain Fragment (), ĠTextField Input Validation On us Ġ{ ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠUser Profile Fragment ViewModel Ġby Ġview Models ( factory Producer Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġactivity ViewModel . auth User . value ?. tags Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( require Activity (). intent ?. extras Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠMainActivity Args . from Bundle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). intent ?. extras !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). user ?. tags Ġ?: Ġarray ListOf () ĊĊĠĠĠĠĠĠĠ ĠTag List ViewModel Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). application , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtags ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment UserProfile Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . fragment _ user _ profile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠ Ġobserve Combined Observer s Invalid ity () ĊĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġthis @ UserProfile Fragment Ġ// Ġin Ġcase Ġli ved ata Ġis Ġneeded Ġto Ġbe Ġobserved Ġfrom Ġbinding ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠCode Ġdup Ġw / Ġother Ġprofile Ġselection ĠF rag ments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Image . gallery Option . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallback s . request Image ( this @ UserProfile Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Image . camera Option . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( R . id . action _ user Profile Fragment _ to _ camera _ capture _ nav _ graph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button Bar . left Button . setOnClickListener Ġ{ Ġ// Ġdelete Ġaccount Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). build Yes No AlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . confirm _ acc _ deletion ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ViewModel . send Intent ( User Intent . Delete User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Switch . isChecked Ġ= Ġpref Config . read Chat room Join Remember Navigate () Ġ== ĠConstants . No Remember Dual Choice . RE MEMBER _ YES . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Switch . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Config . write Chat room Join Remember Navigate ( if ( checked ) ĠConstants . No Remember Dual Choice . RE MEMBER _ YES . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠConstants . No Remember Dual Choice . NO _ RE MEMBER . ordinal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ onCreate View Ġroot ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Constants . is Facebook User Auth d ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Button Bar . left Button . setOnClickListener Ġ{ Ġ// Ġchange Ġemail Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . safe Navigate ( R . id . action _ global _ change Email Dialog Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Button Bar . right Button . setOnClickListener Ġ{ Ġ// Ġchange Ġpassword Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . safe Navigate ( R . id . action _ global _ change Password Dialog Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Button Bar . left Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Button Bar . right Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button Bar . right Button . setOnClickListener Ġ{ Ġ// Ġtag Ġselection Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠUser Profile Fragment Directions . action Global Tag Nav Graph ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. tag Bundle . selected Tags . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. tag Bundle . tags . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . safe Navigate ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity ViewModel . auth User . value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ViewModel . send Intent ( User Intent . Fetch User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Map : ĠMutable Map < String , ĠString ?> Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity ViewModel . auth User . value ?. name Ġ!= ĠviewModel !!. name . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Map [ Constants . USERNAME ] Ġ= ĠviewModel !!. name . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity ViewModel . auth User . value ?. description Ġ!= ĠviewModel !!. description . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Map [ Constants . DESCRIPTION ] Ġ= ĠviewModel !!. description . value Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( activity ViewModel . auth User . value ?. tags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġarray ListOf ()) Ġ!= ĠviewModel !!. tag Bundle . selected Tags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Map [ Constants . TAGS Ġ+ Ġ" [] "] Ġ= ĠConstants . json Converter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toJson ( viewModel !!. tag Bundle . selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel !!. base 6 4 Image . original Uri Ġ!= Ġnull ) Ġ{ Ġ// Ġmeans Ġuser Ġhas Ġchanged Ġtheir Ġp fp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Map [ Constants . IMAGE ] Ġ= ĠviewModel !!. base 6 4 Image . original Uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" UserProfile Fragment ", Ġ" Field Map Ġupdate : Ġ${ field Map }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Map . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. show Warning Toast ( getString ( R . string . no _ fields )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( field Map . size Ġ== Ġ 1 Ġ&& Ġfield Map . containsKey ( Constants . IMAGE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWorker Utils . build And Enqueue Image Upload Worker ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ViewModel . auth User . value !!. id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Config . get Auth User Token () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . EDIT _ USER _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. base 6 4 Image . original Uri !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . pref _ last _ user _ fetch _ time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ViewModel . send Intent ( User Intent . Update User ( field Map )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ViewModel . setIs UserProfile Update Button Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Update Button Enabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Auth User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Tags Fail () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠCode Ġdup Ġwith Ġother Ġtag Ġfragments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . current Back Stack Entry ?. saved State Handle ?. get LiveData < List < Tag >>( Constants . selected Tags Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . observe ( view Lifecycle Owner ) Ġ{ Ġselected Tags Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. tag Bundle . append New Selected Tags To Tags ( selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. tag Bundle . setSelected Tags ( selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . current Back Stack Entry ?. saved State Handle ?. get LiveData < Uri ? >( Constants . CAMERA _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . observe ( view Lifecycle Owner ) Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . profile Image . image ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Uri Into G lide And Save In Image Holder ( it , ĠviewModel !!. base 6 4 Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Tags Fail () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity ViewModel . latest Tag Update Fail . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . tag Bundle . setSelected Tags ( viewModel . original Selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Original Selected Tags ( viewModel . tag Bundle . selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Auth User () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity ViewModel . auth User . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . description . value Ġ= Ġit . description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . name . value Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . tags ?. let Ġ{ Ġselected Tags Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . tag Bundle . setSelected Tags ( selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . tag Bundle . append New Selected Tags To Tags ( selected Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . photoUrl Ġ!= Ġnull Ġ&& Ġnav Controller . current Back Stack Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . saved State Handle ?. get < Uri ? >( Constants . CAMERA _ URI ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" UserProfile Fragment ", Ġ" User Ġphoto Ġurl : Ġ${ it . photoUrl }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . photoUrl !!. as Firebase Storage Reference ()?. let Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . metadata . add On Success Listener Ġ{ Ġmetadata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" UserProfile Fragment ", Ġ" metadata Ġcreate Ġtime : Ġ${ metadata . creation Time Millis }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Context Ġ= Ġcontext Ġ// Ġcrash Ġoccured Ġhere ; Ġcircum vention Ġattempts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Context Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( current Context ). load Reference With Metadata Signature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref , Ġmetadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). placeholder ( binding . profile Image . image . drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( binding . profile Image . image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreceived Camera Image Capture Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġdefault Ġimg Ġ( needed Ġif Ġimg Ġdeletion Ġis Ġadded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Update Button Enabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity ViewModel . is UserProfile Update Button Enabled . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . confirm Button . isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Predicate Validators () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . invalid ity . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Input Layout Focus Validator Observer ( binding . username Input Field , ĠgetString ( R . string . name _ input _ error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription . invalid ity . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Input Layout Focus Validator Observer ( binding . description Input Field , ĠgetString ( R . string . description _ input _ error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Combined Observer s Invalid ity () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . combined Observer s Invalid ity . observe ( view Lifecycle Owner , ĠView Reverse En abler Observer ( binding . confirm Button )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġobserve Predicate Validators () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġnav Controller . current Back Stack Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . saved State Handle ?. set ( Constants . CAMERA _ URI , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ ĠCallback s . handle Image Request With Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . profile Image . image ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Uri Into G lide And Save In Image Holder ( data !!. data !! , ĠviewModel . base 6 4 Image ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }