package Ġorg . sage b ion etwork s . research . s ag ere search . profile Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . LiveData Reactive Streams Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġhu . ak arn ok d . rx java . interop . Rx Java Interop . to V 2 Single Ċ import Ġio . reactivex . Single Ċ import Ġorg . sage b ion etwork s . bridge . android . Bridge Application Ċ import Ġorg . sage b ion etwork s . bridge . android . manager . models .* Ċ import Ġorg . sage b ion etwork s . bridge . research stack . Bridge DataProvider Ċ import Ġorg . sage b ion etwork s . bridge . rest . model . Study Participant Ċ import Ġorg . sage b ion etwork s . research . s ag ere search . dao . room . AppConfig Repository Ċ import Ġorg . sage b ion etwork s . research . s ag ere search . dao . room . Report Entity Ċ import Ġorg . sage b ion etwork s . research . s ag ere search . dao . room . Report Repository Ċ import Ġorg . sage b ion etwork s . research . s ag ere search . dao . room . map Value Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . math . round ToInt Ċ Ċ /** Ċ Ġ* ĠThe ĠProfile Manager Ġloads ĠProfile Data Sources Ġand Ġa ĠProfile DataManager Ġfrom ĠApp Config , Ġuse ing Ġthe Ġdata Ċ Ġ* Ġfrom Ġthese Ġit Ġloads Ġthe Ġnecessary ĠReports , ĠStudy Participant Ġand Ġreturns Ġa ĠProfile DataLoader . Ċ Ġ*/ Ċ class ĠProfile Manager ( val Ġreport Repo : ĠReport Repository , Ġval Ġapp Config Repo : ĠApp Config Repository ) Ġ{ ĊĊĊĠĠĠ Ġfun Ġload Profile Data Sources () Ġ: ĠLive Data < Map < String , ĠProfile DataSource >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprofile DataSource LiveData Ġ= ĠLive Data Reactive Streams . from Publisher ( app Config Repo . profile Data Sources . to Flow able ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġprofile DataSource LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Default Profile DataManager () Ġ: ĠSingle < Profile DataManager > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapp Config Repo . profile Data Managers . map Ġ{ Ġit . get (" Profile Manager ") Ġ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Default Profile Manager LiveData () Ġ: ĠLive Data < Profile DataManager > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLive Data Reactive Streams . from Publisher ( load Default Profile DataManager (). to Flow able ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Participant Record () Ġ: ĠSingle < Study Participant > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto V 2 Single ( Bridge Application . get Bridge Manager Provider (). participant Manager . participant Record ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Participant Record LiveData (): ĠLive Data < Study Participant > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLive Data Reactive Streams . from Publisher ( load Participant Record (). to Flow able ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Reports ( report Keys : ĠSet < String >): ĠLive Data < Map < String , ĠReport Entity ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedi ator Ġ= ĠMed iator LiveData < Map < String , ĠReport Entity ? >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Sources Ġ= Ġreport Keys . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Map : ĠMutable Map < String , ĠReport Entity ?> Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Sources Ġ== Ġreport Map . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġreport Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġreport Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport LiveData Ġ= Ġreport Repo . fetch Most Recent Report ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( report LiveData ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġit ?. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Map . put ( key , Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmedi ator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprofile DataLoader (): ĠLive Data < Profile DataLoader > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedi ator Ġ= ĠMed iator LiveData < Profile DataLoader >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprofile DataManager : ĠProfile DataManager ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparticipant Record : ĠStudy Participant ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreport Map : ĠMap < String , ĠReport Entity ?> ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profile DataManager Ġ!= Ġnull Ġ&& Ġparticipant Record Ġ!= Ġnull Ġ&& Ġreport Map Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= ĠProfile DataLoader ( profile DataManager !! , Ġparticipant Record !! , Ġreport Map !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( load Default Profile Manager LiveData ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile DataManager Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. report Ids ?. let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( load Reports ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Map Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( load Participant Record LiveData ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticipant Record Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmedi ator ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ class ĠProfile DataLoader ( val Ġprofile Data Def : ĠProfile DataManager , Ġval Ġparticipant Data : ĠStudy Participant , Ġval Ġreports : ĠMap < String , ĠReport Entity ?> ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtime Display Formatter Ġ= ĠSimpleDateFormat (" h : mm Ġa aa ", ĠLocale . getDefault ()) ĊĠĠĠ Ġprivate Ġval Ġdate Formatter Ġ= ĠSimpleDateFormat (" HH : mm : 0 0 . 0 0 0 ", ĠLocale . getDefault ()) ĊĊĠĠĠ Ġfun ĠgetValue String ( profile Key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprofile Data Item : ĠProfile Data Item ? Ġ= Ġprofile Data Def . profile DataMap . get ( profile Key ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue ( profile Data Item ) ĊĠĠĠĠĠĠĠ Ġwhen ( profile Data Item ?. item Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" time " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtime Display Formatter . format ( date Formatter . parse ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" year " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue . round ToInt (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" multiple Choice . string " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue . join ToString ( separator Ġ= Ġ", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ?. toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠgetValue ( profile Data Item : ĠProfile Data Item ?): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( profile Data Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReport Profile Data Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profile Data Item . data Groups Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprofile Data Item . data Groups ?. intersect ( participant Data . data Groups )?. join ToString ( separator Ġ= Ġ", ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġreports . get ( profile Data Item . demo graphic Schema ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreport ?. data ?. map Value ( profile Data Item . profile Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPart icipant Profile Data Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( profile Data Item . profile Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" firstName " Ġ-> Ġreturn Ġparticipant Data . firstName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" external Id " Ġ-> Ġreturn Ġparticipant Data . external Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sharing Scope " Ġ-> Ġreturn Ġparticipant Data . sharing Scope . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠgetData Def ( profile Key : ĠString ): ĠProfile Data Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprofile Data Def . profile DataMap [ profile Key ] ĊĠĠĠ Ġ} Ċ Ċ } ĊĊĊ