diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt index 7e1fa80306..541c985f58 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt @@ -4,10 +4,17 @@ */ package org.thoughtcrime.securesms.jobs +import android.app.Notification +import android.app.PendingIntent +import android.content.Intent +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat import org.greenrobot.eventbus.EventBus +import org.signal.core.util.PendingIntentFlags import org.signal.core.util.logging.Log import org.signal.libsignal.protocol.InvalidMacException import org.signal.libsignal.protocol.InvalidMessageException +import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.attachments.InvalidAttachmentException @@ -23,7 +30,10 @@ import org.thoughtcrime.securesms.jobmanager.impl.BatteryNotLowConstraint import org.thoughtcrime.securesms.jobmanager.impl.RestoreAttachmentConstraint import org.thoughtcrime.securesms.jobs.protos.RestoreAttachmentJobData import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity import org.thoughtcrime.securesms.mms.MmsException +import org.thoughtcrime.securesms.notifications.NotificationChannels +import org.thoughtcrime.securesms.notifications.NotificationIds import org.thoughtcrime.securesms.transport.RetryLaterException import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.backup.MediaName @@ -263,7 +273,10 @@ class RestoreAttachmentJob private constructor( } catch (e: NonSuccessfulResponseCodeException) { if (SignalStore.backup.backsUpMedia) { if (e.code == 404 && !forceTransitTier && attachment.remoteLocation?.isNotBlank() == true) { - Log.i(TAG, "Retrying download from transit CDN") + Log.i(TAG, "Failed to download attachment from archive! Should only happen for recent attachments in a narrow window. Retrying download from transit CDN.") + if (RemoteConfig.internalUser) { + postFailedToDownloadFromArchiveNotification() + } retrieveAttachment(messageId, attachmentId, attachment, true) return } else if (e.code == 401 && useArchiveCdn) { @@ -300,6 +313,17 @@ class RestoreAttachmentJob private constructor( SignalDatabase.attachments.setRestoreTransferState(attachmentId, AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE) } + private fun postFailedToDownloadFromArchiveNotification() { + val notification: Notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().FAILURES) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle("[Internal-only] Failed to download attachment from archive!") + .setContentText("Tap to send a debug log") + .setContentIntent(PendingIntent.getActivity(context, 0, Intent(context, SubmitDebugLogActivity::class.java), PendingIntentFlags.mutable())) + .build() + + NotificationManagerCompat.from(context).notify(NotificationIds.INTERNAL_ERROR, notification) + } + class Factory : Job.Factory { override fun create(parameters: Parameters, serializedData: ByteArray?): RestoreAttachmentJob { val data = RestoreAttachmentJobData.ADAPTER.decode(serializedData!!)