package org.thoughtcrime.securesms.jobs; import android.support.annotation.NonNull; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase.RecipientReader; 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.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.GroupUtil; 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.multidevice.BlockedListMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; import javax.inject.Inject; public class MultiDeviceBlockedUpdateJob extends BaseJob implements InjectableType { public static final String KEY = "MultiDeviceBlockedUpdateJob"; @SuppressWarnings("unused") private static final String TAG = MultiDeviceBlockedUpdateJob.class.getSimpleName(); @Inject SignalServiceMessageSender messageSender; public MultiDeviceBlockedUpdateJob() { this(new Job.Parameters.Builder() .addConstraint(NetworkConstraint.KEY) .setQueue("MultiDeviceBlockedUpdateJob") .setLifespan(TimeUnit.DAYS.toMillis(1)) .setMaxAttempts(Parameters.UNLIMITED) .build()); } private MultiDeviceBlockedUpdateJob(@NonNull Job.Parameters parameters) { super(parameters); } @Override public @NonNull Data serialize() { return Data.EMPTY; } @Override public @NonNull String getFactoryKey() { return KEY; } @Override public void onRun() throws IOException, UntrustedIdentityException { if (!TextSecurePreferences.isMultiDevice(context)) { Log.i(TAG, "Not multi device, aborting..."); return; } RecipientDatabase database = DatabaseFactory.getRecipientDatabase(context); try (RecipientReader reader = database.readerForBlocked(database.getBlocked())) { List blockedIndividuals = new LinkedList<>(); List blockedGroups = new LinkedList<>(); Recipient recipient; while ((recipient = reader.getNext()) != null) { if (recipient.isGroupRecipient()) { blockedGroups.add(GroupUtil.getDecodedId(recipient.getAddress().toGroupString())); } else { blockedIndividuals.add(recipient.getAddress().serialize()); } } messageSender.sendMessage(SignalServiceSyncMessage.forBlocked(new BlockedListMessage(blockedIndividuals, blockedGroups)), UnidentifiedAccessUtil.getAccessForSync(context)); } } @Override public boolean onShouldRetry(Exception exception) { if (exception instanceof PushNetworkException) return true; return false; } @Override public void onCanceled() { } public static final class Factory implements Job.Factory { @Override public @NonNull MultiDeviceBlockedUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) { return new MultiDeviceBlockedUpdateJob(parameters); } } }