Store Job data as bytes.

This commit is contained in:
Greyson Parrelli
2023-03-16 15:19:21 -04:00
parent b5af581205
commit 7c8de901f1
198 changed files with 1434 additions and 1302 deletions

View File

@@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.jobmanager.persistence.FullSpec;
import org.thoughtcrime.securesms.jobmanager.persistence.JobSpec;
import org.signal.core.util.CursorUtil;
import java.nio.charset.StandardCharsets;
import java.util.LinkedList;
import java.util.List;
@@ -193,7 +194,7 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabaseOpenH
getWritableDatabase().update(Jobs.TABLE_NAME, contentValues, query, args);
}
public synchronized void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @NonNull String serializedData) {
public synchronized void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @NonNull byte[] serializedData) {
ContentValues contentValues = new ContentValues();
contentValues.put(Jobs.IS_RUNNING, isRunning ? 1 : 0);
contentValues.put(Jobs.RUN_ATTEMPT, runAttempt);
@@ -348,8 +349,8 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabaseOpenH
cursor.getInt(cursor.getColumnIndexOrThrow(Jobs.RUN_ATTEMPT)),
cursor.getInt(cursor.getColumnIndexOrThrow(Jobs.MAX_ATTEMPTS)),
cursor.getLong(cursor.getColumnIndexOrThrow(Jobs.LIFESPAN)),
cursor.getString(cursor.getColumnIndexOrThrow(Jobs.SERIALIZED_DATA)),
cursor.getString(cursor.getColumnIndexOrThrow(Jobs.SERIALIZED_INPUT_DATA)),
cursor.getBlob(cursor.getColumnIndexOrThrow(Jobs.SERIALIZED_DATA)),
cursor.getBlob(cursor.getColumnIndexOrThrow(Jobs.SERIALIZED_INPUT_DATA)),
cursor.getInt(cursor.getColumnIndexOrThrow(Jobs.IS_RUNNING)) == 1,
false);
}

View File

