diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index f0dfe6331..abec38a63 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -25,6 +25,7 @@ class LocalPreferences(context: Context) { const val TRANSLATE_TO = "translateTo" const val ZAP_AMOUNTS = "zapAmounts" const val LATEST_CONTACT_LIST = "latestContactList" + const val HIDE_DELETE_REQUEST_INFO = "hideDeleteRequestInfo" val LAST_READ: (String) -> String = { route -> "last_read_route_$route" } } @@ -49,6 +50,7 @@ class LocalPreferences(context: Context) { account.translateTo.let { putString(PrefKeys.TRANSLATE_TO, it) } account.zapAmountChoices.let { putString(PrefKeys.ZAP_AMOUNTS, gson.toJson(it)) } account.backupContactList.let { putString(PrefKeys.LATEST_CONTACT_LIST, Event.gson.toJson(it)) } + putBoolean(PrefKeys.HIDE_DELETE_REQUEST_INFO, account.hideDeleteRequestInfo) }.apply() } @@ -89,6 +91,8 @@ class LocalPreferences(context: Context) { mapOf() } + val hideDeleteRequestInfo = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_INFO, false) + if (pubKey != null) { return Account( Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()), @@ -99,6 +103,7 @@ class LocalPreferences(context: Context) { languagePreferences, translateTo, zapAmountChoices, + hideDeleteRequestInfo, latestContactList ) } else { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index ebafe6b5c..92a9a7f1c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -56,6 +56,7 @@ class Account( var languagePreferences: Map = mapOf(), var translateTo: String = Locale.getDefault().language, var zapAmountChoices: List = listOf(500L, 1000L, 5000L), + var hideDeleteRequestInfo: Boolean = false, var backupContactList: ContactListEvent? = null ) { var transientHiddenUsers: Set = setOf() @@ -540,6 +541,11 @@ class Account( saveable.invalidateData() } + fun setHideDeleteRequestInfo() { + hideDeleteRequestInfo = true + saveable.invalidateData() + } + init { backupContactList?.let { println("Loading saved contacts ${it.toJson()}") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt index d570e1d76..bf2d910d2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt @@ -10,14 +10,18 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.AlertDialog +import androidx.compose.material.Button import androidx.compose.material.Card import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AlternateEmail import androidx.compose.material.icons.filled.ContentCopy @@ -82,6 +86,7 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni val clipboardManager = LocalClipboardManager.current val scope = rememberCoroutineScope() var showSelectTextDialog by remember { mutableStateOf(false) } + var showDeleteAlertDialog by remember { mutableStateOf(false) } val isOwnNote = note.author == accountViewModel.userProfile() val isFollowingUser = !isOwnNote && accountViewModel.isFollowing(note.author!!) @@ -138,8 +143,12 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni Row(modifier = Modifier.height(IntrinsicSize.Min)) { if (isOwnNote) { NoteQuickActionItem(Icons.Default.Delete, stringResource(R.string.quick_action_delete)) { - accountViewModel.delete(note) - onDismiss() + if (accountViewModel.hideDeleteRequestInfo()) { + accountViewModel.delete(note) + onDismiss() + } else { + showDeleteAlertDialog = true + } } } else if (isFollowingUser) { NoteQuickActionItem(Icons.Default.PersonRemove, stringResource(R.string.quick_action_unfollow)) { @@ -189,6 +198,39 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni SelectTextDialog(it) { showSelectTextDialog = false } } } + + if (showDeleteAlertDialog) { + AlertDialog( + onDismissRequest = { onDismiss() }, + title = { + Text(text = stringResource(R.string.quick_action_request_deletion_alert_title)) + }, + text = { + Text(text = stringResource(R.string.quick_action_request_deletion_alert_body)) + }, + buttons = { + Row( + modifier = Modifier.padding(all = 8.dp).fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + TextButton( + onClick = { + accountViewModel.setHideDeleteRequestInfo() + accountViewModel.delete(note) + onDismiss() + } + ) { + Text("Don't show again") + } + Button( + onClick = { accountViewModel.delete(note); onDismiss() } + ) { + Text("Delete") + } + } + } + ) + } } @Composable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 9e9e5e78e..2734c6ee1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -128,4 +128,12 @@ class AccountViewModel(private val account: Account) : ViewModel() { fun isFollowing(user: User): Boolean { return account.userProfile().isFollowing(user) } + + fun hideDeleteRequestInfo(): Boolean { + return account.hideDeleteRequestInfo + } + + fun setHideDeleteRequestInfo() { + account.setHideDeleteRequestInfo() + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5335ee5f5..bf1bebabe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -205,4 +205,6 @@ Delete Unfollow Follow + Request Deletion + Amethyst will request that your note be deleted from the relays you are currently connected to. There is no guarantee that your note will be permanently deleted from those relays, or from other relays where it may be stored.