Skip to content

Commit

Permalink
Add payment activation capability.
Browse files Browse the repository at this point in the history
  • Loading branch information
cody-signal authored and greyson-signal committed Dec 30, 2022
1 parent 96b2051 commit a13599a
Show file tree
Hide file tree
Showing 15 changed files with 137 additions and 267 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -497,8 +497,8 @@ class RecipientTableTest_getAndPossiblyMerge {
Assert.assertNotNull(SignalDatabase.sessions.load(ACI_SELF, SignalProtocolAddress(ACI_A.toString(), 1)))

// Reaction validation
val reactionsSms: List<ReactionRecord> = SignalDatabase.reactions.getReactions(MessageId(smsId1, false))
val reactionsMms: List<ReactionRecord> = SignalDatabase.reactions.getReactions(MessageId(mmsId1, true))
val reactionsSms: List<ReactionRecord> = SignalDatabase.reactions.getReactions(MessageId(smsId1))
val reactionsMms: List<ReactionRecord> = SignalDatabase.reactions.getReactions(MessageId(mmsId1))

assertEquals(1, reactionsSms.size)
assertEquals(ReactionRecord("a", recipientIdAci, 1, 1), reactionsSms[0])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
28 changes: 0 additions & 28 deletions app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java

This file was deleted.

27 changes: 27 additions & 0 deletions app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.kt
Original file line number Diff line number Diff line change
@@ -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
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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()),
)
}

Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -136,6 +137,7 @@ data class RecipientRecord(
Recipient.Capability.UNKNOWN,
Recipient.Capability.UNKNOWN,
Recipient.Capability.UNKNOWN,
Recipient.Capability.UNKNOWN,
Recipient.Capability.UNKNOWN
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,7 @@ public void onRun() throws IOException {
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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ public static void selectPayment(@NonNull Fragment fragment, @NonNull Recipient
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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,10 @@ public boolean isForceSmsSelection() {
return capabilities.getPnpCapability();
}

public @NonNull Capability getPaymentActivationCapability() {
return capabilities.getPaymentActivation();
}

public @Nullable byte[] getProfileKey() {
return profileKey;
}
Expand Down Expand Up @@ -1213,6 +1217,10 @@ public int serialize() {
return value;
}

public boolean isSupported() {
return this == SUPPORTED;
}

public static Capability deserialize(int value) {
switch (value) {
case 0: return UNKNOWN;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 10 additions & 0 deletions gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3692,6 +3692,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="59c57ab609494d2a30d6ea3737428a56918ff0b8031081ea73b8472fdec06e44" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.4.10">
<artifact name="kotlin-reflect-1.4.10.jar">
<sha256 value="3ab3413ec945f801448360ad97bc6e14fec6d606889ede3c707cc277b4467f45" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.4.32">
<artifact name="kotlin-reflect-1.4.32.jar">
<sha256 value="dbf19e9cdaa9c3c170f3f6f6ce3922f38dfc1d7fa1cab5b7c23a19da8b5eec5b" origin="Generated by Gradle"/>
Expand Down Expand Up @@ -3792,6 +3797,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="5ace22b102a96425e4ac44e0558b927f3857b56a33cbc289cf1b70aee645e6a7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.4.10">
<artifact name="kotlin-stdlib-1.4.10.jar">
<sha256 value="01ecb09782c042b931c1839acf21a188340b295d05400afd6e3415d4475b8daa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.4.20">
<artifact name="kotlin-stdlib-1.4.20.jar">
<sha256 value="b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656" origin="Generated by Gradle"/>
Expand Down
1 change: 1 addition & 0 deletions libsignal/service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a13599a

Please sign in to comment.