Modernizing the edit access to LocalPreferences.

This commit is contained in:
Vitor Pamplona
2025-04-01 18:53:30 -04:00
parent 7e3f64fc61
commit 375931d4f9
@@ -25,6 +25,7 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log import android.util.Log
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.core.content.edit
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.vitorpamplona.amethyst.model.AccountLanguagePreferencesInternal import com.vitorpamplona.amethyst.model.AccountLanguagePreferencesInternal
import com.vitorpamplona.amethyst.model.AccountReactionPreferencesInternal import com.vitorpamplona.amethyst.model.AccountReactionPreferencesInternal
@@ -151,13 +152,13 @@ object LocalPreferences {
if (info == null) { if (info == null) {
currentAccount = null currentAccount = null
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
encryptedPreferences().edit().clear().apply() encryptedPreferences().edit { clear() }
} }
} else if (currentAccount != info.npub) { } else if (currentAccount != info.npub) {
currentAccount = info.npub currentAccount = info.npub
if (!info.isTransient) { if (!info.isTransient) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
encryptedPreferences().edit().apply { putString(PrefKeys.CURRENT_ACCOUNT, info.npub) }.apply() encryptedPreferences().edit { putString(PrefKeys.CURRENT_ACCOUNT, info.npub) }
} }
} }
} }
@@ -189,7 +190,7 @@ object LocalPreferences {
savedAccounts.emit(migrated) savedAccounts.emit(migrated)
edit().apply { putString(PrefKeys.ALL_ACCOUNT_INFO, EventMapper.mapper.writeValueAsString(savedAccounts.value)) }.apply() edit { putString(PrefKeys.ALL_ACCOUNT_INFO, EventMapper.mapper.writeValueAsString(savedAccounts.value)) }
} }
} }
} }
@@ -206,13 +207,12 @@ object LocalPreferences {
savedAccounts.emit(accounts) savedAccounts.emit(accounts)
encryptedPreferences() encryptedPreferences()
.edit() .edit {
.apply {
putString( putString(
PrefKeys.ALL_ACCOUNT_INFO, PrefKeys.ALL_ACCOUNT_INFO,
EventMapper.mapper.writeValueAsString(accounts.filter { !it.isTransient }), EventMapper.mapper.writeValueAsString(accounts.filter { !it.isTransient }),
) )
}.apply() }
} }
} }
@@ -280,7 +280,7 @@ object LocalPreferences {
suspend fun updatePrefsForLogout(accountInfo: AccountInfo) { suspend fun updatePrefsForLogout(accountInfo: AccountInfo) {
Log.d("LocalPreferences", "Saving to encrypted storage updatePrefsForLogout ${accountInfo.npub}") Log.d("LocalPreferences", "Saving to encrypted storage updatePrefsForLogout ${accountInfo.npub}")
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
encryptedPreferences(accountInfo.npub).edit().clear().commit() encryptedPreferences(accountInfo.npub).edit(commit = true) { clear() }
removeAccount(accountInfo) removeAccount(accountInfo)
deleteUserPreferenceFile(accountInfo.npub) deleteUserPreferenceFile(accountInfo.npub)
@@ -304,142 +304,140 @@ object LocalPreferences {
if (!settings.transientAccount) { if (!settings.transientAccount) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val prefs = encryptedPreferences(settings.keyPair.pubKey.toNpub()) val prefs = encryptedPreferences(settings.keyPair.pubKey.toNpub())
prefs prefs.edit {
.edit() putBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, settings.externalSignerPackageName != null)
.apply { if (settings.externalSignerPackageName != null) {
putBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, settings.externalSignerPackageName != null) remove(PrefKeys.NOSTR_PRIVKEY)
if (settings.externalSignerPackageName != null) { putString(PrefKeys.SIGNER_PACKAGE_NAME, settings.externalSignerPackageName)
remove(PrefKeys.NOSTR_PRIVKEY) } else {
putString(PrefKeys.SIGNER_PACKAGE_NAME, settings.externalSignerPackageName) remove(PrefKeys.SIGNER_PACKAGE_NAME)
} else { settings.keyPair.privKey?.let { putString(PrefKeys.NOSTR_PRIVKEY, it.toHexKey()) }
remove(PrefKeys.SIGNER_PACKAGE_NAME) }
settings.keyPair.privKey?.let { putString(PrefKeys.NOSTR_PRIVKEY, it.toHexKey()) } settings.keyPair.pubKey.let { putString(PrefKeys.NOSTR_PUBKEY, it.toHexKey()) }
} putString(PrefKeys.RELAYS, EventMapper.mapper.writeValueAsString(settings.localRelays))
settings.keyPair.pubKey.let { putString(PrefKeys.NOSTR_PUBKEY, it.toHexKey()) }
putString(PrefKeys.RELAYS, EventMapper.mapper.writeValueAsString(settings.localRelays))
putString(
PrefKeys.DEFAULT_FILE_SERVER,
EventMapper.mapper.writeValueAsString(settings.defaultFileServer),
)
putString(PrefKeys.DEFAULT_HOME_FOLLOW_LIST, settings.defaultHomeFollowList.value)
putString(PrefKeys.DEFAULT_STORIES_FOLLOW_LIST, settings.defaultStoriesFollowList.value)
putString(
PrefKeys.DEFAULT_NOTIFICATION_FOLLOW_LIST,
settings.defaultNotificationFollowList.value,
)
putString(
PrefKeys.DEFAULT_DISCOVERY_FOLLOW_LIST,
settings.defaultDiscoveryFollowList.value,
)
putString(
PrefKeys.ZAP_PAYMENT_REQUEST_SERVER,
EventMapper.mapper.writeValueAsString(settings.zapPaymentRequest),
)
if (settings.backupContactList != null) {
putString( putString(
PrefKeys.DEFAULT_FILE_SERVER, PrefKeys.LATEST_CONTACT_LIST,
EventMapper.mapper.writeValueAsString(settings.defaultFileServer), EventMapper.mapper.writeValueAsString(settings.backupContactList),
) )
putString(PrefKeys.DEFAULT_HOME_FOLLOW_LIST, settings.defaultHomeFollowList.value) } else {
putString(PrefKeys.DEFAULT_STORIES_FOLLOW_LIST, settings.defaultStoriesFollowList.value) remove(PrefKeys.LATEST_CONTACT_LIST)
}
if (settings.backupUserMetadata != null) {
putString( putString(
PrefKeys.DEFAULT_NOTIFICATION_FOLLOW_LIST, PrefKeys.LATEST_USER_METADATA,
settings.defaultNotificationFollowList.value, EventMapper.mapper.writeValueAsString(settings.backupUserMetadata),
) )
} else {
remove(PrefKeys.LATEST_USER_METADATA)
}
if (settings.backupDMRelayList != null) {
putString( putString(
PrefKeys.DEFAULT_DISCOVERY_FOLLOW_LIST, PrefKeys.LATEST_DM_RELAY_LIST,
settings.defaultDiscoveryFollowList.value, EventMapper.mapper.writeValueAsString(settings.backupDMRelayList),
) )
} else {
remove(PrefKeys.LATEST_DM_RELAY_LIST)
}
if (settings.backupNIP65RelayList != null) {
putString( putString(
PrefKeys.ZAP_PAYMENT_REQUEST_SERVER, PrefKeys.LATEST_NIP65_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.zapPaymentRequest), EventMapper.mapper.writeValueAsString(settings.backupNIP65RelayList),
) )
if (settings.backupContactList != null) { } else {
putString( remove(PrefKeys.LATEST_NIP65_RELAY_LIST)
PrefKeys.LATEST_CONTACT_LIST, }
EventMapper.mapper.writeValueAsString(settings.backupContactList),
)
} else {
remove(PrefKeys.LATEST_CONTACT_LIST)
}
if (settings.backupUserMetadata != null) {
putString(
PrefKeys.LATEST_USER_METADATA,
EventMapper.mapper.writeValueAsString(settings.backupUserMetadata),
)
} else {
remove(PrefKeys.LATEST_USER_METADATA)
}
if (settings.backupDMRelayList != null) {
putString(
PrefKeys.LATEST_DM_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.backupDMRelayList),
)
} else {
remove(PrefKeys.LATEST_DM_RELAY_LIST)
}
if (settings.backupNIP65RelayList != null) {
putString(
PrefKeys.LATEST_NIP65_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.backupNIP65RelayList),
)
} else {
remove(PrefKeys.LATEST_NIP65_RELAY_LIST)
}
if (settings.backupSearchRelayList != null) {
putString(
PrefKeys.LATEST_SEARCH_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.backupSearchRelayList),
)
} else {
remove(PrefKeys.LATEST_SEARCH_RELAY_LIST)
}
if (settings.localRelayServers.isNotEmpty()) {
putStringSet(PrefKeys.LOCAL_RELAY_SERVERS, settings.localRelayServers)
} else {
remove(PrefKeys.LOCAL_RELAY_SERVERS)
}
if (settings.backupMuteList != null) {
putString(
PrefKeys.LATEST_MUTE_LIST,
EventMapper.mapper.writeValueAsString(settings.backupMuteList),
)
} else {
remove(PrefKeys.LATEST_MUTE_LIST)
}
if (settings.backupPrivateHomeRelayList != null) {
putString(
PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.backupPrivateHomeRelayList),
)
} else {
remove(PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST)
}
if (settings.backupAppSpecificData != null) {
putString(
PrefKeys.LATEST_APP_SPECIFIC_DATA,
EventMapper.mapper.writeValueAsString(settings.backupAppSpecificData),
)
} else {
remove(PrefKeys.LATEST_APP_SPECIFIC_DATA)
}
putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, settings.hideDeleteRequestDialog)
putBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, settings.hideNIP17WarningDialog)
putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, settings.hideBlockAlertDialog)
// migrating from previous design
remove(PrefKeys.USE_PROXY)
remove(PrefKeys.PROXY_PORT)
putString(PrefKeys.TOR_SETTINGS, EventMapper.mapper.writeValueAsString(settings.torSettings.toSettings()))
val regularMap =
settings.lastReadPerRoute.value.mapValues {
it.value.value
}
if (settings.backupSearchRelayList != null) {
putString( putString(
PrefKeys.LAST_READ_PER_ROUTE, PrefKeys.LATEST_SEARCH_RELAY_LIST,
EventMapper.mapper.writeValueAsString(regularMap), EventMapper.mapper.writeValueAsString(settings.backupSearchRelayList),
) )
putStringSet(PrefKeys.HAS_DONATED_IN_VERSION, settings.hasDonatedInVersion.value) } else {
remove(PrefKeys.LATEST_SEARCH_RELAY_LIST)
}
if (settings.localRelayServers.isNotEmpty()) {
putStringSet(PrefKeys.LOCAL_RELAY_SERVERS, settings.localRelayServers)
} else {
remove(PrefKeys.LOCAL_RELAY_SERVERS)
}
if (settings.backupMuteList != null) {
putString( putString(
PrefKeys.PENDING_ATTESTATIONS, PrefKeys.LATEST_MUTE_LIST,
EventMapper.mapper.writeValueAsString(settings.pendingAttestations.value), EventMapper.mapper.writeValueAsString(settings.backupMuteList),
) )
}.apply() } else {
remove(PrefKeys.LATEST_MUTE_LIST)
}
if (settings.backupPrivateHomeRelayList != null) {
putString(
PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST,
EventMapper.mapper.writeValueAsString(settings.backupPrivateHomeRelayList),
)
} else {
remove(PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST)
}
if (settings.backupAppSpecificData != null) {
putString(
PrefKeys.LATEST_APP_SPECIFIC_DATA,
EventMapper.mapper.writeValueAsString(settings.backupAppSpecificData),
)
} else {
remove(PrefKeys.LATEST_APP_SPECIFIC_DATA)
}
putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, settings.hideDeleteRequestDialog)
putBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, settings.hideNIP17WarningDialog)
putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, settings.hideBlockAlertDialog)
// migrating from previous design
remove(PrefKeys.USE_PROXY)
remove(PrefKeys.PROXY_PORT)
putString(PrefKeys.TOR_SETTINGS, EventMapper.mapper.writeValueAsString(settings.torSettings.toSettings()))
val regularMap =
settings.lastReadPerRoute.value.mapValues {
it.value.value
}
putString(
PrefKeys.LAST_READ_PER_ROUTE,
EventMapper.mapper.writeValueAsString(regularMap),
)
putStringSet(PrefKeys.HAS_DONATED_IN_VERSION, settings.hasDonatedInVersion.value)
putString(
PrefKeys.PENDING_ATTESTATIONS,
EventMapper.mapper.writeValueAsString(settings.pendingAttestations.value),
)
}
} }
} }
Log.d("LocalPreferences", "Saved to encrypted storage") Log.d("LocalPreferences", "Saved to encrypted storage")
@@ -501,161 +499,163 @@ object LocalPreferences {
private suspend fun innerLoadCurrentAccountFromEncryptedStorage(npub: String?): AccountSettings? { private suspend fun innerLoadCurrentAccountFromEncryptedStorage(npub: String?): AccountSettings? {
Log.d("LocalPreferences", "Load account from file $npub") Log.d("LocalPreferences", "Load account from file $npub")
val result =
withContext(Dispatchers.IO) {
checkNotInMainThread()
return withContext(Dispatchers.IO) { return@withContext with(encryptedPreferences(npub)) {
checkNotInMainThread() val privKey = getString(PrefKeys.NOSTR_PRIVKEY, null)
val pubKey = getString(PrefKeys.NOSTR_PUBKEY, null) ?: return@with null
val externalSignerPackageName =
getString(PrefKeys.SIGNER_PACKAGE_NAME, null)
?: if (getBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, false)) "com.greenart7c3.nostrsigner" else null
return@withContext with(encryptedPreferences(npub)) { val defaultHomeFollowList =
val privKey = getString(PrefKeys.NOSTR_PRIVKEY, null) getString(PrefKeys.DEFAULT_HOME_FOLLOW_LIST, null) ?: KIND3_FOLLOWS
val pubKey = getString(PrefKeys.NOSTR_PUBKEY, null) ?: return@with null val defaultStoriesFollowList =
val externalSignerPackageName = getString(PrefKeys.DEFAULT_STORIES_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS
getString(PrefKeys.SIGNER_PACKAGE_NAME, null) val defaultNotificationFollowList =
?: if (getBoolean(PrefKeys.LOGIN_WITH_EXTERNAL_SIGNER, false)) "com.greenart7c3.nostrsigner" else null getString(PrefKeys.DEFAULT_NOTIFICATION_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS
val defaultDiscoveryFollowList =
getString(PrefKeys.DEFAULT_DISCOVERY_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS
val defaultHomeFollowList = val defaultZapType =
getString(PrefKeys.DEFAULT_HOME_FOLLOW_LIST, null) ?: KIND3_FOLLOWS getString(PrefKeys.DEFAULT_ZAPTYPE, "")?.let { serverName ->
val defaultStoriesFollowList = LnZapEvent.ZapType.entries.firstOrNull { it.name == serverName }
getString(PrefKeys.DEFAULT_STORIES_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS } ?: LnZapEvent.ZapType.PUBLIC
val defaultNotificationFollowList =
getString(PrefKeys.DEFAULT_NOTIFICATION_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS
val defaultDiscoveryFollowList =
getString(PrefKeys.DEFAULT_DISCOVERY_FOLLOW_LIST, null) ?: GLOBAL_FOLLOWS
val defaultZapType = val localRelays = parseOrNull<Set<RelaySetupInfo>>(PrefKeys.RELAYS) ?: emptySet()
getString(PrefKeys.DEFAULT_ZAPTYPE, "")?.let { serverName ->
LnZapEvent.ZapType.entries.firstOrNull { it.name == serverName }
} ?: LnZapEvent.ZapType.PUBLIC
val localRelays = parseOrNull<Set<RelaySetupInfo>>(PrefKeys.RELAYS) ?: emptySet() val zapPaymentRequestServer = parseOrNull<Nip47WalletConnect.Nip47URI>(PrefKeys.ZAP_PAYMENT_REQUEST_SERVER)
val defaultFileServer = parseOrNull<ServerName>(PrefKeys.DEFAULT_FILE_SERVER) ?: DEFAULT_MEDIA_SERVERS[0]
val zapPaymentRequestServer = parseOrNull<Nip47WalletConnect.Nip47URI>(PrefKeys.ZAP_PAYMENT_REQUEST_SERVER) val pendingAttestations = parseOrNull<Map<HexKey, String>>(PrefKeys.PENDING_ATTESTATIONS) ?: mapOf()
val defaultFileServer = parseOrNull<ServerName>(PrefKeys.DEFAULT_FILE_SERVER) ?: DEFAULT_MEDIA_SERVERS[0] val localRelayServers = getStringSet(PrefKeys.LOCAL_RELAY_SERVERS, null) ?: setOf()
val pendingAttestations = parseOrNull<Map<HexKey, String>>(PrefKeys.PENDING_ATTESTATIONS) ?: mapOf() val latestUserMetadata = parseEventOrNull<MetadataEvent>(PrefKeys.LATEST_USER_METADATA)
val localRelayServers = getStringSet(PrefKeys.LOCAL_RELAY_SERVERS, null) ?: setOf() val latestContactList = parseEventOrNull<ContactListEvent>(PrefKeys.LATEST_CONTACT_LIST)
val latestDmRelayList = parseEventOrNull<ChatMessageRelayListEvent>(PrefKeys.LATEST_DM_RELAY_LIST)
val latestNip65RelayList = parseEventOrNull<AdvertisedRelayListEvent>(PrefKeys.LATEST_NIP65_RELAY_LIST)
val latestSearchRelayList = parseEventOrNull<SearchRelayListEvent>(PrefKeys.LATEST_SEARCH_RELAY_LIST)
val latestMuteList = parseEventOrNull<MuteListEvent>(PrefKeys.LATEST_MUTE_LIST)
val latestPrivateHomeRelayList = parseEventOrNull<PrivateOutboxRelayListEvent>(PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST)
val latestAppSpecificData = parseEventOrNull<AppSpecificDataEvent>(PrefKeys.LATEST_APP_SPECIFIC_DATA)
val latestUserMetadata = parseEventOrNull<MetadataEvent>(PrefKeys.LATEST_USER_METADATA) val syncedSettings =
val latestContactList = parseEventOrNull<ContactListEvent>(PrefKeys.LATEST_CONTACT_LIST) if (latestAppSpecificData != null) {
val latestDmRelayList = parseEventOrNull<ChatMessageRelayListEvent>(PrefKeys.LATEST_DM_RELAY_LIST) null
val latestNip65RelayList = parseEventOrNull<AdvertisedRelayListEvent>(PrefKeys.LATEST_NIP65_RELAY_LIST) } else {
val latestSearchRelayList = parseEventOrNull<SearchRelayListEvent>(PrefKeys.LATEST_SEARCH_RELAY_LIST) // previous version. Delete this when ready.
val latestMuteList = parseEventOrNull<MuteListEvent>(PrefKeys.LATEST_MUTE_LIST) val reactionChoices = parseOrNull<List<String>>(PrefKeys.REACTION_CHOICES)?.ifEmpty { DefaultReactions } ?: DefaultReactions
val latestPrivateHomeRelayList = parseEventOrNull<PrivateOutboxRelayListEvent>(PrefKeys.LATEST_PRIVATE_HOME_RELAY_LIST) val zapAmountChoices = parseOrNull<List<Long>>(PrefKeys.ZAP_AMOUNTS)?.ifEmpty { DefaultZapAmounts } ?: DefaultZapAmounts
val latestAppSpecificData = parseEventOrNull<AppSpecificDataEvent>(PrefKeys.LATEST_APP_SPECIFIC_DATA)
val syncedSettings = val languagePreferences = parseOrNull<Map<String, String>>(PrefKeys.LANGUAGE_PREFS) ?: mapOf()
if (latestAppSpecificData != null) {
null
} else {
// previous version. Delete this when ready.
val reactionChoices = parseOrNull<List<String>>(PrefKeys.REACTION_CHOICES)?.ifEmpty { DefaultReactions } ?: DefaultReactions
val zapAmountChoices = parseOrNull<List<Long>>(PrefKeys.ZAP_AMOUNTS)?.ifEmpty { DefaultZapAmounts } ?: DefaultZapAmounts
val languagePreferences = parseOrNull<Map<String, String>>(PrefKeys.LANGUAGE_PREFS) ?: mapOf() val showSensitiveContent =
if (contains(PrefKeys.SHOW_SENSITIVE_CONTENT)) {
getBoolean(PrefKeys.SHOW_SENSITIVE_CONTENT, false)
} else {
null
}
val filterSpam = getBoolean(PrefKeys.FILTER_SPAM_FROM_STRANGERS, true)
val warnAboutReports = getBoolean(PrefKeys.WARN_ABOUT_REPORTS, true)
val showSensitiveContent = val dontTranslateFrom = getStringSet(PrefKeys.DONT_TRANSLATE_FROM, null) ?: setOf()
if (contains(PrefKeys.SHOW_SENSITIVE_CONTENT)) { val translateTo = getString(PrefKeys.TRANSLATE_TO, null) ?: Locale.getDefault().language
getBoolean(PrefKeys.SHOW_SENSITIVE_CONTENT, false)
} else {
null
}
val filterSpam = getBoolean(PrefKeys.FILTER_SPAM_FROM_STRANGERS, true)
val warnAboutReports = getBoolean(PrefKeys.WARN_ABOUT_REPORTS, true)
val dontTranslateFrom = getStringSet(PrefKeys.DONT_TRANSLATE_FROM, null) ?: setOf() AccountSyncedSettingsInternal(
val translateTo = getString(PrefKeys.TRANSLATE_TO, null) ?: Locale.getDefault().language reactions =
AccountReactionPreferencesInternal(
reactionChoices = reactionChoices,
),
zaps =
AccountZapPreferencesInternal(
zapAmountChoices = zapAmountChoices,
defaultZapType = defaultZapType,
),
languages =
AccountLanguagePreferencesInternal(
dontTranslateFrom = dontTranslateFrom,
languagePreferences = languagePreferences,
translateTo = translateTo,
),
security =
AccountSecurityPreferencesInternal(
showSensitiveContent = showSensitiveContent,
warnAboutPostsWithReports = warnAboutReports,
filterSpamFromStrangers = filterSpam,
),
)
}
AccountSyncedSettingsInternal( val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false)
reactions = val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false)
AccountReactionPreferencesInternal( val hideNIP17WarningDialog = getBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, false)
reactionChoices = reactionChoices, val useProxy = getBoolean(PrefKeys.USE_PROXY, false)
),
zaps =
AccountZapPreferencesInternal(
zapAmountChoices = zapAmountChoices,
defaultZapType = defaultZapType,
),
languages =
AccountLanguagePreferencesInternal(
dontTranslateFrom = dontTranslateFrom,
languagePreferences = languagePreferences,
translateTo = translateTo,
),
security =
AccountSecurityPreferencesInternal(
showSensitiveContent = showSensitiveContent,
warnAboutPostsWithReports = warnAboutReports,
filterSpamFromStrangers = filterSpam,
),
)
}
val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val torSettings =
val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) if (useProxy) {
val hideNIP17WarningDialog = getBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, false) // old settings, means Orbot
val useProxy = getBoolean(PrefKeys.USE_PROXY, false) TorSettings(
TorType.EXTERNAL,
getInt(PrefKeys.PROXY_PORT, 9050),
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
)
} else {
parseOrNull<TorSettings>(PrefKeys.TOR_SETTINGS) ?: TorSettings()
}
val torSettings = val lastReadPerRoute =
if (useProxy) { parseOrNull<Map<String, Long>>(PrefKeys.LAST_READ_PER_ROUTE)?.mapValues {
// old settings, means Orbot MutableStateFlow(it.value)
TorSettings( } ?: mapOf()
TorType.EXTERNAL,
getInt(PrefKeys.PROXY_PORT, 9050),
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
)
} else {
parseOrNull<TorSettings>(PrefKeys.TOR_SETTINGS) ?: TorSettings()
}
val lastReadPerRoute = val keyPair = KeyPair(privKey = privKey?.hexToByteArray(), pubKey = pubKey.hexToByteArray())
parseOrNull<Map<String, Long>>(PrefKeys.LAST_READ_PER_ROUTE)?.mapValues { val hasDonatedInVersion = getStringSet(PrefKeys.HAS_DONATED_IN_VERSION, null) ?: setOf()
MutableStateFlow(it.value)
} ?: mapOf()
val keyPair = KeyPair(privKey = privKey?.hexToByteArray(), pubKey = pubKey.hexToByteArray()) return@with AccountSettings(
val hasDonatedInVersion = getStringSet(PrefKeys.HAS_DONATED_IN_VERSION, null) ?: setOf() keyPair = keyPair,
transientAccount = false,
return@with AccountSettings( externalSignerPackageName = externalSignerPackageName,
keyPair = keyPair, localRelays = localRelays,
transientAccount = false, localRelayServers = localRelayServers,
externalSignerPackageName = externalSignerPackageName, defaultFileServer = defaultFileServer,
localRelays = localRelays, defaultHomeFollowList = MutableStateFlow(defaultHomeFollowList),
localRelayServers = localRelayServers, defaultStoriesFollowList = MutableStateFlow(defaultStoriesFollowList),
defaultFileServer = defaultFileServer, defaultNotificationFollowList = MutableStateFlow(defaultNotificationFollowList),
defaultHomeFollowList = MutableStateFlow(defaultHomeFollowList), defaultDiscoveryFollowList = MutableStateFlow(defaultDiscoveryFollowList),
defaultStoriesFollowList = MutableStateFlow(defaultStoriesFollowList), zapPaymentRequest = zapPaymentRequestServer,
defaultNotificationFollowList = MutableStateFlow(defaultNotificationFollowList), hideDeleteRequestDialog = hideDeleteRequestDialog,
defaultDiscoveryFollowList = MutableStateFlow(defaultDiscoveryFollowList), hideBlockAlertDialog = hideBlockAlertDialog,
zapPaymentRequest = zapPaymentRequestServer, hideNIP17WarningDialog = hideNIP17WarningDialog,
hideDeleteRequestDialog = hideDeleteRequestDialog, backupUserMetadata = latestUserMetadata,
hideBlockAlertDialog = hideBlockAlertDialog, backupContactList = latestContactList,
hideNIP17WarningDialog = hideNIP17WarningDialog, backupNIP65RelayList = latestNip65RelayList,
backupUserMetadata = latestUserMetadata, backupDMRelayList = latestDmRelayList,
backupContactList = latestContactList, backupSearchRelayList = latestSearchRelayList,
backupNIP65RelayList = latestNip65RelayList, backupPrivateHomeRelayList = latestPrivateHomeRelayList,
backupDMRelayList = latestDmRelayList, backupMuteList = latestMuteList,
backupSearchRelayList = latestSearchRelayList, backupAppSpecificData = latestAppSpecificData,
backupPrivateHomeRelayList = latestPrivateHomeRelayList, backupSyncedSettings = syncedSettings,
backupMuteList = latestMuteList, torSettings = TorSettingsFlow.build(torSettings),
backupAppSpecificData = latestAppSpecificData, lastReadPerRoute = MutableStateFlow(lastReadPerRoute),
backupSyncedSettings = syncedSettings, hasDonatedInVersion = MutableStateFlow(hasDonatedInVersion),
torSettings = TorSettingsFlow.build(torSettings), pendingAttestations = MutableStateFlow(pendingAttestations),
lastReadPerRoute = MutableStateFlow(lastReadPerRoute), )
hasDonatedInVersion = MutableStateFlow(hasDonatedInVersion), }
pendingAttestations = MutableStateFlow(pendingAttestations),
)
} }
} Log.d("LocalPreferences", "Loaded account from file $npub")
return result
} }
private inline fun <reified T> SharedPreferences.parseOrNull(key: String): T? { private inline fun <reified T> SharedPreferences.parseOrNull(key: String): T? {