package Ġcom . p wr . s ail app . ui . login ĊĊ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ Ċ import Ġcom . p wr . s ail app . R Ċ import Ġcom . p wr . s ail app . data . s ail . Authentication State Ċ import Ġcom . p wr . s ail app . ui . generic . Login Scoped Fragment Ċ import Ġcom . p wr . s ail app . ui . generic . Scoped Fragment Ċ import Ġcom . p wr . s ail app . viewModel . Login ViewModel Ċ import Ġkotlinx . android . synt hetic . main . fragment _ login .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ // Ġhttps :// developer . android . com / guide / navigation / navigation - conditional Ċ Ċ const Ġval ĠINVALID _ CRED ENTIAL S Ġ= Ġ" Invalid Ġemail Ġor Ġcredentials " Ċ const Ġval ĠLOGIN _ SUCCESS FUL Ġ= Ġ" Login Ġsuccessful " Ċ Ċ class ĠLogin Fragment Ġ: ĠLogin Scoped Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġnav Controller Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ login , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbutton _ register . setOnClickListener Ġ{ Ġnav Controller . navigate ( R . id . action _ login Fragment _ to _ register Fragment ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġbutton _ login . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġedit Text _ email . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġedit Text _ password . text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Loading Bar Visibility ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ login ViewModel . authenticate ( email , Ġpassword )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Loading Bar Visibility ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ViewModel . authentication State . observe ( view Lifecycle Owner , Ġauthentication State Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġauthentication State Observer Ġ= ĠObserver < Authentication State > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Login Ġfragment ", Ġ" login ViewModel . authentication State . value Ġ= Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Observer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication State . AUTHENT IC ATED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ack ( LOGIN _ SUCCESS FUL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( R . id . destination _ main ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsn ack ( INVALID _ CRED ENTIAL S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange Loading Bar Visibility ( isVisible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . change Loading Bar Visibility ( isVisible ) ĊĠĠĠĠĠĠĠ Ġif ( isVisible ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ login . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ register . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Layout _ logging . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ login . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ register . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Layout _ logging . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