Signal-Android/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceSubscriptionSync...

77 wiersze
2.6 KiB
Kotlin

package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.net.NotPushRegisteredException
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException
import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException
/**
* Sends a sync message to linked devices to notify them to refresh subscription status.
*/
class MultiDeviceSubscriptionSyncRequestJob private constructor(parameters: Parameters) : BaseJob(parameters) {
companion object {
const val KEY = "MultiDeviceSubscriptionSyncRequestJob"
private val TAG = Log.tag(MultiDeviceSubscriptionSyncRequestJob::class.java)
@JvmStatic
fun enqueue() {
val job = MultiDeviceSubscriptionSyncRequestJob(
Parameters.Builder()
.setQueue("MultiDeviceSubscriptionSyncRequestJob")
.setMaxInstancesForFactory(2)
.addConstraint(NetworkConstraint.KEY)
.setMaxAttempts(10)
.build()
)
ApplicationDependencies.getJobManager().add(job)
}
}
override fun serialize(): Data = Data.EMPTY
override fun getFactoryKey(): String = KEY
override fun onFailure() {
Log.w(TAG, "Did not succeed!")
}
override fun onRun() {
if (!Recipient.self().isRegistered) {
throw NotPushRegisteredException()
}
if (!TextSecurePreferences.isMultiDevice(context)) {
Log.i(TAG, "Not multi device, aborting...")
return
}
val messageSender = ApplicationDependencies.getSignalServiceMessageSender()
messageSender.sendSyncMessage(
SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.SUBSCRIPTION_STATUS),
UnidentifiedAccessUtil.getAccessForSync(context)
)
}
override fun onShouldRetry(e: Exception): Boolean {
return e is PushNetworkException && e !is ServerRejectedException
}
class Factory : Job.Factory<MultiDeviceSubscriptionSyncRequestJob> {
override fun create(parameters: Parameters, data: Data): MultiDeviceSubscriptionSyncRequestJob {
return MultiDeviceSubscriptionSyncRequestJob(parameters)
}
}
}