package Ġcom . example . h obby fi . view models . auth Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . example . h obby fi . int ents . Facebook Intent Ċ import Ġcom . example . h obby fi . int ents . Intent Ċ import Ġcom . example . h obby fi . int ents . Token Intent Ċ import Ġcom . example . h obby fi . models . data . State Intent Ċ import Ġcom . example . h obby fi . models . data . Tag Ċ import Ġcom . example . h obby fi . models . data . Tag Bundle Ċ import Ġcom . example . h obby fi . shared . invalidate By Ċ import Ġcom . example . h obby fi . state . Facebook State Ċ import Ġcom . example . h obby fi . state . Token State Ċ import Ġcom . example . h obby fi . view models . base . Auth Inclusive ViewModel Ċ import Ġcom . example . h obby fi . view models . base . Tag Bundle Holder Ċ import Ġcom . example . h obby fi . view models . base . Tag Bundle Holder ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Experimental Cor outines Api Ċ class ĠLogin Fragment ViewModel ( application : ĠApplication ) Ġ: ĠAuth Inclusive ViewModel ( application ), ĊĠĠĠĠĠĠĠ ĠTag Bundle Holder Ġby ĠTag Bundle Holder ViewModel () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Intent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ sent Fb Token Fetch Ġ= Ġfalse ĊĠĠĠ Ġfun Ġset Sent Fb Token Fetch ( fetch : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sent Fb Token Fetch Ġ= Ġfetch ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsent Fb Token Fetch Ġget () Ġ= Ġ_ sent Fb Token Fetch ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfacebook State Intent : ĠState Intent < Facebook State , ĠFacebook Intent > ĊĊĠĠĠ Ġfun Ġreset Facebook State () Ġ= Ġfacebook State Intent . setState ( Facebook State . Idle ) ĊĊĠĠĠ Ġval Ġfacebook State Ġget () Ġ= Ġfacebook State Intent . state ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Intent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdifferent Ġchannels Ġconsumed Ġas Ġflows Ġmust Ġbe Ġcollected Ġin Ġdifferent Ġcoroutine Ġjobs ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacebook State Intent Ġ= Ġobject Ġ: ĠState Intent < Facebook State , ĠFacebook Intent >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġ_ state : ĠMutable State Flow < Facebook State > Ġ= ĠMutable State Flow ( Facebook State . Idle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġhas Ġto Ġbe Ġinit - ed Ġhere Ġbecause Ġthis Ġabstract Ġmethod Ġgets Ġcalled / initial ised Ġbefore Ġthe Ġintent Ġsomehow ??? ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacebook State Intent . intent As Flow (). collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFacebook Intent . Fetch Facebook User Tags Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Facebook Tags () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFacebook Intent . Fetch Facebook User Email Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Facebook Email () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFacebook Intent . Validate Facebook User Ex istence Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch User Ex istence ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain State Intent . intent As Flow (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠToken Intent . Fetch Login Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Login Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠToken Intent . Fetch Facebook Register Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Login Fragment VM ", Ġ" fetch ing ĠFB Ġregister Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Register Token Facebook ( it . facebook Token , Ġit . username , Ġemail . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Bundle . selected Tags ) Ġ// Ġfix me : Ġrepeated Ġunnecessary Ġchecks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIntent . Invalid Intent Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsend Facebook Intent ( i : ĠFacebook Intent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . send Intent ( i ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch User Ex istence ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( Facebook State . Loading ) ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . On Data . Ex istence Result Received ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Repository . getUser Ex istence ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . Error ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Facebook Tags () Ġ{ ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( Facebook State . Loading ) ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . On Data . Tags Received ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Repository . get Facebook User Page Titles As Tags () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . Error ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Facebook Email () Ġ{ ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( Facebook State . Loading ) ĊĠĠĠĠĠĠĠ Ġfacebook State Intent . setState ( try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . On Data . Email Received ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Repository . get Facebook User Email () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFacebook State . Error ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠSave Ġfacebook Ġuser Ġpicture Ġon Ġown Ġback - end ? ĠUse less Ġbut Ġeasier ? ĊĠĠĠ Ġ// Ġ... if Ġthe ĠFacebook Ġuser Ġchanges Ġtheir Ġprofile Ġpicture , Ġit Ġwon 't Ġbe Ġsynced Ġin Ġthe Ġapp ... ĊĠĠĠ Ġ// ĠToo Ġbad ! ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Register Token Facebook ( facebook Token : ĠString , Ġusername : ĠString , Ġemail : ĠString ?, Ġtags : ĠList < Tag >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain State Intent . setState ( Token State . Loading ) ĊĠĠĠĠĠĠĠ Ġmain State Intent . setState ( try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Repository . get Register Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfacebook Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken State . Facebook Register Token Success ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken State . Error ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcombined Observer s Invalid ity : ĠLive Data < Boolean > Ġget () Ġ= Ġinvalidate By ( ĊĠĠĠĠĠĠĠ Ġpassword . invalid ity , ĊĠĠĠĠĠĠĠ Ġemail . invalid ity ĊĠĠĠ Ġ) Ċ }