Read the new GV1 Migration capability.

This commit is contained in:
Greyson Parrelli 2020-10-20 10:48:12 -04:00 committed by Alan Evans
parent 3357475fc4
commit d21782696a
9 changed files with 246 additions and 205 deletions

View File

@ -7,14 +7,15 @@ public final class AppCapabilities {
private AppCapabilities() { private AppCapabilities() {
} }
private static final boolean UUID_CAPABLE = false; private static final boolean UUID_CAPABLE = false;
private static final boolean GV2_CAPABLE = true; private static final boolean GV2_CAPABLE = true;
private static final boolean GV1_MIGRATION_CAPABLE = false;
/** /**
* @param storageCapable Whether or not the user can use storage service. This is another way of * @param storageCapable Whether or not the user can use storage service. This is another way of
* asking if the user has set a Signal PIN or not. * asking if the user has set a Signal PIN or not.
*/ */
public static AccountAttributes.Capabilities getCapabilities(boolean storageCapable) { public static AccountAttributes.Capabilities getCapabilities(boolean storageCapable) {
return new AccountAttributes.Capabilities(UUID_CAPABLE, GV2_CAPABLE, storageCapable); return new AccountAttributes.Capabilities(UUID_CAPABLE, GV2_CAPABLE, storageCapable, GV1_MIGRATION_CAPABLE);
} }
} }

View File

