mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 17:29:32 +01:00
Convert GroupTable to kotlin.
Also required converting some tests to mockk.
This commit is contained in:
@@ -15,6 +15,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo;
|
||||
import org.thoughtcrime.securesms.database.GroupTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.database.model.GroupRecord;
|
||||
import org.thoughtcrime.securesms.groups.v2.GroupInviteLinkUrl;
|
||||
import org.thoughtcrime.securesms.groups.v2.GroupLinkPassword;
|
||||
import org.thoughtcrime.securesms.profiles.AvatarHelper;
|
||||
@@ -402,14 +403,14 @@ public final class GroupManager {
|
||||
throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException, GroupChangeBusyException, MembershipNotSuitableForV2Exception
|
||||
{
|
||||
if (groupId.isV2()) {
|
||||
GroupTable.GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
|
||||
try (GroupManagerV2.GroupEditor editor = new GroupManagerV2(context).edit(groupId.requireV2())) {
|
||||
return editor.addMembers(newMembers, groupRecord.requireV2GroupProperties().getBannedMembers());
|
||||
}
|
||||
} else {
|
||||
GroupTable.GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
List<RecipientId> members = groupRecord.getMembers();
|
||||
GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
List<RecipientId> members = groupRecord.getMembers();
|
||||
byte[] avatar = groupRecord.hasAvatar() ? AvatarHelper.getAvatarBytes(context, groupRecord.getRecipientId()) : null;
|
||||
Set<RecipientId> recipientIds = new HashSet<>(members);
|
||||
int originalSize = recipientIds.size();
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
|
||||
import org.thoughtcrime.securesms.database.GroupTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadTable;
|
||||
import org.thoughtcrime.securesms.database.model.GroupRecord;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.groups.v2.GroupCandidateHelper;
|
||||
@@ -167,8 +168,8 @@ final class GroupManagerV2 {
|
||||
|
||||
@WorkerThread
|
||||
@NonNull Map<UUID, UuidCiphertext> getUuidCipherTexts(@NonNull GroupId.V2 groupId) {
|
||||
GroupTable.GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
GroupTable.V2GroupProperties v2GroupProperties = groupRecord.requireV2GroupProperties();
|
||||
GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
|
||||
GroupTable.V2GroupProperties v2GroupProperties = groupRecord.requireV2GroupProperties();
|
||||
GroupMasterKey groupMasterKey = v2GroupProperties.getGroupMasterKey();
|
||||
ClientZkGroupCipher clientZkGroupCipher = new ClientZkGroupCipher(GroupSecretParams.deriveFromMasterKey(groupMasterKey));
|
||||
List<Recipient> recipients = v2GroupProperties.getMemberRecipients(GroupTable.MemberSet.FULL_MEMBERS_INCLUDING_SELF);
|
||||
@@ -251,9 +252,9 @@ final class GroupManagerV2 {
|
||||
throws IOException, MembershipNotSuitableForV2Exception, GroupAlreadyExistsException, GroupChangeFailedException
|
||||
{
|
||||
GroupMasterKey groupMasterKey = groupIdV1.deriveV2MigrationMasterKey();
|
||||
GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupMasterKey);
|
||||
GroupTable.GroupRecord groupRecord = groupDatabase.requireGroup(groupIdV1);
|
||||
String name = Util.emptyIfNull(groupRecord.getTitle());
|
||||
GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupMasterKey);
|
||||
GroupRecord groupRecord = groupDatabase.requireGroup(groupIdV1);
|
||||
String name = Util.emptyIfNull(groupRecord.getTitle());
|
||||
byte[] avatar = groupRecord.hasAvatar() ? AvatarHelper.getAvatarBytes(context, groupRecord.getRecipientId()) : null;
|
||||
int messageTimer = Recipient.resolved(groupRecord.getRecipientId()).getExpiresInSeconds();
|
||||
Set<RecipientId> memberIds = Stream.of(members)
|
||||
@@ -327,7 +328,7 @@ final class GroupManagerV2 {
|
||||
GroupEditor(@NonNull GroupId.V2 groupId, @NonNull Closeable lock) {
|
||||
super(lock);
|
||||
|
||||
GroupTable.GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
|
||||
this.groupId = groupId;
|
||||
this.v2GroupProperties = groupRecord.requireV2GroupProperties();
|
||||
@@ -455,8 +456,8 @@ final class GroupManagerV2 {
|
||||
void leaveGroup()
|
||||
throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException
|
||||
{
|
||||
GroupTable.GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
DecryptedGroup decryptedGroup = groupRecord.requireV2GroupProperties().getDecryptedGroup();
|
||||
GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
DecryptedGroup decryptedGroup = groupRecord.requireV2GroupProperties().getDecryptedGroup();
|
||||
Optional<DecryptedMember> selfMember = DecryptedGroupUtil.findMemberByUuid(decryptedGroup.getMembersList(), selfAci.uuid());
|
||||
Optional<DecryptedPendingMember> aciPendingMember = DecryptedGroupUtil.findPendingByUuid(decryptedGroup.getPendingMembersList(), selfAci.uuid());
|
||||
Optional<DecryptedPendingMember> pniPendingMember = DecryptedGroupUtil.findPendingByUuid(decryptedGroup.getPendingMembersList(), selfPni.uuid());
|
||||
@@ -728,7 +729,7 @@ final class GroupManagerV2 {
|
||||
private GroupManager.GroupActionResult commitChange(@NonNull GroupChange.Actions.Builder change, boolean allowWhenBlocked, boolean sendToMembers)
|
||||
throws GroupNotAMemberException, GroupChangeFailedException, IOException, GroupInsufficientRightsException
|
||||
{
|
||||
final GroupTable.GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
final GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
final GroupTable.V2GroupProperties v2GroupProperties = groupRecord.requireV2GroupProperties();
|
||||
final int nextRevision = v2GroupProperties.getGroupRevision() + 1;
|
||||
final GroupChange.Actions changeActions = change.setRevision(nextRevision).build();
|
||||
@@ -923,7 +924,7 @@ final class GroupManagerV2 {
|
||||
alreadyAMember = true;
|
||||
}
|
||||
|
||||
Optional<GroupTable.GroupRecord> unmigratedV1Group = groupDatabase.getGroupV1ByExpectedV2(groupId);
|
||||
Optional<GroupRecord> unmigratedV1Group = groupDatabase.getGroupV1ByExpectedV2(groupId);
|
||||
|
||||
if (unmigratedV1Group.isPresent()) {
|
||||
Log.i(TAG, "Group link was for a migrated V1 group we know about! Migrating it and using that as the base.");
|
||||
@@ -932,7 +933,7 @@ final class GroupManagerV2 {
|
||||
|
||||
DecryptedGroup decryptedGroup = createPlaceholderGroup(joinInfo, requestToJoin);
|
||||
|
||||
Optional<GroupTable.GroupRecord> group = groupDatabase.getGroup(groupId);
|
||||
Optional<GroupRecord> group = groupDatabase.getGroup(groupId);
|
||||
|
||||
if (group.isPresent()) {
|
||||
Log.i(TAG, "Group already present locally");
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
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.groups.ui.GroupMemberEntry;
|
||||
import org.thoughtcrime.securesms.groups.v2.GroupInviteLinkUrl;
|
||||
@@ -48,7 +49,7 @@ public final class LiveGroup {
|
||||
|
||||
private final GroupTable groupDatabase;
|
||||
private final LiveData<Recipient> recipient;
|
||||
private final LiveData<GroupTable.GroupRecord> groupRecord;
|
||||
private final LiveData<GroupRecord> groupRecord;
|
||||
private final LiveData<List<GroupMemberEntry.FullMember>> fullMembers;
|
||||
private final LiveData<List<GroupMemberEntry.RequestingMember>> requestingMembers;
|
||||
private final LiveData<GroupLinkUrlAndStatus> groupLink;
|
||||
@@ -64,7 +65,7 @@ public final class LiveGroup {
|
||||
this.requestingMembers = mapToRequestingMembers(this.groupRecord);
|
||||
|
||||
if (groupId.isV2()) {
|
||||
LiveData<GroupTable.V2GroupProperties> v2Properties = Transformations.map(this.groupRecord, GroupTable.GroupRecord::requireV2GroupProperties);
|
||||
LiveData<GroupTable.V2GroupProperties> v2Properties = Transformations.map(this.groupRecord, GroupRecord::requireV2GroupProperties);
|
||||
this.groupLink = Transformations.map(v2Properties, g -> {
|
||||
DecryptedGroup group = g.getDecryptedGroup();
|
||||
AccessControl.AccessRequired addFromInviteLink = group.getAccessControl().getAddFromInviteLink();
|
||||
@@ -87,7 +88,7 @@ public final class LiveGroup {
|
||||
SignalExecutors.BOUNDED.execute(() -> liveRecipient.postValue(Recipient.externalGroupExact(groupId).live()));
|
||||
}
|
||||
|
||||
protected static LiveData<List<GroupMemberEntry.FullMember>> mapToFullMembers(@NonNull LiveData<GroupTable.GroupRecord> groupRecord) {
|
||||
protected static LiveData<List<GroupMemberEntry.FullMember>> mapToFullMembers(@NonNull LiveData<GroupRecord> groupRecord) {
|
||||
return LiveDataUtil.mapAsync(groupRecord,
|
||||
g -> Stream.of(g.getMembers())
|
||||
.map(m -> {
|
||||
@@ -98,7 +99,7 @@ public final class LiveGroup {
|
||||
.toList());
|
||||
}
|
||||
|
||||
protected static LiveData<List<GroupMemberEntry.RequestingMember>> mapToRequestingMembers(@NonNull LiveData<GroupTable.GroupRecord> groupRecord) {
|
||||
protected static LiveData<List<GroupMemberEntry.RequestingMember>> mapToRequestingMembers(@NonNull LiveData<GroupRecord> groupRecord) {
|
||||
return LiveDataUtil.mapAsync(groupRecord,
|
||||
g -> {
|
||||
if (!g.isV2Group()) {
|
||||
@@ -128,11 +129,11 @@ public final class LiveGroup {
|
||||
}
|
||||
|
||||
public LiveData<String> getDescription() {
|
||||
return Transformations.map(groupRecord, GroupTable.GroupRecord::getDescription);
|
||||
return Transformations.map(groupRecord, GroupRecord::getDescription);
|
||||
}
|
||||
|
||||
public LiveData<Boolean> isAnnouncementGroup() {
|
||||
return Transformations.map(groupRecord, GroupTable.GroupRecord::isAnnouncementGroup);
|
||||
return Transformations.map(groupRecord, GroupRecord::isAnnouncementGroup);
|
||||
}
|
||||
|
||||
public LiveData<Recipient> getGroupRecipient() {
|
||||
@@ -148,7 +149,7 @@ public final class LiveGroup {
|
||||
}
|
||||
|
||||
public LiveData<Boolean> isActive() {
|
||||
return Transformations.map(groupRecord, GroupTable.GroupRecord::isActive);
|
||||
return Transformations.map(groupRecord, GroupRecord::isActive);
|
||||
}
|
||||
|
||||
public LiveData<Boolean> getRecipientIsAdmin(@NonNull RecipientId recipientId) {
|
||||
@@ -171,11 +172,11 @@ public final class LiveGroup {
|
||||
}
|
||||
|
||||
public LiveData<GroupAccessControl> getMembershipAdditionAccessControl() {
|
||||
return Transformations.map(groupRecord, GroupTable.GroupRecord::getMembershipAdditionAccessControl);
|
||||
return Transformations.map(groupRecord, GroupRecord::getMembershipAdditionAccessControl);
|
||||
}
|
||||
|
||||
public LiveData<GroupAccessControl> getAttributesAccessControl() {
|
||||
return Transformations.map(groupRecord, GroupTable.GroupRecord::getAttributesAccessControl);
|
||||
return Transformations.map(groupRecord, GroupRecord::getAttributesAccessControl);
|
||||
}
|
||||
|
||||
public LiveData<List<GroupMemberEntry.FullMember>> getNonAdminFullMembers() {
|
||||
|
||||
@@ -14,6 +14,7 @@ import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.GroupTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.database.model.GroupRecord;
|
||||
import org.thoughtcrime.securesms.groups.GroupChangeException;
|
||||
import org.thoughtcrime.securesms.groups.GroupId;
|
||||
import org.thoughtcrime.securesms.groups.GroupManager;
|
||||
@@ -56,7 +57,7 @@ public final class LeaveGroupDialog {
|
||||
SimpleTask.run(activity.getLifecycle(), () -> {
|
||||
GroupTable.V2GroupProperties groupProperties = SignalDatabase.groups()
|
||||
.getGroup(groupId)
|
||||
.map(GroupTable.GroupRecord::requireV2GroupProperties)
|
||||
.map(GroupRecord::requireV2GroupProperties)
|
||||
.orElse(null);
|
||||
|
||||
if (groupProperties != null && groupProperties.isAdmin(Recipient.self())) {
|
||||
|
||||
@@ -20,7 +20,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedMember;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval;
|
||||
import org.thoughtcrime.securesms.database.GroupTable;
|
||||
import org.thoughtcrime.securesms.database.GroupTable.GroupRecord;
|
||||
import org.thoughtcrime.securesms.database.model.GroupRecord;
|
||||
import org.thoughtcrime.securesms.database.MessageTable;
|
||||
import org.thoughtcrime.securesms.database.RecipientTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
|
||||
Reference in New Issue
Block a user