From 3b673c07a0147970e8d219eb09bc9ad9673463e7 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Thu, 14 May 2020 15:57:40 -0300 Subject: [PATCH] Support gv2 avatar removal. --- .../securesms/groups/GroupManager.java | 2 +- .../securesms/groups/GroupManagerV2.java | 15 ++++++++------- .../v2/processing/GroupsV2StateProcessor.java | 11 +++++++---- .../jobs/AvatarGroupsV2DownloadJob.java | 18 ++++++++++-------- .../profiles/edit/EditProfileViewModel.java | 2 +- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java index 2f724538ff..8c781a4097 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java @@ -73,7 +73,7 @@ public final class GroupManager { { if (groupId.isV2()) { try (GroupManagerV2.GroupEditor edit = new GroupManagerV2(context).edit(groupId.requireV2())) { - return edit.updateGroupTitleAndAvatar(name, avatarChanged ? avatar : null); + return edit.updateGroupTitleAndAvatar(name, avatar, avatarChanged); } } else { List members = DatabaseFactory.getGroupDatabase(context) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index a14c392dcd..9d70807d68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -209,23 +209,24 @@ final class GroupManagerV2 { } @WorkerThread - @NonNull GroupManager.GroupActionResult updateGroupTitleAndAvatar(@Nullable String title, @Nullable byte[] avatarBytes) + @NonNull GroupManager.GroupActionResult updateGroupTitleAndAvatar(@Nullable String title, @Nullable byte[] avatarBytes, boolean avatarChanged) throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException { try { GroupChange.Actions.Builder change = groupOperations.createModifyGroupTitleAndMembershipChange(Optional.fromNullable(title), Collections.emptySet(), Collections.emptySet()); - if (avatarBytes != null) { - String cdnKey = groupsV2Api.uploadAvatar(avatarBytes, groupSecretParams, authorization.getAuthorizationForToday(selfUuid, groupSecretParams)); + if (avatarChanged) { + String cdnKey = avatarBytes != null ? groupsV2Api.uploadAvatar(avatarBytes, groupSecretParams, authorization.getAuthorizationForToday(selfUuid, groupSecretParams)) + : ""; change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder() - .setAvatar(cdnKey)); + .setAvatar(cdnKey)); } GroupManager.GroupActionResult groupActionResult = commitChangeWithConflictResolution(change); - if (avatarBytes != null) { - AvatarHelper.setAvatar(context, Recipient.externalGroup(context, groupId).getId(), new ByteArrayInputStream(avatarBytes)); - groupDatabase.onAvatarUpdated(groupId, true); + if (avatarChanged) { + AvatarHelper.setAvatar(context, Recipient.externalGroup(context, groupId).getId(), avatarBytes != null ? new ByteArrayInputStream(avatarBytes) : null); + groupDatabase.onAvatarUpdated(groupId, avatarBytes != null); } return groupActionResult; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index 30b4593b8d..e3523dcbed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.groups.v2.processing; import android.content.Context; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -11,7 +12,6 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupChange; import org.signal.zkgroup.VerificationFailedException; import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.groups.GroupSecretParams; -import org.signal.zkgroup.util.UUIDUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; @@ -223,15 +223,18 @@ public final class GroupsV2StateProcessor { private void updateLocalDatabaseGroupState(@NonNull GlobalGroupState inputGroupState, @NonNull DecryptedGroup newLocalState) { + boolean needsAvatarFetch; + if (inputGroupState.getLocalState() == null) { groupDatabase.create(masterKey, newLocalState); + needsAvatarFetch = !TextUtils.isEmpty(newLocalState.getAvatar()); } else { groupDatabase.update(masterKey, newLocalState); + needsAvatarFetch = !newLocalState.getAvatar().equals(inputGroupState.getLocalState().getAvatar()); } - String avatar = newLocalState.getAvatar(); - if (!avatar.isEmpty()) { - jobManager.add(new AvatarGroupsV2DownloadJob(groupId, avatar)); + if (needsAvatarFetch) { + jobManager.add(new AvatarGroupsV2DownloadJob(groupId, newLocalState.getAvatar())); } final boolean fullMemberPostUpdate = GroupProtoUtil.isMember(Recipient.self().getUuid().get(), newLocalState.getMembersList()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob.java index 0fbd45b72d..44cc7e736c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob.java @@ -46,14 +46,7 @@ public final class AvatarGroupsV2DownloadJob extends BaseJob { .setMaxAttempts(10) .build(), groupId, - requireNonEmpty(cdnKey)); - } - - private static String requireNonEmpty(@NonNull String string) { - if (string.isEmpty()) { - throw new AssertionError(); - } - return string; + cdnKey); } private AvatarGroupsV2DownloadJob(@NonNull Parameters parameters, @NonNull GroupId.V2 groupId, @NonNull String cdnKey) { @@ -87,6 +80,15 @@ public final class AvatarGroupsV2DownloadJob extends BaseJob { return; } + if (cdnKey.length() == 0) { + Log.w(TAG, "Removing avatar for group " + groupId); + AvatarHelper.setAvatar(context, record.get().getRecipientId(), null); + database.onAvatarUpdated(groupId, false); + return; + } + + Log.i(TAG, "Downloading new avatar for group " + groupId); + attachment = File.createTempFile("avatar", "gv2", context.getCacheDir()); attachment.deleteOnExit(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index db00afde20..46fb34892d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -90,7 +90,7 @@ class EditProfileViewModel extends ViewModel { } public boolean canRemoveProfilePhoto() { - return (!isGroup() || groupId.isV1()) && hasAvatar(); + return hasAvatar(); } @MainThread