Add a job for sending a background message.
Send a friend request background message to other linked devices upon accepting a friend request.pull/39/head
							parent
							
								
									9541588383
								
							
						
					
					
						commit
						55ecd3cae4
					
				| @ -0,0 +1,98 @@ | ||||
| package org.thoughtcrime.securesms.loki | ||||
| 
 | ||||
| import org.thoughtcrime.securesms.ApplicationContext | ||||
| import org.thoughtcrime.securesms.database.DatabaseFactory | ||||
| import org.thoughtcrime.securesms.dependencies.InjectableType | ||||
| import org.thoughtcrime.securesms.jobmanager.Data | ||||
| import org.thoughtcrime.securesms.jobmanager.Job | ||||
| import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint | ||||
| import org.thoughtcrime.securesms.jobs.BaseJob | ||||
| import org.thoughtcrime.securesms.logging.Log | ||||
| import org.whispersystems.libsignal.util.guava.Optional | ||||
| import org.whispersystems.signalservice.api.SignalServiceMessageSender | ||||
| import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair | ||||
| import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException | ||||
| import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage | ||||
| import org.whispersystems.signalservice.api.push.SignalServiceAddress | ||||
| import java.io.IOException | ||||
| import java.util.concurrent.TimeUnit | ||||
| import javax.inject.Inject | ||||
| 
 | ||||
| class PushBackgroundMessageSendJob private constructor( | ||||
|         parameters: Parameters, | ||||
|         private val recipient: String, | ||||
|         private val messageBody: String?, | ||||
|         private val friendRequest: Boolean | ||||
| ) : 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" | ||||
|   } | ||||
| 
 | ||||
|   constructor(recipient: String): this(recipient, null, false) | ||||
|   constructor(recipient: String, messageBody: String?, friendRequest: Boolean) : this(Parameters.Builder() | ||||
|           .addConstraint(NetworkConstraint.KEY) | ||||
|           .setQueue(KEY) | ||||
|           .setLifespan(TimeUnit.DAYS.toMillis(1)) | ||||
|           .setMaxAttempts(1) | ||||
|           .build(), | ||||
|           recipient, messageBody, friendRequest) | ||||
| 
 | ||||
|   override fun serialize(): Data { | ||||
|     return Data.Builder() | ||||
|             .putString(KEY_RECIPIENT, recipient) | ||||
|             .putString(KEY_MESSAGE_BODY, messageBody) | ||||
|             .putBoolean(KEY_FRIEND_REQUEST, friendRequest) | ||||
|             .build() | ||||
|   } | ||||
| 
 | ||||
|   override fun getFactoryKey(): String { | ||||
|     return KEY | ||||
|   } | ||||
| 
 | ||||
|   public override fun onRun() { | ||||
|     val message = SignalServiceDataMessage.newBuilder() | ||||
|             .withTimestamp(System.currentTimeMillis()) | ||||
|             .withBody(messageBody) | ||||
| 
 | ||||
|     if (friendRequest) { | ||||
|       val bundle = DatabaseFactory.getLokiPreKeyBundleDatabase(context).generatePreKeyBundle(recipient) | ||||
|       message.withPreKeyBundle(bundle) | ||||
|               .asFriendRequest(true) | ||||
|     } | ||||
| 
 | ||||
|     val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() | ||||
|     val address = SignalServiceAddress(recipient) | ||||
|     try { | ||||
|       messageSender.sendMessage(-1, address, Optional.absent<UnidentifiedAccessPair>(), message.build()) // The message ID doesn't matter | ||||
|     } catch (e: Exception) { | ||||
|       Log.d("Loki", "Failed to send background message to: $recipient.") | ||||
|       throw e | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public override fun onShouldRetry(e: Exception): Boolean { | ||||
|     // Loki - Disable since we have our own retrying when sending messages | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   override fun onCanceled() {} | ||||
| 
 | ||||
|   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) | ||||
|       } catch (e: IOException) { | ||||
|         throw AssertionError(e) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue