From da67bfab4c1d0317c159e1f90104dba9ef7b04e1 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Mon, 7 Oct 2019 10:25:14 +1100 Subject: [PATCH] Multi-device sending typing and receipt messages. --- .../components/TypingStatusSender.java | 28 ++++++++++++++++++- .../notifications/MarkReadReceiver.java | 27 ++++++++++++------ 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/org/thoughtcrime/securesms/components/TypingStatusSender.java b/src/org/thoughtcrime/securesms/components/TypingStatusSender.java index 5c26d910e3..be1ff84bc4 100644 --- a/src/org/thoughtcrime/securesms/components/TypingStatusSender.java +++ b/src/org/thoughtcrime/securesms/components/TypingStatusSender.java @@ -5,13 +5,21 @@ import android.content.Context; import android.support.annotation.NonNull; import org.thoughtcrime.securesms.ApplicationContext; +import org.thoughtcrime.securesms.database.Address; +import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.jobs.TypingSendJob; +import org.thoughtcrime.securesms.loki.MultiDeviceUtilKt; +import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.Util; +import org.whispersystems.signalservice.loki.api.LokiStorageAPI; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; +import kotlin.Unit; + @SuppressLint("UseSparseArrays") public class TypingStatusSender { @@ -74,7 +82,25 @@ public class TypingStatusSender { } private void sendTyping(long threadId, boolean typingStarted) { - ApplicationContext.getInstance(context).getJobManager().add(new TypingSendJob(threadId, typingStarted)); + LokiStorageAPI storageAPI = LokiStorageAPI.Companion.getShared(); + ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); + Recipient originalRecipient = threadDatabase.getRecipientForThreadId(threadId); + + // Send normal message if storage api wasn't found + if (storageAPI == null || originalRecipient == null) { + ApplicationContext.getInstance(context).getJobManager().add(new TypingSendJob(threadId, typingStarted)); + return; + } + + MultiDeviceUtilKt.getAllDevices(context, originalRecipient.getAddress().serialize(), storageAPI, (devicePubKey, isFriend, friendCount) -> { + Recipient device = Recipient.from(context, Address.fromSerialized(devicePubKey), false); + long deviceThreadId = threadDatabase.getThreadIdIfExistsFor(device); + if (deviceThreadId > -1) { + ApplicationContext.getInstance(context).getJobManager().add(new TypingSendJob(deviceThreadId, typingStarted)); + } + return Unit.INSTANCE; + }); + } private class StartRunnable implements Runnable { diff --git a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java index e64f395a3c..0fd7199923 100644 --- a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java +++ b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java @@ -21,13 +21,17 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob; import org.thoughtcrime.securesms.jobs.SendReadReceiptJob; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.loki.LokiThreadDatabase; +import org.thoughtcrime.securesms.loki.MultiDeviceUtilKt; import org.thoughtcrime.securesms.service.ExpiringMessageManager; +import org.whispersystems.signalservice.loki.api.LokiStorageAPI; import org.whispersystems.signalservice.loki.messaging.LokiThreadFriendRequestStatus; import java.util.LinkedList; import java.util.List; import java.util.Map; +import kotlin.Unit; + public class MarkReadReceiver extends BroadcastReceiver { private static final String TAG = MarkReadReceiver.class.getSimpleName(); @@ -86,17 +90,24 @@ public class MarkReadReceiver extends BroadcastReceiver { .collect(Collectors.groupingBy(SyncMessageId::getAddress)); for (Address address : addressMap.keySet()) { - // Loki - This also prevents read receipts from being sent in group chats as they don't maintain a friend request status - LokiThreadDatabase lokiThreadDatabase = DatabaseFactory.getLokiThreadDatabase(context); - long threadID = lokiThreadDatabase.getThreadID(address.serialize()); - LokiThreadFriendRequestStatus friendRequestStatus = lokiThreadDatabase.getFriendRequestStatus(threadID); - if (friendRequestStatus != LokiThreadFriendRequestStatus.FRIENDS) { return; } + LokiStorageAPI storageAPI = LokiStorageAPI.Companion.getShared(); + if (storageAPI == null) { + Log.w("Loki", "LokiStorageAPI is not initialized!"); + return; + } List timestamps = Stream.of(addressMap.get(address)).map(SyncMessageId::getTimetamp).toList(); - ApplicationContext.getInstance(context) - .getJobManager() - .add(new SendReadReceiptJob(address, timestamps)); + MultiDeviceUtilKt.getAllDevices(context, address.serialize(), storageAPI, (devicePubKey, isFriend, friendCount) -> { + // Loki - This also prevents read receipts from being sent in group chats as they don't maintain a friend request status + if (isFriend) { + Address deviceAddress = Address.fromSerialized(devicePubKey); + ApplicationContext.getInstance(context) + .getJobManager() + .add(new SendReadReceiptJob(deviceAddress, timestamps)); + } + return Unit.INSTANCE; + }); } }