diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
index 1b2f3fa026..babfd0a56a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java
@@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.messages.MessageContentProcessor.MessageState;
import org.thoughtcrime.securesms.messages.MessageDecryptionUtil;
import org.thoughtcrime.securesms.messages.MessageDecryptionUtil.DecryptionResult;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
+import org.thoughtcrime.securesms.notifications.NotificationIds;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
@@ -118,7 +119,7 @@ public final class PushDecryptMessageJob extends BaseJob {
}
private void postMigrationNotification() {
- NotificationManagerCompat.from(context).notify(494949,
+ NotificationManagerCompat.from(context).notify(NotificationIds.LEGACY_SQLCIPHER_MIGRATION,
new NotificationCompat.Builder(context, NotificationChannels.getMessagesChannel(context))
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_HIGH)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
index b440de59d1..225644e00f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java
@@ -1,9 +1,13 @@
package org.thoughtcrime.securesms.messages;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.metadata.InvalidMetadataMessageException;
@@ -18,6 +22,7 @@ import org.signal.libsignal.metadata.ProtocolLegacyMessageException;
import org.signal.libsignal.metadata.ProtocolNoSessionException;
import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException;
import org.signal.libsignal.metadata.SelfSendException;
+import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.crypto.ReentrantSessionLock;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.crypto.storage.SignalProtocolStoreImpl;
@@ -29,8 +34,11 @@ import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobs.AutomaticSessionResetJob;
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
import org.thoughtcrime.securesms.jobs.SendRetryReceiptJob;
+import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity;
import org.thoughtcrime.securesms.messages.MessageContentProcessor.ExceptionMetadata;
import org.thoughtcrime.securesms.messages.MessageContentProcessor.MessageState;
+import org.thoughtcrime.securesms.notifications.NotificationChannels;
+import org.thoughtcrime.securesms.notifications.NotificationIds;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.GroupUtil;
@@ -88,6 +96,7 @@ public final class MessageDecryptionUtil {
if (sender.supportsMessageRetries() && Recipient.self().supportsMessageRetries() && FeatureFlags.senderKey()) {
jobs.add(handleRetry(context, sender, envelope, e));
+ postInternalErrorNotification(context);
} else {
jobs.add(new AutomaticSessionResetJob(sender.getId(), e.getSenderDevice(), envelope.getTimestamp()));
}
@@ -199,6 +208,19 @@ public final class MessageDecryptionUtil {
return new ExceptionMetadata(sender, e.getSenderDevice());
}
+ private static void postInternalErrorNotification(@NonNull Context context) {
+ if (!FeatureFlags.internalUser()) return;
+
+ NotificationManagerCompat.from(context).notify(NotificationIds.INTERNAL_ERROR,
+ new NotificationCompat.Builder(context, NotificationChannels.FAILURES)
+ .setSmallIcon(R.drawable.ic_notification)
+ .setContentTitle(context.getString(R.string.MessageDecryptionUtil_failed_to_decrypt_message))
+ .setContentText(context.getString(R.string.MessageDecryptionUtil_tap_to_send_a_debug_log))
+ .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, SubmitDebugLogActivity.class), 0))
+ .build());
+ }
+
+
private static class NoSenderException extends Exception {}
public static class DecryptionResult {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationIds.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationIds.java
index 7aa5a89ed8..b822ca22a6 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationIds.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationIds.java
@@ -9,6 +9,8 @@ public final class NotificationIds {
public static final int SMS_IMPORT_COMPLETE = 31337;
public static final int PRE_REGISTRATION_SMS = 5050;
public static final int THREAD = 50000;
+ public static final int INTERNAL_ERROR = 258069;
+ public static final int LEGACY_SQLCIPHER_MIGRATION = 494949;
public static final int USER_NOTIFICATION_MIGRATION = 525600;
public static final int DEVICE_TRANSFER = 625420;
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 040a32efa2..ac0c9c2cc5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1008,6 +1008,10 @@
All media
Camera
+
+ Failed to decrypt message
+ Tap to send a debug log
+
Unknown
Received a message encrypted using an old version of Signal that is no longer supported. Please ask the sender to update to the most recent version and resend the message.