@ -132,7 +132,9 @@ public class RecipientDatabase extends Database {
private static final class Capabilities { private static final class Capabilities {
static final int BIT_LENGTH = 2; static final int BIT_LENGTH = 2;
static final int GROUPS_V2 = 0;
static final int GROUPS_V2 = 0;
static final int GROUPS_V1_MIGRATION = 1;
} }
private static final String[] RECIPIENT_PROJECTION = new String[] { private static final String[] RECIPIENT_PROJECTION = new String[] {
@ -1410,7 +1412,8 @@ public class RecipientDatabase extends Database {
public void setCapabilities(@NonNull RecipientId id, @NonNull SignalServiceProfile.Capabilities capabilities) { public void setCapabilities(@NonNull RecipientId id, @NonNull SignalServiceProfile.Capabilities capabilities) {
long value = 0; long value = 0;
value = Bitmask.update(value, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGv2()).serialize()); value = Bitmask.update(value, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGv2()).serialize());
value = Bitmask.update(value, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGv1Migration()).serialize());
ContentValues values = new ContentValues(1); ContentValues values = new ContentValues(1);
values.put(CAPABILITIES, value); values.put(CAPABILITIES, value);
@ -2599,6 +2602,7 @@ public class RecipientDatabase extends Database {
private final boolean forceSmsSelection; private final boolean forceSmsSelection;
private final long capabilities; private final long capabilities;
private final Recipient.Capability groupsV2Capability; private final Recipient.Capability groupsV2Capability;
private final Recipient.Capability groupsV1MigrationCapability;
private final InsightsBannerTier insightsBannerTier; private final InsightsBannerTier insightsBannerTier;
private final byte[] storageId; private final byte[] storageId;
private final MentionSetting mentionSetting; private final MentionSetting mentionSetting;
@ -2641,43 +2645,44 @@ public class RecipientDatabase extends Database {
@NonNull MentionSetting mentionSetting, @NonNull MentionSetting mentionSetting,
@NonNull SyncExtras syncExtras) @NonNull SyncExtras syncExtras)
{ {
this.id = id; this.id = id;
this.uuid = uuid; this.uuid = uuid;
this.username = username; this.username = username;
this.e164 = e164; this.e164 = e164;
this.email = email; this.email = email;
this.groupId = groupId; this.groupId = groupId;
this.groupType = groupType; this.groupType = groupType;
this.blocked = blocked; this.blocked = blocked;
this.muteUntil = muteUntil; this.muteUntil = muteUntil;
this.messageVibrateState = messageVibrateState; this.messageVibrateState = messageVibrateState;
this.callVibrateState = callVibrateState; this.callVibrateState = callVibrateState;
this.messageRingtone = messageRingtone; this.messageRingtone = messageRingtone;
this.callRingtone = callRingtone; this.callRingtone = callRingtone;
this.color = color; this.color = color;
this.defaultSubscriptionId = defaultSubscriptionId; this.defaultSubscriptionId = defaultSubscriptionId;
this.expireMessages = expireMessages; this.expireMessages = expireMessages;
this.registered = registered; this.registered = registered;
this.profileKey = profileKey; this.profileKey = profileKey;
this.profileKeyCredential = profileKeyCredential; this.profileKeyCredential = profileKeyCredential;
this.systemDisplayName = systemDisplayName; this.systemDisplayName = systemDisplayName;
this.systemContactPhoto = systemContactPhoto; this.systemContactPhoto = systemContactPhoto;
this.systemPhoneLabel = systemPhoneLabel; this.systemPhoneLabel = systemPhoneLabel;
this.systemContactUri = systemContactUri; this.systemContactUri = systemContactUri;
this.signalProfileName = signalProfileName; this.signalProfileName = signalProfileName;
this.signalProfileAvatar = signalProfileAvatar; this.signalProfileAvatar = signalProfileAvatar;
this.hasProfileImage = hasProfileImage; this.hasProfileImage = hasProfileImage;
this.profileSharing = profileSharing; this.profileSharing = profileSharing;
this.lastProfileFetch = lastProfileFetch; this.lastProfileFetch = lastProfileFetch;
this.notificationChannel = notificationChannel; this.notificationChannel = notificationChannel;
this.unidentifiedAccessMode = unidentifiedAccessMode; this.unidentifiedAccessMode = unidentifiedAccessMode;
this.forceSmsSelection = forceSmsSelection; this.forceSmsSelection = forceSmsSelection;
this.capabilities = capabilities; this.capabilities = capabilities;
this.groupsV2Capability = Recipient.Capability.deserialize((int) Bitmask.read(capabilities, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH)); this.groupsV2Capability = Recipient.Capability.deserialize((int) Bitmask.read(capabilities, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH));
this.insightsBannerTier = insightsBannerTier; this.groupsV1MigrationCapability = Recipient.Capability.deserialize((int) Bitmask.read(capabilities, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH));
this.storageId = storageId; this.insightsBannerTier = insightsBannerTier;
this.mentionSetting = mentionSetting; this.storageId = storageId;
this.syncExtras = syncExtras; this.mentionSetting = mentionSetting;
this.syncExtras = syncExtras;
} }
public RecipientId getId() { public RecipientId getId() {
@ -2808,10 +2813,14 @@ public class RecipientDatabase extends Database {
return forceSmsSelection; return forceSmsSelection;
} }
public Recipient.Capability getGroupsV2Capability() { public @NonNull Recipient.Capability getGroupsV2Capability() {
return groupsV2Capability; return groupsV2Capability;
} }
public @NonNull Recipient.Capability getGroupsV1MigrationCapability() {
return groupsV1MigrationCapability;
}
public @Nullable byte[] getStorageId() { public @Nullable byte[] getStorageId() {
return storageId; return storageId;
} }

View File

@ -79,6 +79,7 @@ public class RefreshAttributesJob extends BaseJob {
"\n Capabilities:" + "\n Capabilities:" +
"\n Storage? " + capabilities.isStorage() + "\n Storage? " + capabilities.isStorage() +
"\n GV2? " + capabilities.isGv2() + "\n GV2? " + capabilities.isGv2() +
"\n GV1 Migration? " + capabilities.isGv1Migration() +
"\n UUID? " + capabilities.isUuid()); "\n UUID? " + capabilities.isUuid());
SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager();

View File

@ -30,7 +30,12 @@ public final class LogSectionCapabilities implements LogSection {
AccountAttributes.Capabilities capabilities = AppCapabilities.getCapabilities(false); AccountAttributes.Capabilities capabilities = AppCapabilities.getCapabilities(false);
return new StringBuilder().append("Local device GV2: ").append(capabilities.isGv2()).append("\n") return new StringBuilder().append("-- Local").append("\n")
.append("Global GV2 : ").append(self.getGroupsV2Capability()).append("\n"); .append("GV2 : ").append(capabilities.isGv2()).append("\n")
.append("GV1 Migration: ").append(capabilities.isGv1Migration()).append("\n")
.append("\n")
.append("-- Global").append("\n")
.append("GV2 : ").append(self.getGroupsV2Capability()).append("\n")
.append("GV1 Migration: ").append(self.getGroupsV1MigrationCapability()).append("\n");
} }
} }

