From 989cda6662f13bc008a6920d04ea03fcdf331cf4 Mon Sep 17 00:00:00 2001 From: Michelle Tang Date: Tue, 3 Feb 2026 15:14:38 -0500 Subject: [PATCH] Add internal setting to run KT. --- .../securesms/ApplicationContext.java | 2 +- .../app/internal/InternalSettingsFragment.kt | 10 ++++++++++ .../securesms/dependencies/KeyTransparencyApi.kt | 16 ++++++++-------- .../securesms/jobs/CheckKeyTransparencyJob.kt | 4 ++-- .../registration/data/RegistrationRepository.kt | 2 +- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 1f3ae1c77a..981d4c1f3e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -262,7 +262,7 @@ public class ApplicationContext extends Application implements AppForegroundObse checkFreeDiskSpace(); MemoryTracker.start(); BackupSubscriptionCheckJob.enqueueIfAble(); - CheckKeyTransparencyJob.enqueueIfNecessary(); + CheckKeyTransparencyJob.enqueueIfNecessary(true); AppDependencies.getAuthWebSocket().registerKeepAliveToken(SignalWebSocket.FOREGROUND_KEEPALIVE); AppDependencies.getUnauthWebSocket().registerKeepAliveToken(SignalWebSocket.FOREGROUND_KEEPALIVE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index 54b2541e38..7987fc763b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -46,6 +46,7 @@ import org.thoughtcrime.securesms.database.model.InAppPaymentSubscriberRecord import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobmanager.JobTracker +import org.thoughtcrime.securesms.jobs.CheckKeyTransparencyJob import org.thoughtcrime.securesms.jobs.DownloadLatestEmojiDataJob import org.thoughtcrime.securesms.jobs.EmojiSearchIndexDownloadJob import org.thoughtcrime.securesms.jobs.InAppPaymentKeepAliveJob @@ -307,6 +308,15 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Run self-check key transparency"), + summary = DSLSettingsText.from("Automatically enqueues a job to run KT against yourself without waiting for the elapsed time."), + onClick = { + SignalStore.misc.lastKeyTransparencyTime = 0 + CheckKeyTransparencyJob.enqueueIfNecessary(addDelay = false) + } + ) + dividerPref() sectionHeaderPref(DSLSettingsText.from("Logging")) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt index db9c54b177..51c4c62b31 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt @@ -5,6 +5,7 @@ import org.signal.libsignal.keytrans.KeyTransparencyException import org.signal.libsignal.keytrans.VerificationFailedException import org.signal.libsignal.net.AppExpiredException import org.signal.libsignal.net.BadRequestError +import org.signal.libsignal.net.ChatServiceException import org.signal.libsignal.net.KeyTransparency import org.signal.libsignal.net.NetworkException import org.signal.libsignal.net.NetworkProtocolException @@ -33,8 +34,13 @@ class KeyTransparencyApi(private val unauthWebSocket: SignalWebSocket.Unauthenti onSuccess = { RequestResult.Success(Unit) }, onError = { throwable -> when (throwable) { - is TimeoutException, - is ServerSideErrorException, + is VerificationFailedException, + is KeyTransparencyException, + is AppExpiredException, + is IllegalArgumentException -> { + RequestResult.NonSuccess(KeyTransparencyError(throwable)) + } + is ChatServiceException, is NetworkException, is NetworkProtocolException -> { RequestResult.RetryableNetworkError(throwable, null) @@ -42,12 +48,6 @@ class KeyTransparencyApi(private val unauthWebSocket: SignalWebSocket.Unauthenti is RetryLaterException -> { RequestResult.RetryableNetworkError(throwable, throwable.duration) } - is VerificationFailedException, - is KeyTransparencyException, - is AppExpiredException, - is IllegalArgumentException -> { - RequestResult.NonSuccess(KeyTransparencyError(throwable)) - } else -> { RequestResult.ApplicationError(throwable) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckKeyTransparencyJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckKeyTransparencyJob.kt index 549ab7b048..25e566918d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckKeyTransparencyJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CheckKeyTransparencyJob.kt @@ -41,7 +41,7 @@ class CheckKeyTransparencyJob private constructor( private val TIME_BETWEEN_CHECK = 7.days @JvmStatic - fun enqueueIfNecessary() { + fun enqueueIfNecessary(addDelay: Boolean) { if (!canRunJob()) { return } @@ -54,7 +54,7 @@ class CheckKeyTransparencyJob private constructor( showFailure = false, parameters = Parameters.Builder() .addConstraint(NetworkConstraint.KEY) - .setInitialDelay(5.minutes.inWholeMilliseconds) + .setInitialDelay(if (addDelay) 5.minutes.inWholeMilliseconds else 0.minutes.inWholeMilliseconds) .setGlobalPriority(Parameters.PRIORITY_LOWER) .setMaxInstancesForFactory(2) .build() diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt index f365427a2b..78c7fc66ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt @@ -245,7 +245,7 @@ object RegistrationRepository { PreKeysSyncJob.enqueue() recipientTable.clearSelfKeyTransparencyData() - CheckKeyTransparencyJob.enqueueIfNecessary() + CheckKeyTransparencyJob.enqueueIfNecessary(addDelay = true) val jobManager = AppDependencies.jobManager