Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ jobs:
run: |
python3 tools/test_export_patches.py -v
python3 tools/test_conversation_patch.py -v
python3 tools/test_signal_830_patch.py -v
python3 -m py_compile tools/export_patches.py tools/test_export_patches.py
bash -n tools/export.sh tools/materialize.sh

Expand Down Expand Up @@ -124,6 +125,7 @@ jobs:
--tests 'org.thoughtcrime.securesms.profiles.manage.EditProfileActivityThemeLifecycleTest'
--tests 'org.thoughtcrime.securesms.util.RemoteConfig*Test*'
--tests 'org.thoughtcrime.securesms.util.VesperConfigTest'
--tests 'org.thoughtcrime.securesms.util.VesperLogPreferencesTest'
--stacktrace

- name: Build release APKs
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
strategy:
fail-fast: false
matrix:
signal: [pinned, v8.29.2]
signal: [pinned, v8.30.0]

steps:
- name: Check out Vesper patchset
Expand All @@ -35,6 +35,7 @@ jobs:
run: |
python3 tools/test_export_patches.py -v
python3 tools/test_conversation_patch.py -v
python3 tools/test_signal_830_patch.py -v
python3 -m py_compile tools/export_patches.py tools/test_export_patches.py
bash -n tools/export.sh tools/materialize.sh

Expand Down Expand Up @@ -100,6 +101,7 @@ jobs:
--tests 'org.thoughtcrime.securesms.profiles.manage.EditProfileActivityThemeLifecycleTest'
--tests 'org.thoughtcrime.securesms.util.RemoteConfig*Test*'
--tests 'org.thoughtcrime.securesms.util.VesperConfigTest'
--tests 'org.thoughtcrime.securesms.util.VesperLogPreferencesTest'
--stacktrace

- name: Build release APKs
Expand Down
235 changes: 93 additions & 142 deletions patches/0001-feat-add-Material-You-dynamic-theming.patch

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Vesper Materializer <vesper-materializer@users.noreply.github.com>
Date: Fri, 21 Aug 2026 14:14:19 +0000
Subject: [PATCH 02/28] fix: adapt dynamic theme to inline media send
Subject: [PATCH 02/29] fix: adapt dynamic theme to inline media send

Signed-off-by: Vesper Materializer <vesper-materializer@users.noreply.github.com>
---
Expand Down
57 changes: 30 additions & 27 deletions patches/0003-feat-allow-disabling-debug-logs.patch
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Vesper Materializer <vesper-materializer@users.noreply.github.com>
Date: Thu, 6 Aug 2026 07:44:38 +0000
Subject: [PATCH 03/28] feat: allow disabling debug logs
Subject: [PATCH 03/29] feat: allow disabling debug logs

Signed-off-by: Vesper Materializer <vesper-materializer@users.noreply.github.com>
---
.../settings/app/help/HelpSettingsState.kt | 5 ++++
.../securesms/util/TextSecurePreferences.java | 9 +++++++
.../securesms/util/VesperLogPreferences.kt | 23 ++++++++++++++++
.../java/org/signal/core/util/logging/Log.kt | 27 ++++++++++++-------
3 files changed, 31 insertions(+), 10 deletions(-)
3 files changed, 45 insertions(+), 10 deletions(-)
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/components/settings/app/help/HelpSettingsState.kt
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/VesperLogPreferences.kt

diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/help/HelpSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/help/HelpSettingsState.kt
new file mode 100644
Expand All @@ -22,33 +23,35 @@ index 0000000000..3033c7e651
+data class HelpSettingsState(
+ val logEnabled: Boolean
+)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
index 2b04af571f..8b16e49eb7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
@@ -122,6 +122,7 @@ public class TextSecurePreferences {
private static final String LAST_FULL_CONTACT_SYNC_TIME = "pref_last_full_contact_sync_time";
private static final String NEEDS_FULL_CONTACT_SYNC = "pref_needs_full_contact_sync";

+ public static final String LOG_ENABLED = "pref_log_enabled";
private static final String LOG_ENCRYPTED_SECRET = "pref_log_encrypted_secret";
private static final String LOG_UNENCRYPTED_SECRET = "pref_log_unencrypted_secret";

@@ -719,6 +720,14 @@ public class TextSecurePreferences {
setBooleanPreference(context, NEEDS_FULL_CONTACT_SYNC, needsSync);
}

+ public static void setLogEnabled(Context context, boolean enabled) {
+ setBooleanPreference(context, LOG_ENABLED, enabled);
+ }
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/VesperLogPreferences.kt b/app/src/main/java/org/thoughtcrime/securesms/util/VesperLogPreferences.kt
new file mode 100644
index 0000000000..4d1109feb9
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/VesperLogPreferences.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2026 Vesper contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+package org.thoughtcrime.securesms.util
+
+import android.content.Context
+import androidx.preference.PreferenceManager
+
+ public static boolean isLogEnabled(Context context) {
+ return getBooleanPreference(context, LOG_ENABLED, false);
+/** Retains the preference used by Vesper before Signal removed TextSecurePreferences. */
+object VesperLogPreferences {
+ private const val LOG_ENABLED = "pref_log_enabled"
+
+ @JvmStatic
+ fun setLogEnabled(context: Context, enabled: Boolean) {
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(LOG_ENABLED, enabled).apply()
+ }
+
public static void setLogEncryptedSecret(Context context, String base64Secret) {
setStringPreference(context, LOG_ENCRYPTED_SECRET, base64Secret);
}
+ @JvmStatic
+ fun isLogEnabled(context: Context): Boolean {
+ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(LOG_ENABLED, false)
+ }
+}
diff --git a/core/util-jvm/src/main/java/org/signal/core/util/logging/Log.kt b/core/util-jvm/src/main/java/org/signal/core/util/logging/Log.kt
index 1748be82ee..752f830e8a 100644
--- a/core/util-jvm/src/main/java/org/signal/core/util/logging/Log.kt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Vesper Materializer <vesper-materializer@users.noreply.github.com>
Date: Sat, 15 Aug 2026 08:31:14 +0000
Subject: [PATCH 04/28] feat: optionally preserve remotely deleted messages
Subject: [PATCH 04/29] feat: optionally preserve remotely deleted messages

Signed-off-by: Vesper Materializer <vesper-materializer@users.noreply.github.com>
---
Expand All @@ -19,18 +19,18 @@ Signed-off-by: Vesper Materializer <vesper-materializer@users.noreply.github.com
create mode 100644 app/src/main/res/drawable/vesper_preserved_delete_pill_background.xml

diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt
index b7f48cb226..a5b40aad36 100644
index fe821d9e15..15ad5a5c00 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt
@@ -101,6 +101,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ThreadMergeEvent
@@ -102,6 +102,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ThreadMergeEvent
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.linkpreview.LinkPreview
+import org.thoughtcrime.securesms.messages.PreservedRemoteDelete
import org.thoughtcrime.securesms.mms.PartAuthority
import org.thoughtcrime.securesms.mms.QuoteModel
import org.thoughtcrime.securesms.payments.FailureReason
@@ -1495,6 +1496,7 @@ private fun BodyRangeList.BodyRange.Style.toRemote(): BackupBodyRange.Style {
@@ -1511,6 +1512,7 @@ private fun BodyRangeList.BodyRange.Style.toRemote(): BackupBodyRange.Style {

private fun List<ReactionRecord>?.toRemote(exportState: ExportState): List<Reaction> {
return this
Expand All @@ -39,10 +39,10 @@ index b7f48cb226..a5b40aad36 100644
if (!it.author.hasAciOrE164(exportState)) {
return@mapNotNull null
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
index bd1ac399b3..0f84457801 100644
index a20f64da68..7cd6967831 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt
@@ -161,6 +161,19 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
@@ -160,6 +160,19 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
}
)

Expand All @@ -62,7 +62,7 @@ index bd1ac399b3..0f84457801 100644
dividerPref()

sectionHeaderPref(R.string.PrivacySettingsFragment__disappearing_messages)
@@ -329,6 +342,17 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
@@ -328,6 +341,17 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac
}
}

Expand All @@ -81,10 +81,10 @@ index bd1ac399b3..0f84457801 100644
MaterialAlertDialogBuilder(requireContext()).apply {
setTitle(getString(R.string.PrivacySettingsFragment__cant_enable_title))
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsState.kt
index 06c314db15..5af9ac70d4 100644
index 88493056da..4ef6643fb0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsState.kt
@@ -4,6 +4,7 @@ data class PrivacySettingsState(
@@ -5,6 +5,7 @@ data class PrivacySettingsState(
val blockedCount: Int,
val readReceipts: Boolean,
val typingIndicators: Boolean,
Expand All @@ -93,34 +93,26 @@ index 06c314db15..5af9ac70d4 100644
val screenLockActivityTimeout: Long,
val screenSecurity: Boolean,
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsViewModel.kt
index 924569866d..23ac7d4a24 100644
index c06e74c3ca..ad5ceeafd3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsViewModel.kt
@@ -37,6 +37,11 @@ class PrivacySettingsViewModel(
refresh()
}
@@ -60,2 +60,7 @@ class PrivacySettingsViewModel(

+ fun setIgnoreRemoteDeleteEnabled(enabled: Boolean) {
+ SignalStore.settings.setIgnoreRemoteDelete(enabled)
+ refresh()
+ }
+
fun setScreenSecurityEnabled(enabled: Boolean) {
sharedPreferences.edit().putBoolean(TextSecurePreferences.SCREEN_SECURITY_PREF, enabled).apply()
refresh()
@@ -71,6 +76,7 @@ class PrivacySettingsViewModel(
blockedCount = 0,
readReceipts = TextSecurePreferences.isReadReceiptsEnabled(AppDependencies.application),
typingIndicators = TextSecurePreferences.isTypingIndicatorsEnabled(AppDependencies.application),
+ ignoreRemoteDelete = SignalStore.settings.isIgnoreRemoteDeleteEnabled,
fun refresh() {
@@ -71,2 +76,3 @@ class PrivacySettingsViewModel(
screenLock = SignalStore.settings.screenLockEnabled,
+ ignoreRemoteDelete = SignalStore.settings.isIgnoreRemoteDeleteEnabled,
screenLockActivityTimeout = SignalStore.settings.screenLockTimeout,
screenSecurity = TextSecurePreferences.isScreenSecurityEnabled(AppDependencies.application),
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt
index 996bdbb245..4c711b010d 100644
index 96300e59a3..56ab07e25b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt
@@ -590,9 +590,16 @@ object DataMessageProcessor {
@@ -589,9 +589,16 @@ object DataMessageProcessor {
val targetMessage: MessageRecord? = SignalDatabase.messages.getMessageFor(targetSentTimestamp, senderRecipientId)

return if (targetMessage != null && MessageConstraintsUtil.isValidRemoteDeleteReceive(targetMessage, senderRecipientId, envelope.serverTimestamp!!)) {
Expand Down
Loading
Loading