Support gv2 avatar removal.

This commit is contained in:
Alan Evans 2020-05-14 15:57:40 -03:00 committed by GitHub
parent d726da822c
commit 3b673c07a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 21 deletions

View File

@ -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<Recipient> members = DatabaseFactory.getGroupDatabase(context)

View File

@ -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;

View File

@ -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());

View File

@ -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();

View File

@ -90,7 +90,7 @@ class EditProfileViewModel extends ViewModel {
}
public boolean canRemoveProfilePhoto() {
return (!isGroup() || groupId.isV1()) && hasAvatar();
return hasAvatar();
}
@MainThread