/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . app . features . workers . sign out Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . air bnb . mv rx . Activity ViewModel Context Ċ import Ġcom . air bnb . mv rx . Async Ċ import Ġcom . air bnb . mv rx . Fragment ViewModel Context Ċ import Ġcom . air bnb . mv rx . Mv Rx State Ċ import Ġcom . air bnb . mv rx . Mv Rx ViewModel Factory Ċ import Ġcom . air bnb . mv rx . Un initialized Ċ import Ġcom . air bnb . mv rx . ViewModel Context Ċ import Ġdagger . ass isted . Ass isted Ċ import Ġdagger . ass isted . Ass isted Inject Ċ import Ġdagger . ass isted . Ass isted Factory Ċ import Ġim . vector . app . core . platform . Empty Action Ċ import Ġim . vector . app . core . platform . Empty View Events Ċ import Ġim . vector . app . core . platform . Vector ViewModel Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . functions . Function 4 Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġorg . matrix . android . sdk . api . extensions . or False Ċ import Ġorg . matrix . android . sdk . api . session . Session Ċ import Ġorg . matrix . android . sdk . api . session . account data . User Account Data Event Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . MASTER _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . MX Cross Signing Info Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . SELF _ SIGN ING _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . USER _ SIGN ING _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . keys backup . Keys Backup State Ċ import Ġorg . matrix . android . sdk . api . session . crypto . keys backup . Keys Backup State Listener Ċ import Ġorg . matrix . android . sdk . api . util . Optional Ċ import Ġorg . matrix . android . sdk . internal . crypto . store . Private Keys Info Ċ import Ġorg . matrix . android . sdk . rx . rx Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ data Ġclass ĠServer Backup Status ViewState ( ĊĠĠĠĠĠĠĠ Ġval Ġbanner State : ĠAsync < Banner State > Ġ= ĠUn initialized Ċ ) Ġ: ĠM v Rx State Ċ Ċ /** Ċ Ġ* ĠThe Ġstate Ġrepresenting Ġthe Ġview Ċ Ġ* ĠIt Ġcan Ġtake Ġone Ġstate Ġat Ġa Ġtime Ċ Ġ*/ Ċ sealed Ġclass ĠBanner State Ġ{ ĊĊĠĠĠ Ġobject ĠHidden Ġ: ĠBanner State () ĊĊĠĠĠ Ġ// ĠKeys Ġbackup Ġis Ġnot Ġsetup , ĠnumberOf Keys Ġis Ġthe Ġnumber Ġof Ġlocally Ġstored Ġkeys ĊĠĠĠ Ġdata Ġclass ĠSetup ( val ĠnumberOf Keys : ĠInt ) Ġ: ĠBanner State () ĊĊĠĠĠ Ġ// ĠKeys Ġare Ġbacking Ġup ĊĠĠĠ Ġobject ĠBack ing Up Ġ: ĠBanner State () Ċ } Ċ Ċ class ĠServer Backup Status ViewModel Ġ@ Ass isted Inject Ġconstructor (@ Ass isted ĠinitialState : ĠServer Backup Status ViewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsession : ĠSession ) ĊĠĠĠ Ġ: ĠVector ViewModel < Server Backup Status ViewState , ĠEmpty Action , ĠEmpty View Events >( initialState ), ĠKeys Backup State Listener Ġ{ ĊĊĠĠĠ Ġ@ Ass isted Factory ĊĠĠĠ Ġinterface ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( initialState : ĠServer Backup Status ViewState ): ĠServer Backup Status ViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠM v Rx ViewModel Factory < Server Backup Status ViewModel , ĠServer Backup Status ViewState > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( viewModel Context : ĠViewModel Context , Ġstate : ĠServer Backup Status ViewState ): ĠServer Backup Status ViewModel ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= Ġwhen Ġ( viewModel Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFragment ViewModel Context Ġ-> ĠviewModel Context . fragment Ġas ? ĠFactory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠActivity ViewModel Context Ġ-> ĠviewModel Context . activity Ġas ? ĠFactory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory ?. create ( state ) Ġ?: Ġerror (" You Ġshould Ġlet Ġyour Ġactivity / fragment Ġimplements ĠFactory Ġinterface ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠKeys Ġexported Ġmanually ĊĠĠĠ Ġval Ġkeys Exported ToFile Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġkeys Backup State Ġ= ĠMutable LiveData < Keys Backup State >() ĊĊĠĠĠ Ġprivate Ġval Ġkey Backup Publish Subject : ĠPublish Subject < Keys Backup State > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . crypto Service (). keys Backup Service (). addListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġkeys Backup State . value Ġ= Ġsession . crypto Service (). keys Backup Service (). state ĊĊĠĠĠĠĠĠĠ ĠObservable . combine Latest < List < User Account Data Event >, ĠOptional < MX Cross Signing Info >, ĠKeys Backup State , ĠOptional < Private Keys Info >, ĠBanner State >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . rx (). live Account Data ( set Of ( MASTER _ KEY _ SSSS _ NAME , ĠUSER _ SIGN ING _ KEY _ SSSS _ NAME , ĠS ELF _ SIGN ING _ KEY _ SSSS _ NAME )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . rx (). live Cross Signing Info ( session . my UserId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Publish Subject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . rx (). live Cross Signing Private Keys (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction 4 Ġ{ Ġ_, Ġcross Signing Info , Ġkey Backup State , Ġp Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġcheck Ġif Ġ 4 S Ġis Ġalready Ġsetup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session . shared Secret Storage Service . is Recovery Setup ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 4 S Ġis Ġalready Ġsetup Ġsp Ġwe Ġshould Ġnot Ġdisplay Ġanything ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Function 4 Ġwhen Ġ( key Backup State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeys Backup State . Backing Up Ġ-> ĠBanner State . Backing Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠBanner State . Hidden ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSo Ġrecovery Ġis Ġnot Ġsetup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġcross Ġsigning Ġis Ġenabled Ġand Ġlocal Ġsecrets Ġknown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cross Signing Info . get OrNull ()?. is Trusted () Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġp Info . get OrNull ()?. all Known (). or False () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSo Ġ 4 S Ġis Ġnot Ġsetup Ġand Ġwe Ġhave Ġlocal Ġsecrets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Function 4 ĠBanner State . Setup ( numberOf Keys Ġ= Ġget NumberOf Keys To Backup ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBanner State . Hidden ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. throttle Last ( 1 0 0 0 , ĠTimeUnit . MILLISECONDS ) Ġ// Ġwe Ġdon 't Ġwant Ġto Ġf lick er Ġor Ġcatch Ġtransient Ġstates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute Ġ{ Ġasync Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbanner State Ġ= Ġasync ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkey Backup Publish Subject . onNext ( session . crypto Service (). keys Backup Service (). state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSafe Ġway Ġto Ġget Ġthe Ġcurrent ĠKeys Backup Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetCurrent Backup Version (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession . crypto Service (). keys Backup Service (). current Backup Version Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSafe Ġway Ġto Ġget Ġthe Ġnumber Ġof Ġkeys Ġto Ġbackup ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget NumberOf Keys To Backup (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession . crypto Service (). inbound Group Sessions Count ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSafe Ġway Ġto Ġtell Ġif Ġthere Ġare Ġmore Ġkeys Ġon Ġthe Ġserver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcan Restore Keys (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession . crypto Service (). keys Backup Service (). can Restore Keys () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . crypto Service (). keys Backup Service (). remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon StateChange ( newState : ĠKeys Backup State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Backup Publish Subject . onNext ( session . crypto Service (). keys Backup Service (). state ) ĊĠĠĠĠĠĠĠ Ġkeys Backup State . value Ġ= ĠnewState ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh Remote State IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keys Backup State . value Ġ== ĠKeys Backup State . Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . crypto Service (). keys Backup Service (). check And Start Keys Backup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( action : ĠEmpty Action ) Ġ{} Ċ } Ċ