package Ġinfo . moe vm . mood le . data . courses . impl Ċ Ċ import Ġinfo . moe vm . mood le . api . Mood le Api Ċ import Ġinfo . moe vm . mood le . data . Result Ċ import Ġinfo . moe vm . mood le . data . courses . Courses Map Ċ import Ġinfo . moe vm . mood le . data . courses . Courses Repository Ċ import Ġinfo . moe vm . mood le . data . courses . Topic Selection Ċ import Ġinfo . moe vm . mood le . utils . add Or Remove Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof ĠInter est Repository Ġthat Ġreturns Ġa Ġhardcoded Ġlist Ġof Ċ Ġ* Ġtopics , Ġpeople Ġand Ġpublications Ġsynchronous ly . Ċ Ġ*/ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠFake Courses Repository Ġ: ĠCour ses Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtopics Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Android " Ġto ĠlistOf (" Jet pack ĠCompose ", Ġ" Kotlin ", Ġ" Jet pack "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Programming " Ġto ĠlistOf (" Kotlin ", Ġ" Decl arative ĠU Is ", Ġ" Java "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Tech nology " Ġto ĠlistOf (" Pixel ", Ġ" Google ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcurrent Topics Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" K ob alt ĠT oral ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" K ' K ola ĠU vare k ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" K ris ĠV ri loc ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Gr ala ĠVal dy r ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kr uel ĠVal ax ar ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" L ' E lij ĠV en on n ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" K ra ag ĠSol az arn ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" T ava ĠT arge sh ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" K em arr in ĠMu uda " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpublications Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ðļ ÑĥÑĢ Ñģ ĠÐ¼ Ð¾Ð» Ð¾Ð´ Ð¾Ð³Ð¾ ĠÐ± Ð¾Ð¹ ÑĨ Ð° ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compose ĠMix ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compose ĠBreak down ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Android ĠP urs ue ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin ĠWatch man ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Jet pack ĠAr k ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compose sh ack ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Jet pack ĠPoint ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compose ĠT rib une " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġfor Ġnow , Ġkeep Ġthe Ġselections Ġin Ġmemory ĊĠĠĠ Ġprivate Ġval Ġselected Topics Ġ= ĠMutable State Flow ( set Of < Topic Selection >()) ĊĠĠĠ Ġprivate Ġval Ġselected People Ġ= ĠMutable State Flow ( set Of < String >()) ĊĠĠĠ Ġprivate Ġval Ġselected Public ations Ġ= ĠMutable State Flow ( set Of < String >()) ĊĊĠĠĠ Ġ// ĠUsed Ġto Ġmake Ġsuspend Ġfunctions Ġthat Ġread Ġand Ġupdate Ġstate Ġsafe Ġto Ġcall Ġfrom Ġany Ġthread ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Topics ( token : ĠString ): ĠResult < Courses Map > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġap ic lient Ġ= ĠM ood le Api () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġap ic lient . getC our ses ( token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcourses List Ġ= Ġdata ?. courses ?. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġtopic Map : ĠMutable Map < String , ĠList < String >> Ġ= ĠHashMap < String , ĠList < String >>() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( courses List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcourses List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic Map . put ( i . category name . toString (), Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtopic Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtopic List : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġcourses List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . key Ġ== Ġj . category name . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic List . add ( j . short name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic Map . put ( i . key , Ġtopic List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( topic Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d ( topic Map . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( topic Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget People ( token : ĠString ): ĠResult < List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġap ic lient Ġ= ĠM ood le Api () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġap ic lient . getCurrent Courses ( token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcourses List Ġ= Ġdata ?. courses ?. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġtopic List : ĠMutable List < String > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( courses List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcourses List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic List . add ( i . fullname . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d ( topic List . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( topic List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Public ations (): ĠResult < List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( publications ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtoggle Topic Selection ( topic : ĠTopic Selection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġselected Topics . value . to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add Or Remove ( topic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Topics . value Ġ= Ġset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtoggle Person Selected ( person : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġselected People . value . to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add Or Remove ( person ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected People . value Ġ= Ġset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtoggle Publication Selected ( publication : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġselected Public ations . value . to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add Or Remove ( publication ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Public ations . value Ġ= Ġset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Topics Selected (): ĠFlow < Set < Topic Selection >> Ġ= Ġselected Topics ĊĊĠĠĠ Ġoverride Ġfun Ġobserve People Selected (): ĠFlow < Set < String >> Ġ= Ġselected People ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Publication Selected (): ĠFlow < Set < String >> Ġ= Ġselected Public ations Ċ } Ċ