package Ġcom . t ink . link . sample . credentials . refresh Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . t ink . core . T ink Ċ import Ġcom . t ink . link . authentication . Authentication Task Ċ import Ġcom . t ink . link . core . credentials . Credentials Repository Ċ import Ġcom . t ink . link . core . credentials . Credentials Status Ċ import Ġcom . t ink . link . getUser Context Ċ import Ġcom . t ink . link . sample . Event Ċ import Ġcom . t ink . link . sample . when NonNull Ċ import Ġcom . t ink . model . credentials . Credentials Ċ import Ġcom . t ink . model . misc . Field Ċ import Ġcom . t ink . model . provider . Provider Ċ import Ġcom . t ink . service . handler . Result Handler Ċ import Ġcom . t ink . service . streaming . publisher . Stream Observer Ċ import Ġcom . t ink . service . streaming . publisher . Stream Subscription Ċ import Ġorg . th reet en . bp . Instant Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠRefresh Credentials ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcredentials Ġ= ĠMutable LiveData < List < Credentials >>() ĊĠĠĠ Ġprivate Ġval Ġproviders Ġ= ĠMutable LiveData < List < Provider >>() ĊĊĠĠĠ Ġprivate Ġvar Ġcredentials Subscription : ĠStream Subscription ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcredentials Repository : ĠCredentials Repository ĊĊĠĠĠ Ġprivate Ġval Ġcredentials Status Map Ġ= Ġmutable Map Of < String , ĠCredentials Status Model >() ĊĊĠĠĠ Ġprivate Ġval Ġupdate Queue Ġ= ĠLinkedHashMap < String , ĠCredentials >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Context Ġ= Ġrequire NotNull ( T ink . getUser Context ()) ĊĊĠĠĠĠĠĠĠ Ġcredentials Repository Ġ= Ġuser Context . credentials Repository ĊĠĠĠĠĠĠĠ Ġval Ġprovider Repository Ġ= Ġuser Context . provider Repository ĊĊĠĠĠĠĠĠĠ Ġcredentials Subscription Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Repository . list Stream (). subscribe ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer < List < Credentials >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( value : ĠList < Credentials >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials List Update ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials . post Value ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprovider Repository . list Providers ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproviders . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġif Ġany Ġstatus Ġin Ġthe Ġlist Ġhas Ġchanged ĊĠĠĠ Ġprivate Ġfun Ġcredentials List Update ( credentials : ĠList < Credentials >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( new Credentials Ġin Ġcredentials ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Status Model Ġ= Ġnew Credentials . to Status Model () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Status Description Ġ= Ġcredentials Status Map [ new Credentials . id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Status Description Ġ== Ġnull Ġ|| Ġold Status Description . isNew Status ( new Status Model )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Status Map [ new Credentials . id ] Ġ= Ġnew Status Model Ġ// ĠUpdate Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Credentials Status Update ( new Credentials ) Ġ// ĠUpdate Ġqueue Ġas Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrently Refresh ing . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Queue . as Iterable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull ()?. value Ġ// ĠPost Ġfirst Ġvalue Ġof Ġthe Ġqueue Ġas Ġcurrent Ġcredentials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Credentials Status Update ( credentials : ĠCredentials ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( get Refresh State ( credentials . status )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStatus Ġis Ġdone Ġor Ġerror . ĠNothing Ġto Ġdo Ġanymore Ġfor Ġthe Ġuser , Ġremove Ġfrom Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials Refresh State . DONE Ġ-> Ġupdate Queue . remove ( credentials . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStatus Ġchanged Ġto Ġan Ġactive Ġstate . ĠAdd Ġto Ġqueue Ġor Ġupdate Ġif Ġalready Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials Refresh State . LOADING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials Refresh State . INFO _ REQUIRED Ġ-> Ġupdate Queue [ credentials . id ] Ġ= Ġcredentials ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcurrently Refresh ing : ĠMutable LiveData < Credentials ?> Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġ// ĠA Ġlive Ġdata Ġwhich Ġwill Ġonly Ġupdate Ġits Ġvalue Ġif Ġthe Ġstatus Ġof Ġthe ĊĠĠĠ Ġ// Ġcredentials Ġheld Ġhas Ġchanged Ġor Ġif Ġit 's Ġa Ġcompletely Ġnew Ġcredentials ĊĠĠĠ Ġprivate Ġval Ġcurrently Refresh ing With Distinct Status Ġ= ĠMed iator LiveData < Credentials ?> () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( currently Refresh ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen NonNull ( value , Ġit ) Ġ{ Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old . id Ġ!= Ġnew . id Ġ|| Ġold . to Status Model (). isNew Status ( new . to Status Model ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġif Ġ( value Ġ!= Ġit ) Ġ{ Ġ// Ġone Ġof Ġboth Ġis Ġnull , Ġset Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinfo Required Event : ĠLive Data < Event < Credentials >> Ġ= ĊĠĠĠĠĠĠĠ ĠTransform ations . map ( currently Refresh ing With Distinct Status ) Ġ{ Ġcredentials Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġget Refresh State ( it . status ) Ġ== ĠCredentials Refresh State . INFO _ REQUIRED Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠEvent ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh All ( ĊĠĠĠĠĠĠĠ Ġforce Authenticate : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġon Await ing Authentication : Ġ( Authentication Task ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcredentials . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ Ġcredentials Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Repository . refresh ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. session Expiry Date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit Ġ<= ĠInstant . now () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġforce Authenticate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Credentials Stream Observer ( on Await ing Authentication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Credentials Stream Observer ( ĊĠĠĠĠĠĠĠ Ġon Await ing Authentication : Ġ( Authentication Task ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠStream Observer < Credentials Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠStream Observer < Credentials Status > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( value : ĠCredentials Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCredentials Status . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Refresh Ġsuccess Ġfor Ġ${ value . credentials }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCredentials Status . Await ing Authentication Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Await ing Authentication ( value . authentication Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Refresh Ġerror Ġfor Ġ$ credentials ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Supp lement al Information ( credentials Id : ĠString , Ġfields : ĠList < Field >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcredentials Repository . supp lement Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . associate Ġ{ Ġit . name Ġto Ġit . value Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult Handler ({}, Ġ{}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel Supp lement al Information ( credentials Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcredentials Repository . cancel Supp lement al Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult Handler ({}, Ġ{}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrefresh Info : ĠLive Data < List < Refresh Model >> Ġ= ĠMed iator LiveData < List < Refresh Model >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġcredentials . value ?. map Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġproviders . value ?. find Ġ{ Ġprovider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . name Ġ== Ġit . provider Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRefresh Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġprovider ?. displayName Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġit . status ?. toString () Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġget Refresh State ( it . status ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Uri Ġ= Ġprovider ?. images ?. icon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( credentials ) Ġ{ Ġupdate () Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( providers ) Ġ{ Ġupdate () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Refresh State ( credentials Status : ĠCredentials . Status ?) Ġ= Ġwhen Ġ( credentials Status ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCredentials . Status . CREATED , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . AUTHENT IC ATING Ġ-> ĠCredentials Refresh State . LOADING ĊĠĠĠĠĠĠĠ ĠCredentials . Status . UP DAT ING , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . UPDATED , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . TEMP OR ARY _ ERROR , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . AUTHENT ICATION _ ERROR , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . PER MAN ENT _ ERROR Ġ-> ĠCredentials Refresh State . DONE ĊĠĠĠĠĠĠĠ ĠCredentials . Status . AW A IT ING _ MOB ILE _ BANK ID _ AUTHENT ICATION , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . AW A IT ING _ TH IRD _ PAR TY _ APP _ AUTHENT ICATION , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . AW A IT ING _ SUP P LEMENT AL _ INFORMATION Ġ-> ĠCredentials Refresh State . INFO _ REQUIRED ĊĠĠĠĠĠĠĠ ĠCredentials . Status . SESSION _ EXPI RED , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . DISABLED , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . UNKNOWN , ĊĠĠĠĠĠĠĠ ĠCredentials . Status . DELETED , ĊĠĠĠĠĠĠĠ Ġnull Ġ-> ĠCredentials Refresh State . DONE Ġ// ĠStatus Ġhandling Ġnot Ġimplemented , Ġignore ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġcredentials Subscription ?. unsubscribe () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠCredentials Status Model ( ĊĠĠĠ Ġval Ġstatus : ĠCredentials . Status ?, ĊĠĠĠ Ġval Ġstatus Updated : ĠInstant Ċ ) Ċ Ċ enum Ġclass ĠCredentials Refresh State Ġ{ ĠLO ADING , ĠDONE , ĠINFO _ REQUIRED Ġ} Ċ Ċ data Ġclass ĠRefresh Model ( ĊĠĠĠ Ġval Ġlabel : ĠString , ĊĠĠĠ Ġval Ġstatus : ĠString , ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġstate : ĠCredentials Refresh State , ĊĠĠĠ Ġval Ġicon Uri : ĠString ? Ċ ) Ċ Ċ private Ġfun ĠCredentials . to Status Model () Ġ= ĠCredentials Status Model ( status , Ġstatus Updated ) Ċ Ċ private Ġfun ĠCredentials Status Model . isNew Status ( other : ĠCredentials Status Model ) Ġ= ĊĠĠĠ Ġstatus Ġ!= Ġother . status Ġ|| Ġstatus Updated Ġ< Ġother . status Updated Ċ