Skip to content

Commit 0962f01

Browse files
author
jeffyanta
authored
Merge pull request #577 from code-payments/release/2.1.13
release 2.1.13
2 parents f7078b3 + dd9f2f7 commit 0962f01

129 files changed

Lines changed: 2312 additions & 923 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/src/androidTest/java/com/getcode/models/intents/IntentPrivateTransferTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ class IntentPrivateTransferTest {
5252
val rendezvous = PublicKey.generate()
5353

5454
val intent = IntentPrivateTransfer.newInstance(
55-
context = context,
5655
rendezvousKey = rendezvous,
5756
organizer = organizer,
5857
destination = destination,

api/src/main/java/com/getcode/model/IntentMetadata.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ sealed class IntentMetadata {
2121
metadata.receivePaymentsPublicly.exchangeData.currency,
2222
metadata.receivePaymentsPublicly.exchangeData.quarks,
2323
metadata.receivePaymentsPublicly.exchangeData.exchangeRate,
24+
metadata.sendPrivatePayment.isChat,
2425
)?.let { ReceivePaymentsPublicly(it) }
2526
}
2627
TransactionService.Metadata.TypeCase.UPGRADE_PRIVACY -> UpgradePrivacy
@@ -30,13 +31,15 @@ sealed class IntentMetadata {
3031
metadata.sendPrivatePayment.exchangeData.currency,
3132
metadata.sendPrivatePayment.exchangeData.quarks,
3233
metadata.sendPrivatePayment.exchangeData.exchangeRate,
34+
metadata.sendPrivatePayment.isChat,
3335
)?.let { SendPrivatePayment(it) }
3436
}
3537
TransactionService.Metadata.TypeCase.SEND_PUBLIC_PAYMENT -> {
3638
getPaymentMetadata(
3739
metadata.sendPublicPayment.exchangeData.currency,
3840
metadata.sendPrivatePayment.exchangeData.quarks,
3941
metadata.sendPublicPayment.exchangeData.exchangeRate,
42+
metadata.sendPrivatePayment.isChat,
4043
)?.let { SendPublicPayment(it) }
4144
}
4245
else -> null
@@ -47,6 +50,7 @@ sealed class IntentMetadata {
4750
currencyString: String,
4851
quarks: Long,
4952
exchangeRate: Double,
53+
isChat: Boolean,
5054
): PaymentMetadata? {
5155
val currency = CurrencyCode.tryValueOf(currencyString.uppercase())
5256
?: return null
@@ -58,12 +62,14 @@ sealed class IntentMetadata {
5862
fx = exchangeRate,
5963
currency = currency
6064
)
61-
)
65+
),
66+
isChat = isChat,
6267
)
6368
}
6469
}
6570
}
6671

6772
data class PaymentMetadata(
68-
val amount: KinAmount
73+
val amount: KinAmount,
74+
val isChat: Boolean,
6975
)

api/src/main/java/com/getcode/model/TipMetadata.kt renamed to api/src/main/java/com/getcode/model/SocialUser.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ import com.getcode.utils.serializer.PublicKeyAsStringSerializer
55
import kotlinx.serialization.Serializable
66

77
@Serializable
8-
sealed interface TipMetadata {
8+
sealed interface SocialUser {
99
val platform: String
1010
val username: String
1111
@Serializable(with = PublicKeyAsStringSerializer::class)
1212
val tipAddress: PublicKey
1313
val imageUrl: String?
1414

1515
val imageUrlSanitized: String?
16+
17+
val costOfFriendship: Fiat
18+
val isFriend: Boolean
19+
val chatId: ID
1620
}

api/src/main/java/com/getcode/model/TwitterUser.kt

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@ import android.webkit.MimeTypeMap
44
import com.codeinc.gen.user.v1.IdentityService
55
import com.codeinc.gen.user.v1.friendshipCostOrNull
66
import com.getcode.solana.keys.PublicKey
7-
import com.getcode.solana.keys.base58
87
import com.getcode.utils.serializer.PublicKeyAsStringSerializer
9-
import kotlinx.serialization.KSerializer
108
import kotlinx.serialization.Serializable
11-
import kotlinx.serialization.descriptors.PrimitiveKind
12-
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
13-
import kotlinx.serialization.descriptors.SerialDescriptor
14-
import kotlinx.serialization.encoding.Decoder
15-
import kotlinx.serialization.encoding.Encoder
169

1710
@Serializable
1811
data class TwitterUser(
@@ -23,9 +16,10 @@ data class TwitterUser(
2316
val displayName: String,
2417
val followerCount: Int,
2518
val verificationStatus: VerificationStatus,
26-
val costOfFriendship: Fiat,
27-
val isFriend: Boolean,
28-
): TipMetadata {
19+
override val costOfFriendship: Fiat,
20+
override val isFriend: Boolean,
21+
override val chatId: ID,
22+
): SocialUser {
2923

3024
override val platform: String = "X"
3125

@@ -56,9 +50,12 @@ data class TwitterUser(
5650
followerCount = proto.followerCount,
5751
tipAddress = tipAddress,
5852
verificationStatus = VerificationStatus.entries.getOrNull(proto.verifiedTypeValue) ?: VerificationStatus.unknown,
59-
// costOfFriendship = kotlin.runCatching { proto.friendshipCostOrNull }.getOrNull()
60-
costOfFriendship = Fiat(currency = CurrencyCode.USD, amount = 1.00),
61-
isFriend = runCatching { proto.isFriend }.getOrNull() ?: false
53+
costOfFriendship = proto.friendshipCostOrNull?.let {
54+
val currency = CurrencyCode.tryValueOf(it.currency) ?: return@let null
55+
Fiat(currency, it.nativeAmount)
56+
} ?: Fiat(currency = CurrencyCode.USD, amount = 1.00),
57+
isFriend = runCatching { proto.isFriend }.getOrNull() ?: false,
58+
chatId = proto.friendChatId.value.toList()
6259
)
6360
}
6461
}

api/src/main/java/com/getcode/model/chat/Chat.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ data class Chat(
3333
val cursor: Cursor,
3434
val messages: List<ChatMessage>
3535
) {
36-
val imageData: Any
36+
val imageData: Any?
3737
get() {
3838
return when (type) {
3939
ChatType.Unknown -> id
4040
ChatType.Notification -> id
4141
ChatType.TwoWay -> {
4242
members
4343
.filterNot { it.isSelf }
44-
.firstNotNullOf {
44+
.firstNotNullOfOrNull {
4545
if (it.identity != null) {
4646
it.identity.imageUrl.orEmpty()
4747
} else {

api/src/main/java/com/getcode/model/chat/ChatStreamEventUpdate.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ import com.getcode.mapper.PointerStatus
44

55
data class ChatStreamEventUpdate(
66
val messages: List<ChatMessage>,
7-
val pointers: List<PointerStatus>
7+
val pointers: List<PointerStatus>,
8+
val isTyping: Boolean,
89
)

api/src/main/java/com/getcode/model/chat/Chats.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ typealias ChatGrpcV1 = com.codeinc.gen.chat.v1.ChatGrpc
66
typealias ChatGrpcV2 = com.codeinc.gen.chat.v2.ChatGrpc
77

88
typealias ChatIdV1 = com.codeinc.gen.chat.v1.ChatService.ChatId
9-
typealias ChatIdV2 = com.codeinc.gen.chat.v2.ChatService.ChatId
9+
typealias ChatIdV2 = com.codeinc.gen.common.v1.Model.ChatId
1010

1111
typealias MessageContentV1 = com.codeinc.gen.chat.v1.ChatService.Content
1212
typealias MessageContentV2 = com.codeinc.gen.chat.v2.ChatService.Content
@@ -52,3 +52,15 @@ typealias SetSubscriptionStateRequestV1 = com.codeinc.gen.chat.v1.ChatService.Se
5252
typealias SetSubscriptionStateRequestV2 = com.codeinc.gen.chat.v2.ChatService.SetSubscriptionStateRequest
5353
typealias SetSubscriptionStateResponseV1 = com.codeinc.gen.chat.v1.ChatService.SetSubscriptionStateResponse
5454
typealias SetSubscriptionStateResponseV2 = com.codeinc.gen.chat.v2.ChatService.SetSubscriptionStateResponse
55+
56+
/**
57+
* Code reference to a V1 [Chat] that serves as a collection of messages associated
58+
* with a notification type (Tips, Cash Payments, Web Payments, etc.)
59+
*/
60+
typealias NotificationCollectionEntity = Chat
61+
62+
/**
63+
* Code reference to a V2 [Chat] that is a full end-to-end chat that suports
64+
* peer-to-peer messaging between users.
65+
*/
66+
typealias ConversationEntity = Chat

api/src/main/java/com/getcode/model/chat/Platform.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ enum class Platform {
1212
}
1313

1414
fun named(name: String): Platform {
15-
return entries.firstOrNull { it.name.lowercase() == name.lowercase() } ?: Unknown
15+
val normalizedName = name.lowercase()
16+
return entries.firstOrNull {
17+
it.name.lowercase() == normalizedName ||
18+
(normalizedName == "x" && it.name.lowercase() == "twitter")
19+
} ?: Unknown
1620
}
1721
}
1822
}

api/src/main/java/com/getcode/model/intents/IntentPrivateTransfer.kt

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
11
package com.getcode.model.intents
22

3-
import android.content.Context
3+
import com.codeinc.gen.chat.v2.ChatService
44
import com.codeinc.gen.transaction.v2.TransactionService
5-
import com.codeinc.gen.transaction.v2.TransactionService.TippedUser.Platform
6-
import com.getcode.model.TipMetadata
75
import com.getcode.model.Fee
6+
import com.getcode.model.ID
87
import com.getcode.model.Kin
98
import com.getcode.model.KinAmount
9+
import com.getcode.model.SocialUser
10+
import com.getcode.model.chat.ChatIdV2
11+
import com.getcode.model.chat.Platform
1012
import com.getcode.model.intents.actions.ActionFeePayment
1113
import com.getcode.model.intents.actions.ActionOpenAccount
1214
import com.getcode.model.intents.actions.ActionTransfer
1315
import com.getcode.model.intents.actions.ActionWithdraw
16+
import com.getcode.network.repository.toByteString
1417
import com.getcode.network.repository.toPublicKey
1518
import com.getcode.network.repository.toSolanaAccount
16-
import com.getcode.solana.keys.*
19+
import com.getcode.solana.keys.PublicKey
1720
import com.getcode.solana.organizer.AccountType
1821
import com.getcode.solana.organizer.Organizer
1922
import com.getcode.solana.organizer.Tray
2023
import timber.log.Timber
2124

25+
sealed interface PrivateTransferMetadata {
26+
data class Tip(val socialUser: SocialUser): PrivateTransferMetadata
27+
data class Chat(val socialUser: SocialUser): PrivateTransferMetadata
28+
}
29+
2230
class IntentPrivateTransfer(
2331
override val id: PublicKey,
2432
private val organizer: Organizer,
@@ -30,7 +38,7 @@ class IntentPrivateTransfer(
3038
private val fee: Kin,
3139
private val additionalFees: List<Fee>,
3240
private val isWithdrawal: Boolean,
33-
private val tipMetadata: TipMetadata?,
41+
private val metadata: PrivateTransferMetadata?,
3442
val resultTray: Tray,
3543

3644
override val actionGroup: ActionGroup,
@@ -49,12 +57,24 @@ class IntentPrivateTransfer(
4957
.setNativeAmount(grossAmount.fiat)
5058
)
5159

52-
if (tipMetadata != null) {
53-
setIsTip(true)
54-
setTippedUser(TransactionService.TippedUser.newBuilder()
55-
.setPlatformValue(Platform.TWITTER_VALUE)
56-
.setUsername(tipMetadata.username)
57-
)
60+
when (metadata) {
61+
is PrivateTransferMetadata.Chat -> {
62+
setIsChat(true)
63+
setChatId(ChatIdV2.newBuilder()
64+
.setValue(metadata.socialUser.chatId.toByteString())
65+
)
66+
}
67+
is PrivateTransferMetadata.Tip -> {
68+
setIsTip(true)
69+
setTippedUser(TransactionService.TippedUser.newBuilder()
70+
.setPlatformValue(when (Platform.named(metadata.socialUser.platform)) {
71+
Platform.Unknown -> ChatService.Platform.UNKNOWN_PLATFORM_VALUE
72+
Platform.Twitter -> ChatService.Platform.TWITTER_VALUE
73+
})
74+
.setUsername(metadata.socialUser.username)
75+
)
76+
}
77+
null -> Unit
5878
}
5979
}
6080
)
@@ -63,15 +83,14 @@ class IntentPrivateTransfer(
6383

6484
companion object {
6585
fun newInstance(
66-
context: Context,
6786
rendezvousKey: PublicKey,
6887
organizer: Organizer,
6988
destination: PublicKey,
7089
amount: KinAmount,
7190
fee: Kin,
7291
additionalFees: List<Fee>,
7392
isWithdrawal: Boolean,
74-
tipMetadata: TipMetadata?
93+
metadata: PrivateTransferMetadata?,
7594
): IntentPrivateTransfer {
7695
if (fee > amount.kin) {
7796
throw IntentPrivateTransferException.InvalidFeeException()
@@ -153,7 +172,7 @@ class IntentPrivateTransfer(
153172
kind = ActionWithdraw.Kind.NoPrivacyWithdraw(netAmount.kin),
154173
cluster = currentTray.outgoing.getCluster(),
155174
destination = destination,
156-
tipMetadata = tipMetadata
175+
metadata = metadata
157176
)
158177

159178
// 3. Redistribute the funds to optimize for a
@@ -217,7 +236,7 @@ class IntentPrivateTransfer(
217236
fee = fee,
218237
additionalFees = additionalFees,
219238
isWithdrawal = isWithdrawal,
220-
tipMetadata = tipMetadata,
239+
metadata = metadata,
221240
actionGroup = group,
222241
resultTray = currentTray,
223242
)

api/src/main/java/com/getcode/model/intents/actions/ActionWithdraw.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package com.getcode.model.intents.actions
22

33
import com.codeinc.gen.transaction.v2.TransactionService
44
import com.getcode.ed25519.Ed25519
5-
import com.getcode.model.TipMetadata
5+
import com.getcode.model.SocialUser
66
import com.getcode.model.Kin
7+
import com.getcode.model.intents.PrivateTransferMetadata
78
import com.getcode.model.intents.ServerParameter
89
import com.getcode.network.repository.toPublicKey
910
import com.getcode.network.repository.toSolanaAccount
@@ -23,7 +24,7 @@ class ActionWithdraw(
2324
val cluster: AccountCluster,
2425
val destination: PublicKey,
2526
val legacy: Boolean,
26-
val tipMetadata: TipMetadata? = null,
27+
val metadata: PrivateTransferMetadata? = null,
2728
) : ActionType() {
2829

2930
override fun transactions(): List<SolanaTransaction> {
@@ -37,7 +38,7 @@ class ActionWithdraw(
3738
recentBlockhash = config.blockhash,
3839
kreIndex = kreIndex,
3940
legacy = legacy,
40-
tipMetadata = tipMetadata,
41+
metadata = metadata,
4142
)
4243
}.orEmpty()
4344
}
@@ -87,7 +88,7 @@ class ActionWithdraw(
8788
cluster: AccountCluster,
8889
destination: PublicKey,
8990
legacy: Boolean = false,
90-
tipMetadata: TipMetadata? = null,
91+
metadata: PrivateTransferMetadata? = null,
9192
): ActionWithdraw {
9293
return ActionWithdraw(
9394
id = 0,
@@ -97,7 +98,7 @@ class ActionWithdraw(
9798
cluster = cluster,
9899
destination = destination,
99100
legacy = legacy,
100-
tipMetadata = tipMetadata
101+
metadata = metadata
101102
)
102103
}
103104

0 commit comments

Comments
 (0)