/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠC attle ĠNotes . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . pr 6 5 6 d . shared . data . user . info . datas ources Ċ Ċ import Ġcom . google . firebase . firestore . Document Snapshot Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Exception Ċ import Ġcom . google . firebase . firestore . Listener Registration Ċ import Ġcom . pr 6 5 6 d . shared . data . login . datas ources . Auth Id DataSource Ċ import Ġcom . pr 6 5 6 d . shared . data . user . info . Fire store UserInfo Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ @ Experimental Cor outines Api Ċ class ĠOb serve Fire store UserInfo DataSource Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġfire store : ĠFirebase Fire store , ĊĠĠĠ Ġprivate Ġval Ġauth Id DataSource : ĠAuth Id DataSource Ċ ) Ġ: ĠOb serve Fire store UserInfo DataSource Ġ{ ĊĊĠĠĠ Ġ// ĠChannel Ġthat Ġkeeps Ġtrack Ġof ĠFire store Ġuser Ġinfo . ĊĠĠĠ Ġprivate Ġval Ġchannel Ġ= ĠCon fl ated Broadcast Channel < Fire store UserInfo ?> () ĊĊĠĠĠ Ġprivate Ġvar ĠuserInfo Changed Listener Subscription : ĠListener Registration ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Flow Preview ĊĠĠĠ Ġoverride Ġfun Ġget Firebase UserInfo (): ĠFlow < Fire store UserInfo ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġprevious Ġsubscriptions , Ġif Ġexists . ĊĠĠĠĠĠĠĠ ĠuserInfo Changed Listener Subscription ?. remove () ĊĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġauth Id DataSource . getUserId () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" User Ġid Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . offer ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Changed Listener : Ġ( Document Snapshot ?, ĠFirebase Fire store Exception ?) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsnapshot : ĠDocument Snapshot ?, Ġ_: ĠFirebase Fire store Exception ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snapshot Ġ== Ġnull Ġ|| Ġ! snapshot . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġaccount Ġsigns Ġin Ġfor Ġthe Ġfirst Ġtime Ġthe Ġdocument Ġdoesn 't Ġexist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Document Ġfor Ġsnapshot Ġ$ userId Ġdoesn 't Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Ġ= Ġget Fire store UserInfo ( snapshot ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! channel . is Closed For Send ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . offer ( userInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Changed Listener Subscription Ġ= Ġfire store ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collection ( USERS _ COLLECTION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Snapshot Listener ( userInfo Changed Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchannel . as Flow (). distinct Until Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove User () Ġ{ ĊĠĠĠĠĠĠĠ ĠuserInfo Changed Listener Subscription ?. remove () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Fire store UserInfo ( snapshot : ĠDocument Snapshot ): ĠFire store UserInfo Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠFire store UserInfo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Farm Name (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ F ARM _ NAME _ KEY ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Farm Address (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ F ARM _ ADDRESS _ KEY ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Gender (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ G ENDER _ KEY ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Date OfBirth (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ DO B _ KEY ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Address (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ ADDRESS _ KEY ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget D air y Code (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ DA IR Y _ CODE ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget D air y CustomerId (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot [ DA IR Y _ CUSTOMER _ ID ] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER S _ COLLECTION Ġ= Ġ" users " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF ARM _ NAME _ KEY Ġ= Ġ" farm Name " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF ARM _ ADDRESS _ KEY Ġ= Ġ" farm Address " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG ENDER _ KEY Ġ= Ġ" gender " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDO B _ KEY Ġ= Ġ" date OfBirth " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠADDRESS _ KEY Ġ= Ġ" address " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDA IR Y _ CODE Ġ= Ġ" da iry Code " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDA IR Y _ CUSTOMER _ ID Ġ= Ġ" da iry CustomerId " ĊĠĠĠ Ġ} Ċ } Ċ