@@ -32,7 +32,6 @@ import org.thoughtcrime.securesms.database.PendingRetryReceiptCache;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.JobMigrator;
import org.thoughtcrime.securesms.jobmanager.impl.FactoryJobPredicate;
import org.thoughtcrime.securesms.jobmanager.impl.JsonDataSerializer;
import org.thoughtcrime.securesms.jobs.FastJobStorage;
import org.thoughtcrime.securesms.jobs.GroupCallUpdateSendJob;
import org.thoughtcrime.securesms.jobs.JobManagerFactories;
@@ -170,7 +169,6 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr
@Override
public @NonNull JobManager provideJobManager() {
JobManager.Configuration config = new JobManager.Configuration.Builder()
.setDataSerializer(new JsonDataSerializer())
.setJobFactories(JobManagerFactories.getJobFactories(context))
.setConstraintFactories(JobManagerFactories.getConstraintFactories(context))
.setConstraintObservers(JobManagerFactories.getConstraintObservers(context))

View File

@@ -24,10 +24,10 @@ import static androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE;
* often they should be retried, and how long they should be retried for.
*
* Never rely on a specific instance of this class being run. It can be created and destroyed as the
* job is retried. State that you want to save is persisted to a {@link Data} object in
* job is retried. State that you want to save is persisted to a {@link JsonJobData} object in
* {@link #serialize()}. Your job is then recreated using a {@link Factory} that you register in
* {@link JobManager.Configuration.Builder#setJobFactories(Map)}, which is given the saved
* {@link Data} bundle.
* {@link JsonJobData} bundle.
*/
public abstract class Job {
@@ -62,11 +62,11 @@ public abstract class Job {
return nextRunAttemptTime;
}
public final @Nullable Data getInputData() {
public final @Nullable byte[] getInputData() {
return parameters.getInputData();
}
public final @NonNull Data requireInputData() {
public final @NonNull byte[] requireInputData() {
return Objects.requireNonNull(parameters.getInputData());
}
@@ -126,7 +126,7 @@ public abstract class Job {
/**
* Serialize your job state so that it can be recreated in the future.
*/
public abstract @NonNull Data serialize();
public abstract @Nullable byte[] serialize();
/**
* Returns the key that can be used to find the relevant factory needed to create your job.
@@ -146,7 +146,7 @@ public abstract class Job {
public abstract void onFailure();
public interface Factory<T extends Job> {
@NonNull T create(@NonNull Parameters parameters, @NonNull Data data);
@NonNull T create(@NonNull Parameters parameters, @Nullable byte[] serializedData);
}
public static final class Result {
@@ -158,10 +158,10 @@ public abstract class Job {
private final ResultType resultType;
private final RuntimeException runtimeException;
private final Data outputData;
private final byte[] outputData;
private final long backoffInterval;
private Result(@NonNull ResultType resultType, @Nullable RuntimeException runtimeException, @Nullable Data outputData, long backoffInterval) {
private Result(@NonNull ResultType resultType, @Nullable RuntimeException runtimeException, @Nullable byte[] outputData, long backoffInterval) {
this.resultType = resultType;
this.runtimeException = runtimeException;
this.outputData = outputData;
@@ -174,7 +174,7 @@ public abstract class Job {
}
/** Job completed successfully and wants to provide some output data. */
public static Result success(@Nullable Data outputData) {
public static Result success(@Nullable byte[] outputData) {
return new Result(ResultType.SUCCESS, null, outputData, INVALID_BACKOFF);
}
@@ -215,7 +215,7 @@ public abstract class Job {
return runtimeException;
}
@Nullable Data getOutputData() {
@Nullable byte[] getOutputData() {
return outputData;
}
@@ -259,7 +259,7 @@ public abstract class Job {
private final int maxInstancesForQueue;
private final String queue;
private final List<String> constraintKeys;
private final Data inputData;
private final byte[] inputData;
private final boolean memoryOnly;
private Parameters(@NonNull String id,
@@ -270,7 +270,7 @@ public abstract class Job {
int maxInstancesForQueue,
@Nullable String queue,
@NonNull List<String> constraintKeys,
@Nullable Data inputData,
@Nullable byte[] inputData,
boolean memoryOnly)
{
this.id = id;
@@ -317,7 +317,7 @@ public abstract class Job {
return constraintKeys;
}
@Nullable Data getInputData() {
@Nullable byte[] getInputData() {
return inputData;
}
@@ -339,7 +339,7 @@ public abstract class Job {
private int maxInstancesForQueue;
private String queue;
private List<String> constraintKeys;
private Data inputData;
private byte[] inputData;
private boolean memoryOnly;
public Builder() {
@@ -358,7 +358,7 @@ public abstract class Job {
int maxInstancesForQueue,
@Nullable String queue,
@NonNull List<String> constraintKeys,
@Nullable Data inputData,
@Nullable byte[] inputData,
boolean memoryOnly)
{
this.id = id;
@@ -465,10 +465,10 @@ public abstract class Job {
}
/**
* Sets the input data that will be made availabe to the job when it is run.
* Sets the input data that will be made available to the job when it is run.
* Should only be set by {@link JobController}.
*/
@NonNull Builder setInputData(@Nullable Data inputData) {
@NonNull Builder setInputData(@Nullable byte[] inputData) {
this.inputData = inputData;
return this;
}

View File

@@ -40,7 +40,6 @@ class JobController {
private final JobStorage jobStorage;
private final JobInstantiator jobInstantiator;
private final ConstraintInstantiator constraintInstantiator;
private final Data.Serializer dataSerializer;
private final JobTracker jobTracker;
private final Scheduler scheduler;
private final Debouncer debouncer;
@@ -51,7 +50,6 @@ class JobController {
@NonNull JobStorage jobStorage,
@NonNull JobInstantiator jobInstantiator,
@NonNull ConstraintInstantiator constraintInstantiator,
@NonNull Data.Serializer dataSerializer,
@NonNull JobTracker jobTracker,
@NonNull Scheduler scheduler,
@NonNull Debouncer debouncer,
@@ -61,7 +59,6 @@ class JobController {
this.jobStorage = jobStorage;
this.jobInstantiator = jobInstantiator;
this.constraintInstantiator = constraintInstantiator;
this.dataSerializer = dataSerializer;
this.jobTracker = jobTracker;
this.scheduler = scheduler;
this.debouncer = debouncer;
@@ -229,7 +226,7 @@ class JobController {
List<JobSpec> updatedJobs = new LinkedList<>();
for (JobSpec job : allJobs) {
JobSpec updated = updater.update(job, dataSerializer);
JobSpec updated = updater.update(job);
if (updated != job) {
updatedJobs.add(updated);
}
@@ -255,7 +252,7 @@ class JobController {
int nextRunAttempt = job.getRunAttempt() + 1;
long nextRunAttemptTime = System.currentTimeMillis() + backoffInterval;
String serializedData = dataSerializer.serialize(job.serialize());
byte[] serializedData = job.serialize();
jobStorage.updateJobAfterRetry(job.getId(), false, nextRunAttempt, nextRunAttemptTime, serializedData);
jobTracker.onStateChange(job, JobTracker.JobState.PENDING);
@@ -279,7 +276,7 @@ class JobController {
}
@WorkerThread
synchronized void onSuccess(@NonNull Job job, @Nullable Data outputData) {
synchronized void onSuccess(@NonNull Job job, @Nullable byte[] outputData) {
if (outputData != null) {
List<JobSpec> updates = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(job.getId()))
.map(DependencySpec::getJobId)
@@ -452,7 +449,7 @@ class JobController {
job.getRunAttempt(),
job.getParameters().getMaxAttempts(),
job.getParameters().getLifespan(),
dataSerializer.serialize(job.serialize()),
job.serialize(),
null,
false,
job.getParameters().isMemoryOnly());
@@ -511,8 +508,7 @@ class JobController {
Job.Parameters parameters = buildJobParameters(jobSpec, constraintSpecs);
try {
Data data = dataSerializer.deserialize(jobSpec.getSerializedData());
Job job = jobInstantiator.instantiate(jobSpec.getFactoryKey(), parameters, data);
Job job = jobInstantiator.instantiate(jobSpec.getFactoryKey(), parameters, jobSpec.getSerializedData());
job.setRunAttempt(jobSpec.getRunAttempt());
job.setNextRunAttemptTime(jobSpec.getNextRunAttemptTime());
@@ -542,11 +538,11 @@ class JobController {
.setMaxAttempts(jobSpec.getMaxAttempts())
.setQueue(jobSpec.getQueueKey())
.setConstraints(Stream.of(constraintSpecs).map(ConstraintSpec::getFactoryKey).toList())
.setInputData(jobSpec.getSerializedInputData() != null ? dataSerializer.deserialize(jobSpec.getSerializedInputData()) : null)
.setInputData(jobSpec.getSerializedInputData())
.build();
}
private @NonNull JobSpec mapToJobWithInputData(@NonNull JobSpec jobSpec, @NonNull Data inputData) {
private @NonNull JobSpec mapToJobWithInputData(@NonNull JobSpec jobSpec, @NonNull byte[] inputData) {
return new JobSpec(jobSpec.getId(),
jobSpec.getFactoryKey(),
jobSpec.getQueueKey(),
@@ -556,7 +552,7 @@ class JobController {
jobSpec.getMaxAttempts(),
jobSpec.getLifespan(),
jobSpec.getSerializedData(),
dataSerializer.serialize(inputData),
inputData,
jobSpec.isRunning(),
jobSpec.isMemoryOnly());
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobmanager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
@@ -13,7 +14,7 @@ class JobInstantiator {
this.jobFactories = new HashMap<>(jobFactories);
}
public @NonNull Job instantiate(@NonNull String jobFactoryKey, @NonNull Job.Parameters parameters, @NonNull Data data) {
public @NonNull Job instantiate(@NonNull String jobFactoryKey, @NonNull Job.Parameters parameters, @Nullable byte[] data) {
Job.Factory factory = jobFactories.get(jobFactoryKey);
if (factory != null) {
Job job = factory.create(parameters, data);

View File

@@ -13,7 +13,6 @@ import androidx.annotation.WorkerThread;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.impl.DefaultExecutorFactory;
import org.thoughtcrime.securesms.jobmanager.impl.JsonDataSerializer;
import org.thoughtcrime.securesms.jobmanager.persistence.JobSpec;
import org.thoughtcrime.securesms.jobmanager.persistence.JobStorage;
import org.thoughtcrime.securesms.util.Debouncer;
@@ -66,7 +65,6 @@ public class JobManager implements ConstraintObserver.Notifier {
configuration.getJobStorage(),
configuration.getJobInstantiator(),
configuration.getConstraintFactories(),
configuration.getDataSerializer(),
configuration.getJobTracker(),
Build.VERSION.SDK_INT < 26 ? new AlarmManagerScheduler(application)
: new CompositeScheduler(new InAppScheduler(this), new JobSchedulerScheduler(application)),
@@ -78,7 +76,7 @@ public class JobManager implements ConstraintObserver.Notifier {
JobStorage jobStorage = configuration.getJobStorage();
jobStorage.init();
int latestVersion = configuration.getJobMigrator().migrate(jobStorage, configuration.getDataSerializer());
int latestVersion = configuration.getJobMigrator().migrate(jobStorage);
TextSecurePreferences.setJobManagerVersion(application, latestVersion);
jobController.init();
@@ -544,7 +542,6 @@ public class JobManager implements ConstraintObserver.Notifier {
private final JobInstantiator jobInstantiator;
private final ConstraintInstantiator constraintInstantiator;
private final List<ConstraintObserver> constraintObservers;
private final Data.Serializer dataSerializer;
private final JobStorage jobStorage;
private final JobMigrator jobMigrator;
private final JobTracker jobTracker;
@@ -555,7 +552,6 @@ public class JobManager implements ConstraintObserver.Notifier {
@NonNull JobInstantiator jobInstantiator,
@NonNull ConstraintInstantiator constraintInstantiator,
@NonNull List<ConstraintObserver> constraintObservers,
@NonNull Data.Serializer dataSerializer,
@NonNull JobStorage jobStorage,
@NonNull JobMigrator jobMigrator,
@NonNull JobTracker jobTracker,
@@ -566,7 +562,6 @@ public class JobManager implements ConstraintObserver.Notifier {
this.jobInstantiator = jobInstantiator;
this.constraintInstantiator = constraintInstantiator;
this.constraintObservers = new ArrayList<>(constraintObservers);
this.dataSerializer = dataSerializer;
this.jobStorage = jobStorage;
this.jobMigrator = jobMigrator;
this.jobTracker = jobTracker;
@@ -594,10 +589,6 @@ public class JobManager implements ConstraintObserver.Notifier {
return constraintObservers;
}
@NonNull Data.Serializer getDataSerializer() {
return dataSerializer;
}
@NonNull JobStorage getJobStorage() {
return jobStorage;
}
@@ -621,7 +612,6 @@ public class JobManager implements ConstraintObserver.Notifier {
private Map<String, Job.Factory> jobFactories = new HashMap<>();
private Map<String, Constraint.Factory> constraintFactories = new HashMap<>();
private List<ConstraintObserver> constraintObservers = new ArrayList<>();
private Data.Serializer dataSerializer = new JsonDataSerializer();
private JobStorage jobStorage = null;
private JobMigrator jobMigrator = null;
private JobTracker jobTracker = new JobTracker();
@@ -657,11 +647,6 @@ public class JobManager implements ConstraintObserver.Notifier {
return this;
}
public @NonNull Builder setDataSerializer(@NonNull Data.Serializer dataSerializer) {
this.dataSerializer = dataSerializer;
return this;
}
public @NonNull Builder setJobStorage(@NonNull JobStorage jobStorage) {
this.jobStorage = jobStorage;
return this;
@@ -678,7 +663,6 @@ public class JobManager implements ConstraintObserver.Notifier {
new JobInstantiator(jobFactories),
new ConstraintInstantiator(constraintFactories),
new ArrayList<>(constraintObservers),
dataSerializer,
jobStorage,
jobMigrator,
jobTracker,

View File

@@ -31,9 +31,9 @@ public abstract class JobMigration {
private final String factoryKey;
private final String queueKey;
private final Data data;
private final byte[] data;
public JobData(@NonNull String factoryKey, @Nullable String queueKey, @NonNull Data data) {
public JobData(@NonNull String factoryKey, @Nullable String queueKey, @Nullable byte[] data) {
this.factoryKey = factoryKey;
this.queueKey = queueKey;
this.data = data;
@@ -47,7 +47,7 @@ public abstract class JobMigration {
return new JobData(factoryKey, newQueueKey, data);
}
public @NonNull JobData withData(@NonNull Data newData) {
public @NonNull JobData withData(@Nullable byte[] newData) {
return new JobData(factoryKey, queueKey, newData);
}
@@ -59,7 +59,7 @@ public abstract class JobMigration {
return queueKey;
}
public @NonNull Data getData() {
public @NonNull byte[] getData() {
return data;
}
}

View File

@@ -46,7 +46,7 @@ public class JobMigrator {
/**
* @return The version that has been migrated to.
*/
int migrate(@NonNull JobStorage jobStorage, @NonNull Data.Serializer dataSerializer) {
int migrate(@NonNull JobStorage jobStorage) {
List<JobSpec> jobSpecs = jobStorage.getAllJobSpecs();
for (int i = lastSeenVersion; i < currentVersion; i++) {
@@ -58,22 +58,21 @@ public class JobMigrator {
assert migration != null;
while (iter.hasNext()) {
JobSpec jobSpec = iter.next();
Data data = dataSerializer.deserialize(jobSpec.getSerializedData());
JobData originalJobData = new JobData(jobSpec.getFactoryKey(), jobSpec.getQueueKey(), data);
JobData updatedJobData = migration.migrate(originalJobData);
JobSpec updatedJobSpec = new JobSpec(jobSpec.getId(),
updatedJobData.getFactoryKey(),
updatedJobData.getQueueKey(),
jobSpec.getCreateTime(),
jobSpec.getNextRunAttemptTime(),
jobSpec.getRunAttempt(),
jobSpec.getMaxAttempts(),
jobSpec.getLifespan(),
dataSerializer.serialize(updatedJobData.getData()),
jobSpec.getSerializedInputData(),
jobSpec.isRunning(),
jobSpec.isMemoryOnly());
JobSpec jobSpec = iter.next();
JobData originalJobData = new JobData(jobSpec.getFactoryKey(), jobSpec.getQueueKey(), jobSpec.getSerializedData());
JobData updatedJobData = migration.migrate(originalJobData);
JobSpec updatedJobSpec = new JobSpec(jobSpec.getId(),
updatedJobData.getFactoryKey(),
updatedJobData.getQueueKey(),
jobSpec.getCreateTime(),
jobSpec.getNextRunAttemptTime(),
jobSpec.getRunAttempt(),
jobSpec.getMaxAttempts(),
jobSpec.getLifespan(),
updatedJobData.getData(),
jobSpec.getSerializedInputData(),
jobSpec.isRunning(),
jobSpec.isMemoryOnly());
iter.set(updatedJobSpec);
}

View File

@@ -9,11 +9,8 @@ public interface JobUpdater {
* Called for each enqueued job, giving you an opportunity to update each one.
*
* @param jobSpec An object representing data about an enqueued job.
* @param serializer An object that can be used to serialize/deserialize data if necessary for
* your update.
*
* @return The updated JobSpec you want persisted. If you do not wish to make an update, return
* the literal same JobSpec instance you were provided.
* the literal same JobSpec instance you were provided.
*/
@NonNull JobSpec update(@NonNull JobSpec jobSpec, @NonNull Data.Serializer serializer);
@NonNull JobSpec update(@NonNull JobSpec jobSpec);
}

View File

@@ -5,8 +5,12 @@ import androidx.annotation.Nullable;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.JsonUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -14,9 +18,11 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
public class Data {
public class JsonJobData {
public static final Data EMPTY = new Data.Builder().build();
public static final String TAG = Log.tag(JsonJobData.class);
public static final JsonJobData EMPTY = new JsonJobData.Builder().build();
@JsonProperty private final Map<String, String> strings;
@JsonProperty private final Map<String, String[]> stringArrays;
@@ -31,18 +37,31 @@ public class Data {
@JsonProperty private final Map<String, Boolean> booleans;
@JsonProperty private final Map<String, boolean[]> booleanArrays;
public Data(@JsonProperty("strings") @NonNull Map<String, String> strings,
@JsonProperty("stringArrays") @NonNull Map<String, String[]> stringArrays,
@JsonProperty("integers") @NonNull Map<String, Integer> integers,
@JsonProperty("integerArrays") @NonNull Map<String, int[]> integerArrays,
@JsonProperty("longs") @NonNull Map<String, Long> longs,
@JsonProperty("longArrays") @NonNull Map<String, long[]> longArrays,
@JsonProperty("floats") @NonNull Map<String, Float> floats,
@JsonProperty("floatArrays") @NonNull Map<String, float[]> floatArrays,
@JsonProperty("doubles") @NonNull Map<String, Double> doubles,
@JsonProperty("doubleArrays") @NonNull Map<String, double[]> doubleArrays,
@JsonProperty("booleans") @NonNull Map<String, Boolean> booleans,
@JsonProperty("booleanArrays") @NonNull Map<String, boolean[]> booleanArrays)
public static @NonNull JsonJobData deserialize(@Nullable byte[] data) {
if (data == null) {
return EMPTY;
}
try {
return JsonUtils.fromJson(data, JsonJobData.class);
} catch (IOException e) {
Log.e(TAG, "Failed to deserialize JSON.", e);
throw new AssertionError(e);
}
}
private JsonJobData(@JsonProperty("strings") @NonNull Map<String, String> strings,
@JsonProperty("stringArrays") @NonNull Map<String, String[]> stringArrays,
@JsonProperty("integers") @NonNull Map<String, Integer> integers,
@JsonProperty("integerArrays") @NonNull Map<String, int[]> integerArrays,
@JsonProperty("longs") @NonNull Map<String, Long> longs,
@JsonProperty("longArrays") @NonNull Map<String, long[]> longArrays,
@JsonProperty("floats") @NonNull Map<String, Float> floats,
@JsonProperty("floatArrays") @NonNull Map<String, float[]> floatArrays,
@JsonProperty("doubles") @NonNull Map<String, Double> doubles,
@JsonProperty("doubleArrays") @NonNull Map<String, double[]> doubleArrays,
@JsonProperty("booleans") @NonNull Map<String, Boolean> booleans,
@JsonProperty("booleanArrays") @NonNull Map<String, boolean[]> booleanArrays)
{
this.strings = strings;
this.stringArrays = stringArrays;
@@ -256,6 +275,34 @@ public class Data {
return new Builder(this);
}
public boolean isEmpty() {
return strings.isEmpty() &&
stringArrays.isEmpty() &&
integers.isEmpty() &&
integerArrays.isEmpty() &&
longs.isEmpty() &&
longArrays.isEmpty() &&
floats.isEmpty() &&
floatArrays.isEmpty() &&
doubles.isEmpty() &&
doubleArrays.isEmpty() &&
booleans.isEmpty() &&
booleanArrays.isEmpty();
}
public @Nullable byte[] serialize() {
if (isEmpty()) {
return null;
} else {
try {
return JsonUtils.toJson(this).getBytes(StandardCharsets.UTF_8);
} catch (IOException e) {
Log.e(TAG, "Failed to serialize to JSON.", e);
throw new AssertionError(e);
}
}
}
public static class Builder {
@@ -274,7 +321,7 @@ public class Data {
public Builder() { }
private Builder(@NonNull Data oldData) {
private Builder(@NonNull JsonJobData oldData) {
strings.putAll(oldData.strings);
stringArrays.putAll(oldData.stringArrays);
integers.putAll(oldData.integers);
@@ -385,24 +432,28 @@ public class Data {
return this;
}
public Data build() {
return new Data(strings,
stringArrays,
integers,
integerArrays,
longs,
longArrays,
floats,
floatArrays,
doubles,
doubleArrays,
booleans,
booleanArrays);
public JsonJobData build() {
return new JsonJobData(strings,
stringArrays,
integers,
integerArrays,
longs,
longArrays,
floats,
floatArrays,
doubles,
doubleArrays,
booleans,
booleanArrays);
}
public @Nullable byte[] serialize() {
return build().serialize();
}
}
public interface Serializer {
@NonNull String serialize(@NonNull Data data);
@NonNull Data deserialize(@NonNull String serialized);
@NonNull String serialize(@NonNull JsonJobData data);
@NonNull JsonJobData deserialize(@NonNull String serialized);
}
}

View File

@@ -1,34 +0,0 @@
package org.thoughtcrime.securesms.jobmanager.impl;
import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.util.JsonUtils;
import java.io.IOException;
public class JsonDataSerializer implements Data.Serializer {
private static final String TAG = Log.tag(JsonDataSerializer.class);
@Override
public @NonNull String serialize(@NonNull Data data) {
try {
return JsonUtils.toJson(data);
} catch (IOException e) {
Log.e(TAG, "Failed to serialize to JSON.", e);
throw new AssertionError(e);
}
}
@Override
public @NonNull Data deserialize(@NonNull String serialized) {
try {
return JsonUtils.fromJson(serialized, Data.class);
} catch (IOException e) {
Log.e(TAG, "Failed to deserialize JSON.", e);
throw new AssertionError(e);
}
}
}

View File

@@ -8,7 +8,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.PushTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
import org.thoughtcrime.securesms.jobs.FailingJob;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
@@ -39,16 +39,15 @@ public class PushDecryptMessageJobEnvelopeMigration extends JobMigration {
}
private static @NonNull JobData migratePushDecryptMessageJob(@NonNull PushTable pushDatabase, @NonNull JobData jobData) {
Data data = jobData.getData();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (data.hasLong("message_id")) {
long messageId = data.getLong("message_id");
try {
SignalServiceEnvelope envelope = pushDatabase.get(messageId);
return jobData.withData(jobData.getData()
.buildUpon()
.putBlobAsString("envelope", envelope.serialize())
.build());
return jobData.withData(data.buildUpon()
.putBlobAsString("envelope", envelope.serialize())
.serialize());
} catch (NoSuchMessageException e) {
Log.w(TAG, "Failed to find envelope in DB! Failing.");
return jobData.withFactoryKey(FailingJob.KEY);

View File

@@ -5,14 +5,12 @@ import android.content.Context;
import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.groups.BadGroupIdException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.whispersystems.signalservice.api.messages.SignalServiceContent;
import java.io.IOException;
@@ -47,7 +45,7 @@ public class PushProcessMessageQueueJobMigration extends JobMigration {
}
private static @NonNull JobData migratePushProcessMessageJob(@NonNull Context context, @NonNull JobData jobData) throws IOException {
Data data = jobData.getData();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
String suffix = "";

View File

@@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.jobmanager.migrations;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
/**
@@ -31,7 +31,9 @@ public class RecipientIdFollowUpJobMigration extends JobMigration {
}
private static @NonNull JobData migrateRequestGroupInfoJob(@NonNull JobData jobData) {
if (!jobData.getData().hasString("source") || !jobData.getData().hasString("group_id")) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (!data.hasString("source") || !data.hasString("group_id")) {
return failingJobData();
} else {
return jobData;
@@ -39,9 +41,11 @@ public class RecipientIdFollowUpJobMigration extends JobMigration {
}
private static @NonNull JobData migrateSendDeliveryReceiptJob(@NonNull JobData jobData) {
if (!jobData.getData().hasString("recipient") ||
!jobData.getData().hasLong("message_id") ||
!jobData.getData().hasLong("timestamp"))
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (!data.hasString("recipient") ||
!data.hasLong("message_id") ||
!data.hasLong("timestamp"))
{
return failingJobData();
} else {
@@ -50,6 +54,6 @@ public class RecipientIdFollowUpJobMigration extends JobMigration {
}
private static JobData failingJobData() {
return new JobData("FailingJob", null, new Data.Builder().build());
return new JobData("FailingJob", null, null);
}
}

View File

@@ -7,7 +7,7 @@ import androidx.annotation.VisibleForTesting;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -47,120 +47,142 @@ public class RecipientIdJobMigration extends JobMigration {
}
private @NonNull JobData migrateMultiDeviceContactUpdateJob(@NonNull JobData jobData) {
String address = jobData.getData().hasString("address") ? jobData.getData().getString("address") : null;
Data updatedData = new Data.Builder().putString("recipient", address != null ? Recipient.external(application, address).getId().serialize() : null)
.putBoolean("force_sync", jobData.getData().getBoolean("force_sync"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.hasString("address") ? data.getString("address") : null;
JsonJobData updatedData = new JsonJobData.Builder().putString("recipient", address != null ? Recipient.external(application, address).getId().serialize() : null)
.putBoolean("force_sync", data.getBoolean("force_sync"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateMultiDeviceViewOnceOpenJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
try {
String rawOld = jobData.getData().getString("message_id");
String rawOld = data.getString("message_id");
OldSerializableSyncMessageId old = JsonUtils.fromJson(rawOld, OldSerializableSyncMessageId.class);
Recipient recipient = Recipient.external(application, old.sender);
NewSerializableSyncMessageId updated = new NewSerializableSyncMessageId(recipient.getId().serialize(), old.timestamp);
String rawUpdated = JsonUtils.toJson(updated);
Data updatedData = new Data.Builder().putString("message_id", rawUpdated).build();
String rawUpdated = JsonUtils.toJson(updated);
JsonJobData updatedData = new JsonJobData.Builder().putString("message_id", rawUpdated).build();
return jobData.withData(updatedData);
return jobData.withData(updatedData.serialize());
} catch (IOException e) {
throw new AssertionError(e);
}
}
private @NonNull JobData migrateRequestGroupInfoJob(@NonNull JobData jobData) {
String address = jobData.getData().getString("source");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("source", recipient.getId().serialize())
.putString("group_id", jobData.getData().getString("group_id"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.getString("source");
Recipient recipient = Recipient.external(application, address);
JsonJobData updatedData = new JsonJobData.Builder().putString("source", recipient.getId().serialize())
.putString("group_id", data.getString("group_id"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateSendDeliveryReceiptJob(@NonNull JobData jobData) {
String address = jobData.getData().getString("address");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("recipient", recipient.getId().serialize())
.putLong("message_id", jobData.getData().getLong("message_id"))
.putLong("timestamp", jobData.getData().getLong("timestamp"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.getString("address");
Recipient recipient = Recipient.external(application, address);
JsonJobData updatedData = new JsonJobData.Builder().putString("recipient", recipient.getId().serialize())
.putLong("message_id", data.getLong("message_id"))
.putLong("timestamp", data.getLong("timestamp"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateMultiDeviceVerifiedUpdateJob(@NonNull JobData jobData) {
String address = jobData.getData().getString("destination");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("destination", recipient.getId().serialize())
.putString("identity_key", jobData.getData().getString("identity_key"))
.putInt("verified_status", jobData.getData().getInt("verified_status"))
.putLong("timestamp", jobData.getData().getLong("timestamp"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.getString("destination");
Recipient recipient = Recipient.external(application, address);
JsonJobData updatedData = new JsonJobData.Builder().putString("destination", recipient.getId().serialize())
.putString("identity_key", data.getString("identity_key"))
.putInt("verified_status", data.getInt("verified_status"))
.putLong("timestamp", data.getLong("timestamp"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateRetrieveProfileJob(@NonNull JobData jobData) {
String address = jobData.getData().getString("address");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("recipient", recipient.getId().serialize()).build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.getString("address");
Recipient recipient = Recipient.external(application, address);
JsonJobData updatedData = new JsonJobData.Builder().putString("recipient", recipient.getId().serialize()).build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migratePushGroupSendJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
// noinspection ConstantConditions
Recipient queueRecipient = Recipient.external(application, jobData.getQueueKey());
String address = jobData.getData().hasString("filter_address") ? jobData.getData().getString("filter_address") : null;
String address = data.hasString("filter_address") ? data.getString("filter_address") : null;
RecipientId recipientId = address != null ? Recipient.external(application, address).getId() : null;
Data updatedData = new Data.Builder().putString("filter_recipient", recipientId != null ? recipientId.serialize() : null)
.putLong("message_id", jobData.getData().getLong("message_id"))
.build();
JsonJobData updatedData = new JsonJobData.Builder().putString("filter_recipient", recipientId != null ? recipientId.serialize() : null)
.putLong("message_id", data.getLong("message_id"))
.build();
return jobData.withQueueKey(queueRecipient.getId().toQueueKey())
.withData(updatedData);
.withData(updatedData.serialize());
}
private @NonNull JobData migratePushGroupUpdateJob(@NonNull JobData jobData) {
String address = jobData.getData().getString("source");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("source", recipient.getId().serialize())
.putString("group_id", jobData.getData().getString("group_id"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.getString("source");
Recipient recipient = Recipient.external(application, address);
JsonJobData updatedData = new JsonJobData.Builder().putString("source", recipient.getId().serialize())
.putString("group_id", data.getString("group_id"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateDirectoryRefreshJob(@NonNull JobData jobData) {
String address = jobData.getData().hasString("address") ? jobData.getData().getString("address") : null;
Recipient recipient = address != null ? Recipient.external(application, address) : null;
Data updatedData = new Data.Builder().putString("recipient", recipient != null ? recipient.getId().serialize() : null)
.putBoolean("notify_of_new_users", jobData.getData().getBoolean("notify_of_new_users"))
.build();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
return jobData.withData(updatedData);
String address = data.hasString("address") ? data.getString("address") : null;
Recipient recipient = address != null ? Recipient.external(application, address) : null;
JsonJobData updatedData = new JsonJobData.Builder().putString("recipient", recipient != null ? recipient.getId().serialize() : null)
.putBoolean("notify_of_new_users", data.getBoolean("notify_of_new_users"))
.build();
return jobData.withData(updatedData.serialize());
}
private @NonNull JobData migrateRetrieveProfileAvatarJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
//noinspection ConstantConditions
String queueAddress = jobData.getQueueKey().substring("RetrieveProfileAvatarJob".length());
Recipient queueRecipient = Recipient.external(application, queueAddress);
String address = jobData.getData().getString("address");
String address = data.getString("address");
Recipient recipient = Recipient.external(application, address);
Data updatedData = new Data.Builder().putString("recipient", recipient.getId().serialize())
.putString("profile_avatar", jobData.getData().getString("profile_avatar"))
.build();
JsonJobData updatedData = new JsonJobData.Builder().putString("recipient", recipient.getId().serialize())
.putString("profile_avatar", data.getString("profile_avatar"))
.build();
return jobData.withQueueKey("RetrieveProfileAvatarJob::" + queueRecipient.getId().toQueueKey())
.withData(updatedData);
.withData(updatedData.serialize());
}
private @NonNull JobData migrateMultiDeviceReadUpdateJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
try {
String[] rawOld = jobData.getData().getStringArray("message_ids");
String[] rawOld = data.getStringArray("message_ids");
String[] rawUpdated = new String[rawOld.length];
for (int i = 0; i < rawOld.length; i++) {
@@ -171,27 +193,33 @@ public class RecipientIdJobMigration extends JobMigration {
rawUpdated[i] = JsonUtils.toJson(updated);
}
Data updatedData = new Data.Builder().putStringArray("message_ids", rawUpdated).build();
JsonJobData updatedData = new JsonJobData.Builder().putStringArray("message_ids", rawUpdated).build();
return jobData.withData(updatedData);
return jobData.withData(updatedData.serialize());
} catch (IOException e) {
throw new AssertionError(e);
}
}
private @NonNull JobData migratePushTextSendJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
//noinspection ConstantConditions
Recipient recipient = Recipient.external(application, jobData.getQueueKey());
return jobData.withQueueKey(recipient.getId().toQueueKey());
}
private @NonNull JobData migratePushMediaSendJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
//noinspection ConstantConditions
Recipient recipient = Recipient.external(application, jobData.getQueueKey());
return jobData.withQueueKey(recipient.getId().toQueueKey());
}
private @NonNull JobData migrateSmsSendJob(@NonNull JobData jobData) {
JsonJobData data = JsonJobData.deserialize(jobData.getData());
//noinspection ConstantConditions
if (jobData.getQueueKey() != null) {
Recipient recipient = Recipient.external(application, jobData.getQueueKey());

View File

@@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.jobmanager.migrations;
import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
public class RetrieveProfileJobMigration extends JobMigration {
@@ -25,15 +25,15 @@ public class RetrieveProfileJobMigration extends JobMigration {
}
private static @NonNull JobData migrateRetrieveProfileJob(@NonNull JobData jobData) {
Data data = jobData.getData();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (data.hasString("recipient")) {
Log.i(TAG, "Migrating job.");
String recipient = data.getString("recipient");
return jobData.withData(new Data.Builder()
return jobData.withData(new JsonJobData.Builder()
.putStringArray("recipients", new String[] { recipient })
.build());
.serialize());
} else {
return jobData;
}

View File

@@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.jobmanager.migrations;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.database.MessageTable;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
import java.util.SortedSet;
@@ -27,10 +27,10 @@ public class SendReadReceiptsJobMigration extends JobMigration {
}
private static @NonNull JobData migrateSendReadReceiptJob(@NonNull MessageTable messageTable, @NonNull JobData jobData) {
Data data = jobData.getData();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (!data.hasLong("thread")) {
long[] messageIds = jobData.getData().getLongArray("message_ids");
long[] messageIds = data.getLongArray("message_ids");
SortedSet<Long> threadIds = new TreeSet<>();
for (long id : messageIds) {
@@ -41,9 +41,9 @@ public class SendReadReceiptsJobMigration extends JobMigration {
}
if (threadIds.size() != 1) {
return new JobData("FailingJob", null, new Data.Builder().build());
return new JobData("FailingJob", null, null);
} else {
return jobData.withData(data.buildUpon().putLong("thread", threadIds.first()).build());
return jobData.withData(data.buildUpon().putLong("thread", threadIds.first()).serialize());
}
} else {

View File

@@ -8,7 +8,7 @@ import org.thoughtcrime.securesms.database.GroupTable;
import org.thoughtcrime.securesms.database.model.GroupRecord;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.JobMigration;
import org.thoughtcrime.securesms.jobs.FailingJob;
@@ -44,7 +44,7 @@ public class SenderKeyDistributionSendJobRecipientMigration extends JobMigration
}
private static @NonNull JobData migrateJob(@NonNull JobData jobData, @NonNull GroupTable groupDatabase) {
Data data = jobData.getData();
JsonJobData data = JsonJobData.deserialize(jobData.getData());
if (data.hasString("group_id")) {
GroupId groupId = GroupId.pushOrThrow(data.getStringAsBlob("group_id"));
@@ -53,7 +53,7 @@ public class SenderKeyDistributionSendJobRecipientMigration extends JobMigration
if (group.isPresent()) {
return jobData.withData(data.buildUpon()
.putString("thread_recipient_id", group.get().getRecipientId().serialize())
.build());
.serialize());
} else {
return jobData.withFactoryKey(FailingJob.KEY);

View File

@@ -1,139 +0,0 @@
package org.thoughtcrime.securesms.jobmanager.persistence;
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Locale;
import java.util.Objects;
public final class JobSpec {
private final String id;
private final String factoryKey;
private final String queueKey;
private final long createTime;
private final long nextRunAttemptTime;
private final int runAttempt;
private final int maxAttempts;
private final long lifespan;
private final String serializedData;
private final String serializedInputData;
private final boolean isRunning;
private final boolean memoryOnly;
public JobSpec(@NonNull String id,
@NonNull String factoryKey,
@Nullable String queueKey,
long createTime,
long nextRunAttemptTime,
int runAttempt,
int maxAttempts,
long lifespan,
@NonNull String serializedData,
@Nullable String serializedInputData,
boolean isRunning,
boolean memoryOnly)
{
this.id = id;
this.factoryKey = factoryKey;
this.queueKey = queueKey;
this.createTime = createTime;
this.nextRunAttemptTime = nextRunAttemptTime;
this.runAttempt = runAttempt;
this.maxAttempts = maxAttempts;
this.lifespan = lifespan;
this.serializedData = serializedData;
this.serializedInputData = serializedInputData;
this.isRunning = isRunning;
this.memoryOnly = memoryOnly;
}
public @NonNull JobSpec withNextRunAttemptTime(long updated) {
return new JobSpec(id, factoryKey, queueKey, createTime, updated, runAttempt, maxAttempts, lifespan, serializedData, serializedInputData, isRunning, memoryOnly);
}
public @NonNull JobSpec withData(String updatedSerializedData) {
return new JobSpec(id, factoryKey, queueKey, createTime, nextRunAttemptTime, runAttempt, maxAttempts, lifespan, updatedSerializedData, serializedInputData, isRunning, memoryOnly);
}
public @NonNull String getId() {
return id;
}
public @NonNull String getFactoryKey() {
return factoryKey;
}
public @Nullable String getQueueKey() {
return queueKey;
}
public long getCreateTime() {
return createTime;
}
public long getNextRunAttemptTime() {
return nextRunAttemptTime;
}
public int getRunAttempt() {
return runAttempt;
}
public int getMaxAttempts() {
return maxAttempts;
}
public long getLifespan() {
return lifespan;
}
public @NonNull String getSerializedData() {
return serializedData;
}
public @Nullable String getSerializedInputData() {
return serializedInputData;
}
public boolean isRunning() {
return isRunning;
}
public boolean isMemoryOnly() {
return memoryOnly;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
JobSpec jobSpec = (JobSpec) o;
return createTime == jobSpec.createTime &&
nextRunAttemptTime == jobSpec.nextRunAttemptTime &&
runAttempt == jobSpec.runAttempt &&
maxAttempts == jobSpec.maxAttempts &&
lifespan == jobSpec.lifespan &&
isRunning == jobSpec.isRunning &&
memoryOnly == jobSpec.memoryOnly &&
Objects.equals(id, jobSpec.id) &&
Objects.equals(factoryKey, jobSpec.factoryKey) &&
Objects.equals(queueKey, jobSpec.queueKey) &&
Objects.equals(serializedData, jobSpec.serializedData) &&
Objects.equals(serializedInputData, jobSpec.serializedInputData);
}
@Override
public int hashCode() {
return Objects.hash(id, factoryKey, queueKey, createTime, nextRunAttemptTime, runAttempt, maxAttempts, lifespan, serializedData, serializedInputData, isRunning, memoryOnly);
}
@SuppressLint("DefaultLocale")
@Override
public @NonNull String toString() {
return String.format(Locale.US, "id: JOB::%s | factoryKey: %s | queueKey: %s | createTime: %d | nextRunAttemptTime: %d | runAttempt: %d | maxAttempts: %d | lifespan: %d | isRunning: %b | memoryOnly: %b",
id, factoryKey, queueKey, createTime, nextRunAttemptTime, runAttempt, maxAttempts, lifespan, isRunning, memoryOnly);
}
}

View File

@@ -0,0 +1,73 @@
package org.thoughtcrime.securesms.jobmanager.persistence
data class JobSpec(
val id: String,
val factoryKey: String,
val queueKey: String?,
val createTime: Long,
val nextRunAttemptTime: Long,
val runAttempt: Int,
val maxAttempts: Int,
val lifespan: Long,
val serializedData: ByteArray?,
val serializedInputData: ByteArray?,
val isRunning: Boolean,
val isMemoryOnly: Boolean
) {
fun withNextRunAttemptTime(updated: Long): JobSpec {
return copy(nextRunAttemptTime = updated)
}
fun withData(updatedSerializedData: ByteArray?): JobSpec {
return copy(serializedData = updatedSerializedData)
}
override fun toString(): String {
return "id: JOB::$id | factoryKey: $factoryKey | queueKey: $queueKey | createTime: $createTime | nextRunAttemptTime: $nextRunAttemptTime | runAttempt: $runAttempt | maxAttempts: $maxAttempts | lifespan: $lifespan | isRunning: $isRunning | memoryOnly: $isMemoryOnly"
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as JobSpec
if (id != other.id) return false
if (factoryKey != other.factoryKey) return false
if (queueKey != other.queueKey) return false
if (createTime != other.createTime) return false
if (nextRunAttemptTime != other.nextRunAttemptTime) return false
if (runAttempt != other.runAttempt) return false
if (maxAttempts != other.maxAttempts) return false
if (lifespan != other.lifespan) return false
if (serializedData != null) {
if (other.serializedData == null) return false
if (!serializedData.contentEquals(other.serializedData)) return false
} else if (other.serializedData != null) return false
if (serializedInputData != null) {
if (other.serializedInputData == null) return false
if (!serializedInputData.contentEquals(other.serializedInputData)) return false
} else if (other.serializedInputData != null) return false
if (isRunning != other.isRunning) return false
if (isMemoryOnly != other.isMemoryOnly) return false
return true
}
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + factoryKey.hashCode()
result = 31 * result + (queueKey?.hashCode() ?: 0)
result = 31 * result + createTime.hashCode()
result = 31 * result + nextRunAttemptTime.hashCode()
result = 31 * result + runAttempt
result = 31 * result + maxAttempts
result = 31 * result + lifespan.hashCode()
result = 31 * result + (serializedData?.contentHashCode() ?: 0)
result = 31 * result + (serializedInputData?.contentHashCode() ?: 0)
result = 31 * result + isRunning.hashCode()
result = 31 * result + isMemoryOnly.hashCode()
return result
}
}

View File

@@ -40,7 +40,7 @@ public interface JobStorage {
void updateJobRunningState(@NonNull String id, boolean isRunning);
@WorkerThread
void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @NonNull String serializedData);
void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @Nullable byte[] serializedData);
@WorkerThread
void updateAllJobsToBePending();

View File

@@ -5,6 +5,7 @@ import android.media.MediaDataSource;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.google.android.exoplayer2.util.MimeTypes;
@@ -22,7 +23,7 @@ import org.thoughtcrime.securesms.crypto.ModernEncryptingPartOutputStream;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.events.PartProgressEvent;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader;
@@ -106,12 +107,12 @@ public final class AttachmentCompressionJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putBoolean(KEY_MMS, mms)
.putInt(KEY_MMS_SUBSCRIPTION_ID, mmsSubscriptionId)
.build();
public @Nullable byte [] serialize() {
return new JsonJobData.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putBoolean(KEY_MMS, mms)
.putInt(KEY_MMS_SUBSCRIPTION_ID, mmsSubscriptionId)
.serialize();
}
@Override
@@ -341,7 +342,9 @@ public final class AttachmentCompressionJob extends BaseJob {
public static final class Factory implements Job.Factory<AttachmentCompressionJob> {
@Override
public @NonNull AttachmentCompressionJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AttachmentCompressionJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AttachmentCompressionJob(parameters,
new AttachmentId(data.getLong(KEY_ROW_ID), data.getLong(KEY_UNIQUE_ID)),
data.getBoolean(KEY_MMS),

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.attachments.AttachmentId;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.util.JsonUtils;
@@ -46,7 +47,7 @@ public class AttachmentCopyJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
public @Nullable byte[] serialize() {
try {
String sourceIdString = JsonUtils.toJson(sourceId);
String[] destinationIdStrings = new String[destinationIds.size()];
@@ -55,9 +56,9 @@ public class AttachmentCopyJob extends BaseJob {
destinationIdStrings[i] = JsonUtils.toJson(destinationIds.get(i));
}
return new Data.Builder().putString(KEY_SOURCE_ID, sourceIdString)
.putStringArray(KEY_DESTINATION_IDS, destinationIdStrings)
.build();
return new JsonJobData.Builder().putString(KEY_SOURCE_ID, sourceIdString)
.putStringArray(KEY_DESTINATION_IDS, destinationIdStrings)
.serialize();
} catch (IOException e) {
throw new AssertionError(e);
}
@@ -92,7 +93,9 @@ public class AttachmentCopyJob extends BaseJob {
public static final class Factory implements Job.Factory<AttachmentCopyJob> {
@Override
public @NonNull AttachmentCopyJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AttachmentCopyJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
try {
String sourceIdStrings = data.getString(KEY_SOURCE_ID);
String[] destinationIdStrings = data.getStringArray(KEY_DESTINATION_IDS);

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.greenrobot.eventbus.EventBus;
@@ -18,7 +19,7 @@ import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.events.PartProgressEvent;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -88,12 +89,12 @@ public final class AttachmentDownloadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putLong(KEY_PART_ROW_ID, partRowId)
.putLong(KEY_PAR_UNIQUE_ID, partUniqueId)
.putBoolean(KEY_MANUAL, manual)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putLong(KEY_PART_ROW_ID, partRowId)
.putLong(KEY_PAR_UNIQUE_ID, partUniqueId)
.putBoolean(KEY_MANUAL, manual)
.serialize();
}
@Override
@@ -293,7 +294,9 @@ public final class AttachmentDownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<AttachmentDownloadJob> {
@Override
public @NonNull AttachmentDownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AttachmentDownloadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AttachmentDownloadJob(parameters,
data.getLong(KEY_MESSAGE_ID),
new AttachmentId(data.getLong(KEY_PART_ROW_ID), data.getLong(KEY_PAR_UNIQUE_ID)),

View File

@@ -1,13 +1,14 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.attachments.AttachmentId;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import java.io.IOException;
@@ -46,11 +47,11 @@ public final class AttachmentMarkUploadedJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putLong(KEY_MESSAGE_ID, messageId)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putLong(KEY_MESSAGE_ID, messageId)
.serialize();
}
@Override
@@ -87,7 +88,9 @@ public final class AttachmentMarkUploadedJob extends BaseJob {
public static final class Factory implements Job.Factory<AttachmentMarkUploadedJob> {
@Override
public @NonNull AttachmentMarkUploadedJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AttachmentMarkUploadedJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AttachmentMarkUploadedJob(parameters,
data.getLong(KEY_MESSAGE_ID),
new AttachmentId(data.getLong(KEY_ROW_ID), data.getLong(KEY_UNIQUE_ID)));

View File

@@ -19,7 +19,7 @@ import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.events.PartProgressEvent;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.mms.PartAuthority;
@@ -85,11 +85,11 @@ public final class AttachmentUploadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putBoolean(KEY_FORCE_V2, forceV2)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
.putBoolean(KEY_FORCE_V2, forceV2)
.serialize();
}
@Override
@@ -108,14 +108,14 @@ public final class AttachmentUploadJob extends BaseJob {
throw new NotPushRegisteredException();
}
Data inputData = getInputData();
JsonJobData inputData = JsonJobData.deserialize(getInputData());
ResumableUploadSpec resumableUploadSpec;
if (forceV2) {
Log.d(TAG, "Forcing utilization of V2");
resumableUploadSpec = null;
} else if (inputData != null && inputData.hasString(ResumableUploadSpecJob.KEY_RESUME_SPEC)) {
} else if (inputData.hasString(ResumableUploadSpecJob.KEY_RESUME_SPEC)) {
Log.d(TAG, "Using attachments V3");
resumableUploadSpec = ResumableUploadSpec.deserialize(inputData.getString(ResumableUploadSpecJob.KEY_RESUME_SPEC));
} else {
@@ -269,7 +269,9 @@ public final class AttachmentUploadJob extends BaseJob {
public static final class Factory implements Job.Factory<AttachmentUploadJob> {
@Override
public @NonNull AttachmentUploadJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) {
public @NonNull AttachmentUploadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AttachmentUploadJob(parameters, new AttachmentId(data.getLong(KEY_ROW_ID), data.getLong(KEY_UNIQUE_ID)), data.getBooleanOrDefault(KEY_FORCE_V2, false));
}
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
@@ -8,7 +9,7 @@ import org.thoughtcrime.securesms.database.MessageTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.databaseprotos.DeviceLastResetTime;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
import org.thoughtcrime.securesms.notifications.v2.ConversationId;
@@ -70,11 +71,11 @@ public class AutomaticSessionResetJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.putInt(KEY_DEVICE_ID, deviceId)
.putLong(KEY_SENT_TIMESTAMP, sentTimestamp)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.putInt(KEY_DEVICE_ID, deviceId)
.putLong(KEY_SENT_TIMESTAMP, sentTimestamp)
.serialize();
}
@Override
@@ -169,7 +170,9 @@ public class AutomaticSessionResetJob extends BaseJob {
public static final class Factory implements Job.Factory<AutomaticSessionResetJob> {
@Override
public @NonNull AutomaticSessionResetJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AutomaticSessionResetJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AutomaticSessionResetJob(parameters,
RecipientId.from(data.getString(KEY_RECIPIENT_ID)),
data.getInt(KEY_DEVICE_ID),

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.InvalidMessageException;
@@ -9,7 +10,7 @@ import org.thoughtcrime.securesms.database.model.GroupRecord;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
@@ -49,8 +50,8 @@ public final class AvatarGroupsV1DownloadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString()).build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_GROUP_ID, groupId.toString()).serialize();
}
@Override
@@ -112,7 +113,8 @@ public final class AvatarGroupsV1DownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<AvatarGroupsV1DownloadJob> {
@Override
public @NonNull AvatarGroupsV1DownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AvatarGroupsV1DownloadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AvatarGroupsV1DownloadJob(parameters, GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV1());
}
}

View File

@@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.database.model.GroupRecord;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
@@ -60,11 +60,11 @@ public final class AvatarGroupsV2DownloadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_GROUP_ID, groupId.toString())
.putString(CDN_KEY, cdnKey)
.build();
.serialize();
}
@Override
@@ -145,7 +145,9 @@ public final class AvatarGroupsV2DownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<AvatarGroupsV2DownloadJob> {
@Override
public @NonNull AvatarGroupsV2DownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull AvatarGroupsV2DownloadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new AvatarGroupsV2DownloadJob(parameters,
GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2(),
data.getString(CDN_KEY));

View File

@@ -5,7 +5,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.core.util.tracing.Tracer;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.JobManager.Chain;
@@ -16,7 +15,7 @@ public abstract class BaseJob extends Job {
private static final String TAG = Log.tag(BaseJob.class);
private Data outputData;
private byte[] outputData;
public BaseJob(@NonNull Parameters parameters) {
super(parameters);
@@ -76,7 +75,7 @@ public abstract class BaseJob extends Job {
* If this job is part of a {@link Chain}, data set here will be passed as input data to the next
* job(s) in the chain.
*/
protected void setOutputData(@Nullable Data outputData) {
protected void setOutputData(@Nullable byte[] outputData) {
this.outputData = outputData;
}

View File

@@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.signal.core.util.logging.Log;
import org.signal.donations.StripeIntentAccessor;
import org.signal.libsignal.zkgroup.InvalidInputException;
import org.signal.libsignal.zkgroup.VerificationFailedException;
import org.signal.libsignal.zkgroup.receipts.ClientZkReceiptOperations;
@@ -19,7 +18,7 @@ import org.signal.libsignal.zkgroup.receipts.ReceiptSerial;
import org.thoughtcrime.securesms.components.settings.app.subscription.errors.DonationError;
import org.thoughtcrime.securesms.components.settings.app.subscription.errors.DonationErrorSource;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -119,17 +118,17 @@ public class BoostReceiptRequestResponseJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
Data.Builder builder = new Data.Builder().putString(DATA_PAYMENT_INTENT_ID, paymentIntentId)
.putString(DATA_ERROR_SOURCE, donationErrorSource.serialize())
.putLong(DATA_BADGE_LEVEL, badgeLevel)
.putString(DATA_DONATION_PROCESSOR, donationProcessor.getCode());
public @Nullable byte[] serialize() {
JsonJobData.Builder builder = new JsonJobData.Builder().putString(DATA_PAYMENT_INTENT_ID, paymentIntentId)
.putString(DATA_ERROR_SOURCE, donationErrorSource.serialize())
.putLong(DATA_BADGE_LEVEL, badgeLevel)
.putString(DATA_DONATION_PROCESSOR, donationProcessor.getCode());
if (requestContext != null) {
builder.putBlobAsString(DATA_REQUEST_BYTES, requestContext.serialize());
}
return builder.build();
return builder.serialize();
}
@Override
@@ -175,9 +174,9 @@ public class BoostReceiptRequestResponseJob extends BaseJob {
Log.d(TAG, "Validated credential. Handing off to next job.", true);
ReceiptCredentialPresentation receiptCredentialPresentation = getReceiptCredentialPresentation(receiptCredential);
setOutputData(new Data.Builder().putBlobAsString(DonationReceiptRedemptionJob.INPUT_RECEIPT_CREDENTIAL_PRESENTATION,
receiptCredentialPresentation.serialize())
.build());
setOutputData(new JsonJobData.Builder().putBlobAsString(DonationReceiptRedemptionJob.INPUT_RECEIPT_CREDENTIAL_PRESENTATION,
receiptCredentialPresentation.serialize())
.serialize());
} else {
Log.w(TAG, "Encountered a retryable exception: " + response.getStatus(), response.getExecutionError().orElse(null), true);
throw new RetryableException();
@@ -265,7 +264,9 @@ public class BoostReceiptRequestResponseJob extends BaseJob {
public static class Factory implements Job.Factory<BoostReceiptRequestResponseJob> {
@Override
public @NonNull BoostReceiptRequestResponseJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull BoostReceiptRequestResponseJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String paymentIntentId = data.getString(DATA_PAYMENT_INTENT_ID);
DonationErrorSource donationErrorSource = DonationErrorSource.deserialize(data.getStringOrDefault(DATA_ERROR_SOURCE, DonationErrorSource.BOOST.serialize()));
long badgeLevel = data.getLongOrDefault(DATA_BADGE_LEVEL, Long.parseLong(SubscriptionLevels.BOOST_LEVEL));

View File

@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.BuildConfig
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.keyvalue.SignalStore
@@ -42,8 +41,8 @@ class CheckServiceReachabilityJob private constructor(params: Parameters) : Base
}
}
override fun serialize(): Data {
return Data.EMPTY
override fun serialize(): ByteArray? {
return null
}
override fun getFactoryKey(): String {
@@ -114,7 +113,7 @@ class CheckServiceReachabilityJob private constructor(params: Parameters) : Base
}
class Factory : Job.Factory<CheckServiceReachabilityJob> {
override fun create(parameters: Parameters, data: Data): CheckServiceReachabilityJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): CheckServiceReachabilityJob {
return CheckServiceReachabilityJob(parameters)
}
}

View File

@@ -1,13 +1,14 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.state.SignalProtocolStore;
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.crypto.storage.PreKeyMetadataStore;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -27,8 +28,8 @@ public class CleanPreKeysJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -54,7 +55,7 @@ public class CleanPreKeysJob extends BaseJob {
public static final class Factory implements Job.Factory<CleanPreKeysJob> {
@Override
public @NonNull CleanPreKeysJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull CleanPreKeysJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new CleanPreKeysJob(parameters);
}
}

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.KbsEnclave;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -65,11 +66,11 @@ public class ClearFallbackKbsEnclaveJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_ENCLAVE_NAME, enclave.getEnclaveName())
.putString(KEY_SERVICE_ID, enclave.getServiceId())
.putString(KEY_MR_ENCLAVE, enclave.getMrEnclave())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_ENCLAVE_NAME, enclave.getEnclaveName())
.putString(KEY_SERVICE_ID, enclave.getServiceId())
.putString(KEY_MR_ENCLAVE, enclave.getMrEnclave())
.serialize();
}
@Override
@@ -109,7 +110,9 @@ public class ClearFallbackKbsEnclaveJob extends BaseJob {
public static class Factory implements Job.Factory<ClearFallbackKbsEnclaveJob> {
@Override
public @NonNull ClearFallbackKbsEnclaveJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ClearFallbackKbsEnclaveJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
KbsEnclave enclave = new KbsEnclave(data.getString(KEY_ENCLAVE_NAME),
data.getString(KEY_SERVICE_ID),
data.getString(KEY_MR_ENCLAVE));

View File

@@ -1,13 +1,14 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.transport.RetryLaterException;
@@ -47,8 +48,8 @@ public class ConversationShortcutUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -95,7 +96,7 @@ public class ConversationShortcutUpdateJob extends BaseJob {
public static class Factory implements Job.Factory<ConversationShortcutUpdateJob> {
@Override
public @NonNull ConversationShortcutUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ConversationShortcutUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new ConversationShortcutUpdateJob(parameters);
}
}

View File

@@ -7,7 +7,6 @@ import org.thoughtcrime.securesms.avatar.Avatar
import org.thoughtcrime.securesms.avatar.AvatarRenderer
import org.thoughtcrime.securesms.avatar.Avatars
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.profiles.AvatarHelper
@@ -39,7 +38,7 @@ class CreateReleaseChannelJob private constructor(parameters: Parameters) : Base
}
}
override fun serialize(): Data = Data.EMPTY
override fun serialize(): ByteArray? = null
override fun getFactoryKey(): String = KEY
@@ -102,7 +101,7 @@ class CreateReleaseChannelJob private constructor(parameters: Parameters) : Base
override fun onShouldRetry(e: Exception): Boolean = e is RetryLaterException
class Factory : Job.Factory<CreateReleaseChannelJob> {
override fun create(parameters: Parameters, data: Data): CreateReleaseChannelJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): CreateReleaseChannelJob {
return CreateReleaseChannelJob(parameters)
}
}

View File

@@ -5,7 +5,7 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -50,10 +50,10 @@ public class DirectoryRefreshJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT, recipient != null ? recipient.getId().serialize() : null)
.putBoolean(KEY_NOTIFY_OF_NEW_USERS, notifyOfNewUsers)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT, recipient != null ? recipient.getId().serialize() : null)
.putBoolean(KEY_NOTIFY_OF_NEW_USERS, notifyOfNewUsers)
.serialize();
}
@Override
@@ -89,7 +89,9 @@ public class DirectoryRefreshJob extends BaseJob {
public static final class Factory implements Job.Factory<DirectoryRefreshJob> {
@Override
public @NonNull DirectoryRefreshJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull DirectoryRefreshJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String serialized = data.hasString(KEY_RECIPIENT) ? data.getString(KEY_RECIPIENT) : null;
Recipient recipient = serialized != null ? Recipient.resolved(RecipientId.from(serialized)) : null;
boolean notifyOfNewUsers = data.getBoolean(KEY_NOTIFY_OF_NEW_USERS);

View File

@@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -118,12 +118,12 @@ public class DonationReceiptRedemptionJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(DATA_ERROR_SOURCE, errorSource.serialize())
.putLong(DATA_GIFT_MESSAGE_ID, giftMessageId)
.putBoolean(DATA_PRIMARY, makePrimary)
.build();
.serialize();
}
@Override
@@ -161,7 +161,7 @@ public class DonationReceiptRedemptionJob extends BaseJob {
}
private void doRun() throws Exception {
boolean isKeepAlive409 = getInputData() != null && getInputData().getBooleanOrDefault(INPUT_KEEP_ALIVE_409, false);
boolean isKeepAlive409 = getInputData() != null && JsonJobData.deserialize(getInputData()).getBooleanOrDefault(INPUT_KEEP_ALIVE_409, false);
if (isKeepAlive409) {
Log.d(TAG, "Keep-Alive redemption job hit a 409. Exiting.", true);
return;
@@ -233,9 +233,9 @@ public class DonationReceiptRedemptionJob extends BaseJob {
}
private @Nullable ReceiptCredentialPresentation getPresentationFromInputData() throws InvalidInputException {
Data inputData = getInputData();
JsonJobData inputData = JsonJobData.deserialize(getInputData());
if (inputData == null) {
if (inputData.isEmpty()) {
Log.w(TAG, "No input data. Exiting.", true);
return null;
}
@@ -281,7 +281,9 @@ public class DonationReceiptRedemptionJob extends BaseJob {
public static class Factory implements Job.Factory<DonationReceiptRedemptionJob> {
@Override
public @NonNull DonationReceiptRedemptionJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull DonationReceiptRedemptionJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String serializedErrorSource = data.getStringOrDefault(DATA_ERROR_SOURCE, DonationErrorSource.UNKNOWN.serialize());
long messageId = data.getLongOrDefault(DATA_GIFT_MESSAGE_ID, NO_ID);
boolean primary = data.getBooleanOrDefault(DATA_PRIMARY, false);

View File

@@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.emoji.EmojiPageCache;
import org.thoughtcrime.securesms.emoji.EmojiRemote;
import org.thoughtcrime.securesms.emoji.EmojiSource;
import org.thoughtcrime.securesms.emoji.JumboEmoji;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -161,15 +161,15 @@ public class DownloadLatestEmojiDataJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
public @Nullable byte[] serialize() {
if (targetVersion == null) {
return Data.EMPTY;
return null;
} else {
return new Data.Builder()
return new JsonJobData.Builder()
.putInt(VERSION_INT, targetVersion.getVersion())
.putString(VERSION_UUID, targetVersion.getUuid().toString())
.putString(VERSION_DENSITY, targetVersion.getDensity())
.build();
.serialize();
}
}
@@ -359,9 +359,11 @@ public class DownloadLatestEmojiDataJob extends BaseJob {
public static final class Factory implements Job.Factory<DownloadLatestEmojiDataJob> {
@Override
public @NonNull DownloadLatestEmojiDataJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull DownloadLatestEmojiDataJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
final EmojiFiles.Version version;
JsonJobData data = JsonJobData.deserialize(serializedData);
if (data.hasInt(VERSION_INT) &&
data.hasString(VERSION_UUID) &&
data.hasString(VERSION_DENSITY)) {

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -8,7 +9,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.EmojiSearchData;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.EmojiValues;
@@ -74,8 +75,8 @@ public final class EmojiSearchIndexDownloadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -181,7 +182,7 @@ public final class EmojiSearchIndexDownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<EmojiSearchIndexDownloadJob> {
@Override
public @NonNull EmojiSearchIndexDownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull EmojiSearchIndexDownloadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new EmojiSearchIndexDownloadJob(parameters);
}
}

View File

@@ -1,8 +1,9 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
/**
@@ -18,8 +19,8 @@ public final class FailingJob extends Job {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@NonNull
@@ -39,7 +40,7 @@ public final class FailingJob extends Job {
public static final class Factory implements Job.Factory<FailingJob> {
@Override
public @NonNull FailingJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull FailingJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new FailingJob(parameters);
}
}

View File

@@ -210,7 +210,7 @@ public class FastJobStorage implements JobStorage {
}
@Override
public synchronized void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @NonNull String serializedData) {
public synchronized void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @NonNull byte[] serializedData) {
JobSpec job = getJobById(id);
if (job == null || !job.isMemoryOnly()) {
jobDatabase.updateJobAfterRetry(id, isRunning, runAttempt, nextRunAttemptTime, serializedData);

View File

@@ -23,6 +23,7 @@ import android.content.Intent;
import android.graphics.BitmapFactory;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import com.google.android.gms.common.ConnectionResult;
@@ -34,7 +35,7 @@ import org.thoughtcrime.securesms.PlayServicesProblemActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.gcm.FcmUtil;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -68,8 +69,8 @@ public class FcmRefreshJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -139,7 +140,7 @@ public class FcmRefreshJob extends BaseJob {
public static final class Factory implements Job.Factory<FcmRefreshJob> {
@Override
public @NonNull FcmRefreshJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull FcmRefreshJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new FcmRefreshJob(parameters);
}
}

View File

@@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.jobs
import okhttp3.ResponseBody
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint
import org.thoughtcrime.securesms.providers.BlobProvider
import org.thoughtcrime.securesms.s3.S3
@@ -28,11 +28,11 @@ class FetchRemoteMegaphoneImageJob(parameters: Parameters, private val uuid: Str
imageUrl = imageUrl
)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putString(KEY_UUID, uuid)
.putString(KEY_IMAGE_URL, imageUrl)
.build()
.serialize()
}
override fun getFactoryKey(): String {
@@ -65,7 +65,8 @@ class FetchRemoteMegaphoneImageJob(parameters: Parameters, private val uuid: Str
}
class Factory : Job.Factory<FetchRemoteMegaphoneImageJob> {
override fun create(parameters: Parameters, data: Data): FetchRemoteMegaphoneImageJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): FetchRemoteMegaphoneImageJob {
val data = JsonJobData.deserialize(serializedData)
return FetchRemoteMegaphoneImageJob(parameters, data.getString(KEY_UUID), data.getString(KEY_IMAGE_URL))
}
}

View File

@@ -5,7 +5,6 @@ import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.fonts.Fonts
import org.thoughtcrime.securesms.fonts.SupportedScript
import org.thoughtcrime.securesms.fonts.TextFont
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.util.FutureTaskListener
@@ -35,7 +34,7 @@ class FontDownloaderJob private constructor(parameters: Parameters) : BaseJob(pa
.build()
)
override fun serialize(): Data = Data.EMPTY
override fun serialize(): ByteArray? = null
override fun getFactoryKey(): String = KEY
@@ -79,7 +78,7 @@ class FontDownloaderJob private constructor(parameters: Parameters) : BaseJob(pa
override fun onShouldRetry(e: Exception): Boolean = true
class Factory : Job.Factory<FontDownloaderJob> {
override fun create(parameters: Parameters, data: Data): FontDownloaderJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): FontDownloaderJob {
return FontDownloaderJob(parameters)
}
}

View File

@@ -1,13 +1,14 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.GroupRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
@@ -53,8 +54,8 @@ public final class ForceUpdateGroupV2Job extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString()).build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_GROUP_ID, groupId.toString()).serialize();
}
@Override
@@ -79,7 +80,8 @@ public final class ForceUpdateGroupV2Job extends BaseJob {
public static final class Factory implements Job.Factory<ForceUpdateGroupV2Job> {
@Override
public @NonNull ForceUpdateGroupV2Job create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ForceUpdateGroupV2Job create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new ForceUpdateGroupV2Job(parameters, GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2());
}
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
@@ -9,7 +10,7 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.groups.GroupNotAMemberException;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -49,9 +50,9 @@ final class ForceUpdateGroupV2WorkerJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_GROUP_ID, groupId.toString())
.serialize();
}
@Override
@@ -92,7 +93,9 @@ final class ForceUpdateGroupV2WorkerJob extends BaseJob {
public static final class Factory implements Job.Factory<ForceUpdateGroupV2WorkerJob> {
@Override
public @NonNull ForceUpdateGroupV2WorkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ForceUpdateGroupV2WorkerJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new ForceUpdateGroupV2WorkerJob(parameters,
GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2());
}

View File

@@ -9,8 +9,8 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.audio.AudioWaveForms
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.util.MediaUtil
import kotlin.time.Duration.Companion.days
@@ -46,11 +46,11 @@ class GenerateAudioWaveFormJob private constructor(private val attachmentId: Att
.build()
)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putLong(KEY_PART_ROW_ID, attachmentId.rowId)
.putLong(KEY_PAR_UNIQUE_ID, attachmentId.uniqueId)
.build()
.serialize()
}
override fun getFactoryKey(): String = KEY
@@ -87,7 +87,8 @@ class GenerateAudioWaveFormJob private constructor(private val attachmentId: Att
override fun onFailure() = Unit
class Factory : Job.Factory<GenerateAudioWaveFormJob> {
override fun create(parameters: Parameters, data: Data): GenerateAudioWaveFormJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): GenerateAudioWaveFormJob {
val data = JsonJobData.deserialize(serializedData)
return GenerateAudioWaveFormJob(AttachmentId(data.getLong(KEY_PART_ROW_ID), data.getLong(KEY_PAR_UNIQUE_ID)), parameters)
}
}

View File

@@ -7,8 +7,8 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.sharing.MultiShareArgs
@@ -38,17 +38,17 @@ class GiftSendJob private constructor(parameters: Parameters, private val recipi
additionalMessage = additionalMessage
)
override fun serialize(): Data = Data.Builder()
override fun serialize(): ByteArray? = JsonJobData.Builder()
.putLong(DATA_RECIPIENT_ID, recipientId.toLong())
.putString(DATA_ADDITIONAL_MESSAGE, additionalMessage)
.build()
.serialize()
override fun getFactoryKey(): String = KEY
override fun run(): Result {
Log.i(TAG, "Getting data and generating message for gift send to $recipientId")
val token = this.inputData?.getStringAsBlob(DonationReceiptRedemptionJob.INPUT_RECEIPT_CREDENTIAL_PRESENTATION) ?: return Result.failure()
val token = JsonJobData.deserialize(this.inputData).getStringAsBlob(DonationReceiptRedemptionJob.INPUT_RECEIPT_CREDENTIAL_PRESENTATION) ?: return Result.failure()
val recipient = Recipient.resolved(recipientId)
@@ -104,7 +104,8 @@ class GiftSendJob private constructor(parameters: Parameters, private val recipi
}
class Factory : Job.Factory<GiftSendJob> {
override fun create(parameters: Parameters, data: Data): GiftSendJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): GiftSendJob {
val data = JsonJobData.deserialize(serializedData)
val recipientId = RecipientId.from(data.getLong(DATA_RECIPIENT_ID))
val additionalMessage = data.getStringOrDefault(DATA_ADDITIONAL_MESSAGE, null)

View File

@@ -1,9 +1,10 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
@@ -52,10 +53,10 @@ public final class GroupCallPeekJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_GROUP_RECIPIENT_ID, groupRecipientId.serialize())
.build();
.serialize();
}
@Override
@@ -70,7 +71,8 @@ public final class GroupCallPeekJob extends BaseJob {
public static final class Factory implements Job.Factory<GroupCallPeekJob> {
@Override
public @NonNull GroupCallPeekJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull GroupCallPeekJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new GroupCallPeekJob(parameters, RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID)));
}
}

View File

@@ -1,9 +1,10 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -42,10 +43,10 @@ final class GroupCallPeekWorkerJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_GROUP_RECIPIENT_ID, groupRecipientId.serialize())
.build();
.serialize();
}
@Override
@@ -60,7 +61,8 @@ final class GroupCallPeekWorkerJob extends BaseJob {
public static final class Factory implements Job.Factory<GroupCallPeekWorkerJob> {
@Override
public @NonNull GroupCallPeekWorkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull GroupCallPeekWorkerJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new GroupCallPeekWorkerJob(parameters, RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID)));
}
}

View File

@@ -8,7 +8,7 @@ import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.messages.GroupSendUtil;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -87,12 +87,12 @@ public class GroupCallUpdateSendJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.putString(KEY_ERA_ID, eraId)
.putString(KEY_RECIPIENTS, RecipientId.toSerializedList(recipients))
.putInt(KEY_INITIAL_RECIPIENT_COUNT, initialRecipientCount)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.putString(KEY_ERA_ID, eraId)
.putString(KEY_RECIPIENTS, RecipientId.toSerializedList(recipients))
.putInt(KEY_INITIAL_RECIPIENT_COUNT, initialRecipientCount)
.serialize();
}
@Override
@@ -175,7 +175,9 @@ public class GroupCallUpdateSendJob extends BaseJob {
@Override
public @NonNull
GroupCallUpdateSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
GroupCallUpdateSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
RecipientId recipientId = RecipientId.from(data.getString(KEY_RECIPIENT_ID));
String eraId = data.getString(KEY_ERA_ID);
List<RecipientId> recipients = RecipientId.fromSerializedList(data.getString(KEY_RECIPIENTS));

View File

@@ -1,23 +1,16 @@
package org.thoughtcrime.securesms.jobs;
import android.app.Application;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import androidx.annotation.Nullable;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
import org.thoughtcrime.securesms.groups.GroupsV1MigrationUtil;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.transport.RetryLaterException;
@@ -25,9 +18,6 @@ import org.whispersystems.signalservice.api.groupsv2.NoCredentialForRedemptionTi
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class GroupV1MigrationJob extends BaseJob {
@@ -67,9 +57,9 @@ public class GroupV1MigrationJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize())
.serialize();
}
@Override
@@ -105,7 +95,8 @@ public class GroupV1MigrationJob extends BaseJob {
public static final class Factory implements Job.Factory<GroupV1MigrationJob> {
@Override
public @NonNull GroupV1MigrationJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull GroupV1MigrationJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new GroupV1MigrationJob(parameters, RecipientId.from(data.getString(KEY_RECIPIENT_ID)));
}
}

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.protobuf.ByteString;
@@ -17,7 +18,7 @@ import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupInsufficientRightsException;
import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.groups.GroupNotAMemberException;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -145,9 +146,9 @@ public final class GroupV2UpdateSelfProfileKeyJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_GROUP_ID, groupId.toString())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_GROUP_ID, groupId.toString())
.serialize();
}
@Override
@@ -177,7 +178,9 @@ public final class GroupV2UpdateSelfProfileKeyJob extends BaseJob {
public static final class Factory implements Job.Factory<GroupV2UpdateSelfProfileKeyJob> {
@Override
public @NonNull GroupV2UpdateSelfProfileKeyJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull GroupV2UpdateSelfProfileKeyJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new GroupV2UpdateSelfProfileKeyJob(parameters,
GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2());
}

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
@@ -19,7 +20,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -116,8 +117,8 @@ public class IndividualSendJob extends PushSendJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId).build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId).serialize();
}
@Override
@@ -339,13 +340,15 @@ public class IndividualSendJob extends PushSendJob {
}
}
public static long getMessageId(@NonNull Data data) {
public static long getMessageId(@Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return data.getLong(KEY_MESSAGE_ID);
}
public static final class Factory implements Job.Factory<IndividualSendJob> {
@Override
public @NonNull IndividualSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull IndividualSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new IndividualSendJob(parameters, data.getLong(KEY_MESSAGE_ID));
}
}

View File

@@ -1,9 +1,10 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -46,8 +47,8 @@ public class KbsEnclaveMigrationWorkerJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -92,7 +93,7 @@ public class KbsEnclaveMigrationWorkerJob extends BaseJob {
public static class Factory implements Job.Factory<KbsEnclaveMigrationWorkerJob> {
@Override
public @NonNull KbsEnclaveMigrationWorkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull KbsEnclaveMigrationWorkerJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new KbsEnclaveMigrationWorkerJob(parameters);
}
}

View File

@@ -2,8 +2,8 @@ package org.thoughtcrime.securesms.jobs
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint
/**
@@ -23,10 +23,10 @@ class LeaveGroupV2Job(parameters: Parameters, private val groupId: GroupId.V2) :
groupId = groupId
)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putString(KEY_GROUP_ID, groupId.toString())
.build()
.serialize()
}
override fun getFactoryKey(): String {
@@ -42,7 +42,8 @@ class LeaveGroupV2Job(parameters: Parameters, private val groupId: GroupId.V2) :
override fun onFailure() = Unit
class Factory : Job.Factory<LeaveGroupV2Job> {
override fun create(parameters: Parameters, data: Data): LeaveGroupV2Job {
override fun create(parameters: Parameters, serializedData: ByteArray?): LeaveGroupV2Job {
val data = JsonJobData.deserialize(serializedData)
return LeaveGroupV2Job(parameters, GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2())
}
}

View File

@@ -7,8 +7,8 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException
import org.thoughtcrime.securesms.groups.GroupChangeFailedException
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.groups.GroupManager
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.recipients.Recipient
import java.io.IOException
@@ -28,10 +28,10 @@ class LeaveGroupV2WorkerJob(parameters: Parameters, private val groupId: GroupId
groupId = groupId
)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putString(KEY_GROUP_ID, groupId.toString())
.build()
.serialize()
}
override fun getFactoryKey(): String {
@@ -61,7 +61,8 @@ class LeaveGroupV2WorkerJob(parameters: Parameters, private val groupId: GroupId
override fun onFailure() = Unit
class Factory : Job.Factory<LeaveGroupV2WorkerJob> {
override fun create(parameters: Parameters, data: Data): LeaveGroupV2WorkerJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): LeaveGroupV2WorkerJob {
val data = JsonJobData.deserialize(serializedData)
return LeaveGroupV2WorkerJob(parameters, GroupId.parseOrThrow(data.getString(KEY_GROUP_ID)).requireV2())
}
}

View File

@@ -5,6 +5,7 @@ import android.Manifest;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -21,7 +22,7 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.database.NoExternalStorageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint;
@@ -74,8 +75,8 @@ public final class LocalBackupJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -233,7 +234,7 @@ public final class LocalBackupJob extends BaseJob {
public static class Factory implements Job.Factory<LocalBackupJob> {
@Override
public @NonNull LocalBackupJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull LocalBackupJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new LocalBackupJob(parameters);
}
}

View File

@@ -23,7 +23,7 @@ import org.thoughtcrime.securesms.backup.BackupVerifier;
import org.thoughtcrime.securesms.backup.FullBackupExporter;
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
@@ -68,8 +68,8 @@ public final class LocalBackupJobApi29 extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -294,7 +294,7 @@ public final class LocalBackupJobApi29 extends BaseJob {
public static class Factory implements Job.Factory<LocalBackupJobApi29> {
@Override
public @NonNull
LocalBackupJobApi29 create(@NonNull Parameters parameters, @NonNull Data data) {
LocalBackupJobApi29 create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new LocalBackupJobApi29(parameters);
}
}

View File

@@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
/**
@@ -39,8 +39,8 @@ public final class MarkerJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -54,7 +54,7 @@ public final class MarkerJob extends BaseJob {
public static final class Factory implements Job.Factory<MarkerJob> {
@Override
public @NonNull MarkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MarkerJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MarkerJob(parameters);
}
}

View File

@@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.database.MessageTable.InsertResult;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mms.ApnUnavailableException;
@@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.util.Util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -83,11 +82,11 @@ public class MmsDownloadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putLong(KEY_THREAD_ID, threadId)
.putBoolean(KEY_AUTOMATIC, automatic)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putLong(KEY_THREAD_ID, threadId)
.putBoolean(KEY_AUTOMATIC, automatic)
.serialize();
}
@Override
@@ -271,7 +270,9 @@ public class MmsDownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<MmsDownloadJob> {
@Override
public @NonNull MmsDownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MmsDownloadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MmsDownloadJob(parameters,
data.getLong(KEY_MESSAGE_ID),
data.getLong(KEY_THREAD_ID),

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.mms.pdu_alt.GenericPdu;
import com.google.android.mms.pdu_alt.NotificationInd;
@@ -12,7 +13,7 @@ import org.signal.libsignal.protocol.util.Pair;
import org.thoughtcrime.securesms.database.MessageTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.Base64;
@@ -44,10 +45,10 @@ public class MmsReceiveJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_DATA, Base64.encodeBytes(data))
.putInt(KEY_SUBSCRIPTION_ID, subscriptionId)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_DATA, Base64.encodeBytes(data))
.putInt(KEY_SUBSCRIPTION_ID, subscriptionId)
.serialize();
}
@Override
@@ -123,8 +124,9 @@ public class MmsReceiveJob extends BaseJob {
public static final class Factory implements Job.Factory<MmsReceiveJob> {
@Override
public @NonNull MmsReceiveJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MmsReceiveJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
try {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MmsReceiveJob(parameters, Base64.decode(data.getString(KEY_DATA)), data.getInt(KEY_SUBSCRIPTION_ID));
} catch (IOException e) {
throw new AssertionError(e);

View File

@@ -5,6 +5,7 @@ import android.text.TextUtils;
import android.webkit.MimeTypeMap;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.android.mms.dom.smil.parser.SmilXmlSerializer;
@@ -33,7 +34,7 @@ import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.JobManager;
@@ -106,8 +107,8 @@ public final class MmsSendJob extends SendJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId).build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId).serialize();
}
@Override
@@ -362,7 +363,8 @@ public final class MmsSendJob extends SendJob {
public static class Factory implements Job.Factory<MmsSendJob> {
@Override
public @NonNull MmsSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MmsSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MmsSendJob(parameters, data.getLong(KEY_MESSAGE_ID));
}
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
@@ -8,7 +9,7 @@ import org.thoughtcrime.securesms.database.RecipientTable;
import org.thoughtcrime.securesms.database.RecipientTable.RecipientReader;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -49,8 +50,8 @@ public class MultiDeviceBlockedUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -106,7 +107,7 @@ public class MultiDeviceBlockedUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceBlockedUpdateJob> {
@Override
public @NonNull MultiDeviceBlockedUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceBlockedUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceBlockedUpdateJob(parameters);
}
}

View File

@@ -2,11 +2,12 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -71,12 +72,12 @@ public class MultiDeviceConfigurationUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putBoolean(KEY_READ_RECEIPTS_ENABLED, readReceiptsEnabled)
.putBoolean(KEY_TYPING_INDICATORS_ENABLED, typingIndicatorsEnabled)
.putBoolean(KEY_UNIDENTIFIED_DELIVERY_INDICATORS_ENABLED, unidentifiedDeliveryIndicatorsEnabled)
.putBoolean(KEY_LINK_PREVIEWS_ENABLED, linkPreviewsEnabled)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putBoolean(KEY_READ_RECEIPTS_ENABLED, readReceiptsEnabled)
.putBoolean(KEY_TYPING_INDICATORS_ENABLED, typingIndicatorsEnabled)
.putBoolean(KEY_UNIDENTIFIED_DELIVERY_INDICATORS_ENABLED, unidentifiedDeliveryIndicatorsEnabled)
.putBoolean(KEY_LINK_PREVIEWS_ENABLED, linkPreviewsEnabled)
.serialize();
}
@Override
@@ -121,7 +122,9 @@ public class MultiDeviceConfigurationUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceConfigurationUpdateJob> {
@Override
public @NonNull MultiDeviceConfigurationUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceConfigurationUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MultiDeviceConfigurationUpdateJob(parameters,
data.getBooleanOrDefault(KEY_READ_RECEIPTS_ENABLED, false),
data.getBooleanOrDefault(KEY_TYPING_INDICATORS_ENABLED, false),

View File

@@ -5,8 +5,8 @@ import org.signal.libsignal.protocol.InvalidMessageException
import org.thoughtcrime.securesms.database.IdentityTable.VerifiedStatus
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.net.NotPushRegisteredException
import org.thoughtcrime.securesms.profiles.AvatarHelper
@@ -35,10 +35,10 @@ class MultiDeviceContactSyncJob(parameters: Parameters, private val attachmentPo
AttachmentPointerUtil.createAttachmentPointer(contactsAttachment).toByteArray()
)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putBlobAsString(KEY_ATTACHMENT_POINTER, attachmentPointer)
.build()
.serialize()
}
override fun getFactoryKey(): String {
@@ -141,7 +141,8 @@ class MultiDeviceContactSyncJob(parameters: Parameters, private val attachmentPo
override fun onFailure() = Unit
class Factory : Job.Factory<MultiDeviceContactSyncJob> {
override fun create(parameters: Parameters, data: Data): MultiDeviceContactSyncJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): MultiDeviceContactSyncJob {
val data = JsonJobData.deserialize(serializedData)
return MultiDeviceContactSyncJob(parameters, data.getStringAsBlob(KEY_ATTACHMENT_POINTER))
}
}

View File

@@ -20,7 +20,7 @@ import org.thoughtcrime.securesms.database.RecipientTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.IdentityRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -101,10 +101,10 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT, recipientId != null ? recipientId.serialize() : null)
.putBoolean(KEY_FORCE_SYNC, forceSync)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT, recipientId != null ? recipientId.serialize() : null)
.putBoolean(KEY_FORCE_SYNC, forceSync)
.serialize();
}
@Override
@@ -404,7 +404,9 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceContactUpdateJob> {
@Override
public @NonNull MultiDeviceContactUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceContactUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String serialized = data.getString(KEY_RECIPIENT);
RecipientId address = serialized != null ? RecipientId.from(serialized) : null;

View File

@@ -4,6 +4,7 @@ import android.net.Uri;
import android.os.ParcelFileDescriptor;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.conversation.colors.ChatColorsMapper;
@@ -12,7 +13,7 @@ import org.thoughtcrime.securesms.database.GroupTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.GroupRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -69,8 +70,8 @@ public class MultiDeviceGroupUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -205,7 +206,7 @@ public class MultiDeviceGroupUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceGroupUpdateJob> {
@Override
public @NonNull MultiDeviceGroupUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceGroupUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceGroupUpdateJob(parameters);
}
}

View File

@@ -2,11 +2,12 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -45,8 +46,8 @@ public class MultiDeviceKeysUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -89,7 +90,7 @@ public class MultiDeviceKeysUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceKeysUpdateJob> {
@Override
public @NonNull MultiDeviceKeysUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceKeysUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceKeysUpdateJob(parameters);
}
}

View File

@@ -2,11 +2,12 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -76,10 +77,10 @@ public class MultiDeviceMessageRequestResponseJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_THREAD_RECIPIENT, threadRecipient.serialize())
.putInt(KEY_TYPE, type.serialize())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_THREAD_RECIPIENT, threadRecipient.serialize())
.putInt(KEY_TYPE, type.serialize())
.serialize();
}
@Override
@@ -174,8 +175,9 @@ public class MultiDeviceMessageRequestResponseJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceMessageRequestResponseJob> {
@Override
public @NonNull
MultiDeviceMessageRequestResponseJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceMessageRequestResponseJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
RecipientId threadRecipient = RecipientId.from(data.getString(KEY_THREAD_RECIPIENT));
Type type = Type.deserialize(data.getInt(KEY_TYPE));

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.protobuf.ByteString;
@@ -9,7 +10,7 @@ import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.PaymentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -57,10 +58,10 @@ public final class MultiDeviceOutgoingPaymentSyncJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_UUID, uuid.toString())
.build();
.serialize();
}
@Override
@@ -134,7 +135,9 @@ public final class MultiDeviceOutgoingPaymentSyncJob extends BaseJob {
public static class Factory implements Job.Factory<MultiDeviceOutgoingPaymentSyncJob> {
@Override
public @NonNull MultiDeviceOutgoingPaymentSyncJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceOutgoingPaymentSyncJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MultiDeviceOutgoingPaymentSyncJob(parameters,
UUID.fromString(data.getString(KEY_UUID)));
}

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.protobuf.ByteString;
@@ -9,7 +10,7 @@ import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -50,8 +51,8 @@ public class MultiDevicePniIdentityUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -96,7 +97,7 @@ public class MultiDevicePniIdentityUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDevicePniIdentityUpdateJob> {
@Override
public @NonNull MultiDevicePniIdentityUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDevicePniIdentityUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDevicePniIdentityUpdateJob(parameters);
}
}

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -36,8 +37,8 @@ public class MultiDeviceProfileContentUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -75,7 +76,7 @@ public class MultiDeviceProfileContentUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceProfileContentUpdateJob> {
@Override
public @NonNull MultiDeviceProfileContentUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceProfileContentUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceProfileContentUpdateJob(parameters);
}
}

View File

@@ -2,13 +2,14 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -52,8 +53,8 @@ public class MultiDeviceProfileKeyUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -115,7 +116,7 @@ public class MultiDeviceProfileKeyUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceProfileKeyUpdateJob> {
@Override
public @NonNull MultiDeviceProfileKeyUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceProfileKeyUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceProfileKeyUpdateJob(parameters);
}
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -10,7 +11,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -80,7 +81,7 @@ public class MultiDeviceReadUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
public @Nullable byte[] serialize() {
String[] ids = new String[messageIds.size()];
for (int i = 0; i < ids.length; i++) {
@@ -91,7 +92,7 @@ public class MultiDeviceReadUpdateJob extends BaseJob {
}
}
return new Data.Builder().putStringArray(KEY_MESSAGE_IDS, ids).build();
return new JsonJobData.Builder().putStringArray(KEY_MESSAGE_IDS, ids).serialize();
}
@Override
@@ -152,7 +153,9 @@ public class MultiDeviceReadUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceReadUpdateJob> {
@Override
public @NonNull MultiDeviceReadUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceReadUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
List<SyncMessageId> ids = Stream.of(data.getStringArray(KEY_MESSAGE_IDS))
.map(id -> {
try {

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.signal.core.util.Hex;
@@ -59,11 +60,11 @@ public class MultiDeviceStickerPackOperationJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_PACK_ID, packId)
.putString(KEY_PACK_KEY, packKey)
.putString(KEY_TYPE, type.name())
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_PACK_ID, packId)
.putString(KEY_PACK_KEY, packKey)
.putString(KEY_TYPE, type.name())
.serialize();
}
@Override
@@ -115,7 +116,9 @@ public class MultiDeviceStickerPackOperationJob extends BaseJob {
public static class Factory implements Job.Factory<MultiDeviceStickerPackOperationJob> {
@Override
public @NonNull MultiDeviceStickerPackOperationJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceStickerPackOperationJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new MultiDeviceStickerPackOperationJob(parameters,
data.getString(KEY_PACK_ID),
data.getString(KEY_PACK_KEY),

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
@@ -8,7 +9,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.StickerTable.StickerPackRecordReader;
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -47,8 +48,8 @@ public class MultiDeviceStickerPackSyncJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -99,7 +100,7 @@ public class MultiDeviceStickerPackSyncJob extends BaseJob {
@Override
public @NonNull
MultiDeviceStickerPackSyncJob create(@NonNull Parameters parameters, @NonNull Data data) {
MultiDeviceStickerPackSyncJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceStickerPackSyncJob(parameters);
}
}

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -36,8 +37,8 @@ public class MultiDeviceStorageSyncRequestJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -75,7 +76,7 @@ public class MultiDeviceStorageSyncRequestJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceStorageSyncRequestJob> {
@Override
public @NonNull MultiDeviceStorageSyncRequestJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceStorageSyncRequestJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new MultiDeviceStorageSyncRequestJob(parameters);
}
}

View File

@@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.recipients.Recipient
import org.whispersystems.signalservice.api.messages.SignalServiceStoryMessageRecipient
@@ -44,11 +44,11 @@ class MultiDeviceStorySendSyncJob private constructor(parameters: Parameters, pr
}
}
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putLong(DATA_SENT_TIMESTAMP, sentTimestamp)
.putLong(DATA_DELETED_MESSAGE_ID, deletedMessageId)
.build()
.serialize()
}
override fun getFactoryKey(): String = KEY
@@ -90,7 +90,8 @@ class MultiDeviceStorySendSyncJob private constructor(parameters: Parameters, pr
class RetryableException : Exception()
class Factory : Job.Factory<MultiDeviceStorySendSyncJob> {
override fun create(parameters: Parameters, data: Data): MultiDeviceStorySendSyncJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): MultiDeviceStorySendSyncJob {
val data = JsonJobData.deserialize(serializedData)
return MultiDeviceStorySendSyncJob(
parameters = parameters,
sentTimestamp = data.getLong(DATA_SENT_TIMESTAMP),

View File

@@ -3,7 +3,6 @@ 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
@@ -38,7 +37,7 @@ class MultiDeviceSubscriptionSyncRequestJob private constructor(parameters: Para
}
}
override fun serialize(): Data = Data.EMPTY
override fun serialize(): ByteArray? = null
override fun getFactoryKey(): String = KEY
@@ -69,7 +68,7 @@ class MultiDeviceSubscriptionSyncRequestJob private constructor(parameters: Para
}
class Factory : Job.Factory<MultiDeviceSubscriptionSyncRequestJob> {
override fun create(parameters: Parameters, data: Data): MultiDeviceSubscriptionSyncRequestJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): MultiDeviceSubscriptionSyncRequestJob {
return MultiDeviceSubscriptionSyncRequestJob(parameters)
}
}

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKey;
@@ -9,7 +10,7 @@ import org.signal.libsignal.protocol.InvalidKeyException;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.IdentityTable.VerifiedStatus;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -73,12 +74,12 @@ public class MultiDeviceVerifiedUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_DESTINATION, destination.serialize())
.putString(KEY_IDENTITY_KEY, Base64.encodeBytes(identityKey))
.putInt(KEY_VERIFIED_STATUS, verifiedStatus.toInt())
.putLong(KEY_TIMESTAMP, timestamp)
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_DESTINATION, destination.serialize())
.putString(KEY_IDENTITY_KEY, Base64.encodeBytes(identityKey))
.putInt(KEY_VERIFIED_STATUS, verifiedStatus.toInt())
.putLong(KEY_TIMESTAMP, timestamp)
.serialize();
}
@Override
@@ -148,7 +149,9 @@ public class MultiDeviceVerifiedUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceVerifiedUpdateJob> {
@Override
public @NonNull MultiDeviceVerifiedUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceVerifiedUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
try {
RecipientId destination = RecipientId.from(data.getString(KEY_DESTINATION));
VerifiedStatus verifiedStatus = VerifiedStatus.forState(data.getInt(KEY_VERIFIED_STATUS));

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -8,7 +9,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
@@ -53,7 +54,7 @@ public class MultiDeviceViewOnceOpenJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
public @Nullable byte[] serialize() {
String serialized;
try {
@@ -62,7 +63,7 @@ public class MultiDeviceViewOnceOpenJob extends BaseJob {
throw new AssertionError(e);
}
return new Data.Builder().putString(KEY_MESSAGE_ID, serialized).build();
return new JsonJobData.Builder().putString(KEY_MESSAGE_ID, serialized).serialize();
}
@Override
@@ -123,9 +124,10 @@ public class MultiDeviceViewOnceOpenJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceViewOnceOpenJob> {
@Override
public @NonNull MultiDeviceViewOnceOpenJob create(@NonNull Parameters parameters, @NonNull Data data) {
SerializableSyncMessageId messageId;
public @NonNull MultiDeviceViewOnceOpenJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
SerializableSyncMessageId messageId;
try {
messageId = JsonUtils.fromJson(data.getString(KEY_MESSAGE_ID), SerializableSyncMessageId.class);
} catch (IOException e) {

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -10,7 +11,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -80,7 +81,7 @@ public class MultiDeviceViewedUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
public @Nullable byte[] serialize() {
String[] ids = new String[messageIds.size()];
for (int i = 0; i < ids.length; i++) {
@@ -91,7 +92,7 @@ public class MultiDeviceViewedUpdateJob extends BaseJob {
}
}
return new Data.Builder().putStringArray(KEY_MESSAGE_IDS, ids).build();
return new JsonJobData.Builder().putStringArray(KEY_MESSAGE_IDS, ids).serialize();
}
@Override
@@ -152,7 +153,9 @@ public class MultiDeviceViewedUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<MultiDeviceViewedUpdateJob> {
@Override
public @NonNull MultiDeviceViewedUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull MultiDeviceViewedUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
List<SyncMessageId> ids = Stream.of(data.getStringArray(KEY_MESSAGE_IDS))
.map(id -> {
try {

View File

@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import java.io.IOException
@@ -26,7 +25,7 @@ class NewRegistrationUsernameSyncJob private constructor(parameters: Parameters)
.build()
)
override fun serialize(): Data = Data.EMPTY
override fun serialize(): ByteArray? = null
override fun getFactoryKey(): String = KEY
@@ -41,7 +40,7 @@ class NewRegistrationUsernameSyncJob private constructor(parameters: Parameters)
}
class Factory : Job.Factory<NewRegistrationUsernameSyncJob> {
override fun create(parameters: Parameters, data: Data): NewRegistrationUsernameSyncJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): NewRegistrationUsernameSyncJob {
return NewRegistrationUsernameSyncJob(parameters)
}
}

View File

@@ -1,11 +1,12 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -49,8 +50,8 @@ public class NullMessageSendJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize()).build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putString(KEY_RECIPIENT_ID, recipientId.serialize()).serialize();
}
@Override
@@ -94,7 +95,9 @@ public class NullMessageSendJob extends BaseJob {
public static final class Factory implements Job.Factory<NullMessageSendJob> {
@Override
public @NonNull NullMessageSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull NullMessageSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new NullMessageSendJob(RecipientId.from(data.getString(KEY_RECIPIENT_ID)),
parameters);
}

View File

@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.transport.RetryLaterException
@@ -34,7 +33,7 @@ class OptimizeMessageSearchIndexJob private constructor(parameters: Parameters)
.build()
)
override fun serialize(): Data = Data.EMPTY
override fun serialize(): ByteArray? = null
override fun getFactoryKey() = KEY
override fun onFailure() = Unit
override fun onShouldRetry(e: Exception) = e is RetryLaterException
@@ -54,6 +53,6 @@ class OptimizeMessageSearchIndexJob private constructor(parameters: Parameters)
}
class Factory : Job.Factory<OptimizeMessageSearchIndexJob> {
override fun create(parameters: Parameters, data: Data) = OptimizeMessageSearchIndexJob(parameters)
override fun create(parameters: Parameters, serializedData: ByteArray?) = OptimizeMessageSearchIndexJob(parameters)
}
}

View File

@@ -9,7 +9,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.PaymentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.payments.MobileCoinLedgerWrapper;
@@ -96,10 +96,10 @@ public final class PaymentLedgerUpdateJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_PAYMENT_UUID, paymentUuid != null ? paymentUuid.toString() : null)
.build();
.serialize();
}
@NonNull @Override
@@ -114,7 +114,9 @@ public final class PaymentLedgerUpdateJob extends BaseJob {
public static final class Factory implements Job.Factory<PaymentLedgerUpdateJob> {
@Override
public @NonNull PaymentLedgerUpdateJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PaymentLedgerUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String paymentUuid = data.getString(KEY_PAYMENT_UUID);
return new PaymentLedgerUpdateJob(parameters,
paymentUuid != null ? UUID.fromString(paymentUuid) : null);

View File

@@ -1,20 +1,20 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.PaymentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
import org.whispersystems.signalservice.api.SignalServiceMessageSender.IndividualSendEvents;
import org.whispersystems.signalservice.api.crypto.ContentHint;
@@ -27,7 +27,6 @@ import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedExcept
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public final class PaymentNotificationSendJob extends BaseJob {
@@ -56,11 +55,11 @@ public final class PaymentNotificationSendJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_RECIPIENT, recipientId.serialize())
.putString(KEY_UUID, uuid.toString())
.build();
.serialize();
}
@Override
@@ -134,7 +133,9 @@ public final class PaymentNotificationSendJob extends BaseJob {
public static class Factory implements Job.Factory<PaymentNotificationSendJob> {
@Override
public @NonNull PaymentNotificationSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PaymentNotificationSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new PaymentNotificationSendJob(parameters,
RecipientId.from(data.getString(KEY_RECIPIENT)),
UUID.fromString(data.getString(KEY_UUID)));

View File

@@ -2,8 +2,8 @@ package org.thoughtcrime.securesms.jobs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.mms.OutgoingMessage
import org.thoughtcrime.securesms.net.NotPushRegisteredException
import org.thoughtcrime.securesms.recipients.Recipient
@@ -32,11 +32,11 @@ class PaymentNotificationSendJobV2 private constructor(
constructor(recipientId: RecipientId, uuid: UUID) : this(Parameters.Builder().build(), recipientId, uuid)
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putString(KEY_RECIPIENT, recipientId.serialize())
.putString(KEY_UUID, uuid.toString())
.build()
.serialize()
}
override fun getFactoryKey(): String {
@@ -80,7 +80,8 @@ class PaymentNotificationSendJobV2 private constructor(
override fun onFailure() = Unit
class Factory : Job.Factory<PaymentNotificationSendJobV2?> {
override fun create(parameters: Parameters, data: Data): PaymentNotificationSendJobV2 {
override fun create(parameters: Parameters, serializedData: ByteArray?): PaymentNotificationSendJobV2 {
val data = JsonJobData.deserialize(serializedData)
return PaymentNotificationSendJobV2(
parameters,
RecipientId.from(data.getString(KEY_RECIPIENT)),

View File

@@ -8,7 +8,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.PaymentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -211,9 +211,9 @@ public final class PaymentSendJob extends BaseJob {
return false;
}
@NonNull @Override
public Data serialize() {
return new Data.Builder()
@Override
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_UUID, uuid.toString())
.putLong(KEY_TIMESTAMP, timestamp)
.putString(KEY_RECIPIENT, recipientId != null ? recipientId.serialize() : null)
@@ -221,7 +221,7 @@ public final class PaymentSendJob extends BaseJob {
.putString(KEY_NOTE, note)
.putString(KEY_AMOUNT, amount.serialize())
.putString(KEY_FEE, totalFee.serialize())
.build();
.serialize();
}
@NonNull @Override
@@ -242,7 +242,9 @@ public final class PaymentSendJob extends BaseJob {
public static final class Factory implements Job.Factory<PaymentSendJob> {
@Override
public @NonNull PaymentSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PaymentSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new PaymentSendJob(parameters,
UUID.fromString(data.getString(KEY_UUID)),
data.getLong(KEY_TIMESTAMP),

View File

@@ -1,12 +1,13 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.PaymentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -134,12 +135,11 @@ public final class PaymentTransactionCheckJob extends BaseJob {
e instanceof IOException;
}
@NonNull
@Override
public Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putString(KEY_UUID, uuid.toString())
.build();
.serialize();
}
@NonNull
@@ -158,7 +158,9 @@ public final class PaymentTransactionCheckJob extends BaseJob {
public static class Factory implements Job.Factory<PaymentTransactionCheckJob> {
@Override
public @NonNull PaymentTransactionCheckJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PaymentTransactionCheckJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return new PaymentTransactionCheckJob(parameters,
UUID.fromString(data.getString(KEY_UUID)));
}

View File

@@ -4,7 +4,6 @@ import org.signal.core.util.concurrent.safeBlockingGet
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.components.settings.app.changenumber.ChangeNumberRepository
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.keyvalue.SignalStore
@@ -38,8 +37,8 @@ class PnpInitializeDevicesJob private constructor(parameters: Parameters) : Base
constructor() : this(Parameters.Builder().addConstraint(NetworkConstraint.KEY).build())
override fun serialize(): Data {
return Data.EMPTY
override fun serialize(): ByteArray? {
return null
}
override fun getFactoryKey(): String {
@@ -110,7 +109,7 @@ class PnpInitializeDevicesJob private constructor(parameters: Parameters) : Base
}
class Factory : Job.Factory<PnpInitializeDevicesJob?> {
override fun create(parameters: Parameters, data: Data): PnpInitializeDevicesJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): PnpInitializeDevicesJob {
return PnpInitializeDevicesJob(parameters)
}
}

View File

@@ -6,8 +6,8 @@ import org.signal.libsignal.protocol.state.SignalProtocolStore
import org.thoughtcrime.securesms.crypto.PreKeyUtil
import org.thoughtcrime.securesms.crypto.storage.PreKeyMetadataStore
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.TextSecurePreferences
@@ -78,10 +78,10 @@ class PreKeysSyncJob private constructor(private val forceRotate: Boolean = fals
override fun getFactoryKey(): String = KEY
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putBoolean(KEY_FORCE_ROTATE, forceRotate)
.build()
.serialize()
}
override fun onRun() {
@@ -175,7 +175,8 @@ class PreKeysSyncJob private constructor(private val forceRotate: Boolean = fals
}
class Factory : Job.Factory<PreKeysSyncJob> {
override fun create(parameters: Parameters, data: Data): PreKeysSyncJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): PreKeysSyncJob {
val data = JsonJobData.deserialize(serializedData)
return PreKeysSyncJob(data.getBooleanOrDefault(KEY_FORCE_ROTATE, false), parameters)
}
}

View File

@@ -8,7 +8,7 @@ import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
@@ -130,11 +130,11 @@ public class ProfileKeySendJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder()
public @Nullable byte[] serialize() {
return new JsonJobData.Builder()
.putLong(KEY_THREAD, threadId)
.putString(KEY_RECIPIENTS, RecipientId.toSerializedList(recipients))
.build();
.serialize();
}
@Override
@@ -161,7 +161,9 @@ public class ProfileKeySendJob extends BaseJob {
public static class Factory implements Job.Factory<ProfileKeySendJob> {
@Override
public @NonNull ProfileKeySendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ProfileKeySendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
long threadId = data.getLong(KEY_THREAD);
List<RecipientId> recipients = RecipientId.fromSerializedList(data.getString(KEY_RECIPIENTS));

View File

@@ -2,9 +2,10 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -51,8 +52,8 @@ public final class ProfileUploadJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -67,7 +68,7 @@ public final class ProfileUploadJob extends BaseJob {
public static class Factory implements Job.Factory<ProfileUploadJob> {
@Override
public @NonNull ProfileUploadJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull ProfileUploadJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new ProfileUploadJob(parameters);
}
}

View File

@@ -1,10 +1,11 @@
package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
/**
@@ -29,8 +30,8 @@ public class PushDecryptDrainedJob extends BaseJob {
}
@Override
public @NonNull Data serialize() {
return Data.EMPTY;
public @Nullable byte[] serialize() {
return null;
}
@Override
@@ -55,7 +56,7 @@ public class PushDecryptDrainedJob extends BaseJob {
public static final class Factory implements Job.Factory<PushDecryptDrainedJob> {
@Override
public @NonNull PushDecryptDrainedJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PushDecryptDrainedJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
return new PushDecryptDrainedJob(parameters);
}
}

View File

@@ -8,8 +8,8 @@ import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.MainActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Data
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.messages.MessageContentProcessor.ExceptionMetadata
import org.thoughtcrime.securesms.messages.MessageContentProcessor.MessageState
@@ -61,11 +61,11 @@ class PushDecryptMessageJob private constructor(
override fun shouldTrace() = true
override fun serialize(): Data {
return Data.Builder()
override fun serialize(): ByteArray? {
return JsonJobData.Builder()
.putBlobAsString(KEY_ENVELOPE, envelope.serialize())
.putLong(KEY_SMS_MESSAGE_ID, smsMessageId)
.build()
.serialize()
}
override fun getFactoryKey() = KEY
@@ -186,7 +186,8 @@ class PushDecryptMessageJob private constructor(
}
class Factory : Job.Factory<PushDecryptMessageJob> {
override fun create(parameters: Parameters, data: Data): PushDecryptMessageJob {
override fun create(parameters: Parameters, serializedData: ByteArray?): PushDecryptMessageJob {
val data = JsonJobData.deserialize(serializedData)
return PushDecryptMessageJob(
parameters,
SignalServiceEnvelope.deserialize(data.getStringAsBlob(KEY_ENVELOPE)),

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
@@ -18,7 +19,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.JobManager;
@@ -119,10 +120,10 @@ public final class PushDistributionListSendJob extends PushSendJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putString(KEY_FILTERED_RECIPIENT_IDS, RecipientId.toSerializedList(filterRecipientIds))
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putString(KEY_FILTERED_RECIPIENT_IDS, RecipientId.toSerializedList(filterRecipientIds))
.serialize();
}
@Override
@@ -225,7 +226,9 @@ public final class PushDistributionListSendJob extends PushSendJob {
public static class Factory implements Job.Factory<PushDistributionListSendJob> {
@Override
public @NonNull PushDistributionListSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
public @NonNull PushDistributionListSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
Set<RecipientId> recipientIds = new HashSet<>(RecipientId.fromSerializedList(data.getStringOrDefault(KEY_FILTERED_RECIPIENT_IDS, "")));
return new PushDistributionListSendJob(parameters, data.getLong(KEY_MESSAGE_ID), recipientIds);
}

View File

@@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.JobManager;
@@ -146,10 +146,10 @@ public final class PushGroupSendJob extends PushSendJob {
}
@Override
public @NonNull Data serialize() {
return new Data.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putString(KEY_FILTER_RECIPIENTS, RecipientId.toSerializedList(filterRecipients))
.build();
public @Nullable byte[] serialize() {
return new JsonJobData.Builder().putLong(KEY_MESSAGE_ID, messageId)
.putString(KEY_FILTER_RECIPIENTS, RecipientId.toSerializedList(filterRecipients))
.serialize();
}
private static boolean isGv2UpdateMessage(@NonNull OutgoingMessage message) {
@@ -382,7 +382,8 @@ public final class PushGroupSendJob extends PushSendJob {
}
}
public static long getMessageId(@NonNull Data data) {
public static long getMessageId(@Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
return data.getLong(KEY_MESSAGE_ID);
}
@@ -520,7 +521,9 @@ public final class PushGroupSendJob extends PushSendJob {
public static class Factory implements Job.Factory<PushGroupSendJob> {
@Override
public @NonNull PushGroupSendJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) {
public @NonNull PushGroupSendJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
JsonJobData data = JsonJobData.deserialize(serializedData);
String raw = data.getStringOrDefault(KEY_FILTER_RECIPIENTS, "");
Set<RecipientId> filters = raw != null ? new HashSet<>(RecipientId.fromSerializedList(raw)) : Collections.emptySet();

Some files were not shown because too many files have changed in this diff Show More