@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.loki.protocol
import android.content.Context
import android.util.Log
import network.loki.messenger.BuildConfig
import nl.komponents.kovenant.Promise
import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
@ -34,21 +33,21 @@ object MultiDeviceProtocol {
enum class MessageType { Text , Media }
@JvmStatic
fun sendTextPush ( context : Context , recipient : Recipient , messageID : Long ) {
sendMessagePush ( context , recipient , messageID , MessageType . Text )
fun sendTextPush ( context : Context , recipient : Recipient , messageID : Long , isEndSession : Boolean ) {
sendMessagePush ( context , recipient , messageID , MessageType . Text , isEndSession )
}
@JvmStatic
fun sendMediaPush ( context : Context , recipient : Recipient , messageID : Long ) {
sendMessagePush ( context , recipient , messageID , MessageType . Media )
sendMessagePush ( context , recipient , messageID , MessageType . Media , false )
}
private fun sendMessagePushToDevice ( context : Context , recipient : Recipient , messageID : Long , messageType : MessageType ): PushSendJob {
private fun sendMessagePushToDevice ( context : Context , recipient : Recipient , messageID : Long , messageType : MessageType , isEndSession : Boolean ): PushSendJob {
val threadID = DatabaseFactory . getThreadDatabase ( context ) . getThreadIdFor ( recipient )
val threadFRStatus = DatabaseFactory . getLokiThreadDatabase ( context ) . getFriendRequestStatus ( threadID )
val isNoteToSelf = SessionMetaProtocol . shared . isNoteToSelf ( recipient . address . serialize ( ) )
val isContactFriend = ( threadFRStatus == LokiThreadFriendRequestStatus . FRIENDS || isNoteToSelf ) // In the note to self case the device linking request was the FR
val isFRMessage = !is ContactFriend // Holds true assuming this method isn't invoked for control messages
val isFRMessage = !is ContactFriend
val hasVisibleContent = when ( messageType ) {
MessageType . Text -> DatabaseFactory . getSmsDatabase ( context ) . getMessage ( messageID ) . body . isNotBlank ( )
MessageType . Media -> {
@ -56,10 +55,9 @@ object MultiDeviceProtocol {
outgoingMediaMessage . body . isNotBlank ( ) || outgoingMediaMessage . attachments . isNotEmpty ( )
}
}
if ( isFRMessage && ! hasVisibleContent && BuildConfig . DEBUG ) { throw IllegalStateException ( ) } // Verify the above assumption
val shouldSendAutoGeneratedFR = !is ContactFriend && !is FRMessage
&& !is NoteToSelf && ! recipient . address . isGroup // Group threads work through session requests
&& hasVisibleContent
&& hasVisibleContent && !is EndSession
if ( ! shouldSendAutoGeneratedFR ) {
when ( messageType ) {
MessageType . Text -> return PushTextSendJob ( messageID , messageID , recipient . address , isFRMessage , null )
@ -74,7 +72,7 @@ object MultiDeviceProtocol {
}
}
private fun sendMessagePush ( context : Context , recipient : Recipient , messageID : Long , messageType : MessageType ) {
private fun sendMessagePush ( context : Context , recipient : Recipient , messageID : Long , messageType : MessageType , isEndSession : Boolean ) {
val jobManager = ApplicationContext . getInstance ( context ) . jobManager
val isMultiDeviceRequired = ! recipient . address . isOpenGroup
if ( !is MultiDeviceRequired ) {
@ -86,7 +84,7 @@ object MultiDeviceProtocol {
val publicKey = recipient . address . serialize ( )
LokiFileServerAPI . shared . getDeviceLinks ( publicKey ) . success {
val devices = MultiDeviceProtocol . shared . getAllLinkedDevices ( publicKey )
val jobs = devices . map { sendMessagePushToDevice ( context , recipient ( context , it ) , messageID , messageType ) }
val jobs = devices . map { sendMessagePushToDevice ( context , recipient ( context , it ) , messageID , messageType , isEndSession ) }
@Suppress ( " UNCHECKED_CAST " )
when ( messageType ) {
MessageType . Text -> jobManager . startChain ( jobs ) . enqueue ( )