Search in sources :

Example 1 with Data

use of org.thoughtcrime.securesms.jobmanager.Data in project Signal-Android by WhisperSystems.

the class AttachmentUploadJob method onRun.

@Override
public void onRun() throws Exception {
    if (!Recipient.self().isRegistered()) {
        throw new NotPushRegisteredException();
    }
    Data inputData = getInputData();
    ResumableUploadSpec resumableUploadSpec;
    if (forceV2) {
        Log.d(TAG, "Forcing utilization of V2");
        resumableUploadSpec = null;
    } else if (inputData != null && inputData.hasString(ResumableUploadSpecJob.KEY_RESUME_SPEC)) {
        Log.d(TAG, "Using attachments V3");
        resumableUploadSpec = ResumableUploadSpec.deserialize(inputData.getString(ResumableUploadSpecJob.KEY_RESUME_SPEC));
    } else {
        Log.d(TAG, "Using attachments V2");
        resumableUploadSpec = null;
    }
    SignalServiceMessageSender messageSender = ApplicationDependencies.getSignalServiceMessageSender();
    AttachmentDatabase database = SignalDatabase.attachments();
    DatabaseAttachment databaseAttachment = database.getAttachment(attachmentId);
    if (databaseAttachment == null) {
        throw new InvalidAttachmentException("Cannot find the specified attachment.");
    }
    long timeSinceUpload = System.currentTimeMillis() - databaseAttachment.getUploadTimestamp();
    if (timeSinceUpload < UPLOAD_REUSE_THRESHOLD && !TextUtils.isEmpty(databaseAttachment.getLocation())) {
        Log.i(TAG, "We can re-use an already-uploaded file. It was uploaded " + timeSinceUpload + " ms ago. Skipping.");
        return;
    } else if (databaseAttachment.getUploadTimestamp() > 0) {
        Log.i(TAG, "This file was previously-uploaded, but too long ago to be re-used. Age: " + timeSinceUpload + " ms");
    }
    Log.i(TAG, "Uploading attachment for message " + databaseAttachment.getMmsId() + " with ID " + databaseAttachment.getAttachmentId());
    try (NotificationController notification = getNotificationForAttachment(databaseAttachment)) {
        SignalServiceAttachment localAttachment = getAttachmentFor(databaseAttachment, notification, resumableUploadSpec);
        SignalServiceAttachmentPointer remoteAttachment = messageSender.uploadAttachment(localAttachment.asStream());
        Attachment attachment = PointerAttachment.forPointer(Optional.of(remoteAttachment), null, databaseAttachment.getFastPreflightId()).get();
        database.updateAttachmentAfterUpload(databaseAttachment.getAttachmentId(), attachment, remoteAttachment.getUploadTimestamp());
    } catch (NonSuccessfulResumableUploadResponseCodeException e) {
        if (e.getCode() == 400) {
            Log.w(TAG, "Failed to upload due to a 400 when getting resumable upload information. Downgrading to attachments v2", e);
            forceV2 = true;
        }
    }
}
Also used : NotPushRegisteredException(org.thoughtcrime.securesms.net.NotPushRegisteredException) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) SignalServiceMessageSender(org.whispersystems.signalservice.api.SignalServiceMessageSender) SignalServiceAttachmentPointer(org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer) Data(org.thoughtcrime.securesms.jobmanager.Data) PointerAttachment(org.thoughtcrime.securesms.attachments.PointerAttachment) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) SignalServiceAttachment(org.whispersystems.signalservice.api.messages.SignalServiceAttachment) Attachment(org.thoughtcrime.securesms.attachments.Attachment) AttachmentDatabase(org.thoughtcrime.securesms.database.AttachmentDatabase) NonSuccessfulResumableUploadResponseCodeException(org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResumableUploadResponseCodeException) SignalServiceAttachment(org.whispersystems.signalservice.api.messages.SignalServiceAttachment) ResumableUploadSpec(org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec) NotificationController(org.thoughtcrime.securesms.service.NotificationController)

Example 2 with Data

use of org.thoughtcrime.securesms.jobmanager.Data in project Signal-Android by WhisperSystems.

the class DownloadLatestEmojiDataJob method clearOldEmojiData.

