From 6d956ca0f9195e62d4f3fc665d16305c12afd2ce Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 12 Mar 2025 15:25:11 -0400 Subject: [PATCH] Add internal debug setting to archive session. --- .../InternalConversationSettingsFragment.kt | 18 ++++++++++++-- .../storage/TextSecureSessionStore.java | 24 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt index b22df7f2e7..f5b734435c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt @@ -183,8 +183,8 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( ) clickPref( - title = DSLSettingsText.from("Delete Session"), - summary = DSLSettingsText.from("Deletes the session, essentially guaranteeing an encryption error if they send you a message."), + title = DSLSettingsText.from("Delete Sessions"), + summary = DSLSettingsText.from("Deletes all sessions with this recipient, essentially guaranteeing an encryption error if they send you a message."), onClick = { MaterialAlertDialogBuilder(requireContext()) .setTitle("Are you sure?") @@ -200,6 +200,20 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( .show() } ) + + clickPref( + title = DSLSettingsText.from("Archive Sessions"), + summary = DSLSettingsText.from("Archives all sessions associated with this recipient, causing you to create a new session the next time you send a message (while not causing decryption errors)."), + onClick = { + MaterialAlertDialogBuilder(requireContext()) + .setTitle("Are you sure?") + .setNegativeButton(android.R.string.cancel) { d, _ -> d.dismiss() } + .setPositiveButton(android.R.string.ok) { _, _ -> + AppDependencies.protocolStore.aci().sessions().archiveSessions(recipient.id) + } + .show() + } + ) } clickPref( diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java index 592e30c9e8..37dba13ee6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java @@ -150,6 +150,30 @@ public class TextSecureSessionStore implements SignalServiceSessionStore { } } + public void archiveSessions(@NonNull RecipientId recipientId) { + try (SignalSessionLock.Lock unused = ReentrantSessionLock.INSTANCE.acquire()) { + Recipient recipient = Recipient.resolved(recipientId); + + if (recipient.getHasAci()) { + SignalProtocolAddress address = new SignalProtocolAddress(recipient.requireAci().toString(), 1); + archiveSiblingSessions(address); + archiveSession(address); + } + + if (recipient.getHasPni()) { + SignalProtocolAddress address = new SignalProtocolAddress(recipient.requirePni().toString(), 1); + archiveSiblingSessions(address); + archiveSession(address); + } + + if (recipient.getHasE164()) { + SignalProtocolAddress address = new SignalProtocolAddress(recipient.requireE164(), 1); + archiveSiblingSessions(address); + archiveSession(address); + } + } + } + public void archiveSiblingSessions(@NonNull SignalProtocolAddress address) { try (SignalSessionLock.Lock unused = ReentrantSessionLock.INSTANCE.acquire()) { List sessions = SignalDatabase.sessions().getAllFor(accountId, address.getName());