package Ġapp . th irty nin th . github viewer . ui . view Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . lifecycle . repeat On Lifecycle Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġapp . th irty nin th . github viewer . R Ċ import Ġapp . th irty nin th . github viewer . data . models . Exception Bundle Ċ import Ġapp . th irty nin th . github viewer . databinding . Auth Fragment Binding Ċ import Ġapp . th irty nin th . github viewer . extent ions . bind Text Two Way Flow Ċ import Ġapp . th irty nin th . github viewer . ui . view model . Auth ViewModel Ċ import Ġapp . th irty nin th . github viewer . ui . view model . Auth ViewModel . Action Ċ import Ġapp . th irty nin th . github viewer . ui . view model . Auth ViewModel . Screen State Ċ import Ġapp . th irty nin th . github viewer . utils . call Exception Dialog Ċ import Ġapp . th irty nin th . github viewer . utils . map Alert Message Ċ import Ġby . kir ich 1 4 0 9 . view binding delegate . Create Method Ċ import Ġby . kir ich 1 4 0 9 . view binding delegate . view Binding Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ @ Android EntryPoint Ċ class ĠAuth Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠAuth Fragment :: class . java . simple Name ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠAuth ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠAuth Fragment Binding Ġby Ġview Binding ( Create Method . IN FL ATE ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate View ( in flater , Ġcontainer , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( false ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġsetup UI () ĊĠĠĠĠĠĠĠ Ġsetup Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Token . bind Text Two Way Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Flow Ġ= ĠviewModel . auth Token Flow , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġlifecycle Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on SignIn Button Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . repeat On Lifecycle ( Lifecycle . State . STARTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . actions . collect Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Action ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . repeat On Lifecycle ( Lifecycle . State . STARTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . state . collect Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle State ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġroute To Repositories List () Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Auth Fragment Directions . route To Repositories Screen ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow ErrorMessage ( exception Bundle : ĠException Bundle ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d ( exception Bundle . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġexception Bundle . title . getString ( require Context ()) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmap Alert Message ( exception Bundle , Ġrequire Context ()) ĊĊĠĠĠĠĠĠĠ Ġcall Exception Dialog ( title , Ġmessage , Ġrequire Context ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( exception Bundle . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Action ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . Route To Repository List Ġ-> Ġroute To Repositories List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction . Show Error Ġ-> Ġshow ErrorMessage ( action . exception Bundle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle State ( state : ĠScreen State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Container . error Ġ= Ġif Ġ( state Ġis ĠScreen State . Invalid AuthToken Input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . reason . getString ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Button . text Ġ= Ġif Ġ( state Ġis ĠScreen State . Loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetText ( R . string . sign _ in ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Circular . visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠScreen State . Loading ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }