+ public Pair<GroupId, List<SendMessageResult>> createGroup(
+ String name, List<String> members, File avatarFile
+ ) throws IOException, AttachmentInvalidException, InvalidNumberException {
+ return createGroup(name, members == null ? null : getSignalServiceAddresses(members), avatarFile);
+ }
+
+ private Pair<GroupId, List<SendMessageResult>> createGroup(
+ String name, Set<RecipientId> members, File avatarFile
+ ) throws IOException, AttachmentInvalidException {
+ final var selfRecipientId = account.getSelfRecipientId();
+ if (members != null && members.contains(selfRecipientId)) {
+ members = new HashSet<>(members);
+ members.remove(selfRecipientId);
+ }
+
+ var gv2Pair = groupHelper.createGroupV2(name == null ? "" : name,
+ members == null ? Set.of() : members,
+ avatarFile);
+
+ SignalServiceDataMessage.Builder messageBuilder;
+ if (gv2Pair == null) {
+ // Failed to create v2 group, creating v1 group instead
+ var gv1 = new GroupInfoV1(GroupIdV1.createRandom());
+ gv1.addMembers(List.of(selfRecipientId));
+ final var result = updateGroupV1(gv1, name, members, avatarFile);
+ return new Pair<>(gv1.getGroupId(), result.second());
+ }
+
+ final var gv2 = gv2Pair.first();
+ final var decryptedGroup = gv2Pair.second();
+
+ gv2.setGroup(decryptedGroup, this::resolveRecipient);
+ if (avatarFile != null) {
+ avatarStore.storeGroupAvatar(gv2.getGroupId(),
+ outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+ }
+ messageBuilder = getGroupUpdateMessageBuilder(gv2, null);
+ account.getGroupStore().updateGroup(gv2);
+
+ final var result = sendMessage(messageBuilder, gv2.getMembersIncludingPendingWithout(selfRecipientId));
+ return new Pair<>(gv2.getGroupId(), result.second());
+ }
+
+ public Pair<Long, List<SendMessageResult>> updateGroup(