private static void clearOldEmojiData(@NonNull Context context, @Nullable EmojiFiles.Version newVersion) {
    EmojiFiles.Version version = EmojiFiles.Version.readVersion(context);
    final String currentDirectoryName;
    final String newVersionDirectoryName;
    if (version != null) {
        currentDirectoryName = version.getUuid().toString();
    } else {
        currentDirectoryName = "";
    }
    if (newVersion != null) {
        newVersionDirectoryName = newVersion.getUuid().toString();
    } else {
        newVersionDirectoryName = "";
    }
    File emojiDirectory = EmojiFiles.getBaseDirectory(context);
    File[] files = emojiDirectory.listFiles();
    if (files == null) {
        Log.d(TAG, "No emoji data to delete.");
        return;
    }
    Log.d(TAG, "Deleting old folders of emoji data");
    Stream.of(files).filter(File::isDirectory).filterNot(file -> file.getName().equals(currentDirectoryName)).filterNot(file -> file.getName().equals(newVersionDirectoryName)).forEach(FileUtils::deleteDirectory);
    EmojiPageCache.INSTANCE.clear();
    if (version != null) {
        SignalStore.emojiValues().clearJumboEmojiSheets(version.getVersion());
    }
}
Also used : SignalStore(org.thoughtcrime.securesms.keyvalue.SignalStore) Context(android.content.Context) Okio(okio.Okio) Arrays(java.util.Arrays) Hex(com.mobilecoin.lib.util.Hex) Stream(com.annimon.stream.Stream) Source(okio.Source) ScreenDensity(org.thoughtcrime.securesms.util.ScreenDensity) NonNull(androidx.annotation.NonNull) Data(org.thoughtcrime.securesms.jobmanager.Data) Uri(android.net.Uri) AutoDownloadEmojiConstraint(org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint) EmojiFiles(org.thoughtcrime.securesms.emoji.EmojiFiles) Sink(okio.Sink) Matcher(java.util.regex.Matcher) EmojiPageCache(org.thoughtcrime.securesms.emoji.EmojiPageCache) Response(okhttp3.Response) IntPair(com.annimon.stream.IntPair) FileUtils(org.thoughtcrime.securesms.util.FileUtils) EmojiJsonRequest(org.thoughtcrime.securesms.emoji.EmojiJsonRequest) EmojiSource(org.thoughtcrime.securesms.emoji.EmojiSource) ResponseBody(okhttp3.ResponseBody) JumboEmoji(org.thoughtcrime.securesms.emoji.JumboEmoji) OutputStream(java.io.OutputStream) EmojiData(org.thoughtcrime.securesms.emoji.EmojiData) EmojiImageRequest(org.thoughtcrime.securesms.emoji.EmojiImageRequest) ApplicationDependencies(org.thoughtcrime.securesms.dependencies.ApplicationDependencies) NetworkConstraint(org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint) IOException(java.io.IOException) UUID(java.util.UUID) File(java.io.File) EmojiDownloader(org.thoughtcrime.securesms.emoji.EmojiDownloader) EmojiPageModel(org.thoughtcrime.securesms.components.emoji.EmojiPageModel) TimeUnit(java.util.concurrent.TimeUnit) Log(org.signal.core.util.logging.Log) List(java.util.List) Nullable(androidx.annotation.Nullable) Job(org.thoughtcrime.securesms.jobmanager.Job) EmojiRemote(org.thoughtcrime.securesms.emoji.EmojiRemote) Pattern(java.util.regex.Pattern) FileUtils(org.thoughtcrime.securesms.util.FileUtils) File(java.io.File) EmojiFiles(org.thoughtcrime.securesms.emoji.EmojiFiles)

Example 3 with Data

use of org.thoughtcrime.securesms.jobmanager.Data in project Signal-Android by WhisperSystems.

the class RecipientIdJobMigration method migrateMultiDeviceVerifiedUpdateJob.

@NonNull
private 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();
    return jobData.withData(updatedData);
}
Also used : Recipient(org.thoughtcrime.securesms.recipients.Recipient) Data(org.thoughtcrime.securesms.jobmanager.Data) NonNull(androidx.annotation.NonNull)

Example 4 with Data

use of org.thoughtcrime.securesms.jobmanager.Data in project Signal-Android by WhisperSystems.

the class RecipientIdJobMigration method migrateDirectoryRefreshJob.

@NonNull
private 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();
    return jobData.withData(updatedData);
}
Also used : Recipient(org.thoughtcrime.securesms.recipients.Recipient) Data(org.thoughtcrime.securesms.jobmanager.Data) NonNull(androidx.annotation.NonNull)

Example 5 with Data

use of org.thoughtcrime.securesms.jobmanager.Data in project Signal-Android by WhisperSystems.

the class RecipientIdJobMigration method migrateMultiDeviceViewOnceOpenJob.

@NonNull
private JobData migrateMultiDeviceViewOnceOpenJob(@NonNull JobData jobData) {
    try {
        String rawOld = jobData.getData().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();
        return jobData.withData(updatedData);
    } catch (IOException e) {
        throw new AssertionError(e);
    }
}
Also used : Recipient(org.thoughtcrime.securesms.recipients.Recipient) Data(org.thoughtcrime.securesms.jobmanager.Data) IOException(java.io.IOException) NonNull(androidx.annotation.NonNull)

Aggregations

Data (org.thoughtcrime.securesms.jobmanager.Data)21 NonNull (androidx.annotation.NonNull)17 Recipient (org.thoughtcrime.securesms.recipients.Recipient)13 IOException (java.io.IOException)5 Stream (com.annimon.stream.Stream)3 List (java.util.List)3 ApplicationDependencies (org.thoughtcrime.securesms.dependencies.ApplicationDependencies)3 Job (org.thoughtcrime.securesms.jobmanager.Job)3 RecipientId (org.thoughtcrime.securesms.recipients.RecipientId)3 Context (android.content.Context)2 TimeUnit (java.util.concurrent.TimeUnit)2 Test (org.junit.Test)2 Uri (android.net.Uri)1 Nullable (androidx.annotation.Nullable)1 WorkerThread (androidx.annotation.WorkerThread)1 IntPair (com.annimon.stream.IntPair)1 Hex (com.mobilecoin.lib.util.Hex)1 File (java.io.File)1 OutputStream (java.io.OutputStream)1 ArrayList (java.util.ArrayList)1