package Ġcom . t ink . link . ui . provider list Ċ Ċ 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 . link . ui . Provider Selection Ċ import Ġcom . t ink . model . provider . Provider Ċ import Ġcom . t ink . model . provider . Provider TreeNode Ċ import Ġcom . t ink . model . provider . to Provider Tree Ċ Ċ internal Ġclass ĠProvider List ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġquery Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġpath Ġ= ĠMutable LiveData < Provider List Path >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠProvider DataSource . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġall Enabled Providers : ĠLive Data < List < Provider TreeNode > ?> Ġ= ĠTransform ations . map ( Provider DataSource . providers ) Ġ{ Ġall Providers Ġ-> ĊĠĠĠĠĠĠĠ Ġall Providers ?. filter Ġ{ Ġprovider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . status Ġ== ĠProvider . Status . ENABLED ĊĠĠĠĠĠĠĠ Ġ} ?. to Provider Tree () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġloading : ĠLive Data < Boolean > Ġ= ĠProvider DataSource . loading ĊĊĠĠĠ Ġval Ġis Error : ĠLive Data < Boolean > Ġ= ĠProvider DataSource . isError ĊĊĠĠĠ Ġprivate Ġval Ġproviders By Path Ġ= ĠMed iator LiveData < List < Provider TreeNode >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Enabled Providers Ġ= Ġall Enabled Providers . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġpath . value Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġapply Path ( all Enabled Providers , Ġpath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ( filtered ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( path ) Ġ{ Ġupdate () Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( all Enabled Providers ) Ġ{ Ġupdate () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfiltered Providers Ġ= ĠMed iator LiveData < List < Provider TreeNode >> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproviders Ġ= Ġproviders By Path . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġquery . value . or Empty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Providers Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproviders . filter Ġ{ Ġprovider TreeNode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider TreeNode Ġis ĠProvider TreeNode . Authentication User Type Node Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider TreeNode Ġis ĠProvider TreeNode . AccessType Node Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider TreeNode Ġis ĠProvider TreeNode . Credentials Type Node Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider TreeNode . name ?. contains ( query , Ġignore Case Ġ= Ġtrue ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filtered Providers Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfiltered Providers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( providers By Path ) Ġ{ Ġupdate () Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( query ) Ġ{ Ġupdate () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproviders : ĠLive Data < List < Provider TreeNode >> Ġ= Ġfiltered Providers ĊĊĠĠĠ Ġfun Ġsearch ( query : ĠString ) Ġ= Ġthis . query . post Value ( query ) ĊĊĠĠĠ Ġfun Ġset Path ( path : ĠProvider List Path ) Ġ= Ġthis . path . post Value ( path ) ĊĊĠĠĠ Ġprivate Ġfun Ġapply Path ( ĊĠĠĠĠĠĠĠ Ġproviders : ĠList < Provider TreeNode >, ĊĠĠĠĠĠĠĠ Ġpath : ĠProvider List Path ĊĠĠĠ Ġ): ĠList < Provider TreeNode > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfinancial Inst itution s Ġ= Ġpath . financial Inst itution Group Node ByName ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproviders . find Financial Inst itution Group Node ( it )?. financial Inst itution s ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġproviders ĊĊĠĠĠĠĠĠĠ Ġval Ġauthentication User Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . financial Inst itution Node By Financial Inst itution ?. let Ġ{ Ġpath Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinancial Inst itution s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . financial Inst itution Ġ== Ġpath Item Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . authentication User Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Not Ġ{ Ġit . authentication User Type Ġ== ĠProvider . Authentication User Type . UNKNOWN Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġfinancial Inst itution s ĊĊĠĠĠĠĠĠĠ Ġval Ġaccess Types Ġ= Ġpath . authentication User Type Node ByType ?. let Ġ{ Ġpath Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication User Types . first OrNull Ġ{ Ġit . authentication User Type Ġ== Ġpath Item Ġ} ?. access Types ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġauthentication User Types ĊĊĠĠĠĠĠĠĠ Ġval Ġcredentials Types Ġ= Ġpath . access Type Node ByType ?. let Ġ{ Ġpath Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Types . first OrNull Ġ{ Ġit . type Ġ== Ġpath Item Ġ} ?. credentials Types ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġaccess Types ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpath . credentials Type Node ByType ?. let Ġ{ Ġpath Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials Types . first OrNull Ġ{ Ġit . type Ġ== Ġpath Item Ġ} ?. providers ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcredentials Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Provider TreeNode >. find Financial Inst itution Group Node ( ĊĠĠĠĠĠĠĠ Ġname : ĠString ? ĊĠĠĠ Ġ): ĠProvider TreeNode . Financial Inst itution Group Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠProvider TreeNode . Financial Inst itution Group Node Ġ&& Ġelement . name Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Providers From Selection ( selection : ĠProvider Selection ) Ġ= ĊĠĠĠĠĠĠĠ ĠProvider DataSource . update Providers From Selection ( selection ) Ċ } Ċ