package Ġorg . ny pl . simpl ified . card creator . 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 Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Directions Ċ import Ġandroidx . navigation . Navigation Ċ import Ġorg . ny pl . simpl ified . card creator . R Ċ import Ġorg . ny pl . simpl ified . card creator . databinding . Fragment Account Information Binding Ċ import Ġorg . ny pl . simpl ified . card creator . utils . Cache Ċ import Ġorg . ny pl . simpl ified . card creator . utils . hide Keyboard Ċ import Ġorg . ny pl . simpl ified . card creator . view model . Username ViewModel Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ class ĠAccount Information Fragment Ġ: ĠFragment () Ġ{ ĊĊĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Account Information Fragment :: class . java ) ĊĊĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Account Information Binding ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠ Ġprivate Ġlateinit Ġvar Ġnav Controller : ĠNav Controller ĊĠ Ġprivate Ġlateinit Ġvar Ġnext Action : ĠNav Directions ĊĠ Ġprivate Ġvar Ġback Ġ= Ġfalse ĊĊĠ Ġprivate Ġval Ġmin Pin Chars Ġ= Ġ 4 ĊĠ Ġprivate Ġval Ġusername Min Chars Ġ= Ġ 5 ĊĠ Ġprivate Ġval Ġusername Max Chars Ġ= Ġ 2 5 ĊĠ Ġprivate Ġval Ġusername Available Ġ= Ġ" available - username " ĊĊĠ Ġprivate Ġval ĠviewModel : ĠUsername ViewModel Ġby Ġview Models () ĊĊĠ Ġprivate Ġvar Ġdialog : ĠAlertDialog ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠ Ġ): ĠView ? Ġ{ ĊĠĠĠ Ġ_ binding Ġ= ĠFragment Account Information Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġreturn Ġbinding . root ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠ Ġarguments ?. let Ġ{ ĊĠĠĠĠĠ Ġback Ġ= ĠAccount Information Fragment Args . from Bundle ( it ). back ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġnav Controller Ġ= ĠNavigation . find Nav Controller ( require Activity (), ĠR . id . card _ creator _ nav _ host _ fragment ) ĊĊĠĠĠ Ġbinding . pin Et . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Form () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġbinding . username Et . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Form () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġ// ĠGo Ġto Ġnext Ġscreen ĊĠĠĠ Ġbinding . next Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠ Ġback Ġ= Ġfalse ĊĠĠĠĠĠ Ġvalidate Username () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGo Ġto Ġprevious Ġscreen ĊĠĠĠ Ġbinding . prev Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġnav Controller . pop Back Stack () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrestore ViewData () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvalidate Username () Ġ{ ĊĠĠĠ Ġshow Loading ( true ) ĊĠĠĠ ĠviewModel . validate Username Response . observe ( ĊĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠ ĠObserver Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ(! back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġshow Loading ( false ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . type Ġ== Ġusername Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Username Ġis Ġvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache ( require Context ()). set Account Information ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . username Et . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pin Et . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Action Ġ= ĠAccount Information Fragment Directions . action Next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( next Action ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġresponse . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠviewModel . api Error . observe ( ĊĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Loading ( false ) ĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= ĠgetString ( R . string . validate _ username _ general _ error ) ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror Ġ= ĠgetString ( R . string . validate _ username _ error , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdialog Builder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġdialog Builder . setMessage ( error ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . try _ again )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Username () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel )) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( dialog Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdialog Ġ= Ġdialog Builder . create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog ?. show () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠĠĠ ĠviewModel . validate Username ( ĊĠĠĠĠĠ Ġbinding . username Et . text . toString (), ĊĠĠĠĠĠ Ġrequire Activity (). intent . getString Extra (" username ") !! , ĊĠĠĠĠĠ Ġrequire Activity (). intent . getString Extra (" password ") !! ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvalidate Form () Ġ{ ĊĠĠĠ Ġbinding . next Btn . isEnabled Ġ= Ġbinding . pin Et . text . length Ġ== ĊĠĠĠĠĠ Ġmin Pin Chars Ġ&& ĊĠĠĠĠĠ Ġbinding . username Et . text . length Ġin Ġusername Min Chars .. username Max Chars ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠShow Ġloading Ġscreen ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġshow Loading ( show : ĠBoolean ) Ġ{ ĊĠĠĠ Ġlogger . debug (" To g gling Ġloading Ġscreen ") ĊĠĠĠ Ġif Ġ( show ) Ġ{ ĊĠĠĠĠĠ Ġbinding . loading . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġbinding . loading . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRest ores Ġcached Ġdata ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġrestore ViewData () Ġ{ ĊĠĠĠ Ġval Ġaccount Information Ġ= ĠCache ( require Context ()). get Account Information () ĊĠĠĠ Ġbinding . pin Et . setText ( account Information . pin , ĠTextView . Buffer Type . EDIT ABLE ) ĊĠĠĠ Ġbinding . username Et . setText ( account Information . username , ĠTextView . Buffer Type . EDIT ABLE ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġdialog ?. dismiss () ĊĠ Ġ} Ċ } Ċ