package Ġcom . notes ync . notes . framework . presentation . auth Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . widget . add TextChanged Listener Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment . find Nav Controller Ċ import Ġandroidx . transition . Transition Inflater Ċ import Ġcom . notes ync . notes . R Ċ import Ġcom . notes ync . notes . business . domain . state . State Message Callback Ċ import Ġcom . notes ync . notes . framework . presentation . UI Controller Ċ import Ġcom . notes ync . notes . framework . presentation . auth . state . Auth State Event Ċ import Ġcom . notes ync . notes . framework . presentation . auth . state . Login Fields Ċ import Ġcom . notes ync . notes . framework . presentation . auth . state . Registration Fields Ċ import Ġcom . notes ync . notes . framework . presentation . common . Auth ViewModel Factory Ċ import Ġcom . notes ync . notes . framework . presentation . common . hide Keyboard Ċ import Ġcom . notes ync . notes . framework . presentation . common . invisible Ċ import Ġcom . notes ync . notes . framework . presentation . common . visible Ċ import Ġkotlinx . android . synt hetic . main . fragment _ login .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ register .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ register . register _ button Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġkotlinx . coroutines . Obsolete Cor outines Api Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Flow Preview Ċ @ Obsolete Cor outines Api Ċ @ Experimental Cor outines Api Ċ class ĠRegister Fragment ( private Ġval ĠviewModel Factory : ĠAuth ViewModel Factory ) Ġ: ĊĠĠĠ ĠFragment ( R . layout . fragment _ register ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠAuth ViewModel Ġby Ġactivity ViewModels Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Factory ĊĠĠĠ Ġ} ĊĠĠĠ Ġlateinit Ġvar Ġui Controller : ĠUI Controller ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel . setup Channel () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġshared Element Enter Transition Ġ= ĠTransition Inflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate Transition ( R . transition . shared _ element _ transition ) ĊĠĠĠĠĠĠĠ Ġregister _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . hide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogin _ button _ register . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller ( this ). pop Back Stack () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Listener () ĊĠĠĠĠĠĠĠ Ġsubscribe Observer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . setState Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth State Event . Register Attempt Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġemail Text Listener () ĊĠĠĠĠĠĠĠ Ġpassword Text Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe Observer () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . view State . observe ( view Lifecycle Owner , Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . registration Fields ?. let Ġ{ Ġregistration Fields Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistration Fields . registration _ email ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address . setText ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistration Fields . registration _ password ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password . setText ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . is Register Button Enabled . collect Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ button . isEnabled Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . should Display ProgressBar . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ button . invisible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller . display ProgressBar ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . state Message . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġstate Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Message ?. response ?. let Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller . on Response Received ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Message Callback Ġ= Ġobject Ġ: ĠState Message Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Message From Stack () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . clear State Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ ĠviewModel . set Registration Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegistration Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ ĠviewModel . set Registration Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegistration Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpassword Text Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġregister _ password . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Register Password ( it . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( register _ password _ layout . isError Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password _ layout . error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . validate Password s ( this . text . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Focus ChangeListener Ġ= ĠView . On Focus ChangeListener Ġ{ Ġ_, Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . password Register Focus Initial = false ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password _ layout . isError Enabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! viewModel . validate Password s ( this . text . toString ()). isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password _ layout . error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . validate Password s ( this . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ password _ layout . isError Enabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! viewModel . password Register Focus Initial ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemail Text Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġregister _ email _ address . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Register Email ( it . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( register _ email _ address _ layout . isError Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address _ layout . error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . validate Email ( this . text . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Focus ChangeListener Ġ= ĠView . On Focus ChangeListener Ġ{ Ġ_, Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . email Register Focus Initial = false ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address _ layout . isError Enabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! viewModel . validate Email ( this . text . toString ()). isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address _ layout . error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . validate Email ( this . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister _ email _ address _ layout . isError Enabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! viewModel . email Register Focus Initial ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġactivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller Ġ= Ġcontext Ġas ĠUI Controller ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }