Multi-device sending text messages.

This commit is contained in:
Mikunj
2019-10-04 16:14:25 +10:00
parent 8e495d087b
commit fb3967db55
3 changed files with 133 additions and 31 deletions

View File

@@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.jobs.SmsSendJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.UtilitiesKt;
import org.thoughtcrime.securesms.mms.MmsException;
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
import org.thoughtcrime.securesms.push.AccountManagerFactory;
@@ -52,9 +53,15 @@ import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.push.ContactTokenDetails;
import org.whispersystems.signalservice.loki.api.LokiStorageAPI;
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import kotlin.Unit;
public class MessageSender {
@@ -203,8 +210,47 @@ public class MessageSender {
}
private static void sendTextPush(Context context, Recipient recipient, long messageId) {
LokiStorageAPI storageAPI = LokiStorageAPI.Companion.getShared();
JobManager jobManager = ApplicationContext.getInstance(context).getJobManager();
jobManager.add(new PushTextSendJob(messageId, recipient.getAddress()));
// Just send the message normally if the job manager failed or if it's a group message
String recipientPubKey = recipient.getAddress().serialize();
if (storageAPI == null || UtilitiesKt.isGroupChat(recipientPubKey)) {
jobManager.add(new PushTextSendJob(messageId, recipient.getAddress()));
return;
}
String ourPubKey = TextSecurePreferences.getLocalNumber(context);
// Get all the devices and run our logic on them
storageAPI.getAllDevices(recipientPubKey).success(devices -> {
// Remove our self if we intended this message to go to another recipient
if (!recipientPubKey.equals(ourPubKey)) { devices.remove(ourPubKey); }
Set<String> friends = UtilitiesKt.getFriends(context, devices);
Set<String> nonFriends = new HashSet<>(devices);
nonFriends.removeAll(friends);
// Send a normal message to our friends
for (String friend : friends) {
// If this message had the same recipient then point it to the correct message id otherwise point it to a non-existing message
long messageIdToUse = recipientPubKey.equals(friend) ? messageId : -1L;
jobManager.add(new PushTextSendJob(messageId, messageIdToUse, Address.fromSerialized(friend)));
}
// Send friend requests to non friends
for (String stranger : nonFriends) {
// If this message had the same recipient then point it to the correct message id otherwise point it to a non-existing message
long messageIdToUse = recipientPubKey.equals(stranger) ? messageId : -1L;
// If we're friends with one of the devices then send out a default friend request message
boolean isFriendsWithAny = friends.size() > 0;
String defaultFriendRequestMessage = isFriendsWithAny ? "This is a friend request for devices linked to " + recipientPubKey : null;
jobManager.add(new PushTextSendJob(messageId, messageIdToUse, Address.fromSerialized(stranger), true, defaultFriendRequestMessage));
}
return Unit.INSTANCE;
});
}
private static void sendMediaPush(Context context, Recipient recipient, long messageId) {