package Ġcom . ch ic ag or ob oto . data Ċ Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠLocal Favorite Provider Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠPreferences Provider Ċ ) Ġ: ĠF avorite Provider Ġ{ ĊĊĠ Ġprivate Ġval Ġfavor ites Key Ġ= Ġ" favorite _ sessions " ĊĊĠ Ġprivate Ġval Ġ_ favorites Ġ= ĠCon fl ated Broadcast Channel ( prefs . getString Set ( favorites Key )) ĊĠ Ġprivate Ġval Ġlisteners : ĠMutable Map < String , Ġ(( sessions : ĠSet < String >) Ġ-> ĠUnit )> Ġ= Ġmutable Map Of () ĊĊĠ Ġoverride Ġfun Ġfavor ites ( userId : ĠString ): ĠFlow < Set < String >> Ġ= Ġ_ favorites . as Flow () ĊĊĠ Ġoverride Ġfun Ġadd Favorite Listener ( key : ĠString , ĠonComplete : Ġ( sessions : ĠSet < String >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġlisteners [ key ] Ġ= ĠonComplete ĊĠĠĠ Ġ_ favorites . value OrNull ?. let Ġ{ ĠonComplete ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġremove Favorite Listener ( key : ĠString ) Ġ{ ĊĠĠĠ Ġlisteners . remove ( key ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Favorite Session ( userId : ĠString , Ġid : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġfav s Ġ= Ġ_ favorites . value OrNull ?. to Mutable Set () Ġ?: Ġmutable Set Of () ĊĠĠĠ Ġfav s . add ( id ) ĊĠĠĠ Ġ_ favorites . offer ( fav s ) ĊĠĠĠ Ġlisteners . values . forEach Ġ{ Ġit ( fav s ) Ġ} ĊĠĠĠ Ġprefs . putString Set ( favorites Key , Ġfav s ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġremove Favorite Session ( userId : ĠString , Ġid : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġfav s Ġ= Ġ_ favorites . value OrNull ?. to Mutable Set () Ġ?: Ġreturn ĊĠĠĠ Ġif Ġ( fav s . remove ( id )) Ġ{ ĊĠĠĠĠĠ Ġ_ favorites . offer ( fav s ) ĊĠĠĠĠĠ Ġlisteners . values . forEach Ġ{ Ġit ( fav s ) Ġ} ĊĠĠĠĠĠ Ġprefs . putString Set ( favorites Key , Ġfav s ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