package Ġorg . simple . clin ic . user Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġcom . f 2 pr ate ek . rx . preferences 2 . Preference Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġdagger . Lazy Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . rx kotlin . Sing les Ċ import Ġio . reactivex . rx kotlin . zip With Ċ import Ġorg . simple . clin ic . App Database Ċ import Ġorg . simple . clin ic . analytics . Analytics Ċ import Ġorg . simple . clin ic . app config . Country Ċ import Ġorg . simple . clin ic . di . App Scope Ċ import Ġorg . simple . clin ic . facility . Facility Repository Ċ import Ġorg . simple . clin ic . forgot pin . Forgot Pin Response Ċ import Ġorg . simple . clin ic . forgot pin . Reset Pin Request Ċ import Ġorg . simple . clin ic . login . Login Api Ċ import Ġorg . simple . clin ic . login . Login ErrorResponse Ċ import Ġorg . simple . clin ic . login . Login Request Ċ import Ġorg . simple . clin ic . login . Login Response Ċ import Ġorg . simple . clin ic . login . Login Result Ċ import Ġorg . simple . clin ic . login . User Payload Ċ import Ġorg . simple . clin ic . patient . Patient Repository Ċ import Ġorg . simple . clin ic . registration . Find User Result Ċ import Ġorg . simple . clin ic . registration . Registration Api Ċ import Ġorg . simple . clin ic . registration . Registration Request Ċ import Ġorg . simple . clin ic . registration . Registration Response Ċ import Ġorg . simple . clin ic . registration . Registration Result Ċ import Ġorg . simple . clin ic . security . Password Hash er Ċ import Ġorg . simple . clin ic . security . pin . Br ute Force Protection Ċ import Ġorg . simple . clin ic . storage . files . Clear All Files Result Ċ import Ġorg . simple . clin ic . storage . files . File Storage Ċ import Ġorg . simple . clin ic . sync . Data Sync Ċ import Ġorg . simple . clin ic . user . User . LoggedIn Status . LOG GED _ IN Ċ import Ġorg . simple . clin ic . user . User . LoggedIn Status . NOT _ LOG GED _ IN Ċ import Ġorg . simple . clin ic . user . User . LoggedIn Status . RESET _ PIN _ REQUEST ED Ċ import Ġorg . simple . clin ic . user . User . LoggedIn Status . UN AUTHORIZ ED Ċ import Ġorg . simple . clin ic . user . User Status . Approved For Sync ing Ċ import Ġorg . simple . clin ic . user . User Status . Waiting For Approval Ċ import Ġorg . simple . clin ic . util . Just Ċ import Ġorg . simple . clin ic . util . None Ċ import Ġorg . simple . clin ic . util . Optional Ċ import Ġorg . simple . clin ic . util . filter And Un wrap Just Ċ import Ġorg . simple . clin ic . util . scheduler . Schedulers Provider Ċ import Ġretrofit 2 . HttpException Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ App Scope Ċ class ĠUser Session Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġlogin Api : ĠLogin Api , ĊĠĠĠ Ġprivate Ġval Ġregistration Api : ĠRegistration Api , ĊĠĠĠ Ġprivate Ġval Ġm oshi : ĠM oshi , ĊĠĠĠ Ġprivate Ġval Ġfacility Repository : ĠFac ility Repository , ĊĠĠĠ Ġprivate Ġval Ġshared Preferences : ĠSharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġapp Database : ĠApp Database , ĊĠĠĠ Ġprivate Ġval Ġpassword Hash er : ĠPassword Hash er , ĊĠĠĠ Ġ// ĠThis Ġis ĠLazy Ġto Ġwork Ġaround Ġa Ġcy clic Ġdependency Ġbetween ĊĠĠĠ Ġ// ĠData Sync , ĠUser Session , Ġand ĠPatient Repository . ĊĠĠĠ Ġprivate Ġval Ġdata Sync : ĠLazy < Data Sync >, ĊĠĠĠ Ġprivate Ġval Ġongoing Login Entry Repository : ĠO ngo ing Login Entry Repository , ĊĠĠĠ Ġprivate Ġval Ġbr ute Force Protection : ĠBr ute Force Protection , ĊĠĠĠ Ġprivate Ġval Ġfile Storage : ĠFile Storage , ĊĠĠĠ Ġprivate Ġval Ġreport Pending Records : ĠReport Pending Records To Analytics , ĊĠĠĠ Ġprivate Ġval Ġs chedulers Provider : ĠS chedulers Provider , ĊĠĠĠ Ġprivate Ġval Ġselected Country Preference : ĠPreference < Optional < Country >>, ĊĠĠĠ Ġ@ Named (" preference _ access _ token ") Ġprivate Ġval ĠaccessToken Preference : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" last _ patient _ pull _ token ") Ġprivate Ġval Ġpatient Sync Pull Token : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" last _ pre scription _ pull _ token ") Ġprivate Ġval Ġpre scription Sync Pull Token : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" last _ appointment _ pull _ token ") Ġprivate Ġval Ġappointment Sync Pull Token : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" last _ medical history _ pull _ token ") Ġprivate Ġval Ġmedical History Sync Pull Token : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" last _ en counter _ pull _ token ") Ġprivate Ġval Ġencounter Sync Pull Token : ĠPreference < Optional < String >>, ĊĠĠĠ Ġ@ Named (" on boarding _ complete ") Ġprivate Ġval Ġon boarding Complete : ĠPreference < Boolean > Ċ ) Ġ{ ĊĊĠ Ġprivate Ġvar Ġongoing Registration Entry : ĠO ngo ing Registration Entry ? Ġ= Ġnull ĊĊĠ Ġfun Ġsave O ngo ing Login Entry ( entry : ĠO ngo ing Login Entry ): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġongoing Login Entry Repository . save Login Entry ( entry ) ĊĠ Ġ} ĊĊĠ Ġfun Ġongoing Login Entry (): ĠSingle < O ngo ing Login Entry > Ġ{ ĊĠĠĠ Ġreturn Ġongoing Login Entry Repository . entry () ĊĠ Ġ} ĊĊĠ Ġfun Ġclear O ngo ing Login Entry (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġongoing Login Entry Repository . clear Login Entry () ĊĠ Ġ} ĊĊĠ Ġfun Ġlogin With O tp ( otp : ĠString ): ĠSingle < Login Result > Ġ{ ĊĠĠĠ Ġreturn Ġongoing Login Entry () ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" Logging Ġin Ġwith ĠO TP ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠLogin Request ( User Payload ( it . phoneNumber !! , Ġit . pin !! , Ġo tp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlogin Api . login ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstore User And AccessToken ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Default ( Login Result . Success Ġas ĠLogin Result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġreport User LoggedIn To Analytics () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Default ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġsync On Login Result () Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġclear O ngo ing Login Entry (). subscribe () Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġis ĠIOException Ġ-> ĠLogin Result . Network Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġis ĠHttp Exception Ġ&& Ġerror . code () Ġ== Ġ 4 0 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Response Ġ= Ġread ErrorResponse Json ( error , ĠLogin ErrorResponse :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Result . ServerError ( error Response . first Error ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Result . Unexpected Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠTim ber . i (" Login Ġresult : Ġ$ it ") Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġreport User LoggedIn To Analytics (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġ( user ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĠAnalytics . set LoggedIn User ( user !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsync On Login Result () Ġ{ ĊĠĠĠ Ġdata Sync ĊĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠ Ġ. sync The World () ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( schedul ers Provider . io ()) ĊĠĠĠĠĠĠĠ Ġ. onError Complete () ĊĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠ Ġ} ĊĊĠ Ġfun Ġsave O ngo ing Registration Entry As User (): ĠComp letable Ġ{ ĊĠĠĠ Ġval Ġongoing Entry Ġ= Ġongoing Registration Entry (). cache () ĊĊĠĠĠ Ġreturn Ġongoing Entry ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" Logging Ġin Ġfrom Ġongoing Ġregistration Ġentry ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. zip With ( ongo ing Entry . flatMap Ġ{ Ġentry Ġ-> Ġpassword Hash er . hash ( entry . pin !! ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġ( entry , Ġpassword Digest ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġentry . uuid !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġentry . fullName !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= Ġentry . phoneNumber !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin Digest Ġ= Ġpassword Digest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcreatedAt Ġ= Ġentry . createdAt !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠupdatedAt Ġ= Ġentry . createdAt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠWaiting For Approval , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogged In Status Ġ= ĠNOT _ LOG GED _ IN ) ĊĠĠĠĠĠĠĠĠĠ Ġstore User ( user , Ġentry . facility Id !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġfind Existing User ( phoneNumber : ĠString ): ĠSingle < Find User Result > Ġ{ ĊĠĠĠ ĠTim ber . i (" Finding Ġuser Ġwith Ġphone Ġnumber ") ĊĠĠĠ Ġreturn Ġregistration Api . find User ( phoneNumber ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġuser Ġ-> ĠFind User Result . Found ( user ) Ġas ĠFind User Result Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġis ĠIOException Ġ-> ĠFind User Result . Network Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġis ĠHttp Exception Ġ&& Ġe . code () Ġ== Ġ 4 0 4 Ġ-> ĠFind User Result . NotFound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFind User Result . Unexpected Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġrefresh LoggedIn User (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġrequire LoggedIn User () ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠTim ber . i (" Refresh ing Ġlogged - in Ġuser ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġlogged In User Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġregistration Api . find User ( logged In User . phoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġuser Payload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThis Ġwas Ġadded Ġto Ġhandle Ġthe Ġcase Ġwhere Ġthe Ġuser Ġlogged Ġin Ġstatus Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġget Ġset Ġto ĠLOG GED _ IN Ġwhen Ġthe ĠPIN Ġreset Ġrequest Ġis Ġapproved . ĠSee Ġif Ġit Ġcan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbe Ġdone Ġin Ġa Ġbetter Ġway Ġsince Ġthere Ġare Ġmany Ġplaces Ġwhere Ġthis Ġsort Ġof Ġlogic Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġl itter ed Ġall Ġover Ġthe Ġapp Ġcurrently . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal LoggedIn Status Ġ= Ġif Ġ( logged In User . logged In Status Ġ== ĠRESET _ PIN _ REQUEST ED Ġ&& Ġuser Payload . status Ġ== ĠApproved For Sync ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG GED _ IN ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogged In User . logged In Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser From Payload ( user Payload , Ġfinal LoggedIn Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate User ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġregister (): ĠSingle < Registration Result > Ġ{ ĊĠĠĠ Ġval Ġuser : ĠSingle < User > Ġ= Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( user ) Ġ-> Ġuser !! Ġ} ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. cache () ĊĊĠĠĠ Ġval Ġcurrent Facility Ġ= Ġuser ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfacility Repository . facility Uuid s ForUser ( it ). first Or Error () Ġ} ĊĊĠĠĠ Ġreturn ĠSing les . zip ( user , Ġcurrent Facility ) ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" Register ing Ġuser ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( user , Ġfacility Uuid s ) Ġ-> Ġuser To Payload ( user , Ġfacility Uuid s ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map (:: Registration Request ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġregistration Api . createUser ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġstore User And AccessToken ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Default ( Registration Result . Success Ġas ĠRegistration Result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġreport User Registered To Analytics () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Default ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> ĠRegistration Result . Network Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRegistration Result . Unexpected Error ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠTim ber . i (" Registration Ġresult : Ġ$ it ") Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġreport User Registered To Analytics (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġ( user ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĠAnalytics . set New ly Registered User ( user !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġuser To Payload ( user : ĠUser , Ġfacility Uuid s : ĠList < UUID >): ĠLog ged In User Payload Ġ{ ĊĠĠĠ Ġreturn Ġuser . run Ġ{ ĊĠĠĠĠĠ ĠLog ged In User Payload ( ĊĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġuuid , ĊĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= ĠfullName , ĊĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= ĠphoneNumber , ĊĠĠĠĠĠĠĠĠĠ Ġpin Digest Ġ= Ġpin Digest , ĊĠĠĠĠĠĠĠĠĠ Ġregistration Facility Id Ġ= Ġfacility Uuid s . first (), ĊĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠ ĠcreatedAt Ġ= ĠcreatedAt , ĊĠĠĠĠĠĠĠĠĠ ĠupdatedAt Ġ= ĠupdatedAt ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġuser From Payload ( payload : ĠLog ged In User Payload , Ġstatus : ĠUser . LoggedIn Status ): ĠUser Ġ{ ĊĠĠĠ Ġreturn Ġpayload . run Ġ{ ĊĠĠĠĠĠ ĠUser ( ĊĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġuuid , ĊĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= ĠfullName , ĊĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= ĠphoneNumber , ĊĠĠĠĠĠĠĠĠĠ Ġpin Digest Ġ= Ġpin Digest , ĊĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġthis . status , ĊĠĠĠĠĠĠĠĠĠ ĠcreatedAt Ġ= ĠcreatedAt , ĊĠĠĠĠĠĠĠĠĠ ĠupdatedAt Ġ= ĠupdatedAt , ĊĠĠĠĠĠĠĠĠĠ Ġlogged In Status Ġ= Ġstatus ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġsave O ngo ing Registration Entry ( entry : ĠO ngo ing Registration Entry ): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠ Ġthis . ongo ing Registration Entry Ġ= Ġentry ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġongoing Registration Entry (): ĠSingle < O ngo ing Registration Entry > Ġ{ ĊĠĠĠ Ġreturn ĠSingle . from Callable Ġ{ Ġongoing Registration Entry Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġclear O ngo ing Registration Entry (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠ Ġongoing Registration Entry Ġ= Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis O ngo ing Registration Entry Present (): ĠSingle < Boolean > Ġ= ĊĠĠĠĠĠ ĠSingle . from Callable Ġ{ Ġongoing Registration Entry Ġ!= Ġnull Ġ} ĊĊĠ Ġfun Ġstore User And AccessToken ( response : ĠLogin Response ): ĠComp letable Ġ{ ĊĠĠĠ ĠTim ber . i (" St oring Ġuser Ġand Ġaccess Ġtoken . ĠIs Ġtoken Ġblank ? Ġ${ response . accessToken . isBlank () }") ĊĠĠĠ ĠaccessToken Preference . set ( Just ( response . accessToken )) ĊĠĠĠ Ġreturn Ġstore User ( ĊĠĠĠĠĠĠĠ Ġuser From Payload ( response . logged In User , ĠLOG GED _ IN ), ĊĠĠĠĠĠĠĠ Ġresponse . logged In User . registration Facility Id ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstore User And AccessToken ( response : ĠF orgot Pin Response ): ĠComp letable Ġ{ ĊĠĠĠ ĠTim ber . i (" St oring Ġuser Ġand Ġaccess Ġtoken . ĠIs Ġtoken Ġblank ? Ġ${ response . accessToken . isBlank () }") ĊĠĠĠ ĠaccessToken Preference . set ( Just ( response . accessToken )) ĊĊĠĠĠ Ġval Ġuser Ġ= Ġuser From Payload ( response . logged In User , ĠRESET _ PIN _ REQUEST ED ) ĊĠĠĠ Ġreturn Ġstore User ( user , Ġresponse . logged In User . registration Facility Id ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstore User And AccessToken ( response : ĠRegistration Response ): ĠComp letable Ġ{ ĊĠĠĠ ĠTim ber . i (" St oring Ġuser Ġand Ġaccess Ġtoken . ĠIs Ġtoken Ġblank ? Ġ${ response . accessToken . isBlank () }") ĊĠĠĠ ĠaccessToken Preference . set ( Just ( response . accessToken )) ĊĊĠĠĠ Ġval Ġuser Ġ= Ġuser From Payload ( response . user Payload , ĠLOG GED _ IN ) ĊĠĠĠ Ġreturn Ġstore User ( user , Ġresponse . user Payload . registration Facility Id ) ĊĠ Ġ} ĊĊĠ Ġfun Ġstore User ( user : ĠUser , Ġfacility Uuid : ĠUUID ): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠ Ġ. from Action Ġ{ Ġapp Database . user Dao (). create OrUpdate ( user ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" St oring Ġuser ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. and Then ( facility Repository . associate User With Fac ilities ( user , ĠlistOf ( facility Uuid ), Ġcurrent Facility Ġ= Ġfacility Uuid )) ĊĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĠTim ber . e ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate User ( user : ĠUser ): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠ Ġ. from Action Ġ{ Ġapp Database . user Dao (). create OrUpdate ( user ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" Updating Ġuser ") Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġread ErrorResponse Json ( error : ĠHttp Exception , Ġclazz : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠ Ġval Ġjson Adapter Ġ= Ġm oshi . adapter ( clazz . java ) ĊĠĠĠ Ġreturn Ġjson Adapter . fromJson ( error . response (). error Body () !!. source ()) !! ĊĠ Ġ} ĊĊĠ Ġfun Ġclear LoggedIn User (): ĠComp letable Ġ{ ĊĠĠĠ ĠTim ber . i (" Clear ing Ġlogged - in Ġuser ") ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠJust < User > Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( user ) Ġ-> Ġuser !! Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Database . user Dao (). delete User And Facility Mappings ( it , Ġapp Database . user Facility Mapping Dao ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġlogout (): ĠSingle < Logout Result > Ġ{ ĊĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠ Ġ. concat Array ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Pending Records . report (). onError Complete (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Local Database (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear SharedPreferences (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Private Files () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. to Single Default ( Logout Result . Success Ġas ĠLogout Result ) ĊĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġcause Ġ-> ĠLogout Result . Failure ( cause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠAnalytics . clear User () Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear Local Database (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ Ġapp Database . clear All Tables () Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear SharedPreferences (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠ Ġ// ĠRet ain Ġthe Ġsaved Ġcountry Ġwhen Ġclearing Ġthe Ġshared Ġpreferences ĊĠĠĠĠĠ Ġval Ġsaved Country Data Ġ= Ġshared Preferences . getString ( selected Country Preference . key (), Ġ"") ĊĊĠĠĠĠĠ Ġshared Preferences . edit (). clear (). apply () ĊĠĠĠĠĠ Ġ// ĠWhen Ġwe Ġclear Ġall Ġshared Ġpreferences , Ġwe Ġalso Ġend Ġup Ġclearing Ġthe Ġflag Ġthat Ġstates Ġwhether ĊĠĠĠĠĠ Ġ// Ġthe Ġuser Ġhas Ġcompleted Ġthe Ġon boarding Ġflow Ġor Ġnot . ĠThis Ġmeans Ġthat Ġif Ġthe Ġuser Ġopens Ġthe ĊĠĠĠĠĠ Ġ// Ġagain Ġafter Ġgetting Ġlogged Ġout Ġand Ġbefore Ġlogging Ġin , Ġthey Ġwill Ġbe Ġshown Ġthe ĠOn boarding ĊĠĠĠĠĠ Ġ// Ġscreen Ġinstead Ġof Ġthe ĠRegistration Ġphone Ġscreen . ĠThis Ġis Ġa Ġworkaround Ġthat Ġsets Ġthe Ġflag ĊĠĠĠĠĠ Ġ// Ġagain Ġafter Ġclearing Ġthe Ġshared Ġpreferences Ġto Ġfix Ġthis . ĊĠĠĠĠĠ Ġon boarding Complete . set ( true ) ĊĠĠĠĠĠ Ġshared Preferences . edit (). putString ( selected Country Preference . key (), Ġsaved Country Data ). apply () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear Private Files (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠSingle ĊĠĠĠĠĠĠĠ Ġ. from Callable Ġ{ Ġfile Storage . clear All Files () Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClear All Files Result . Failure Ġ-> ĠComp letable . error ( result . cause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠComp letable . complete () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġlogged In User (): ĠObservable < Optional < User >> Ġ{ ĊĠĠĠ Ġreturn Ġapp Database . user Dao (). user () ĊĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it . isEmpty ()) ĠNone Ġelse ĠJust ( it . first ()) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Deprecated ( ĊĠĠĠĠĠ Ġmessage Ġ= Ġ" User Ġcan Ġget Ġlogged Ġout Ġnow Ġand Ġcleared ; ĠDon 't Ġuse Ġthis Ġfunction Ġanymore ", ĊĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" logged In User () ") ĊĠ Ġ) ĊĠ Ġfun Ġrequire LoggedIn User (): ĠObservable < User > Ġ{ ĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* ĠThe Ġearlier Ġversion Ġof Ġthis Ġmethod Ġused Ġto Ġthrow Ġan Ġerror Ġif Ġthe Ġreturned Ġvalue Ġfrom ĊĠĠĠ Ġ* Ġlogged In User () Ġwas ĠNone , Ġbut Ġwe Ġhave Ġadded Ġthe Ġlogout Ġfeature Ġwhich Ġclears Ġthe Ġdatabase Ġin Ġthe ĊĠĠĠ Ġ* Ġbackground . ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* ĠThis Ġmeans Ġthat Ġsubscribers Ġcan Ġno Ġlonger Ġassume Ġthat Ġthe Ġuser Ġwill ĠAL WAYS Ġbe Ġpresent Ġin Ġtheir ĊĠĠĠ Ġ* Ġspecific Ġuse Ġcase , Ġand Ġmust Ġexplicitly Ġchoose Ġto Ġeither Ġignore Ġor Ġhandle Ġa ĠUser Ġbeing ĠNone . ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* ĠSince Ġthis Ġis Ġnot Ġa Ġvery Ġfrequent Ġcase Ġthat Ġa Ġuser Ġwill Ġbe Ġlogged Ġout , Ġwe Ġcan Ġchange Ġthis ĊĠĠĠ Ġ* Ġfunction Ġto Ġinstead Ġjust Ġnot Ġemit Ġanything Ġ( instead Ġof Ġthrowing Ġan Ġexception ) Ġif Ġthe Ġuser Ġgets ĊĠĠĠ Ġ* Ġcleared Ġand Ġdeprec ate Ġthis Ġfunction . ĠCall ers Ġcan Ġchoose Ġto Ġmigrate Ġin Ġstages Ġsince Ġthis ĊĠĠĠ Ġ* Ġfunction Ġis Ġbeing Ġused ĠE VER YW HERE . ĊĠĠĠ Ġ**/ ĊĠĠĠ Ġreturn Ġlogged In User (). filter And Un wrap Just () ĊĠ Ġ} ĊĊĠ Ġ// ĠFIXME : ĠFigure Ġout Ġa Ġbetter Ġway Ġto Ġadd Ġaccess Ġtokens Ġto Ġnetwork Ġcalls Ġin Ġa Ġreactive Ġfashion ĊĠ Ġ// ĠFIXME : ĠMaybe Ġadd Ġa Ġseparate ĠRx Call Adapter Factory Ġthat Ġlets Ġus Ġtransform Ġrequests Ġwithout Ġintercept ors ? ĊĠ Ġ// ĠThis Ġwas Ġadded Ġbecause Ġwe Ġneeded Ġto Ġcall Ġit Ġfrom Ġthe ĠOk Http ĠInter ceptor ĊĠ Ġ// Ġin Ġa Ġsynchronous Ġfashion Ġbecause Ġthe ĠRx Ġ- Ġblocking () Ġcall Ġused Ġearlier ĊĠ Ġ// Ġwas Ġcausing Ġa Ġdead lock Ġin Ġthe ĠRoom Ġthreads Ġwhen Ġdata Ġsync Ġhappened ĊĠ Ġ@ Worker Thread ĊĠ Ġfun Ġlogged In User Immediate () Ġ= Ġapp Database . user Dao (). user Immediate () ĊĊĠ Ġfun Ġis User LoggedIn (): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠThis Ġis Ġbad . ĠMake Ġthis Ġfunction Ġreturn ĠSingle < Boolean > Ġinstead . ĊĠĠĠ Ġval Ġuser Ġ= Ġlogged In User (). blocking First () ĊĠĠĠ Ġreturn Ġuser Ġis ĠJust ĊĠ Ġ} ĊĊĠ Ġfun ĠaccessToken (): ĠOptional < String > Ġ{ ĊĠĠĠ Ġreturn ĠaccessToken Preference . get () ĊĠ Ġ} ĊĊĠ Ġfun Ġsync And Clear Data ( patient Repository : ĠPatient Repository , Ġsync Retry Count : ĠInt Ġ= Ġ 0 , Ġtimeout Seconds : ĠLong Ġ= Ġ 1 5 L ): ĠComp letable Ġ{ ĊĠĠĠ ĠTim ber . i (" Sync ing Ġand Ġclearing Ġall Ġpatient Ġrelated Ġdata ") ĊĊĠĠĠ Ġval Ġclear Stored Pull Tokens Ġ= ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠ Ġpatient Sync Pull Token . delete () ĊĠĠĠĠĠ Ġpre scription Sync Pull Token . delete () ĊĠĠĠĠĠ Ġappointment Sync Pull Token . delete () ĊĠĠĠĠĠ Ġmedical History Sync Pull Token . delete () ĊĠĠĠĠĠ Ġencounter Sync Pull Token . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġdata Sync ĊĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠ Ġ. sync The World () ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( schedul ers Provider . io ()) ĊĠĠĠĠĠĠĠ Ġ. retry ( sync Retry Count . to Long ()) ĊĠĠĠĠĠĠĠ Ġ. timeout ( timeout Seconds , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. onError Complete () ĊĠĠĠĠĠĠĠ Ġ. and Then ( patient Repository . clear Patient Data ()) ĊĠĠĠĠĠĠĠ Ġ. and Then ( clear Stored Pull Tokens ) ĊĠĠĠĠĠĠĠ Ġ. and Then ( br ute Force Protection . reset Failed Attempts ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġreset Pin ( pin : ĠString ): ĠSingle < Forgot Pin Result > Ġ{ ĊĠĠĠ Ġval Ġreset Password Call Ġ= Ġpassword Hash er . hash ( pin ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠReset Pin Request ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlogin Api . reset Pin ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠTim ber . i (" Reset ting ĠPIN ") Ġ} ĊĊĠĠĠ Ġval Ġupdate User On Success Ġ= Ġreset Password Call ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġstore User And AccessToken ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Single Default ( Forgot Pin Result . Success Ġas ĠF orgot Pin Result ) ĊĊĠĠĠ Ġreturn Ġupdate User On Success ĊĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> ĠF orgot Pin Result . Network Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Exception Ġ-> Ġif Ġ( it . code () Ġ== Ġ 4 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF orgot Pin Result . User NotFound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF orgot Pin Result . Unexpected Error ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠF orgot Pin Result . Unexpected Error ( it ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġcan Sync Data (): ĠObservable < Boolean > Ġ{ ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( user ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser ?. logged In Status Ġ== ĠLOG GED _ IN Ġ&& Ġuser . status Ġ== ĠApproved For Sync ing Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġun authorize (): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. filter And Un wrap Just () ĊĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġuser Ġ-> Ġupdate LoggedIn Status ForUser ( user . uuid , ĠU NA UTH ORIZ ED ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis User Unauthorized (): ĠObservable < Boolean > Ġ{ ĊĠĠĠ Ġreturn Ġlogged In User () ĊĠĠĠĠĠĠĠ Ġ. filter And Un wrap Just () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġuser Ġ-> Ġuser . logged In Status Ġ== ĠU NA UTH ORIZ ED Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate LoggedIn Status ForUser ( ĊĠĠĠĠĠ Ġuser Uuid : ĠUUID , ĊĠĠĠĠĠ Ġnew LoggedIn Status : ĠUser . LoggedIn Status ĊĠ Ġ): ĠComp letable Ġ{ ĊĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠ Ġapp Database ĊĠĠĠĠĠĠĠĠĠ Ġ. user Dao () ĊĠĠĠĠĠĠĠĠĠ Ġ. update LoggedIn Status ForUser ( user Uuid , Ġnew LoggedIn Status ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġsealed Ġclass ĠLogout Result Ġ{ ĊĠĠĠ Ġobject ĠSuccess Ġ: ĠLogout Result () ĊĠĠĠ Ġdata Ġclass ĠFailure ( val Ġcause : ĠThrowable ) Ġ: ĠLogout Result () ĊĠ Ġ} Ċ } Ċ