/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġim . vector . matrix . android . internal . crypto . cross signing Ċ Ċ import Ġim . vector . matrix . android . api . extensions . or False Ċ import Ġim . vector . matrix . android . internal . database . model . Room Member Summary Entity Ċ import Ġim . vector . matrix . android . internal . database . model . Room Member Summary Entity Fields Ċ import Ġim . vector . matrix . android . internal . database . model . Room Summary Entity Ċ import Ġim . vector . matrix . android . internal . database . query . where Ċ import Ġim . vector . matrix . android . internal . di . Session Database Ċ import Ġim . vector . matrix . android . internal . session . room . Room Summary Updater Ċ import Ġim . vector . matrix . android . internal . session . room . membership . Room Member Helper Ċ import Ġim . vector . matrix . android . internal . task . Task Executor Ċ import Ġim . vector . matrix . android . internal . util . create Background Handler Ċ import Ġio . realm . Realm Ċ import Ġio . realm . Realm Configuration Ċ import Ġkotlinx . coroutines . android . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġorg . green robot . event bus . Subscribe Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ import Ġjavax . inject . Inject Ċ Ċ internal Ġclass ĠSh ield Trust Updater Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġevent Bus : ĠEvent Bus , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcompute Trust Task : ĠCompute Trust Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtask Executor : ĠTask Executor , ĊĠĠĠĠĠĠĠ Ġ@ Session Database Ġprivate Ġval Ġsession Realm Configuration : ĠRealm Configuration , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroom Summary Updater : ĠRoom Summary Updater Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBACK GROUND _ HANDLER Ġ= Ġcreate Background Handler (" SH I ELD _ CRYPTO _ DB _ THREAD ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBACK GROUND _ HANDLER _ DISPATCH ER Ġ= ĠBACK GROUND _ HANDLER . as Coroutine Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbackground Session Realm Ġ= ĠAtomic Reference < Realm >() ĊĊĠĠĠ Ġprivate Ġval Ġis Started Ġ= ĠAtomic Boolean () ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Started . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Bus . register ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBACK GROUND _ HANDLER . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Session Realm . set ( Realm . getInstance ( session Realm Configuration )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Started . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Bus . unregister ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBACK GROUND _ HANDLER . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Session Realm . get AndSet ( null ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġfun Ġon Room Member Change ( update : ĠSession To Crypto Room Members Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Started . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtask Executor . executor Scope . launch ( BACKGROUND _ HANDLER _ DISPATCH ER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Trust Ġ= Ġcompute Trust Task . execute ( Compute Trust Task . Params ( update . user Ids )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġsend Ġthat Ġback Ġto Ġsession Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Session Realm . get ()?. execute Transaction Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Summary Updater . update Shield Trust ( realm , Ġupdate . roomId , Ġupdated Trust ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġfun Ġon Trust Update ( update : ĠCrypto To Session User Trust Change ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Started . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Crypto Devices Change ( update . user Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Crypto Devices Change ( users : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Executor . executor Scope . launch ( BACKGROUND _ HANDLER _ DISPATCH ER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= Ġbackground Session Realm . get () Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistinct Room Ids Ġ= Ġrealm . where ( Room Member Summary Entity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ` in `( Room Member Summary Entity Fields . USER _ ID , Ġusers . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct ( Room Member Summary Entity Fields . ROOM _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . roomId Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistinct Room Ids . forEach Ġ{ Ġroom Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Summary Ġ= ĠRoom Summary Entity . where ( realm , Ġroom Id ). findFirst () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room Summary ?. is Encrypted . or False ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Active Room Members Ġ= ĠRoom Member Helper ( realm , Ġroom Id ). getActive Room Member Ids () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCan Ġthrow Ġif Ġthe Ġcrypto Ġdatabase Ġhas Ġbeen Ġclosed Ġin Ġbetween , Ġin Ġthis Ġcase Ġlog Ġand Ġignore ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Trust Ġ= Ġcompute Trust Task . execute ( Compute Trust Task . Params ( all Active Room Members )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . execute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Summary Updater . update Shield Trust ( it , Ġroom Id , Ġupdated Trust ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( failure : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