package Ġcom . el ig ust ilo . N udge Me . on boarding Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . el ig ust ilo . N udge Me . R Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType OrNull Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . IOException ĊĊ Ċ class ĠOn boarding Fragment 1 : ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" On Board ing Fragment 1 " ĊĠĠĠ Ġlateinit Ġvar Ġnext Screen Button : ĠButton ĊĠĠĠ Ġlateinit Ġvar Ġname TextView : ĠTextView ĊĠĠĠ Ġprivate Ġvar ĠNAME _ OBJECT _ KEY Ġ= Ġ" On boarding Fragment 1 " ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠOn boarding ViewModel 1 : ĠOn Board ing Frag 1 ViewModel ĊĠĠĠ Ġvar Ġauth Id Ġ= Ġ" auth Id " ĊĠĠĠ Ġvar ĠdisplayName Ġ= Ġ" display name " ĊĠĠĠ Ġvar ĠuserId Ġ= Ġ" userID " ĊĠĠĠ Ġval Ġbundle Ġ= ĠBundle Ġ() ĊĠĠĠ Ġval ĠON _ BOARD ING _ KEY Ġ= Ġ" ON _ BOARD ING _ KEY " ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( // TODO Ġwhat Ġis Ġthis ĠonCreate View Ġdoing Ġexactly ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ ĠOn boarding ViewModel 1 Ġ= ĠViewModel Providers . of ( this ). get ( On Board ing Frag 1 ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġinflater . inflate ( R . layout . on board _ fragment _ 1 , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ ĠOn boarding ViewModel 1 . test Mutable Data . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtest Mutable Data 1 Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġtest Mutable Data 1 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġname TextView Ġ= Ġview . findViewById ( R . id . name Input TextView ) ĊĊĠĠĠĠĠĠĠ Ġ// Sets Ġthe Ġtop Ġaction Ġbar , Ġalready Ġset Ġin Ġother Ġfr ags Ġbut Ġensures Ġcompliance . ĊĠĠĠĠĠĠĠ Ġval Ġmain Activity Ġ= Ġactivity Ġas ĠAppCompatActivity ? ĊĠĠĠĠĠĠĠ Ġmain Activity ?. support ActionBar ?. set Custom View ( R . layout . action _ bar _ custom ) ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Title Ġ= Ġmain Activity ?. support ActionBar ?. custom View ?. findViewById < TextView >( R . id . action _ bar _ title ) ĊĠĠĠĠĠĠĠ Ġaction Bar Title ?. setText (" N udge Me ") ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Image Ġ= Ġmain Activity ?. support ActionBar ?. custom View ?. findViewById < ImageView >( R . id . action _ bar _ image ) ĊĠĠĠĠĠĠĠ Ġaction Bar Image ?. setImage Resource ( R . drawable . icon _ main _ blue ) ĊĠĠĠĠĠĠĠ Ġmain Activity ?. support ActionBar ?. set Display Show Custom Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġcolor Drawable Ġ= ĠColor Drawable ( Color . parse Color ("# 0 f 8 1 c 7 ")) ĊĠĠĠĠĠĠĠ Ġmain Activity ?. support ActionBar ?. setBackground Drawable ( color Drawable ) ĊĊĠĠĠĠĠĠĠ Ġname TextView . setOn Editor ActionListener Ġ{ Ġv , Ġaction Id , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Id Ġ== ĠEditor Info . IME _ ACTION _ DONE Ġ|| Ġevent . keyCode Ġ== ĠKeyEvent . KEYCODE _ ENTER Ġ|| Ġevent . keyCode Ġ== ĠKeyEvent . ACTION _ DOWN Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġv . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname TextView . text Ġ= Ġv . text . trim () Ġ// Ġremove Ġthe Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcloses Ġthe Ġkeyboard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm : ĠInput Method Manager ? Ġ= Ġrequire Context (). getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( imm Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimm . hide Soft Input From Window ( view . window Token , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmakes Ġit Ġso Ġthe Ġname TextView Ġis Ġnot Ġfocused Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn boarding ViewModel 1 . update Data ( name TextView . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Name ( this . require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ// done ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext Screen Button Ġ= Ġview . findViewById ( R . id . test _ on boarding _ forward )// TODO Ġwhy Ġdoes Ġthis Ġnot Ġwork Ġproperly Ġwithout Ġa ĠviewModel ? ĊĊĠĠĠĠĠĠĠ Ġnext Screen Button . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate User ( Ġthis . require Context ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Name ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġval Ġuser Defaults : ĠSharedPreferences Ġ= Ġcontext . get SharedPreferences ( NAME _ OBJECT _ KEY , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġuser Defaults . edit () ĊĠĠĠĠĠĠĠ Ġeditor . putString ( NAME _ OBJECT _ KEY , Ġname TextView . text . toString ()) ĊĠĠĠĠĠĠĠ Ġeditor . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget UserName ( context : ĠContext ): ĠString { ĊĠĠĠĠĠĠĠ Ġvar ĠuserName String Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġuser Defaults : ĠSharedPreferences Ġ= Ġcontext . application Context . get SharedPreferences ( NAME _ OBJECT _ KEY , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( user Defaults . contains ( NAME _ OBJECT _ KEY )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġuser Defaults . getString ( NAME _ OBJECT _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( userName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName String Ġ= ĠuserName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" the Ġgiven Ġuser Ġname Ġtest Ġfor Ġon boarding Ġis Ġ$ userName String ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠuserName String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate User ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġval Ġok HttpClient Ġ= ĠOk HttpClient Ġ() ĊĠĠĠĠĠĠĠ Ġval ĠcurrentUser Firebase Auth ID Ġ= ĠFirebase Auth . getInstance (). currentUser ?. uid ĊĠĠĠĠĠĠĠ Ġif Ġ( currentUser Firebase Auth ID Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , ĠcurrentUser Firebase Auth ID ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). signIn Anonymous ly () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" FIRE BASE ĠID : Ġ${ it . credential }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" FIRE BASE ĠFailure : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// time Ġto Ġget Ġtoken Ġsecurity Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġtoken Url Ġ= Ġ" https :// reminder - auth - server . herokuapp . com / mobile ? auth Id =$ currentUser Firebase Auth ID " ĊĠĠĠĠĠĠĠ Ġval Ġok HttpRequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( token Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () // This Ġsends Ġthe Ġbody Ġas Ġa Ġpost Ġto Ġthe Ġurl Ġand Ġgets Ġback ĠGRAPH QL Ġdata . ĊĊĠĠĠĠĠĠĠ Ġok HttpClient . new Call ( ok HttpRequest ). enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// on Response Ġis ĠAS Y NC Ġand Ġthe Ġbelow Ġcode Ġis Ġall ĠAS Y NC Ġon secondary Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorization Token Ġ= Ġresponse . body ?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" authorization Token Ġ= Ġ$ authorization Token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authorization Token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentUser Firebase Auth ID Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġget UserName ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutate New User ( userName , ĠcurrentUser Firebase Auth ID , Ġauthorization Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" The Ġnew Ġuser Ġname Ġis : Ġ$ userName , Ġthe Ġnew Ġfirebase Ġauth Ġid Ġis : Ġ$ currentUser Firebase Auth ID , Ġthe Ġnew Ġtoken Ġis : Ġ$ authorization Token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmutate New User ( userName : ĠString , Ġfirebase Auth Id : ĠString , Ġauth Token : ĠString ){ ĊĠĠĠĠĠĠĠ Ġval Ġmutation Url Ġ= Ġ"{\" query \":\" mutation ĠNew User Mutation Ġ{ \\ n Ġ Ġinsert _ users _ one ( object : Ġ{ auth _ id : Ġ\\ \" $ firebase Auth Id \\ \", Ġdisplay _ name : Ġ\\ \" $ userName \\\" }) Ġ{ \\ n ĠĠĠ Ġauth _ id \\ n ĠĠĠ Ġdisplay _ name \\ n ĠĠĠ Ġuser _ login _ name \\ n ĠĠĠ Ġuser _ login _ password \\ n ĠĠĠ Ġuser _ id \\ n Ġ Ġ} \\ n }\ ", \" variables \": { }}" Ċ // ĠĠĠĠĠĠĠ Ġval Ġmutation Url Ġ= Ġ"{\" query \":\" mutation ĠNew User Mutation Ġ{ \\ n Ġ Ġinsert _ users _ one ( object : Ġ{ auth _ id : Ġ\\ \" $ firebase Auth Id \\ \", Ġdisplay _ name : Ġ\\ \" $ userName \\\" }) Ġ{ \\ n ĠĠĠ Ġauth _ id \\ n ĠĠĠ Ġdisplay _ name \\ n ĠĠĠ Ġuser _ login _ name \\ n ĠĠĠ Ġuser _ login _ password \\ n Ġ Ġ} \\ n }\ ", \" variables \": { }}" ĊĠĠĠĠĠĠĠ Ġval Ġok HttpClient Ġ= ĠOk HttpClient Ġ() ĊĠĠĠĠĠĠĠ Ġval Ġbody : ĠRequest Body Ġ= Ġmutation Url . to RequestBody (" application / json ". to MediaType OrNull ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġok HttpRequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// reminder - app - server . herokuapp . com / v 1 / graphql ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Authorization " Ġ, Ġ" Bearer Ġ" Ġ+ Ġauth Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () // This Ġsends Ġthe Ġbody Ġas Ġa Ġpost Ġto Ġthe Ġurl Ġand Ġgets Ġback ĠGRAPH QL Ġdata . ĊĊĠĠĠĠĠĠĠ Ġok HttpClient . new Call ( ok HttpRequest ). enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// on Response Ġis ĠAS Y NC Ġand Ġthe Ġbelow Ġcode Ġis Ġall ĠAS Y NC Ġon secondary Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Defaults : ĠSharedPreferences Ġ= Ġrequire Context (). get SharedPreferences ( ON _ BOARD ING _ KEY , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġuser Defaults . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . putString ( ON _ BOARD ING _ KEY , Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . commit () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġresponse . body ?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Response ĠFrom ĠOur Server : Ġ= Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject Ġ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠjsonObject . getJSONObject (" data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert Users One Ġ= Ġdata . getJSONObject (" insert _ users _ one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Id Ġ= Ġinsert Users One . getString (" auth _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġinsert Users One . getString (" display _ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġinsert Users One . getString (" user _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString (" auth Id ", Ġauth Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString (" displayName ", ĠdisplayName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString (" userId ", ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString (" auth Token ", Ġauth Token ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler . post ( object Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġfind Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( R . id . action _ on board 1 _ to _ on board _ 2 , Ġbundle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }