feat(privacy): enable NIP-89 client tag by default and move to Compose settings

Convert the per-account `disableClientTag` toggle into a positive
`addClientTag` setting that defaults to enabled, and relocate it from the
Security Filters screen to the Compose Settings page.

https://claude.ai/code/session_01TkmBzzEz3kKnrjpbrKCpsf
This commit is contained in:
Claude
2026-05-14 18:29:28 +00:00
parent b385088c95
commit 1a8e349e9f
18 changed files with 43 additions and 55 deletions
@@ -545,8 +545,8 @@ class Account(
return false
}
suspend fun updateDisableClientTag(disable: Boolean): Boolean {
if (settings.updateDisableClientTag(disable)) {
suspend fun updateAddClientTag(add: Boolean): Boolean {
if (settings.updateAddClientTag(add)) {
sendNewAppSpecificData()
return true
}
@@ -440,8 +440,8 @@ class AccountSettings(
}
}
fun updateDisableClientTag(disable: Boolean): Boolean =
if (syncedSettings.security.updateDisableClientTag(disable)) {
fun updateAddClientTag(add: Boolean): Boolean =
if (syncedSettings.security.updateAddClientTag(add)) {
saveAccountSettings()
true
} else {
@@ -56,7 +56,7 @@ class AccountSyncedSettings(
MutableStateFlow(internalSettings.security.filterSpamFromStrangers),
MutableStateFlow(internalSettings.security.maxHashtagLimit),
MutableStateFlow(internalSettings.security.sendKind0EventsToLocalRelay),
MutableStateFlow(internalSettings.security.disableClientTag),
MutableStateFlow(internalSettings.security.addClientTag),
)
val videoPlayer =
AccountVideoPlayerPreferences(
@@ -85,7 +85,7 @@ class AccountSyncedSettings(
security.filterSpamFromStrangers.value,
security.maxHashtagLimit.value,
security.sendKind0EventsToLocalRelay.value,
security.disableClientTag.value,
security.addClientTag.value,
),
videoPlayer = AccountVideoPlayerPreferencesInternal(videoPlayer.buttonItems.value),
)
@@ -146,8 +146,8 @@ class AccountSyncedSettings(
security.sendKind0EventsToLocalRelay.tryEmit(syncedSettingsInternal.security.sendKind0EventsToLocalRelay)
}
if (security.disableClientTag.value != syncedSettingsInternal.security.disableClientTag) {
security.disableClientTag.tryEmit(syncedSettingsInternal.security.disableClientTag)
if (security.addClientTag.value != syncedSettingsInternal.security.addClientTag) {
security.addClientTag.tryEmit(syncedSettingsInternal.security.addClientTag)
}
val newVideoPlayerButtonItems =
@@ -247,7 +247,7 @@ class AccountSecurityPreferences(
var filterSpamFromStrangers: MutableStateFlow<Boolean> = MutableStateFlow(true),
val maxHashtagLimit: MutableStateFlow<Int> = MutableStateFlow(5),
var sendKind0EventsToLocalRelay: MutableStateFlow<Boolean> = MutableStateFlow(false),
val disableClientTag: MutableStateFlow<Boolean> = MutableStateFlow(false),
val addClientTag: MutableStateFlow<Boolean> = MutableStateFlow(true),
) {
fun updateShowSensitiveContent(show: Boolean?): Boolean {
if (showSensitiveContent.value != show) {
@@ -297,9 +297,9 @@ class AccountSecurityPreferences(
false
}
fun updateDisableClientTag(disable: Boolean): Boolean =
if (disable != disableClientTag.value) {
disableClientTag.tryEmit(disable)
fun updateAddClientTag(add: Boolean): Boolean =
if (add != addClientTag.value) {
addClientTag.tryEmit(add)
true
} else {
false
@@ -161,5 +161,5 @@ class AccountSecurityPreferencesInternal(
var filterSpamFromStrangers: Boolean = true,
val maxHashtagLimit: Int = 5,
var sendKind0EventsToLocalRelay: Boolean = false,
var disableClientTag: Boolean = false,
var addClientTag: Boolean = true,
)
@@ -139,7 +139,7 @@ class AccountCacheState(
NostrSignerWithClientTag(
inner = signer,
clientName = CLIENT_TAG_NAME,
disabled = { accountSettings.syncedSettings.security.disableClientTag.value },
disabled = { !accountSettings.syncedSettings.security.addClientTag.value },
)
val accountDir = File(rootFilesDir(), "accounts/${signer.pubKey}").apply { mkdirs() }
@@ -1193,7 +1193,7 @@ class AccountViewModel(
fun updateReportWarningThreshold(threshold: Int) = launchSigner { account.updateReportWarningThreshold(threshold) }
fun updateDisableClientTag(disable: Boolean) = launchSigner { account.updateDisableClientTag(disable) }
fun updateAddClientTag(add: Boolean) = launchSigner { account.updateAddClientTag(add) }
fun updateFilterSpam(filterSpam: Boolean) =
launchSigner {
@@ -33,12 +33,14 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.BooleanType
import com.vitorpamplona.amethyst.model.UiSettingsFlow
import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.topbars.TopBarWithBackButton
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.mockAccountViewModel
import com.vitorpamplona.amethyst.ui.stringRes
import com.vitorpamplona.amethyst.ui.theme.RowColSpacing
import com.vitorpamplona.amethyst.ui.theme.Size10dp
@@ -57,7 +59,7 @@ fun ComposeSettingsScreen(
},
) {
Column(Modifier.padding(it)) {
ComposeSettingsContent(accountViewModel.settings.uiSettingsFlow)
ComposeSettingsContent(accountViewModel.settings.uiSettingsFlow, accountViewModel)
}
}
}
@@ -66,12 +68,15 @@ fun ComposeSettingsScreen(
@Composable
fun ComposeSettingsScreenPreview() {
ThemeComparisonRow {
ComposeSettingsContent(UiSettingsFlow())
ComposeSettingsContent(UiSettingsFlow(), mockAccountViewModel())
}
}
@Composable
fun ComposeSettingsContent(sharedPrefs: UiSettingsFlow) {
fun ComposeSettingsContent(
sharedPrefs: UiSettingsFlow,
accountViewModel: AccountViewModel,
) {
Column(
Modifier
.fillMaxSize()
@@ -95,6 +100,24 @@ fun ComposeSettingsContent(sharedPrefs: UiSettingsFlow) {
R.string.tracked_broadcasts_setting_title,
R.string.tracked_broadcasts_setting_description,
)
AddClientTagRow(accountViewModel)
}
}
@Composable
private fun AddClientTagRow(accountViewModel: AccountViewModel) {
val addClientTag by accountViewModel.account.settings.syncedSettings.security
.addClientTag
.collectAsStateWithLifecycle()
SettingsRow(
R.string.add_client_tag_title,
R.string.add_client_tag_explainer,
) {
Switch(
checked = addClientTag,
onCheckedChange = accountViewModel::updateAddClientTag,
)
}
}
@@ -84,8 +84,6 @@ private fun SecurityPreferencesSection(accountViewModel: AccountViewModel) {
SettingsDivider()
HideCommunityViolationsTile(accountViewModel)
SettingsDivider()
DisableClientTagTile(accountViewModel)
SettingsDivider()
WarnReportsTile(accountViewModel)
SettingsDivider()
MaxHashtagsTile(accountViewModel)
@@ -147,21 +145,6 @@ private fun HideCommunityViolationsTile(accountViewModel: AccountViewModel) {
)
}
@Composable
private fun DisableClientTagTile(accountViewModel: AccountViewModel) {
val disableClientTag by accountViewModel.account.settings.syncedSettings.security
.disableClientTag
.collectAsStateWithLifecycle()
SwitchTile(
icon = MaterialSymbols.Code,
title = R.string.disable_client_tag_title,
description = R.string.disable_client_tag_explainer,
checked = disableClientTag,
onCheckedChange = accountViewModel::updateDisableClientTag,
)
}
@Composable
private fun WarnReportsTile(accountViewModel: AccountViewModel) {
val security = accountViewModel.account.settings.syncedSettings.security
@@ -1122,8 +1122,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">Varovat, když příspěvky obsahují hlášení od vašich sledovaných osob</string>
<string name="filter_spam_from_strangers_title">Filtrovat spam</string>
<string name="filter_spam_from_strangers_explainer">Skryje příspěvky od cizinců, které byly přesně stejné 5 a více krát</string>
<string name="disable_client_tag_title">Nepřidávat klientský tag k mým událostem</string>
<string name="disable_client_tag_explainer">Pokud je povoleno, Amethyst nebude k tvým publikovaným událostem přidávat klientský tag NIP-89.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Upozornit na hlášení</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Zobrazí varovnou zprávu, když příspěvky mají 5 nebo více hlášení od vašich sledovaných</string>
<string name="report_warning_threshold_title">Práh varování o nahlášeních</string>
@@ -1115,8 +1115,6 @@ anz der Bedingungen ist erforderlich</string>
<string name="warn_when_posts_have_reports_from_your_follows">Warnung bei Meldungen von deinen Abonnements</string>
<string name="filter_spam_from_strangers_title">Spam filtern</string>
<string name="filter_spam_from_strangers_explainer">Versteckt Beiträge von Fremden, die 5 oder mehr Male genau die gleichen waren</string>
<string name="disable_client_tag_title">Kein Client-Tag zu meinen Ereignissen hinzufügen</string>
<string name="disable_client_tag_explainer">Wenn aktiviert, fügt Amethyst deinen veröffentlichten Ereignissen kein NIP-89 Client-Tag hinzu.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Bei Berichten warnen</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Zeigt eine Warnmeldung an, wenn die Beiträge 5 oder mehr Berichte von den folgenden Beiträgen enthalten</string>
<string name="report_warning_threshold_title">Warnschwelle für Meldungen</string>
@@ -1100,8 +1100,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">चेतावनी दें जब पत्र सूचित किये गये हों आपके द्वारा अनुचरित व्यक्तियों से</string>
<string name="filter_spam_from_strangers_title">कचरालेख छलनी</string>
<string name="filter_spam_from_strangers_explainer">अज्ञात लोगों से पत्र छिपाएँ जो निरन्तर 5 अथवा अधिक बार यथावत समान थे</string>
<string name="disable_client_tag_title">मेरे घटनाओं में ग्राहक सूचक ना जोडें</string>
<string name="disable_client_tag_explainer">जब सक्षम अमेथिस्ट निप॰८९ ग्राहक सूचक नहीं जोडेगा आपके द्वारा प्रकाशित घटनाओं में।</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">सूचनाएँ प्राप्त होने पर चेतावनी दें</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">चेतावनी सन्देश दिखाता है जब प्रकाशित पत्र 5 अथवा अधिक बार सूचित हो आपके द्वारा अनुचरित लेखाओं से</string>
<string name="report_warning_threshold_title">चेतावनी सीमा सूचना</string>
@@ -1114,8 +1114,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">Figyelmeztessen amikor a bejegyzések jelentve vannak azok által akiket követek</string>
<string name="filter_spam_from_strangers_title">Kéretlen tartalomszűrő</string>
<string name="filter_spam_from_strangers_explainer">Elrejti az ismeretlen felhasználók hozzászólásait, amelyek pontosan ugyanazok voltak 5 vagy több alkalommal</string>
<string name="disable_client_tag_title">Ne legyenek megjelölve az eseményeim klienscímkével</string>
<string name="disable_client_tag_explainer">Ha engedélyezve van, akkor az Amethyst nem fűz NIP-89 klienscímkét az Ön által közzétett eseményekhez.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Figyelmeztetés a jelentésekre</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Figyelmeztető üzenetet jelenít meg, ha az Ön követői bejelentést tettek bejegyzésekről vagy profilokról</string>
<string name="report_warning_threshold_title">Jelentési figyelmeztetés küszöbértéke</string>
@@ -1078,8 +1078,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">Waarschuwen bij rapportages van volgers</string>
<string name="filter_spam_from_strangers_title">Spamfilter</string>
<string name="filter_spam_from_strangers_explainer">Verbergt identieke berichten van onbekenden die 5 keer of vaker voorkomen</string>
<string name="disable_client_tag_title">Geen client-tag toevoegen aan mijn events</string>
<string name="disable_client_tag_explainer">Wanneer ingeschakeld voegt Amethyst geen NIP-89 client-tag toe aan events die je publiceert.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Waarschuwen bij rapportages</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Toont waarschuwing wanneer een bericht 5 of meer rapportages van je volgers heeft</string>
<string name="show_sensitive_content_title">Gevoelige inhoud tonen</string>
@@ -1124,8 +1124,6 @@ Zaplanowane posty z innych kont nie zostaną opublikowane, dopóki to konto jest
<string name="warn_when_posts_have_reports_from_your_follows">Ostrzegaj, gdy posty zostały zgłoszone przez osoby które obserwujesz</string>
<string name="filter_spam_from_strangers_title">Filtr spamu</string>
<string name="filter_spam_from_strangers_explainer">Ukrywa posty od nieznajomych, które były dokładnie takie same przez 5 lub więcej razy</string>
<string name="disable_client_tag_title">Nie dodawaj tagu klienta do moich publikacji</string>
<string name="disable_client_tag_explainer">Po włączeniu tej opcji Amethyst nie będzie dołączać tagu klienta NIP-89 do Twoich publikacji.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Ostrzeżenie o zgłoszeniach</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Wyświetla komunikat ostrzegawczy, gdy posty zostały zgłoszone przez 5 lub więcej obserwowanych osób</string>
<string name="report_warning_threshold_title">Zgłoś próg ostrzegawczy</string>
@@ -1116,8 +1116,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">Avise quando as postagens tiverem denuncias de seus seguidores</string>
<string name="filter_spam_from_strangers_title">Filtrar spam</string>
<string name="filter_spam_from_strangers_explainer">Esconde publicações de desconhecidos que eram exatamente o mesmo por 5 ou mais vezes</string>
<string name="disable_client_tag_title">Não adicionar tag de cliente aos meus eventos</string>
<string name="disable_client_tag_explainer">Quando ativado, o Amethyst não anexará uma tag de cliente NIP-89 aos eventos que você publicar.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Avisar em relatórios</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Mostra uma mensagem de aviso quando as postagens tiverem 5 ou mais relatórios de suas seguintes</string>
<string name="report_warning_threshold_title">Limite de aviso de denúncias</string>
@@ -1109,8 +1109,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">Varna när inlägg har rapporter från dina följare</string>
<string name="filter_spam_from_strangers_title">Filtrera spam</string>
<string name="filter_spam_from_strangers_explainer">Döljer inlägg från främlingar som var exakt samma för 5 eller fler gånger</string>
<string name="disable_client_tag_title">Lägg inte till klienttagg i mina händelser</string>
<string name="disable_client_tag_explainer">När aktiverat kommer Amethyst inte att lägga till en NIP-89 klienttagg till händelser du publicerar.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Varna vid rapporter</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Visar ett varningsmeddelande när inlägg har 5 eller fler rapporter från följande</string>
<string name="report_warning_threshold_title">Tröskel för rapportvarning</string>
@@ -1107,8 +1107,6 @@
<string name="warn_when_posts_have_reports_from_your_follows">当帖子有你的关注的报告时警告</string>
<string name="filter_spam_from_strangers_title">过滤垃圾信息</string>
<string name="filter_spam_from_strangers_explainer">隐藏陌生人的五次或五次以上完全相同的帖子</string>
<string name="disable_client_tag_title">不要将客户标签添加到我的事件</string>
<string name="disable_client_tag_explainer">启用时,Amethyst 将不会在您发布的事件中附加一个 NIP-89 客户端标签。</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">举报警示</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">当帖子有来自你关注的五次及以上举报时显示警告消息</string>
<string name="report_warning_threshold_title">举报警告阈值</string>
+2 -2
View File
@@ -1232,8 +1232,8 @@
<string name="filter_spam_from_strangers_title">Filter spam</string>
<string name="filter_spam_from_strangers_explainer">Hides posts from strangers that were exactly the same for 5 or more times</string>
<string name="disable_client_tag_title">Don\'t add client tag to my events</string>
<string name="disable_client_tag_explainer">When enabled, Amethyst will not append a NIP-89 client tag to events you publish.</string>
<string name="add_client_tag_title">Add client tag to my events</string>
<string name="add_client_tag_explainer">When enabled, Amethyst appends a NIP-89 client tag to events you publish.</string>
<string name="warn_when_posts_have_reports_from_your_follows_title">Warn on reports</string>
<string name="warn_when_posts_have_reports_from_your_follows_explainer">Shows a warning message when posts or profiles have reports from your follows</string>
<string name="report_warning_threshold_title">Report warning threshold</string>