mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-03 12:32:17 +00:00
Add missing friend request protocol logic
This commit is contained in:
@@ -6,6 +6,7 @@ import org.thoughtcrime.securesms.database.Address
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||
import org.thoughtcrime.securesms.loki.utilities.recipient
|
||||
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage
|
||||
import org.thoughtcrime.securesms.recipients.Recipient
|
||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceContent
|
||||
@@ -16,12 +17,72 @@ import org.whispersystems.signalservice.loki.protocol.todo.LokiThreadFriendReque
|
||||
object FriendRequestProtocol {
|
||||
|
||||
@JvmStatic
|
||||
fun acceptFriendRequest(context: Context, contactPublicKey: String) {
|
||||
fun acceptFriendRequest(context: Context, recipient: Recipient) {
|
||||
if (recipient.isGroupRecipient) { return; }
|
||||
val userPublicKey = TextSecurePreferences.getLocalNumber(context)
|
||||
val allUserDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey)
|
||||
// Accept all outstanding friend requests associated with this user and try to establish sessions with the
|
||||
// subset of their devices that haven't sent a friend request.
|
||||
val linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(recipient.address.serialize())
|
||||
val threadDB = DatabaseFactory.getThreadDatabase(context)
|
||||
val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context)
|
||||
for (device in linkedDevices) {
|
||||
val deviceAsRecipient = recipient(context, device)
|
||||
val deviceThreadID = threadDB.getThreadIdFor(deviceAsRecipient)
|
||||
val deviceFRStatus = lokiThreadDB.getFriendRequestStatus(deviceThreadID)
|
||||
if (deviceFRStatus == LokiThreadFriendRequestStatus.REQUEST_RECEIVED) {
|
||||
lokiThreadDB.setFriendRequestStatus(deviceThreadID, LokiThreadFriendRequestStatus.FRIENDS)
|
||||
val lastMessageID = getLastMessageID(context, deviceThreadID)
|
||||
if (lastMessageID != null) {
|
||||
DatabaseFactory.getLokiMessageDatabase(context).setFriendRequestStatus(lastMessageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED)
|
||||
}
|
||||
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient(context, device), true)
|
||||
val ephemeralMessage = EphemeralMessage.create(device)
|
||||
ApplicationContext.getInstance(context).jobManager.add(PushEphemeralMessageSendJob(ephemeralMessage))
|
||||
// Sync contact if needed
|
||||
if (allUserDevices.contains(device)) { return }
|
||||
val deviceToSync = MultiDeviceProtocol.shared.getMasterDevice(device) ?: device
|
||||
SyncMessagesProtocol.syncContact(context, Address.fromSerialized(deviceToSync))
|
||||
} else if (deviceFRStatus == LokiThreadFriendRequestStatus.REQUEST_SENT) {
|
||||
// Do nothing
|
||||
} else if (!allUserDevices.contains(device)
|
||||
&& (deviceFRStatus == LokiThreadFriendRequestStatus.NONE || deviceFRStatus == LokiThreadFriendRequestStatus.REQUEST_EXPIRED)) {
|
||||
// TODO: Send AFR to contact (NOT their linked devices)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun rejectFriendRequest(context: Context, recipient: Recipient) {
|
||||
if (recipient.isGroupRecipient) { return; }
|
||||
val linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(recipient.address.serialize())
|
||||
val threadDB = DatabaseFactory.getThreadDatabase(context)
|
||||
val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context)
|
||||
for (device in linkedDevices) {
|
||||
val deviceAsRecipient = recipient(context, device)
|
||||
val deviceThreadID = threadDB.getThreadIdFor(deviceAsRecipient)
|
||||
val deviceFRStatus = lokiThreadDB.getFriendRequestStatus(deviceThreadID)
|
||||
// We only want to decline incoming requests
|
||||
if (deviceFRStatus == LokiThreadFriendRequestStatus.REQUEST_RECEIVED) {
|
||||
// Delete the pre key bundle for the given contact. This ensures that if we send a
|
||||
// new message after this, it restarts the friend request process from scratch.
|
||||
DatabaseFactory.getLokiPreKeyBundleDatabase(context).removePreKeyBundle(device)
|
||||
lokiThreadDB.setFriendRequestStatus(deviceThreadID, LokiThreadFriendRequestStatus.NONE)
|
||||
val lastMessageID = getLastMessageID(context, deviceThreadID)
|
||||
if (lastMessageID != null) {
|
||||
DatabaseFactory.getLokiMessageDatabase(context).setFriendRequestStatus(lastMessageID, LokiMessageFriendRequestStatus.REQUEST_REJECTED)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun shouldInputPanelBeEnabled(context: Context, threadID: Long): Boolean {
|
||||
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun rejectFriendRequest(context: Context, contactPublicKey: String) {
|
||||
fun shouldAttachmentButtonBeEnabled(context: Context, threadID: Long): Boolean {
|
||||
|
||||
}
|
||||
|
||||
@@ -51,6 +112,7 @@ object FriendRequestProtocol {
|
||||
if (lastMessageID != null) {
|
||||
DatabaseFactory.getLokiMessageDatabase(context).setFriendRequestStatus(lastMessageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED)
|
||||
}
|
||||
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient, true)
|
||||
// Send a contact sync message if needed
|
||||
val userPublicKey = TextSecurePreferences.getLocalNumber(context)
|
||||
val allUserDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey)
|
||||
@@ -107,6 +169,7 @@ object FriendRequestProtocol {
|
||||
if (lastMessageID != null) {
|
||||
DatabaseFactory.getLokiMessageDatabase(context).setFriendRequestStatus(lastMessageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED)
|
||||
}
|
||||
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient, true)
|
||||
val ephemeralMessage = EphemeralMessage.create(publicKey)
|
||||
ApplicationContext.getInstance(context).jobManager.add(PushEphemeralMessageSendJob(ephemeralMessage))
|
||||
} else if (threadFRStatus != LokiThreadFriendRequestStatus.FRIENDS) {
|
||||
|
||||
@@ -10,17 +10,31 @@ import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||
import org.thoughtcrime.securesms.jobs.CleanPreKeysJob
|
||||
import org.thoughtcrime.securesms.loki.utilities.recipient
|
||||
import org.thoughtcrime.securesms.recipients.Recipient
|
||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
||||
import org.whispersystems.libsignal.loki.LokiSessionResetStatus
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceContent
|
||||
import org.whispersystems.signalservice.loki.protocol.todo.LokiThreadFriendRequestStatus
|
||||
|
||||
|
||||
object SessionManagementProtocol {
|
||||
|
||||
@JvmStatic
|
||||
fun startSessionReset(context: Context, contactPublicKey: String) {
|
||||
|
||||
fun startSessionReset(context: Context, recipient: Recipient, threadID: Long) {
|
||||
if (recipient.isGroupRecipient) { return }
|
||||
val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context)
|
||||
val smsDB = DatabaseFactory.getSmsDatabase(context)
|
||||
val devices = lokiThreadDB.getSessionRestoreDevices(threadID)
|
||||
for (device in devices) {
|
||||
val sessionRestorationRequest = EphemeralMessage.createSessionRestorationRequest(recipient.address.serialize())
|
||||
ApplicationContext.getInstance(context).jobManager.add(PushEphemeralMessageSendJob(sessionRestorationRequest))
|
||||
}
|
||||
val infoMessage = OutgoingTextMessage(recipient, "", 0, 0)
|
||||
val infoMessageID = smsDB.insertMessageOutbox(threadID, infoMessage, false, System.currentTimeMillis(), null)
|
||||
if (infoMessageID > -1) {
|
||||
smsDB.markAsSentLokiSessionRestorationRequest(infoMessageID)
|
||||
}
|
||||
lokiThreadDB.removeAllSessionRestoreDevices(threadID)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
|
||||
@@ -104,15 +104,16 @@ object SyncMessagesProtocol {
|
||||
val threadFRStatus = lokiThreadDB.getFriendRequestStatus(threadID)
|
||||
when (threadFRStatus) {
|
||||
LokiThreadFriendRequestStatus.NONE, LokiThreadFriendRequestStatus.REQUEST_EXPIRED -> {
|
||||
// TODO: Send AFR to contact and their linked devices
|
||||
// TODO: Send AFR to contact AND THEIR LINKED DEVICES
|
||||
}
|
||||
LokiThreadFriendRequestStatus.REQUEST_RECEIVED -> {
|
||||
FriendRequestProtocol.acceptFriendRequest(contactPublicKey) // Takes into account multi device internally
|
||||
FriendRequestProtocol.acceptFriendRequest(context, recipient(context, contactPublicKey)) // Takes into account multi device internally
|
||||
lokiThreadDB.setFriendRequestStatus(threadID, LokiThreadFriendRequestStatus.FRIENDS)
|
||||
val lastMessageID = FriendRequestProtocol.getLastMessageID(context, threadID)
|
||||
if (lastMessageID != null) {
|
||||
DatabaseFactory.getLokiMessageDatabase(context).setFriendRequestStatus(lastMessageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED)
|
||||
}
|
||||
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(recipient(context, contactPublicKey), true)
|
||||
}
|
||||
else -> {
|
||||
// Do nothing
|
||||
|
||||
Reference in New Issue
Block a user