@ -11,39 +11,58 @@ import org.whispersystems.libsignal.util.guava.Optional
import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage
import org.whispersystems.signalservice.api.push.SignalServiceAddress
import org.whispersystems.signalservice.internal.util.JsonUtil
import java.io.IOException
import java.util.concurrent.TimeUnit
data class BackgroundMessage private constructor ( val recipient : String , val body : String ? , val friendRequest : Boolean , val unpairingRequest : Boolean ) {
companion object {
@JvmStatic
fun create ( recipient : String ) = BackgroundMessage ( recipient , null , false , false )
@JvmStatic
fun createFriendRequest ( recipient : String , messageBody : String ) = BackgroundMessage ( recipient , messageBody , true , false )
@JvmStatic
fun createUnpairingRequest ( recipient : String ) = BackgroundMessage ( recipient , null , false , true )
internal fun parse ( serialized : String ) : BackgroundMessage {
val node = JsonUtil . fromJson ( serialized )
val recipient = node . get ( " recipient " ) . asText ( )
val body = if ( node . hasNonNull ( " body " ) ) node . get ( " body " ) . asText ( ) else null
val friendRequest = node . get ( " friendRequest " ) . asBoolean ( false )
val unpairingRequest = node . get ( " unpairingRequest " ) . asBoolean ( false )
return BackgroundMessage ( recipient , body , friendRequest , unpairingRequest )
}
}
fun serialize ( ) : String {
val map = mapOf ( " recipient " to recipient , " body " to body , " friendRequest " to friendRequest , " unpairingRequest " to unpairingRequest )
return JsonUtil . toJson ( map )
}
}
class PushBackgroundMessageSendJob private constructor (
parameters : Parameters ,
private val recipient : String ,
private val messageBody : String ? ,
private val friendRequest : Boolean
private val message : BackgroundMessage
) : BaseJob ( parameters ) {
companion object {
const val KEY = " PushBackgroundMessageSendJob "
private val TAG = PushBackgroundMessageSendJob :: class . java . simpleName
private val KEY _RECIPIENT = " recipient "
private val KEY _MESSAGE _BODY = " message_body "
private val KEY _FRIEND _REQUEST = " asFriendRequest "
private val KEY _MESSAGE = " message "
}
constructor ( recipient : String ) : this ( recipient , null , false )
constructor ( recipient : String , messageBody : String ? , friendRequest : Boolean ) : this ( Parameters . Builder ( )
constructor ( message : BackgroundMessage ) : this ( Parameters . Builder ( )
. addConstraint ( NetworkConstraint . KEY )
. setQueue ( KEY )
. setLifespan ( TimeUnit . DAYS . toMillis ( 1 ) )
. setMaxAttempts ( 1 )
. build ( ) ,
recipient , messageBody , friendRequest )
message)
override fun serialize ( ) : Data {
return Data . Builder ( )
. putString ( KEY _RECIPIENT , recipient )
. putString ( KEY _MESSAGE _BODY , messageBody )
. putBoolean ( KEY _FRIEND _REQUEST , friendRequest )
. putString ( KEY _MESSAGE , message . serialize ( ) )
. build ( )
}
@ -52,22 +71,24 @@ class PushBackgroundMessageSendJob private constructor(
}
public override fun onRun ( ) {
val m essage = SignalServiceDataMessage . newBuilder ( )
val dataM essage = SignalServiceDataMessage . newBuilder ( )
. withTimestamp ( System . currentTimeMillis ( ) )
. withBody ( message B ody)
. withBody ( message . b ody)
if ( friendRequest) {
val bundle = DatabaseFactory . getLokiPreKeyBundleDatabase ( context ) . generatePreKeyBundle ( recipient)
m essage. withPreKeyBundle ( bundle )
if ( message. friendRequest) {
val bundle = DatabaseFactory . getLokiPreKeyBundleDatabase ( context ) . generatePreKeyBundle ( message. recipient)
dataM essage. withPreKeyBundle ( bundle )
. asFriendRequest ( true )
} else if ( message . unpairingRequest ) {
dataMessage . asUnpairingRequest ( true )
}
val messageSender = ApplicationContext . getInstance ( context ) . communicationModule . provideSignalMessageSender ( )
val address = SignalServiceAddress ( recipient)
val address = SignalServiceAddress ( message. recipient)
try {
messageSender . sendMessage ( - 1 , address , Optional . absent < UnidentifiedAccessPair > ( ) , m essage. build ( ) ) // The message ID doesn't matter
messageSender . sendMessage ( - 1 , address , Optional . absent < UnidentifiedAccessPair > ( ) , dataM essage. build ( ) ) // The message ID doesn't matter
} catch ( e : Exception ) {
Log . d ( " Loki " , " Failed to send background message to: $ recipient. " )
Log . d ( " Loki " , " Failed to send background message to: $ {message. recipient} . " )
throw e
}
}
@ -82,10 +103,8 @@ class PushBackgroundMessageSendJob private constructor(
class Factory : Job . Factory < PushBackgroundMessageSendJob > {
override fun create ( parameters : Parameters , data : Data ) : PushBackgroundMessageSendJob {
try {
val recipient = data . getString ( KEY _RECIPIENT )
val messageBody = if ( data . hasString ( KEY _MESSAGE _BODY ) ) data . getString ( KEY _MESSAGE _BODY ) else null
val friendRequest = data . getBooleanOrDefault ( KEY _FRIEND _REQUEST , false )
return PushBackgroundMessageSendJob ( parameters , recipient , messageBody , friendRequest )
val messageJSON = data . getString ( KEY _MESSAGE )
return PushBackgroundMessageSendJob ( parameters , BackgroundMessage . parse ( messageJSON ) )
} catch ( e : IOException ) {
throw AssertionError ( e )
}