@ -17,10 +17,9 @@ import org.thoughtcrime.securesms.util.GroupUtil
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.thoughtcrime.securesms.util.Util
import org.whispersystems.libsignal.util.guava.Optional
import org.whispersystems.signalservice.api.messages.SignalServiceContent
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage
import org.whispersystems.signalservice.api.messages.SignalServiceGroup
import org.whispersystems.signalservice.api.messages.*
import org.whispersystems.signalservice.api.push.SignalServiceAddress
import org.whispersystems.signalservice.internal.push.SignalServiceProtos
import org.whispersystems.signalservice.loki.api.LokiPublicChat
import org.whispersystems.signalservice.loki.api.LokiPublicChatAPI
import org.whispersystems.signalservice.loki.api.LokiPublicChatMessage
@ -96,21 +95,35 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki
private fun pollForNewMessages ( ) {
fun processIncomingMessage ( message : LokiPublicChatMessage ) {
val id = group . id . toByteArray ( )
val x1 = SignalServiceGroup ( SignalServiceGroup . Type . UPDATE , id , null , null , null )
val quote : SignalServiceDataMessage . Quote ?
if ( message . quote != null ) {
quote = SignalServiceDataMessage . Quote ( message . quote !! . quotedMessageTimestamp , SignalServiceAddress ( message . quote !! . quoteeHexEncodedPublicKey ) , message . quote !! . quotedMessageBody , listOf ( ) )
val serviceGroup = SignalServiceGroup ( SignalServiceGroup . Type . UPDATE , id , null , null , null )
val quote = if ( message . quote != null ) {
SignalServiceDataMessage . Quote ( message . quote !! . quotedMessageTimestamp , SignalServiceAddress ( message . quote !! . quoteeHexEncodedPublicKey ) , message . quote !! . quotedMessageBody , listOf ( ) )
} else {
quote = null
}
val x2 = SignalServiceDataMessage ( message . timestamp , x1 , listOf ( ) , message . body , false , 0 , false , null , false , quote , null , null , null )
val x3 = SignalServiceContent ( x2 , message . hexEncodedPublicKey , SignalServiceAddress . DEFAULT _DEVICE _ID , message . timestamp , false )
null
}
val attachments = message . attachments . map { attachment ->
SignalServiceAttachmentPointer (
attachment . serverID ,
attachment . contentType ,
ByteArray ( 0 ) ,
Optional . of ( attachment . size ) ,
Optional . absent ( ) ,
attachment . width , attachment . height ,
Optional . absent ( ) ,
Optional . of ( attachment . fileName ) ,
false ,
Optional . fromNullable ( attachment . caption ) ,
attachment . url )
}
val body = if ( message . body == message . timestamp . toString ( ) ) " " else message . body // Workaround for the fact that the back-end doesn't accept messages without a body
val serviceDataMessage = SignalServiceDataMessage ( message . timestamp , serviceGroup , attachments , body , false , 0 , false , null , false , quote , null , null , null )
val serviceContent = SignalServiceContent ( serviceDataMessage , message . hexEncodedPublicKey , SignalServiceAddress . DEFAULT _DEVICE _ID , message . timestamp , false )
val senderDisplayName = " ${message.displayName} (... ${message.hexEncodedPublicKey.takeLast(8)} ) "
DatabaseFactory . getLokiUserDatabase ( context ) . setServerDisplayName ( group . id , message . hexEncodedPublicKey , senderDisplayName )
if ( quote != null ) {
PushDecryptJob ( context ) . handleMediaMessage ( x3 , x2 , Optional . absent ( ) , Optional . of ( message . serverID ) )
if ( quote != null || attachments . count ( ) > 0 ) {
PushDecryptJob ( context ) . handleMediaMessage ( serviceContent, serviceDataMessage , Optional . absent ( ) , Optional . of ( message . serverID ) )
} else {
PushDecryptJob ( context ) . handleTextMessage ( x3 , x2 , Optional . absent ( ) , Optional . of ( message . serverID ) )
PushDecryptJob ( context ) . handleTextMessage ( serviceContent, serviceDataMessage , Optional . absent ( ) , Optional . of ( message . serverID ) )
}
}
fun processOutgoingMessage ( message : LokiPublicChatMessage ) {
@ -118,6 +131,10 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki
val lokiMessageDatabase = DatabaseFactory . getLokiMessageDatabase ( context )
val isDuplicate = lokiMessageDatabase . getMessageID ( messageServerID ) != null
if ( isDuplicate ) { return }
// Ignore empty messages with no attachments or quotes
if ( message . body . isEmpty ( ) && message . attachments . isEmpty ( ) && message . quote == null ) { return }
val id = group . id . toByteArray ( )
val mmsDatabase = DatabaseFactory . getMmsDatabase ( context )
val recipient = Recipient . from ( context , Address . fromSerialized ( GroupUtil . getEncodedId ( id , false ) ) , false )
@ -127,7 +144,9 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki
} else {
quote = null
}
val signalMessage = OutgoingMediaMessage ( recipient , message . body , listOf ( ) , message . timestamp , 0 , 0 ,
// TODO: Handle attachments correctly for our previous messages
val body = if ( message . body == message . timestamp . toString ( ) ) " " else message . body // Workaround for the fact that the back-end doesn't accept messages without a body
val signalMessage = OutgoingMediaMessage ( recipient , body , listOf ( ) , message . timestamp , 0 , 0 ,
ThreadDatabase . DistributionTypes . DEFAULT , quote , listOf ( ) , listOf ( ) , listOf ( ) , listOf ( ) )
val threadID = DatabaseFactory . getThreadDatabase ( context ) . getThreadIdFor ( recipient )
fun finalize ( ) {