1 package org
.asamk
.signal
.manager
.helper
;
3 import org
.signal
.storageservice
.protos
.groups
.Member
;
4 import org
.signal
.zkgroup
.groups
.GroupSecretParams
;
5 import org
.signal
.zkgroup
.profiles
.ProfileKeyCredential
;
6 import org
.whispersystems
.libsignal
.util
.guava
.Optional
;
7 import org
.whispersystems
.signalservice
.api
.groupsv2
.GroupCandidate
;
8 import org
.whispersystems
.signalservice
.api
.groupsv2
.GroupsV2Operations
;
9 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
11 import java
.util
.Collection
;
13 import java
.util
.stream
.Collectors
;
15 public class GroupHelper
{
17 private final ProfileKeyCredentialProvider profileKeyCredentialProvider
;
19 private final ProfileProvider profileProvider
;
21 private final SelfAddressProvider selfAddressProvider
;
23 private final GroupsV2Operations groupsV2Operations
;
26 final ProfileKeyCredentialProvider profileKeyCredentialProvider
,
27 final ProfileProvider profileProvider
,
28 final SelfAddressProvider selfAddressProvider
,
29 final GroupsV2Operations groupsV2Operations
31 this.profileKeyCredentialProvider
= profileKeyCredentialProvider
;
32 this.profileProvider
= profileProvider
;
33 this.selfAddressProvider
= selfAddressProvider
;
34 this.groupsV2Operations
= groupsV2Operations
;
37 public GroupsV2Operations
.NewGroup
createGroupV2(
38 String name
, Collection
<SignalServiceAddress
> members
, byte[] avatar
40 final ProfileKeyCredential profileKeyCredential
= profileKeyCredentialProvider
.getProfileKeyCredential(
41 selfAddressProvider
.getSelfAddress());
42 if (profileKeyCredential
== null) {
43 System
.err
.println("Cannot create a V2 group as self does not have a versioned profile");
47 final int noUuidCapability
= members
.stream()
48 .filter(address
-> !address
.getUuid().isPresent())
49 .collect(Collectors
.toUnmodifiableSet())
51 if (noUuidCapability
> 0) {
52 System
.err
.println("Cannot create a V2 group as " + noUuidCapability
+ " members don't have a UUID.");
56 final int noGv2Capability
= members
.stream()
57 .map(profileProvider
::getProfile
)
58 .filter(profile
-> !profile
.getCapabilities().gv2
)
59 .collect(Collectors
.toUnmodifiableSet())
61 if (noGv2Capability
> 0) {
62 System
.err
.println("Cannot create a V2 group as " + noGv2Capability
+ " members don't support Groups V2.");
66 GroupCandidate self
= new GroupCandidate(selfAddressProvider
.getSelfAddress().getUuid().orNull(),
67 Optional
.fromNullable(profileKeyCredential
));
68 Set
<GroupCandidate
> candidates
= members
.stream()
69 .map(member
-> new GroupCandidate(member
.getUuid().get(),
70 Optional
.fromNullable(profileKeyCredentialProvider
.getProfileKeyCredential(member
))))
71 .collect(Collectors
.toSet());
73 final GroupSecretParams groupSecretParams
= GroupSecretParams
.generate();
74 return groupsV2Operations
.createNewGroup(groupSecretParams
,
76 Optional
.fromNullable(avatar
),