From a13599ae2a07492e8f2e092b02429dfc6dd9b972 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 21 Dec 2022 10:01:20 -0500 Subject: [PATCH] Add payment activation capability. --- .../RecipientTableTest_getAndPossiblyMerge.kt | 8 +- .../securesms/testing/SignalActivityRule.kt | 2 +- .../securesms/AppCapabilities.java | 28 --- .../thoughtcrime/securesms/AppCapabilities.kt | 27 +++ .../securesms/database/RecipientTable.kt | 3 + .../database/model/RecipientRecord.kt | 2 + .../securesms/jobs/RefreshAttributesJob.java | 12 +- .../securesms/mms/AttachmentManager.java | 2 +- .../securesms/recipients/Recipient.java | 8 + .../database/RecipientDatabaseTestUtils.kt | 1 + gradle/verification-metadata.xml | 10 + libsignal/service/build.gradle | 1 + .../api/account/AccountAttributes.java | 221 ------------------ .../api/account/AccountAttributes.kt | 69 ++++++ .../api/profiles/SignalServiceProfile.java | 10 +- 15 files changed, 137 insertions(+), 267 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.kt delete mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java create mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.kt diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index a14726cc1..030fa0265 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -418,8 +418,8 @@ class RecipientTableTest_getAndPossiblyMerge { SignalDatabase.sessions.store(ACI_SELF, SignalProtocolAddress(ACI_A.toString(), 1), SessionRecord()) - SignalDatabase.reactions.addReaction(MessageId(smsId1, false), ReactionRecord("a", recipientIdAci, 1, 1)) - SignalDatabase.reactions.addReaction(MessageId(mmsId1, true), ReactionRecord("b", recipientIdE164, 1, 1)) + SignalDatabase.reactions.addReaction(MessageId(smsId1), ReactionRecord("a", recipientIdAci, 1, 1)) + SignalDatabase.reactions.addReaction(MessageId(mmsId1), ReactionRecord("b", recipientIdE164, 1, 1)) val profile1: NotificationProfile = notificationProfile(name = "Test") val profile2: NotificationProfile = notificationProfile(name = "Test2") @@ -497,8 +497,8 @@ class RecipientTableTest_getAndPossiblyMerge { Assert.assertNotNull(SignalDatabase.sessions.load(ACI_SELF, SignalProtocolAddress(ACI_A.toString(), 1))) // Reaction validation - val reactionsSms: List = SignalDatabase.reactions.getReactions(MessageId(smsId1, false)) - val reactionsMms: List = SignalDatabase.reactions.getReactions(MessageId(mmsId1, true)) + val reactionsSms: List = SignalDatabase.reactions.getReactions(MessageId(smsId1)) + val reactionsMms: List = SignalDatabase.reactions.getReactions(MessageId(mmsId1)) assertEquals(1, reactionsSms.size) assertEquals(ReactionRecord("a", recipientIdAci, 1, 1), reactionsSms[0]) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt index c725182c3..282a22265 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt @@ -108,7 +108,7 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() val recipientId = RecipientId.from(SignalServiceAddress(aci, "+15555551%03d".format(i))) SignalDatabase.recipients.setProfileName(recipientId, ProfileName.fromParts("Buddy", "#$i")) SignalDatabase.recipients.setProfileKeyIfAbsent(recipientId, ProfileKeyUtil.createNew()) - SignalDatabase.recipients.setCapabilities(recipientId, SignalServiceProfile.Capabilities(true, true, true, true, true, true, true, true)) + SignalDatabase.recipients.setCapabilities(recipientId, SignalServiceProfile.Capabilities(true, true, true, true, true, true, true, true, true)) SignalDatabase.recipients.setProfileSharing(recipientId, true) SignalDatabase.recipients.markRegistered(recipientId, aci) ApplicationDependencies.getProtocolStore().aci().saveIdentity(SignalProtocolAddress(aci.toString(), 0), IdentityKeyUtil.generateIdentityKeyPair().publicKey) diff --git a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java deleted file mode 100644 index a781f488d..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.thoughtcrime.securesms; - -import org.thoughtcrime.securesms.stories.Stories; -import org.thoughtcrime.securesms.util.FeatureFlags; -import org.whispersystems.signalservice.api.account.AccountAttributes; - -public final class AppCapabilities { - - private AppCapabilities() { - } - - private static final boolean UUID_CAPABLE = false; - private static final boolean GV2_CAPABLE = true; - private static final boolean GV1_MIGRATION = true; - private static final boolean ANNOUNCEMENT_GROUPS = true; - private static final boolean SENDER_KEY = true; - private static final boolean CHANGE_NUMBER = true; - private static final boolean STORIES = true; - private static final boolean GIFT_BADGES = true; - - /** - * @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. - */ - public static AccountAttributes.Capabilities getCapabilities(boolean storageCapable) { - return new AccountAttributes.Capabilities(UUID_CAPABLE, GV2_CAPABLE, storageCapable, GV1_MIGRATION, SENDER_KEY, ANNOUNCEMENT_GROUPS, CHANGE_NUMBER, STORIES, GIFT_BADGES, FeatureFlags.phoneNumberPrivacy()); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.kt b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.kt new file mode 100644 index 000000000..73f2c6aff --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.kt @@ -0,0 +1,27 @@ +package org.thoughtcrime.securesms + +import org.thoughtcrime.securesms.util.FeatureFlags +import org.whispersystems.signalservice.api.account.AccountAttributes + +object AppCapabilities { + /** + * @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. + */ + @JvmStatic + fun getCapabilities(storageCapable: Boolean): AccountAttributes.Capabilities { + return AccountAttributes.Capabilities( + isUuid = false, + isGv2 = true, + isStorage = storageCapable, + isGv1Migration = true, + isSenderKey = true, + isAnnouncementGroup = true, + isChangeNumber = true, + isStories = true, + isGiftBadges = true, + isPnp = FeatureFlags.phoneNumberPrivacy(), + paymentActivation = true + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index 438e3c527..46c014045 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -1552,6 +1552,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da value = Bitmask.update(value, Capabilities.STORIES, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isStories).serialize().toLong()) value = Bitmask.update(value, Capabilities.GIFT_BADGES, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGiftBadges).serialize().toLong()) value = Bitmask.update(value, Capabilities.PNP, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isPnp).serialize().toLong()) + value = Bitmask.update(value, Capabilities.PAYMENT_ACTIVATION, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isPaymentActivation).serialize().toLong()) val values = ContentValues(1).apply { put(CAPABILITIES, value) @@ -3919,6 +3920,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da storiesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.STORIES, Capabilities.BIT_LENGTH).toInt()), giftBadgesCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GIFT_BADGES, Capabilities.BIT_LENGTH).toInt()), pnpCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.PNP, Capabilities.BIT_LENGTH).toInt()), + paymentActivation = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.PAYMENT_ACTIVATION, Capabilities.BIT_LENGTH).toInt()), ) } @@ -4240,6 +4242,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da const val STORIES = 5 const val GIFT_BADGES = 6 const val PNP = 7 + const val PAYMENT_ACTIVATION = 8 } enum class VibrateState(val id: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt index c51b12bd5..898e16e26 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt @@ -125,6 +125,7 @@ data class RecipientRecord( val storiesCapability: Recipient.Capability, val giftBadgesCapability: Recipient.Capability, val pnpCapability: Recipient.Capability, + val paymentActivation: Recipient.Capability ) { companion object { @JvmField @@ -136,6 +137,7 @@ data class RecipientRecord( Recipient.Capability.UNKNOWN, Recipient.Capability.UNKNOWN, Recipient.Capability.UNKNOWN, + Recipient.Capability.UNKNOWN, Recipient.Capability.UNKNOWN ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java index 1aec897d6..faa1d02f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java @@ -108,17 +108,7 @@ public class RefreshAttributesJob extends BaseJob { Log.i(TAG, "Calling setAccountAttributes() reglockV1? " + !TextUtils.isEmpty(registrationLockV1) + ", reglockV2? " + !TextUtils.isEmpty(registrationLockV2) + ", pin? " + kbsValues.hasPin() + "\n Phone number discoverable : " + phoneNumberDiscoverable + "\n Device Name : " + (encryptedDeviceName != null) + - "\n Capabilities:" + - "\n Storage? " + capabilities.isStorage() + - "\n GV2? " + capabilities.isGv2() + - "\n GV1 Migration? " + capabilities.isGv1Migration() + - "\n Sender Key? " + capabilities.isSenderKey() + - "\n Announcement Groups? " + capabilities.isAnnouncementGroup() + - "\n Change Number? " + capabilities.isChangeNumber() + - "\n Stories? " + capabilities.isStories() + - "\n Gift Badges? " + capabilities.isGiftBadges() + - "\n PNP? " + capabilities.isPnp() + - "\n UUID? " + capabilities.isUuid()); + "\n Capabilities: " + capabilities); SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); signalAccountManager.setAccountAttributes(null, diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java index 83421f018..13c21703d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -450,7 +450,7 @@ public class AttachmentManager { intent.putExtra(PaymentsActivity.EXTRA_PAYMENTS_STARTING_ACTION, R.id.action_directly_to_createPayment); intent.putExtra(PaymentsActivity.EXTRA_STARTING_ARGUMENTS, new CreatePaymentFragmentArgs.Builder(new PayeeParcelable(recipient.getId())).setFinishOnConfirm(true).build().toBundle()); fragment.startActivity(intent); - } else if (FeatureFlags.paymentsRequestActivateFlow()) { + } else if (FeatureFlags.paymentsRequestActivateFlow() && recipient.getPaymentActivationCapability().isSupported()) { showRequestToActivatePayments(fragment.requireContext(), recipient); } else { RecipientHasNotEnabledPaymentsDialog.show(fragment.requireContext()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java index ad0919b39..cdd934945 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -1024,6 +1024,10 @@ public class Recipient { return capabilities.getPnpCapability(); } + public @NonNull Capability getPaymentActivationCapability() { + return capabilities.getPaymentActivation(); + } + public @Nullable byte[] getProfileKey() { return profileKey; } @@ -1213,6 +1217,10 @@ public class Recipient { return value; } + public boolean isSupported() { + return this == SUPPORTED; + } + public static Capability deserialize(int value) { switch (value) { case 0: return UNKNOWN; diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt b/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt index 15c409b90..2913d1b9d 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt @@ -136,6 +136,7 @@ object RecipientDatabaseTestUtils { Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientTable.Capabilities.STORIES, RecipientTable.Capabilities.BIT_LENGTH).toInt()), Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientTable.Capabilities.GIFT_BADGES, RecipientTable.Capabilities.BIT_LENGTH).toInt()), Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientTable.Capabilities.PNP, RecipientTable.Capabilities.BIT_LENGTH).toInt()), + Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientTable.Capabilities.PAYMENT_ACTIVATION, RecipientTable.Capabilities.BIT_LENGTH).toInt()), ), insightBannerTier, storageId, diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 277553922..77aab3f0b 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -3692,6 +3692,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -3792,6 +3797,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + diff --git a/libsignal/service/build.gradle b/libsignal/service/build.gradle index 5d99b0ef2..84d904054 100644 --- a/libsignal/service/build.gradle +++ b/libsignal/service/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation libs.google.protobuf.javalite api libs.google.libphonenumber api libs.jackson.core + api libs.jackson.module.kotlin implementation libs.libsignal.client api libs.square.okhttp3 diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java deleted file mode 100644 index 3199e830b..000000000 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2014-2016 Open Whisper Systems - * - * Licensed according to the LICENSE file in this repository. - */ - -package org.whispersystems.signalservice.api.account; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class AccountAttributes { - - @JsonProperty - private String signalingKey; - - @JsonProperty - private int registrationId; - - @JsonProperty - private boolean voice; - - @JsonProperty - private boolean video; - - @JsonProperty - private boolean fetchesMessages; - - @JsonProperty - private String pin; - - @JsonProperty - private String registrationLock; - - @JsonProperty - private byte[] unidentifiedAccessKey; - - @JsonProperty - private boolean unrestrictedUnidentifiedAccess; - - @JsonProperty - private boolean discoverableByPhoneNumber; - - @JsonProperty - private Capabilities capabilities; - - @JsonProperty - private String name; - - @JsonProperty - private int pniRegistrationId; - - public AccountAttributes(String signalingKey, - int registrationId, - boolean fetchesMessages, - String pin, - String registrationLock, - byte[] unidentifiedAccessKey, - boolean unrestrictedUnidentifiedAccess, - Capabilities capabilities, - boolean discoverableByPhoneNumber, - String name, - int pniRegistrationId) - { - this.signalingKey = signalingKey; - this.registrationId = registrationId; - this.voice = true; - this.video = true; - this.fetchesMessages = fetchesMessages; - this.pin = pin; - this.registrationLock = registrationLock; - this.unidentifiedAccessKey = unidentifiedAccessKey; - this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess; - this.capabilities = capabilities; - this.discoverableByPhoneNumber = discoverableByPhoneNumber; - this.name = name; - this.pniRegistrationId = pniRegistrationId; - } - - public AccountAttributes() {} - - public String getSignalingKey() { - return signalingKey; - } - - public int getRegistrationId() { - return registrationId; - } - - public boolean isVoice() { - return voice; - } - - public boolean isVideo() { - return video; - } - - public boolean isFetchesMessages() { - return fetchesMessages; - } - - public String getPin() { - return pin; - } - - public String getRegistrationLock() { - return registrationLock; - } - - public byte[] getUnidentifiedAccessKey() { - return unidentifiedAccessKey; - } - - public boolean isUnrestrictedUnidentifiedAccess() { - return unrestrictedUnidentifiedAccess; - } - - public boolean isDiscoverableByPhoneNumber() { - return discoverableByPhoneNumber; - } - - public Capabilities getCapabilities() { - return capabilities; - } - - public String getName() { - return name; - } - - public int getPniRegistrationId() { - return pniRegistrationId; - } - - public static class Capabilities { - @JsonProperty - private boolean uuid; - - @JsonProperty("gv2-3") - private boolean gv2; - - @JsonProperty - private boolean storage; - - @JsonProperty("gv1-migration") - private boolean gv1Migration; - - @JsonProperty - private boolean senderKey; - - @JsonProperty - private boolean announcementGroup; - - @JsonProperty - private boolean changeNumber; - - @JsonProperty - private boolean stories; - - @JsonProperty - private boolean giftBadges; - - @JsonProperty - private boolean pni; - - @JsonCreator - public Capabilities() {} - - public Capabilities(boolean uuid, boolean gv2, boolean storage, boolean gv1Migration, boolean senderKey, boolean announcementGroup, boolean changeNumber, boolean stories, boolean giftBadges, boolean pni) { - this.uuid = uuid; - this.gv2 = gv2; - this.storage = storage; - this.gv1Migration = gv1Migration; - this.senderKey = senderKey; - this.announcementGroup = announcementGroup; - this.changeNumber = changeNumber; - this.stories = stories; - this.giftBadges = giftBadges; - this.pni = pni; - } - - public boolean isUuid() { - return uuid; - } - - public boolean isGv2() { - return gv2; - } - - public boolean isStorage() { - return storage; - } - - public boolean isGv1Migration() { - return gv1Migration; - } - - public boolean isSenderKey() { - return senderKey; - } - - public boolean isAnnouncementGroup() { - return announcementGroup; - } - - public boolean isChangeNumber() { - return changeNumber; - } - - public boolean isStories() { - return stories; - } - - public boolean isGiftBadges() { - return giftBadges; - } - - public boolean isPnp() { - return pni; - } - } -} diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.kt new file mode 100644 index 000000000..550dee8bb --- /dev/null +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.kt @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.whispersystems.signalservice.api.account + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty + +@JsonIgnoreProperties(ignoreUnknown = true) +class AccountAttributes @JsonCreator constructor( + @JsonProperty val signalingKey: String?, + @JsonProperty val registrationId: Int, + @JsonProperty val isVoice: Boolean, + @JsonProperty val isVideo: Boolean, + @JsonProperty val isFetchesMessages: Boolean, + @JsonProperty val pin: String?, + @JsonProperty val registrationLock: String?, + @JsonProperty val unidentifiedAccessKey: ByteArray?, + @JsonProperty val isUnrestrictedUnidentifiedAccess: Boolean, + @JsonProperty val isDiscoverableByPhoneNumber: Boolean, + @JsonProperty val capabilities: Capabilities?, + @JsonProperty val name: String?, + @JsonProperty val pniRegistrationId: Int, +) { + constructor( + signalingKey: String?, + registrationId: Int, + isFetchesMessages: Boolean, + pin: String?, + registrationLock: String?, + unidentifiedAccessKey: ByteArray?, + isUnrestrictedUnidentifiedAccess: Boolean, + capabilities: Capabilities?, + isDiscoverableByPhoneNumber: Boolean, + name: String?, + pniRegistrationId: Int + ) : this( + signalingKey = signalingKey, + registrationId = registrationId, + isVoice = true, + isVideo = true, + isFetchesMessages = isFetchesMessages, + pin = pin, + registrationLock = registrationLock, + unidentifiedAccessKey = unidentifiedAccessKey, + isUnrestrictedUnidentifiedAccess = isUnrestrictedUnidentifiedAccess, + isDiscoverableByPhoneNumber = isDiscoverableByPhoneNumber, + capabilities = capabilities, + name = name, + pniRegistrationId = pniRegistrationId + ) + + data class Capabilities @JsonCreator constructor( + @JsonProperty val isUuid: Boolean, + @JsonProperty("gv2-3") val isGv2: Boolean, + @JsonProperty val isStorage: Boolean, + @JsonProperty("gv1-migration") val isGv1Migration: Boolean, + @JsonProperty val isSenderKey: Boolean, + @JsonProperty val isAnnouncementGroup: Boolean, + @JsonProperty val isChangeNumber: Boolean, + @JsonProperty val isStories: Boolean, + @JsonProperty val isGiftBadges: Boolean, + @JsonProperty val isPnp: Boolean, + @JsonProperty val paymentActivation: Boolean + ) +} diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java index 481326aed..71d264341 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java @@ -206,10 +206,13 @@ public class SignalServiceProfile { @JsonProperty private boolean pnp; + @JsonProperty + private boolean paymentActivation; + @JsonCreator public Capabilities() {} - public Capabilities(boolean storage, boolean gv1Migration, boolean senderKey, boolean announcementGroup, boolean changeNumber, boolean stories, boolean giftBadges, boolean pnp) { + public Capabilities(boolean storage, boolean gv1Migration, boolean senderKey, boolean announcementGroup, boolean changeNumber, boolean stories, boolean giftBadges, boolean pnp, boolean paymentActivation) { this.storage = storage; this.gv1Migration = gv1Migration; this.senderKey = senderKey; @@ -218,6 +221,7 @@ public class SignalServiceProfile { this.stories = stories; this.giftBadges = giftBadges; this.pnp = pnp; + this.paymentActivation = paymentActivation; } public boolean isStorage() { @@ -251,6 +255,10 @@ public class SignalServiceProfile { public boolean isPnp() { return pnp; } + + public boolean isPaymentActivation() { + return paymentActivation; + } } public ExpiringProfileKeyCredentialResponse getExpiringProfileKeyCredentialResponse() {