package Ġcom . z enger . cookbook . ui . fragments Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroidx . activity . add Callback Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . firebase . Firebase Exception Ċ import Ġcom . google . firebase . Firebase Too Many Requests Exception Ċ import Ġcom . google . firebase . auth . Firebase Auth Invalid Credentials Exception Ċ import Ġcom . google . firebase . auth . Phone Auth Credential Ċ import Ġcom . google . firebase . auth . Phone Auth Provider Ċ import Ġcom . z enger . cookbook . R Ċ import Ġcom . z enger . cookbook . databinding . Fragment Phone SignIn Binding Ċ import Ġcom . z enger . cookbook . repository . Auth Repository Ċ import Ġcom . z enger . cookbook . view models . Login ViewModel Ċ import Ġcom . z enger . cookbook . view models . factories . Login ViewModel Factory Ċ import Ġio . reactivex . rx java 3 . core . Observer Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠPhone SignIn Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfactory Ġby Ġlazy Ġ{ ĠLogin ViewModel Factory ( require Activity (). application ) Ġ} ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠLogin ViewModel Ġby Ġview Models Ġ{ Ġfactory Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Phone SignIn Binding ĊĊĠĠĠ Ġprivate Ġval Ġrepo Ġby Ġlazy Ġ{ ĠAuth Repository ( require Activity (). application ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġvar Ġvalid Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġcallbacks Ġ= Ġobject Ġ: ĠPhone Auth Provider . On Verification StateChanged Callbacks () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Verification Completed ( p 0 : ĠPhone Auth Credential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . firebase Auth With Credentials ( p 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Verification Failed ( e : ĠFirebase Exception ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠFirebase Auth Invalid Credentials Exception ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . container , Ġ" Invalid ĠPhone ĠNumber ", ĠSn ackbar . LENGTH _ LONG ). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( e Ġis ĠFirebase Too Many Requests Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal AccessException (" SMS Ġquota Ġexceeded Ġin Ġfirebase ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e , Ġ" Phone ĠVerification ĠFailed : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . container ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsn ackBar Ġ= ĠSn ackbar . make ( view , Ġ" Sign ĠIn ĠFailed ", ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackBar . setAction (" Retry ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . login Phone . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackBar . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Code Sent ( p 0 : ĠString , Ġp 1 : ĠPhone Auth Provider . Force Res ending Token ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( Phone SignIn Fragment Directions . action Phone SignIn Fragment To O tp Fragment ( p 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġactivity ?. on Back Pressed Dispatcher ?. add Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . login Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ phone _ sign _ in , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġbinding . back Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . login Phone . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġphone Auth () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify Phone () ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġphone Auth () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"+ ${ binding . country Code Layout . selected CountryCode }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠphoneNumber Ġ= Ġcode Ġ+ Ġbinding . phone EditText . text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPhone Auth Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify PhoneNumber ( phoneNumber , Ġ 6 0 , ĠTimeUnit . SECONDS , Ġrequire Activity (), Ġcallbacks ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Mgr Ġ= Ġrequire Activity (). getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Mgr . hide Soft Input From Window ( binding . phone EditText . window Token , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . loading . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . login Phone . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . phone EditText . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . country Code Layout . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . phone EditText . error Ġ= ĠgetString ( R . string . invalid _ phone _ number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġverify Phone () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= ĠRegex ("^ \\ d { 1 0 }$ ") ĊĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= Ġrepo . verify Input ( binding . phone EditText ) ĊĊĠĠĠĠĠĠĠ Ġobservable . subscribe ( object Ġ: ĠObserver < String > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( d ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( t : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" onNext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġt Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( input Ġmatches Ġregex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . phone EditText . error Ġ= ĠgetString ( R . string . invalid _ phone _ number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . phone EditText . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġdis pos ables . dispose () ĊĠĠĠ Ġ} Ċ Ċ }