diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt index 6283dc72a2..e3106278a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt @@ -171,7 +171,7 @@ class StickerTables( val values = contentValuesOf( Sticker.PACK_ID to sticker.packId, Sticker.STICKER_ID to sticker.stickerId, - Sticker.EMOJI to sticker.emoji, + Sticker.EMOJI to (sticker.emoji ?: ""), Sticker.CONTENT_TYPE to sticker.contentType, Sticker.COVER to if (sticker.isCover) 1 else 0, Sticker.FILE_PATH to fileInfo.file.absolutePath, diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.kt index 49aa65bfb7..ec60a16006 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.kt @@ -6,7 +6,7 @@ data class IncomingSticker( val packTitle: String, val packAuthor: String, val stickerId: Int, - val emoji: String, + val emoji: String?, val contentType: String?, val isCover: Boolean, val isInstalled: Boolean diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java index c7c5e86ae1..705e8421d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java @@ -69,11 +69,11 @@ public final class StickerManifest { private final String contentType; private final Optional uri; - public Sticker(@NonNull String packId, @NonNull String packKey, int id, @NonNull String emoji, @Nullable String contentType) { + public Sticker(@NonNull String packId, @NonNull String packKey, int id, @Nullable String emoji, @Nullable String contentType) { this(packId, packKey, id, emoji, contentType, null); } - public Sticker(@NonNull String packId, @NonNull String packKey, int id, @NonNull String emoji, @Nullable String contentType, @Nullable Uri uri) { + public Sticker(@NonNull String packId, @NonNull String packKey, int id, @Nullable String emoji, @Nullable String contentType, @Nullable Uri uri) { this.packId = packId; this.packKey = packKey; this.id = id; @@ -94,7 +94,7 @@ public final class StickerManifest { return id; } - public String getEmoji() { + public @Nullable String getEmoji() { return emoji; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java index 23825a3db2..ebbffa197e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java @@ -100,7 +100,7 @@ public class StickerRolloverTouchListener implements RecyclerView.OnItemTouchLis } } - private void showSticker(@NonNull RecyclerView recyclerView, @NonNull Object toLoad, @NonNull String emoji) { + private void showSticker(@NonNull RecyclerView recyclerView, @NonNull Object toLoad, @Nullable String emoji) { if (!popup.isShowing()) { popup.showAtLocation(recyclerView, Gravity.NO_GRAVITY, 0, 0); eventListener.onStickerPopupStarted(); diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt index 7fd5762ad0..ac4dcb01f0 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt @@ -266,6 +266,28 @@ class StickerTablesTest { assertThat(installedPackIds()).isEqualTo(listOf(packId1, packId3, packId2)) } + @Test + fun `given a sticker with no emoji, when I insert it, then I expect an empty emoji`() { + installPack(packId1, packKey1) + + insertSticker(packId1, packKey1, stickerId = 1, emoji = null) + + assertThat(SignalDatabase.stickers.getSticker(packId1, 1, false)!!.emoji).isEqualTo("") + } + + @Test + fun `given a sticker with no emoji, when I search by emoji, then I expect only the sticker that has one`() { + installPack(packId1, packKey1) + insertSticker(packId1, packKey1, stickerId = 1, emoji = null) + insertSticker(packId1, packKey1, stickerId = 2, emoji = "\uD83D\uDC4D") + + val results = StickerTables.StickerRecordReader(SignalDatabase.stickers.getStickersByEmoji("\uD83D\uDC4D")).use { reader -> + generateSequence { reader.getNext() }.map { it.stickerId }.toList() + } + + assertThat(results).isEqualTo(listOf(2)) + } + private fun installedPackIds(): List { return StickerTables.StickerPackRecordReader(SignalDatabase.stickers.getInstalledStickerPacks()).use { reader -> reader.asSequence().map { it.packId }.toList() @@ -273,16 +295,20 @@ class StickerTablesTest { } private fun installPack(packId: String, packKey: String) { + insertSticker(packId, packKey, stickerId = 0, emoji = "", isCover = true) + } + + private fun insertSticker(packId: String, packKey: String, stickerId: Int, emoji: String?, isCover: Boolean = false) { SignalDatabase.stickers.insertSticker( sticker = IncomingSticker( packId = packId, packKey = packKey, packTitle = "Title", packAuthor = "Author", - stickerId = 0, - emoji = "", + stickerId = stickerId, + emoji = emoji, contentType = "image/webp", - isCover = true, + isCover = isCover, isInstalled = true ), dataStream = ByteArrayInputStream(byteArrayOf(1, 2, 3, 4)), diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceStickerManifest.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceStickerManifest.java index 4f356d0cf1..d045b024eb 100644 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceStickerManifest.java +++ b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceStickerManifest.java @@ -2,6 +2,8 @@ package org.whispersystems.signalservice.api.messages; +import javax.annotation.Nullable; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -42,7 +44,7 @@ public class SignalServiceStickerManifest { private final String emoji; private final String contentType; - public StickerInfo(int id, String emoji, String contentType) { + public StickerInfo(int id, @Nullable String emoji, String contentType) { this.id = id; this.emoji = emoji; this.contentType = contentType; @@ -52,7 +54,7 @@ public class SignalServiceStickerManifest { return id; } - public String getEmoji() { + public @Nullable String getEmoji() { return emoji; }