diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java index 3d29772c85..ac6dd890ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java @@ -36,6 +36,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage; import org.whispersystems.signalservice.api.messages.multidevice.DeviceContact; +import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactAvatar; import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsOutputStream; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; @@ -307,7 +308,7 @@ public class MultiDeviceContactUpdateJob extends BaseJob { } } - private Optional getSystemAvatar(@Nullable Uri uri) throws IOException { + private Optional getSystemAvatar(@Nullable Uri uri) throws IOException { if (uri == null) { return Optional.empty(); } @@ -325,12 +326,7 @@ public class MultiDeviceContactUpdateJob extends BaseJob { return Optional.empty(); } - return Optional.of(SignalServiceAttachment.newStreamBuilder() - .withStream(fd.createInputStream()) - .withContentType("image/*") - .withLength(fd.getLength()) - .withResumableUploadSpec(AppDependencies.getSignalServiceMessageSender().getResumableUploadSpec()) - .build()); + return Optional.of(new DeviceContactAvatar(fd.createInputStream(), fd.getLength(), "image/*")); } catch (IOException e) { // Ignored } @@ -352,12 +348,7 @@ public class MultiDeviceContactUpdateJob extends BaseJob { byte[] data = cursor.getBlob(0); if (data != null) { - return Optional.of(SignalServiceAttachment.newStreamBuilder() - .withStream(new ByteArrayInputStream(data)) - .withContentType("image/*") - .withLength(data.length) - .withResumableUploadSpec(AppDependencies.getSignalServiceMessageSender().getResumableUploadSpec()) - .build()); + return Optional.of(new DeviceContactAvatar(new ByteArrayInputStream(data), data.length, "image/*")); } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContact.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContact.java index 2fcabe9395..a78afdcc76 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContact.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContact.java @@ -1,36 +1,33 @@ /** * Copyright (C) 2014-2016 Open Whisper Systems - * + *

* Licensed according to the LICENSE file in this repository. */ package org.whispersystems.signalservice.api.messages.multidevice; import org.signal.libsignal.zkgroup.profiles.ProfileKey; -import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; -import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId.ACI; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.util.Optional; public class DeviceContact { - private final Optional aci; - private final Optional e164; - private final Optional name; - private final Optional avatar; - private final Optional color; - private final Optional verified; - private final Optional profileKey; - private final Optional expirationTimer; - private final Optional inboxPosition; - private final boolean archived; + private final Optional aci; + private final Optional e164; + private final Optional name; + private final Optional avatar; + private final Optional color; + private final Optional verified; + private final Optional profileKey; + private final Optional expirationTimer; + private final Optional inboxPosition; + private final boolean archived; public DeviceContact(Optional aci, Optional e164, Optional name, - Optional avatar, + Optional avatar, Optional color, Optional verified, Optional profileKey, @@ -54,7 +51,7 @@ public class DeviceContact { this.archived = archived; } - public Optional getAvatar() { + public Optional getAvatar() { return avatar; } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactAvatar.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactAvatar.kt new file mode 100644 index 0000000000..2340699505 --- /dev/null +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactAvatar.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.whispersystems.signalservice.api.messages.multidevice + +import java.io.InputStream + +/** + * Data needed to sync a device contact avatar to/from other devices. + */ +data class DeviceContactAvatar(val inputStream: InputStream, val length: Long, val contentType: String) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java index 384e9c3a44..b710090b8b 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java @@ -47,27 +47,23 @@ public class DeviceContactsInputStream extends ChunkedInputStream { throw new IOException("Missing contact address!"); } - Optional aci = Optional.ofNullable(ACI.parseOrNull(details.aci)); - Optional e164 = Optional.ofNullable(details.number); - Optional name = Optional.ofNullable(details.name); - Optional avatar = Optional.empty(); - Optional color = details.color != null ? Optional.of(details.color) : Optional.empty(); - Optional verified = Optional.empty(); - Optional profileKey = Optional.empty(); - Optional expireTimer = Optional.empty(); - Optional inboxPosition = Optional.empty(); - boolean archived = false; + Optional aci = Optional.ofNullable(ACI.parseOrNull(details.aci)); + Optional e164 = Optional.ofNullable(details.number); + Optional name = Optional.ofNullable(details.name); + Optional avatar = Optional.empty(); + Optional color = details.color != null ? Optional.of(details.color) : Optional.empty(); + Optional verified = Optional.empty(); + Optional profileKey = Optional.empty(); + Optional expireTimer = Optional.empty(); + Optional inboxPosition = Optional.empty(); + boolean archived = false; - if (details.avatar != null) { + if (details.avatar != null && details.avatar.length != null) { long avatarLength = details.avatar.length; InputStream avatarStream = new LimitedInputStream(in, avatarLength); - String avatarContentType = details.avatar.contentType; + String avatarContentType = details.avatar.contentType != null ? details.avatar.contentType : "image/*"; - avatar = Optional.of(SignalServiceAttachment.newStreamBuilder() - .withStream(avatarStream) - .withContentType(avatarContentType) - .withLength(avatarLength) - .build()); + avatar = Optional.of(new DeviceContactAvatar(avatarStream, avatarLength, avatarContentType)); } if (details.verified != null) {