package org.thoughtcrime.securesms.jobs; import android.content.Context; import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.dependencies.InjectableType; import org.thoughtcrime.securesms.jobmanager.JobParameters; import org.thoughtcrime.securesms.jobmanager.requirements.NetworkRequirement; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import java.io.IOException; import java.util.List; import javax.inject.Inject; public class SendReadReceiptJob extends ContextJob implements InjectableType { private static final long serialVersionUID = 1L; private static final String TAG = SendReadReceiptJob.class.getSimpleName(); @Inject transient SignalServiceMessageSender messageSender; private final String address; private final List messageIds; private final long timestamp; public SendReadReceiptJob(Context context, Address address, List messageIds) { super(context, JobParameters.newBuilder() .withRequirement(new NetworkRequirement(context)) .withPersistence() .create()); this.address = address.serialize(); this.messageIds = messageIds; this.timestamp = System.currentTimeMillis(); } @Override public void onAdded() {} @Override public void onRun() throws IOException, UntrustedIdentityException { if (!TextSecurePreferences.isReadReceiptsEnabled(context)) return; SignalServiceAddress remoteAddress = new SignalServiceAddress(address); SignalServiceReceiptMessage receiptMessage = new SignalServiceReceiptMessage(SignalServiceReceiptMessage.Type.READ, messageIds, timestamp); messageSender.sendReceipt(remoteAddress, receiptMessage); } @Override public boolean onShouldRetry(Exception e) { if (e instanceof PushNetworkException) return true; return false; } @Override public void onCanceled() { Log.w(TAG, "Failed to send read receipts to: " + address); } }