// ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ // Ċ // Ġ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 . example . loy alty ap ide mo . activity . signup Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . example . loy alty ap ide mo . R Ċ import Ġcom . example . loy alty ap ide mo . databinding . Activity Signup Binding Ċ Ċ class ĠSign Up Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsign Up ViewModel : ĠSign Up ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Signup Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Signup Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġsign Up ViewModel Ġ= ĠViewModel Provider ( this , ĠSign Up ViewModel Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( SignUp ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġsign Up ViewModel . sign Up Form State . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ SignUp Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Up State Ġ= Ġit Ġ?: Ġreturn @ Observer ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdisable Ġsign Ġup Ġbutton Ġunless Ġboth Ġname Ġand Ġemail Ġare Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sign Up . isEnabled Ġ= Ġsign Up State . is Data Valid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . name . error Ġ= Ġsign Up State . name Error ?. let (:: getString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email . error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . email . text . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign Up State . email Error ?. let (:: getString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwatch Ġfor Ġsign Up Result ĊĠĠĠĠĠĠĠ Ġsign Up ViewModel . sign Up Result . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ SignUp Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Up Result Ġ= Ġit Ġ?: Ġreturn @ Observer ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loading . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sign Up Result . error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , ĠR . string . sign _ up _ failed , ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 : Ġstart ĠSign Up Confirmation Activity Ġwith Ġthe ĠJWT Ġfrom Ġthe Ġsign Up Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" TODO : Ġimplement Ġme ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbinding . name . after TextChanged Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Up ViewModel . sign Up Data Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . name . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . email . after TextChanged Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Up ViewModel . sign Up Data Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . name . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . email . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . sign Up . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loading . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġsign Up Ġclick , Ġinitiate Ġthe Ġsign Up Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Up ViewModel . sign Up ( binding . name . text . toString (), Ġbinding . email . text . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExtension Ġfunction Ġto Ġsimplify Ġsetting Ġan Ġafter TextChanged Ġaction Ġto ĠEditText Ġcomponents . Ċ Ġ*/ Ċ fun ĠEditText . after TextChanged ( after TextChanged : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter TextChanged . invoke ( editable . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠ Ġ}) Ċ } Ċ