Skip to content

Commit e246d63

Browse files
authored
Reaction Content Type (#97)
* add api client with grpc kotlin * add reactions codec and clean up package typo * lowercase the enums
1 parent 275714c commit e246d63

File tree

7 files changed

+103
-16
lines changed

7 files changed

+103
-16
lines changed

library/src/androidTest/java/org/xmtp/android/library/GroupChatTest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
44
import org.junit.Assert.assertEquals
55
import org.junit.Test
66
import org.junit.runner.RunWith
7+
import org.xmtp.android.library.codecs.ContentTypeGroupChatMemberAdded
8+
import org.xmtp.android.library.codecs.ContentTypeGroupTitleChangedAdded
9+
import org.xmtp.android.library.codecs.GroupChatMemberAdded
10+
import org.xmtp.android.library.codecs.GroupChatTitleChanged
711
import org.xmtp.android.library.messages.walletAddress
8-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.ContentTypeGroupChatMemberAdded
9-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.ContentTypeGroupTitleChangedAdded
10-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.GroupChatMemberAdded
11-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.GroupChatTitleChanged
1212

1313
@RunWith(AndroidJUnit4::class)
1414
class GroupChatTest {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.xmtp.android.library
2+
3+
import androidx.test.ext.junit.runners.AndroidJUnit4
4+
import org.junit.Assert.assertEquals
5+
import org.junit.Test
6+
import org.junit.runner.RunWith
7+
import org.xmtp.android.library.codecs.ContentTypeReaction
8+
import org.xmtp.android.library.codecs.Reaction
9+
import org.xmtp.android.library.codecs.ReactionAction
10+
import org.xmtp.android.library.codecs.ReactionCodec
11+
import org.xmtp.android.library.codecs.ReactionSchema
12+
import org.xmtp.android.library.messages.walletAddress
13+
14+
@RunWith(AndroidJUnit4::class)
15+
class ReactionTest {
16+
17+
@Test
18+
fun testCanUseReactionCodec() {
19+
Client.register(codec = ReactionCodec())
20+
21+
val fixtures = fixtures()
22+
val aliceClient = fixtures.aliceClient
23+
val aliceConversation =
24+
aliceClient.conversations.newConversation(fixtures.bob.walletAddress)
25+
26+
aliceConversation.send(text = "hey alice 2 bob")
27+
28+
val messageToReact = aliceConversation.messages()[0]
29+
30+
val attachment = Reaction(
31+
reference = messageToReact.id,
32+
action = ReactionAction.added,
33+
content = "U+1F603",
34+
schema = ReactionSchema.unicode
35+
)
36+
37+
aliceConversation.send(
38+
content = attachment,
39+
options = SendOptions(contentType = ContentTypeReaction),
40+
)
41+
val messages = aliceConversation.messages()
42+
assertEquals(messages.size, 2)
43+
if (messages.size == 2) {
44+
val content: Reaction? = messages.first().content()
45+
assertEquals("U+1F603", content?.content)
46+
assertEquals(messageToReact.id, content?.reference)
47+
assertEquals(ReactionAction.added, content?.action)
48+
assertEquals(ReactionSchema.unicode, content?.schema)
49+
}
50+
}
51+
}

library/src/main/java/org/xmtp/android/library/GroupChat.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package uniffi.xmtp_dh.org.xmtp.android.library
22

33
import org.xmtp.android.library.Client
4-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.GroupChatMemberAddedCodec
5-
import uniffi.xmtp_dh.org.xmtp.android.library.codecs.GroupChatTitleChangedCodec
4+
import org.xmtp.android.library.codecs.GroupChatMemberAddedCodec
5+
import org.xmtp.android.library.codecs.GroupChatTitleChangedCodec
66

77
class GroupChat {
88
companion object {

library/src/main/java/org/xmtp/android/library/codecs/GroupChatMemberAddedCodec.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
package uniffi.xmtp_dh.org.xmtp.android.library.codecs
1+
package org.xmtp.android.library.codecs
22

33
import com.google.gson.GsonBuilder
44
import com.google.protobuf.kotlin.toByteStringUtf8
5-
import org.xmtp.android.library.codecs.ContentCodec
6-
import org.xmtp.android.library.codecs.ContentTypeId
7-
import org.xmtp.android.library.codecs.ContentTypeIdBuilder
8-
import org.xmtp.android.library.codecs.EncodedContent
95

106
val ContentTypeGroupChatMemberAdded = ContentTypeIdBuilder.builderFromAuthorityId(
117
"xmtp.org",

library/src/main/java/org/xmtp/android/library/codecs/GroupChatTitleChangedCodec.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
package uniffi.xmtp_dh.org.xmtp.android.library.codecs
1+
package org.xmtp.android.library.codecs
22

33
import com.google.gson.GsonBuilder
44
import com.google.protobuf.kotlin.toByteStringUtf8
5-
import org.xmtp.android.library.codecs.ContentCodec
6-
import org.xmtp.android.library.codecs.ContentTypeId
7-
import org.xmtp.android.library.codecs.ContentTypeIdBuilder
8-
import org.xmtp.android.library.codecs.EncodedContent
95

106
val ContentTypeGroupTitleChangedAdded = ContentTypeIdBuilder.builderFromAuthorityId(
117
"xmtp.org",

library/src/main/java/org/xmtp/android/library/codecs/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ When you build an app with XMTP, all messages are encoded with a [content type](
77
- `TextCodec`: This is the default content type and enables sending plain text messages.
88
- `AttachmentCodec`: Enables sending attachments.
99
- `RemoteAttachmentCodec`: Enables sending remote attachments.
10+
- `ReactionCodec`: Enables sending of reactions.
1011

1112
## Support remote media attachments
1213

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.xmtp.android.library.codecs
2+
3+
import com.google.gson.GsonBuilder
4+
import com.google.protobuf.kotlin.toByteStringUtf8
5+
6+
val ContentTypeReaction = ContentTypeIdBuilder.builderFromAuthorityId(
7+
"xmtp.org",
8+
"reaction",
9+
versionMajor = 1,
10+
versionMinor = 0
11+
)
12+
13+
data class Reaction(
14+
val reference: String,
15+
val action: ReactionAction,
16+
val content: String,
17+
val schema: ReactionSchema,
18+
)
19+
20+
enum class ReactionAction {
21+
added, removed
22+
}
23+
24+
enum class ReactionSchema {
25+
unicode, shortcode, custom
26+
}
27+
28+
data class ReactionCodec(override var contentType: ContentTypeId = ContentTypeReaction) :
29+
ContentCodec<Reaction> {
30+
31+
override fun encode(content: Reaction): EncodedContent {
32+
val gson = GsonBuilder().create()
33+
return EncodedContent.newBuilder().also {
34+
it.type = ContentTypeReaction
35+
it.content = gson.toJson(content).toByteStringUtf8()
36+
}.build()
37+
}
38+
39+
override fun decode(content: EncodedContent): Reaction {
40+
val gson = GsonBuilder().create()
41+
return gson.fromJson(content.content.toStringUtf8(), Reaction::class.java)
42+
}
43+
}

0 commit comments

Comments
 (0)