package Ġapp . d apk . st . settings Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . d apk . st . core . L ce Ċ import Ġapp . d apk . st . design . components . Spider Page Ċ import Ġapp . d apk . st . domain . Store Clean er Ċ import Ġapp . d apk . st . matrix . crypto . Crypto Service Ċ import Ġapp . d apk . st . matrix . sync . Sync Service Ċ import Ġapp . d apk . st . settings . Setting Item . Id .* Ċ import Ġapp . d apk . st . settings . Settings Event .* Ċ import Ġapp . d apk . st . view model . D apk ViewModel Ċ import Ġapp . d apk . st . view model . Mutable State Factory Ċ import Ġapp . d apk . st . view model . default State Factory Ċ import Ġkotlinx . coroutines . launch Ċ Ċ private Ġconst Ġval ĠPRIV ACY _ POLICY _ URL Ġ= Ġ" https :// ouch adam . github . io / small - talk / privacy /" Ċ Ċ internal Ġclass ĠSettings ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġcache Clean er : ĠStore Clean er , ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver , ĊĠĠĠ Ġprivate Ġval Ġcrypto Service : ĠCrypto Service , ĊĠĠĠ Ġprivate Ġval Ġsync Service : ĠSync Service , ĊĠĠĠ Ġprivate Ġval Ġuri Filename Resolver : ĠUri Filename Resolver , ĊĠĠĠ Ġprivate Ġval Ġsettings Item Factory : ĠSettings Item Factory , ĊĠĠĠ Ġfactory : ĠMutable State Factory < Settings Screen State > Ġ= Ġdefault State Factory (), Ċ ) Ġ: ĠD apk ViewModel < Settings Screen State , ĠSettings Event >( ĊĠĠĠ ĠinitialState Ġ= ĠSettings Screen State ( Spider Page ( Page . Routes . root , Ġ" Settings ", Ġnull , ĠPage . Root ( L ce . Loading ())) ), ĊĠĠĠ Ġfactory Ġ= Ġfactory , Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠPage . Root ( L ce . Content ( settings Item Factory . root ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Page Ġ= ĠSp ider Page ( Page . Routes . root , Ġ" Settings ", Ġnull , Ġroot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State Ġ{ Ġcopy ( page Ġ= Ġroot Page ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo To ( page : ĠSp ider Page < out ĠPage >) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate State Ġ{ Ġcopy ( page Ġ= Ġpage ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonClick ( item : ĠSetting Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSign Out Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Clean er . clean Cache ( remove Credentials Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . emit ( Signed Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAccess Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( item Ġis ĠSetting Item . AccessToken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . emit ( CopyTo Clipboard (" Token Ġcopied ", Ġitem . accessToken )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClear Cache Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Clean er . clean Cache ( remove Credentials Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . emit ( Toast ( message Ġ= Ġ" Cache Ġdeleted ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Log Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . emit ( Open Event Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncryption Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( page Ġ= ĠSp ider Page ( Page . Routes . encryption , Ġ" Encryption ", ĠPage . Routes . root , ĠPage . Security )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrivacy Policy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . emit ( Open Url ( PRIV ACY _ POLICY _ URL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIgnore d Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġimport FromFile Keys ( file : ĠUri , Ġpassphrase : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Page State < Page . Import Room Key > Ġ{ Ġcopy ( import Progress Ġ= ĠL ce . Loading ()) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( crypto Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom sTo Refresh Ġ= Ġcontent Resolver . open InputStream ( file )?. import Room Keys ( pass phrase ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom sTo Refresh ?. let Ġ{ Ġsync Service . force Manual Refresh ( room sTo Refresh ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġupdate Page State < Page . Import Room Key > Ġ{ Ġcopy ( import Progress Ġ= ĠL ce . Content ( Unit )) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġupdate Page State < Page . Import Room Key > Ġ{ Ġcopy ( import Progress Ġ= ĠL ce . Error ( it )) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo To Import Room () Ġ{ ĊĠĠĠĠĠĠĠ Ġgo To ( Spider Page ( Page . Routes . import Room Keys , Ġ" Import Ġroom Ġkeys ", ĠPage . Routes . encryption , ĠPage . Import Room Key ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfile Selected ( file : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnamed File Ġ= ĠNamed Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġuri Filename Resolver . read Filename From Uri ( file ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Page State < Page . Import Room Key > Ġ{ Ġcopy ( selected File Ġ= Ġnamed File ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠS Ġ: ĠPage > Ġupdate Page State ( cross inline Ġblock : ĠS . () Ġ-> ĠS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġstate . page ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġpage . state ĊĠĠĠĠĠĠĠ Ġrequire ( currentState Ġis ĠS ) ĊĠĠĠĠĠĠĠ Ġupdate State Ġ{ Ġcopy ( page Ġ= Ġ( page Ġas ĠSp ider Page < S >). copy ( state Ġ= Ġblock ( page . state ))) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