View File

@ -98,6 +98,7 @@ public class Recipient {
private final UnidentifiedAccessMode unidentifiedAccessMode; private final UnidentifiedAccessMode unidentifiedAccessMode;
private final boolean forceSmsSelection; private final boolean forceSmsSelection;
private final Capability groupsV2Capability; private final Capability groupsV2Capability;
private final Capability groupsV1MigrationCapability;
private final InsightsBannerTier insightsBannerTier; private final InsightsBannerTier insightsBannerTier;
private final byte[] storageId; private final byte[] storageId;
private final MentionSetting mentionSetting; private final MentionSetting mentionSetting;
@ -275,85 +276,87 @@ public class Recipient {
} }
Recipient(@NonNull RecipientId id) { Recipient(@NonNull RecipientId id) {
this.id = id; this.id = id;
this.resolving = true; this.resolving = true;
this.uuid = null; this.uuid = null;
this.username = null; this.username = null;
this.e164 = null; this.e164 = null;
this.email = null; this.email = null;
this.groupId = null; this.groupId = null;
this.participants = Collections.emptyList(); this.participants = Collections.emptyList();
this.groupAvatarId = Optional.absent(); this.groupAvatarId = Optional.absent();
this.isSelf = false; this.isSelf = false;
this.blocked = false; this.blocked = false;
this.muteUntil = 0; this.muteUntil = 0;
this.messageVibrate = VibrateState.DEFAULT; this.messageVibrate = VibrateState.DEFAULT;
this.callVibrate = VibrateState.DEFAULT; this.callVibrate = VibrateState.DEFAULT;
this.messageRingtone = null; this.messageRingtone = null;
this.callRingtone = null; this.callRingtone = null;
this.color = null; this.color = null;
this.insightsBannerTier = InsightsBannerTier.TIER_TWO; this.insightsBannerTier = InsightsBannerTier.TIER_TWO;
this.defaultSubscriptionId = Optional.absent(); this.defaultSubscriptionId = Optional.absent();
this.expireMessages = 0; this.expireMessages = 0;
this.registered = RegisteredState.UNKNOWN; this.registered = RegisteredState.UNKNOWN;
this.profileKey = null; this.profileKey = null;
this.profileKeyCredential = null; this.profileKeyCredential = null;
this.name = null; this.name = null;
this.systemContactPhoto = null; this.systemContactPhoto = null;
this.customLabel = null; this.customLabel = null;
this.contactUri = null; this.contactUri = null;
this.profileName = ProfileName.EMPTY; this.profileName = ProfileName.EMPTY;
this.profileAvatar = null; this.profileAvatar = null;
this.hasProfileImage = false; this.hasProfileImage = false;
this.profileSharing = false; this.profileSharing = false;
this.lastProfileFetch = 0; this.lastProfileFetch = 0;
this.notificationChannel = null; this.notificationChannel = null;
this.unidentifiedAccessMode = UnidentifiedAccessMode.DISABLED; this.unidentifiedAccessMode = UnidentifiedAccessMode.DISABLED;
this.forceSmsSelection = false; this.forceSmsSelection = false;
this.groupsV2Capability = Capability.UNKNOWN; this.groupsV2Capability = Capability.UNKNOWN;
this.storageId = null; this.groupsV1MigrationCapability = Capability.UNKNOWN;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY; this.storageId = null;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY;
} }
public Recipient(@NonNull RecipientId id, @NonNull RecipientDetails details, boolean resolved) { public Recipient(@NonNull RecipientId id, @NonNull RecipientDetails details, boolean resolved) {
this.id = id; this.id = id;
this.resolving = !resolved; this.resolving = !resolved;
this.uuid = details.uuid; this.uuid = details.uuid;
this.username = details.username; this.username = details.username;
this.e164 = details.e164; this.e164 = details.e164;
this.email = details.email; this.email = details.email;
this.groupId = details.groupId; this.groupId = details.groupId;
this.participants = details.participants; this.participants = details.participants;
this.groupAvatarId = details.groupAvatarId; this.groupAvatarId = details.groupAvatarId;
this.isSelf = details.isSelf; this.isSelf = details.isSelf;
this.blocked = details.blocked; this.blocked = details.blocked;
this.muteUntil = details.mutedUntil; this.muteUntil = details.mutedUntil;
this.messageVibrate = details.messageVibrateState; this.messageVibrate = details.messageVibrateState;
this.callVibrate = details.callVibrateState; this.callVibrate = details.callVibrateState;
this.messageRingtone = details.messageRingtone; this.messageRingtone = details.messageRingtone;
this.callRingtone = details.callRingtone; this.callRingtone = details.callRingtone;
this.color = details.color; this.color = details.color;
this.insightsBannerTier = details.insightsBannerTier; this.insightsBannerTier = details.insightsBannerTier;
this.defaultSubscriptionId = details.defaultSubscriptionId; this.defaultSubscriptionId = details.defaultSubscriptionId;
this.expireMessages = details.expireMessages; this.expireMessages = details.expireMessages;
this.registered = details.registered; this.registered = details.registered;
this.profileKey = details.profileKey; this.profileKey = details.profileKey;
this.profileKeyCredential = details.profileKeyCredential; this.profileKeyCredential = details.profileKeyCredential;
this.name = details.name; this.name = details.name;
this.systemContactPhoto = details.systemContactPhoto; this.systemContactPhoto = details.systemContactPhoto;
this.customLabel = details.customLabel; this.customLabel = details.customLabel;
this.contactUri = details.contactUri; this.contactUri = details.contactUri;
this.profileName = details.profileName; this.profileName = details.profileName;
this.profileAvatar = details.profileAvatar; this.profileAvatar = details.profileAvatar;
this.hasProfileImage = details.hasProfileImage; this.hasProfileImage = details.hasProfileImage;
this.profileSharing = details.profileSharing; this.profileSharing = details.profileSharing;
this.lastProfileFetch = details.lastProfileFetch; this.lastProfileFetch = details.lastProfileFetch;
this.notificationChannel = details.notificationChannel; this.notificationChannel = details.notificationChannel;
this.unidentifiedAccessMode = details.unidentifiedAccessMode; this.unidentifiedAccessMode = details.unidentifiedAccessMode;
this.forceSmsSelection = details.forceSmsSelection; this.forceSmsSelection = details.forceSmsSelection;
this.groupsV2Capability = details.groupsV2Capability; this.groupsV2Capability = details.groupsV2Capability;
this.storageId = details.storageId; this.groupsV1MigrationCapability = details.groupsV1MigrationCapability;
this.mentionSetting = details.mentionSetting; this.storageId = details.storageId;
this.mentionSetting = details.mentionSetting;
} }
public @NonNull RecipientId getId() { public @NonNull RecipientId getId() {
@ -737,10 +740,14 @@ public class Recipient {
return forceSmsSelection; return forceSmsSelection;
} }
public Capability getGroupsV2Capability() { public @NonNull Capability getGroupsV2Capability() {
return groupsV2Capability; return groupsV2Capability;
} }
public @NonNull Capability getGroupsV1MigrationCapability() {
return groupsV1MigrationCapability;
}
public @Nullable byte[] getProfileKey() { public @Nullable byte[] getProfileKey() {
return profileKey; return profileKey;
} }

View File

@ -60,6 +60,7 @@ public class RecipientDetails {
final UnidentifiedAccessMode unidentifiedAccessMode; final UnidentifiedAccessMode unidentifiedAccessMode;
final boolean forceSmsSelection; final boolean forceSmsSelection;
final Recipient.Capability groupsV2Capability; final Recipient.Capability groupsV2Capability;
final Recipient.Capability groupsV1MigrationCapability;
final InsightsBannerTier insightsBannerTier; final InsightsBannerTier insightsBannerTier;
final byte[] storageId; final byte[] storageId;
final MentionSetting mentionSetting; final MentionSetting mentionSetting;
@ -71,42 +72,43 @@ public class RecipientDetails {
@NonNull RecipientSettings settings, @NonNull RecipientSettings settings,
@Nullable List<Recipient> participants) @Nullable List<Recipient> participants)
{ {
this.groupAvatarId = groupAvatarId; this.groupAvatarId = groupAvatarId;
this.systemContactPhoto = Util.uri(settings.getSystemContactPhotoUri()); this.systemContactPhoto = Util.uri(settings.getSystemContactPhotoUri());
this.customLabel = settings.getSystemPhoneLabel(); this.customLabel = settings.getSystemPhoneLabel();
this.contactUri = Util.uri(settings.getSystemContactUri()); this.contactUri = Util.uri(settings.getSystemContactUri());
this.uuid = settings.getUuid(); this.uuid = settings.getUuid();
this.username = settings.getUsername(); this.username = settings.getUsername();
this.e164 = settings.getE164(); this.e164 = settings.getE164();
this.email = settings.getEmail(); this.email = settings.getEmail();
this.groupId = settings.getGroupId(); this.groupId = settings.getGroupId();
this.color = settings.getColor(); this.color = settings.getColor();
this.messageRingtone = settings.getMessageRingtone(); this.messageRingtone = settings.getMessageRingtone();
this.callRingtone = settings.getCallRingtone(); this.callRingtone = settings.getCallRingtone();
this.mutedUntil = settings.getMuteUntil(); this.mutedUntil = settings.getMuteUntil();
this.messageVibrateState = settings.getMessageVibrateState(); this.messageVibrateState = settings.getMessageVibrateState();
this.callVibrateState = settings.getCallVibrateState(); this.callVibrateState = settings.getCallVibrateState();
this.blocked = settings.isBlocked(); this.blocked = settings.isBlocked();
this.expireMessages = settings.getExpireMessages(); this.expireMessages = settings.getExpireMessages();
this.participants = participants == null ? new LinkedList<>() : participants; this.participants = participants == null ? new LinkedList<>() : participants;
this.profileName = settings.getProfileName(); this.profileName = settings.getProfileName();
this.defaultSubscriptionId = settings.getDefaultSubscriptionId(); this.defaultSubscriptionId = settings.getDefaultSubscriptionId();
this.registered = settings.getRegistered(); this.registered = settings.getRegistered();
this.profileKey = settings.getProfileKey(); this.profileKey = settings.getProfileKey();
this.profileKeyCredential = settings.getProfileKeyCredential(); this.profileKeyCredential = settings.getProfileKeyCredential();
this.profileAvatar = settings.getProfileAvatar(); this.profileAvatar = settings.getProfileAvatar();
this.hasProfileImage = settings.hasProfileImage(); this.hasProfileImage = settings.hasProfileImage();
this.profileSharing = settings.isProfileSharing(); this.profileSharing = settings.isProfileSharing();
this.lastProfileFetch = settings.getLastProfileFetch(); this.lastProfileFetch = settings.getLastProfileFetch();
this.systemContact = systemContact; this.systemContact = systemContact;
this.isSelf = isSelf; this.isSelf = isSelf;
this.notificationChannel = settings.getNotificationChannel(); this.notificationChannel = settings.getNotificationChannel();
this.unidentifiedAccessMode = settings.getUnidentifiedAccessMode(); this.unidentifiedAccessMode = settings.getUnidentifiedAccessMode();
this.forceSmsSelection = settings.isForceSmsSelection(); this.forceSmsSelection = settings.isForceSmsSelection();
this.groupsV2Capability = settings.getGroupsV2Capability(); this.groupsV2Capability = settings.getGroupsV2Capability();
this.insightsBannerTier = settings.getInsightsBannerTier(); this.groupsV1MigrationCapability = settings.getGroupsV1MigrationCapability();
this.storageId = settings.getStorageId(); this.insightsBannerTier = settings.getInsightsBannerTier();
this.mentionSetting = settings.getMentionSetting(); this.storageId = settings.getStorageId();
this.mentionSetting = settings.getMentionSetting();
if (name == null) this.name = settings.getSystemDisplayName(); if (name == null) this.name = settings.getSystemDisplayName();
else this.name = name; else this.name = name;
@ -116,43 +118,44 @@ public class RecipientDetails {
* Only used for {@link Recipient#UNKNOWN}. * Only used for {@link Recipient#UNKNOWN}.
*/ */
RecipientDetails() { RecipientDetails() {
this.groupAvatarId = null; this.groupAvatarId = null;
this.systemContactPhoto = null; this.systemContactPhoto = null;
this.customLabel = null; this.customLabel = null;
this.contactUri = null; this.contactUri = null;
this.uuid = null; this.uuid = null;
this.username = null; this.username = null;
this.e164 = null; this.e164 = null;
this.email = null; this.email = null;
this.groupId = null; this.groupId = null;
this.color = null; this.color = null;
this.messageRingtone = null; this.messageRingtone = null;
this.callRingtone = null; this.callRingtone = null;
this.mutedUntil = 0; this.mutedUntil = 0;
this.messageVibrateState = VibrateState.DEFAULT; this.messageVibrateState = VibrateState.DEFAULT;
this.callVibrateState = VibrateState.DEFAULT; this.callVibrateState = VibrateState.DEFAULT;
this.blocked = false; this.blocked = false;
this.expireMessages = 0; this.expireMessages = 0;
this.participants = new LinkedList<>(); this.participants = new LinkedList<>();
this.profileName = ProfileName.EMPTY; this.profileName = ProfileName.EMPTY;
this.insightsBannerTier = InsightsBannerTier.TIER_TWO; this.insightsBannerTier = InsightsBannerTier.TIER_TWO;
this.defaultSubscriptionId = Optional.absent(); this.defaultSubscriptionId = Optional.absent();
this.registered = RegisteredState.UNKNOWN; this.registered = RegisteredState.UNKNOWN;
this.profileKey = null; this.profileKey = null;
this.profileKeyCredential = null; this.profileKeyCredential = null;
this.profileAvatar = null; this.profileAvatar = null;
this.hasProfileImage = false; this.hasProfileImage = false;
this.profileSharing = false; this.profileSharing = false;
this.lastProfileFetch = 0; this.lastProfileFetch = 0;
this.systemContact = true; this.systemContact = true;
this.isSelf = false; this.isSelf = false;
this.notificationChannel = null; this.notificationChannel = null;
this.unidentifiedAccessMode = UnidentifiedAccessMode.UNKNOWN; this.unidentifiedAccessMode = UnidentifiedAccessMode.UNKNOWN;
this.forceSmsSelection = false; this.forceSmsSelection = false;
this.name = null; this.name = null;
this.groupsV2Capability = Recipient.Capability.UNKNOWN; this.groupsV2Capability = Recipient.Capability.UNKNOWN;
this.storageId = null; this.groupsV1MigrationCapability = Recipient.Capability.UNKNOWN;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY; this.storageId = null;
this.mentionSetting = MentionSetting.ALWAYS_NOTIFY;
} }
public static @NonNull RecipientDetails forIndividual(@NonNull Context context, @NonNull RecipientSettings settings) { public static @NonNull RecipientDetails forIndividual(@NonNull Context context, @NonNull RecipientSettings settings) {

View File

@ -125,13 +125,17 @@ public class AccountAttributes {
@JsonProperty @JsonProperty
private boolean storage; private boolean storage;
@JsonProperty("gv1-migration")
private boolean gv1Migration;
@JsonCreator @JsonCreator
public Capabilities() {} public Capabilities() {}
public Capabilities(boolean uuid, boolean gv2, boolean storage) { public Capabilities(boolean uuid, boolean gv2, boolean storage, boolean gv1Migration) {
this.uuid = uuid; this.uuid = uuid;
this.gv2 = gv2; this.gv2 = gv2;
this.storage = storage; this.storage = storage;
this.gv1Migration = gv1Migration;
} }
public boolean isUuid() { public boolean isUuid() {
@ -145,5 +149,9 @@ public class AccountAttributes {
public boolean isStorage() { public boolean isStorage() {
return storage; return storage;
} }
public boolean isGv1Migration() {
return gv1Migration;
}
} }
} }

View File

@ -97,6 +97,9 @@ public class SignalServiceProfile {
@JsonProperty @JsonProperty
private boolean storage; private boolean storage;
@JsonProperty("gv1-migration")
private boolean gv1Migration;
@JsonCreator @JsonCreator
public Capabilities() {} public Capabilities() {}
@ -107,6 +110,10 @@ public class SignalServiceProfile {
public boolean isStorage() { public boolean isStorage() {
return storage; return storage;
} }
public boolean isGv1Migration() {
return gv1Migration;
}
} }
public ProfileKeyCredentialResponse getProfileKeyCredentialResponse() { public ProfileKeyCredentialResponse getProfileKeyCredentialResponse() {

View File

@ -16,7 +16,7 @@ public final class AccountAttributesTest {
"reglock1234", "reglock1234",
new byte[10], new byte[10],
false, false,
new AccountAttributes.Capabilities(true, true, true), new AccountAttributes.Capabilities(true, true, true, true),
false)); false));
assertEquals("{\"signalingKey\":\"skey\"," + assertEquals("{\"signalingKey\":\"skey\"," +
"\"registrationId\":123," + "\"registrationId\":123," +
@ -28,19 +28,19 @@ public final class AccountAttributesTest {
"\"unidentifiedAccessKey\":\"AAAAAAAAAAAAAA==\"," + "\"unidentifiedAccessKey\":\"AAAAAAAAAAAAAA==\"," +
"\"unrestrictedUnidentifiedAccess\":false," + "\"unrestrictedUnidentifiedAccess\":false," +
"\"discoverableByPhoneNumber\":false," + "\"discoverableByPhoneNumber\":false," +
"\"capabilities\":{\"uuid\":true,\"storage\":true,\"gv2-3\":true}}", json); "\"capabilities\":{\"uuid\":true,\"storage\":true,\"gv2-3\":true,\"gv1-migration\":true}}", json);
} }
@Test @Test
public void gv2_true() { public void gv2_true() {
String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, true, false)); String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, true, false, false));
assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-3\":true}", json); assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-3\":true,\"gv1-migration\":false}", json);
} }
@Test @Test
public void gv2_false() { public void gv2_false() {
String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, false, false)); String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, false, false, false));
assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-3\":false}", json); assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-3\":false,\"gv1-migration\":false}", json);
} }
} }