1package com.peachpasswords.vault23import android.content.Context4import androidx.security.crypto.EncryptedSharedPreferences5import androidx.security.crypto.MasterKey6import dagger.hilt.android.qualifiers.ApplicationContext7import org.json.JSONObject8import javax.inject.Inject9import javax.inject.Singleton101112131415161718192021enum class DuressAction(val wire: String) {22 DECOY("decoy"),23 DESTROY("destroy");2425 companion object {26 fun fromWire(s: String?): DuressAction =27 entries.firstOrNull { it.wire == s } ?: DECOY28 }29}30313233343536373839404142434445464748@Singleton49class DuressConfigStore @Inject constructor(50 @ApplicationContext context: Context,51) {52 private val masterKey = MasterKey.Builder(context)53 .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)54 .build()5556 private val prefs = EncryptedSharedPreferences.create(57 context,58 PREFS_FILE,59 masterKey,60 EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,61 EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,62 )6364 fun isConfigured(): Boolean = prefs.contains(KEY_DURESS_CONFIG)6566 67 fun action(): DuressAction = load()?.let { DuressAction.fromWire(it.optString(FIELD_ACTION)) } ?: DuressAction.DECOY6869 70 fun enable(action: DuressAction): Boolean {71 val json = JSONObject().apply {72 put(FIELD_VERSION, 2)73 put(FIELD_ACTION, action.wire)74 }75 return prefs.edit().putString(KEY_DURESS_CONFIG, json.toString()).commit()76 }7778 fun clear(): Boolean = prefs.edit().remove(KEY_DURESS_CONFIG).commit()7980 private fun load(): JSONObject? =81 prefs.getString(KEY_DURESS_CONFIG, null)?.let { runCatching { JSONObject(it) }.getOrNull() }8283 companion object {84 private const val PREFS_FILE = "peach_duress_prefs"85 private const val KEY_DURESS_CONFIG = "duress_config"86 private const val FIELD_VERSION = "v"87 private const val FIELD_ACTION = "action"88 }89}