diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java index 2e9a7c3aa..11027d729 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java @@ -24,6 +24,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.VerifyIdentityActivity; import org.thoughtcrime.securesms.database.IdentityDatabase; +import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -35,6 +36,7 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa private static final String RECIPIENT_IDS_EXTRA = "recipient_ids"; private static final String MESSAGE_ID_EXTRA = "message_id"; + private static final String MESSAGE_TYPE_EXTRA = "message_type"; private SafetyNumberChangeViewModel viewModel; private SafetyNumberChangeAdapter adapter; @@ -62,6 +64,7 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa Bundle arguments = new Bundle(); arguments.putStringArray(RECIPIENT_IDS_EXTRA, ids.toArray(new String[0])); arguments.putLong(MESSAGE_ID_EXTRA, messageRecord.getId()); + arguments.putString(MESSAGE_TYPE_EXTRA, messageRecord.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT); SafetyNumberChangeDialog fragment = new SafetyNumberChangeDialog(); fragment.setArguments(arguments); return fragment; @@ -78,10 +81,12 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + //noinspection ConstantConditions List recipientIds = Stream.of(getArguments().getStringArray(RECIPIENT_IDS_EXTRA)).map(RecipientId::from).toList(); long messageId = getArguments().getLong(MESSAGE_ID_EXTRA, -1); + String messageType = getArguments().getString(MESSAGE_TYPE_EXTRA, null); - viewModel = ViewModelProviders.of(this, new SafetyNumberChangeViewModel.Factory(recipientIds, (messageId != -1) ? messageId : null)).get(SafetyNumberChangeViewModel.class); + viewModel = ViewModelProviders.of(this, new SafetyNumberChangeViewModel.Factory(recipientIds, (messageId != -1) ? messageId : null, messageType)).get(SafetyNumberChangeViewModel.class); viewModel.getChangedRecipients().observe(getViewLifecycleOwner(), adapter::submitList); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java index 7bc012ff1..4a5222f46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java @@ -15,8 +15,11 @@ import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord; import org.thoughtcrime.securesms.database.MmsDatabase; +import org.thoughtcrime.securesms.database.MmsSmsDatabase; +import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sms.MessageSender; @@ -30,15 +33,17 @@ import static org.whispersystems.libsignal.SessionCipher.SESSION_LOCK; final class SafetyNumberChangeRepository { + private static final String TAG = SafetyNumberChangeRepository.class.getSimpleName(); + private final Context context; SafetyNumberChangeRepository(Context context) { this.context = context.getApplicationContext(); } - @NonNull LiveData getSafetyNumberChangeState(@NonNull List recipientIds, @Nullable Long messageId) { + @NonNull LiveData getSafetyNumberChangeState(@NonNull List recipientIds, @Nullable Long messageId, @Nullable String messageType) { MutableLiveData liveData = new MutableLiveData<>(); - SignalExecutors.BOUNDED.execute(() -> liveData.postValue(getSafetyNumberChangeStateInternal(recipientIds, messageId))); + SignalExecutors.BOUNDED.execute(() -> liveData.postValue(getSafetyNumberChangeStateInternal(recipientIds, messageId, messageType))); return liveData; } @@ -55,10 +60,10 @@ final class SafetyNumberChangeRepository { } @WorkerThread - private @NonNull SafetyNumberChangeState getSafetyNumberChangeStateInternal(@NonNull List recipientIds, @Nullable Long messageId) { + private @NonNull SafetyNumberChangeState getSafetyNumberChangeStateInternal(@NonNull List recipientIds, @Nullable Long messageId, @Nullable String messageType) { MessageRecord messageRecord = null; - if (messageId != null) { - messageRecord = DatabaseFactory.getMmsSmsDatabase(context).getMessageRecord(messageId); + if (messageId != null && messageType != null) { + messageRecord = getMessageRecord(messageId, messageType); } List recipients = Stream.of(recipientIds).map(Recipient::resolved).toList(); @@ -70,6 +75,23 @@ final class SafetyNumberChangeRepository { return new SafetyNumberChangeState(changedRecipients, messageRecord); } + @WorkerThread + private @Nullable MessageRecord getMessageRecord(Long messageId, String messageType) { + try { + switch (messageType) { + case MmsSmsDatabase.SMS_TRANSPORT: + return DatabaseFactory.getSmsDatabase(context).getMessage(messageId); + case MmsSmsDatabase.MMS_TRANSPORT: + return DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); + default: + throw new AssertionError("no valid message type specified"); + } + } catch (NoSuchMessageException e) { + Log.i(TAG, e); + } + return null; + } + @WorkerThread private TrustAndVerifyResult trustOrVerifyChangedRecipientsInternal(@NonNull List changedRecipients) { IdentityDatabase identityDatabase = DatabaseFactory.getIdentityDatabase(context); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeViewModel.java index d43d492ae..54344a9ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeViewModel.java @@ -19,9 +19,13 @@ public final class SafetyNumberChangeViewModel extends ViewModel { private final SafetyNumberChangeRepository safetyNumberChangeRepository; private final LiveData safetyNumberChangeState; - private SafetyNumberChangeViewModel(@NonNull List recipientIds, @Nullable Long messageId, SafetyNumberChangeRepository safetyNumberChangeRepository) { + private SafetyNumberChangeViewModel(@NonNull List recipientIds, + @Nullable Long messageId, + @Nullable String messageType, + SafetyNumberChangeRepository safetyNumberChangeRepository) + { this.safetyNumberChangeRepository = safetyNumberChangeRepository; - safetyNumberChangeState = this.safetyNumberChangeRepository.getSafetyNumberChangeState(recipientIds, messageId); + safetyNumberChangeState = this.safetyNumberChangeRepository.getSafetyNumberChangeState(recipientIds, messageId, messageType); } @NonNull LiveData> getChangedRecipients() { @@ -40,16 +44,18 @@ public final class SafetyNumberChangeViewModel extends ViewModel { public static final class Factory implements ViewModelProvider.Factory { private final List recipientIds; private final Long messageId; + private final String messageType; - public Factory(@NonNull List recipientIds, @Nullable Long messageId) { + public Factory(@NonNull List recipientIds, @Nullable Long messageId, @Nullable String messageType) { this.recipientIds = recipientIds; this.messageId = messageId; + this.messageType = messageType; } @Override public @NonNull T create(@NonNull Class modelClass) { SafetyNumberChangeRepository repo = new SafetyNumberChangeRepository(ApplicationDependencies.getApplication()); - return Objects.requireNonNull(modelClass.cast(new SafetyNumberChangeViewModel(recipientIds, messageId, repo))); + return Objects.requireNonNull(modelClass.cast(new SafetyNumberChangeViewModel(recipientIds, messageId, messageType, repo))); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 741684799..c4b98eacd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -280,18 +280,6 @@ public class MmsSmsDatabase extends Database { else return id; } - public @Nullable MessageRecord getMessageRecord(long messageId) { - try { - return DatabaseFactory.getSmsDatabase(context).getMessage(messageId); - } catch (NoSuchMessageException e1) { - try { - return DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); - } catch (NoSuchMessageException e2) { - return null; - } - } - } - public void incrementDeliveryReceiptCount(SyncMessageId syncMessageId, long timestamp) { DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, true); DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, true);