package Ġcom . example . signup application . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġcom . example . signup application . R Ċ import Ġcom . example . signup application . databinding . Fragment Signup Binding Ċ import Ġcom . example . signup application . model . User Ċ import Ġcom . example . signup application . util . Regex Validation Ċ import Ġcom . example . signup application . view model . SignUp Shared ViewModel Ċ Ċ class ĠSign Up Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Signup Binding ĊĊĠĠĠ Ġprivate Ġval Ġshared ViewModel : ĠSign Up Shared ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate View ( in flater , Ġcontainer , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Signup Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġsetup Listeners () ĊĊĠĠĠĠĠĠĠ Ġbinding . submit Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . setUser Details ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . firstName Text . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Address Text . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . password Text . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . website Text . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchecking Ġvalidations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Validate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Confirm Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Validate (): ĠBoolean Ġ= Ġvalidate Email () Ġ&& Ġvalidate Password () ĊĊĠĠĠ Ġfun Ġload Confirm Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġparent FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . container , ĠConfirm ation Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . email Address Text . add TextChanged Listener ( TextField Validation ( binding . email Address Text )) ĊĠĠĠĠĠĠĠ Ġbinding . password Text . add TextChanged Listener ( TextField Validation ( binding . password Text )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Password (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġbinding . password Text . text . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( shared ViewModel . isRequired ( password )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . password Id . error Ġ= Ġresources . getString ( R . string . password _ required ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . password Text . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . password Id . isError Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Email (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġbinding . email Address Text . text . toString () ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . isRequired ( email ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Id . error Ġ= Ġresources . getString ( R . string . email _ required ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Address Text . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . is Regex Match ( email ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Id . error Ġ= Ġresources . getString ( R . string . please _ enter _ valid _ email ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Address Text . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email Id . isError Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġapplying Ġtext Ġwatcher Ġon Ġeach Ġtext Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠTextField Validation ( private Ġval Ġview : ĠView ) Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen ( view . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . email _ address _ text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Email () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . password _ text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Password () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }