From 00b72c9263d964b689d5d22baafcfb012472da1d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 5 Feb 2026 21:16:08 -0500 Subject: [PATCH] Clean up system for blessed sticker packs. --- .../securesms/AppInitialization.java | 18 +-- .../securesms/stickers/BlessedPacks.java | 69 ----------- .../securesms/stickers/BlessedPacks.kt | 113 ++++++++++++++++++ 3 files changed, 116 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/AppInitialization.java b/app/src/main/java/org/thoughtcrime/securesms/AppInitialization.java index 5c03cc1d4f..21c7a4c60c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AppInitialization.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AppInitialization.java @@ -41,11 +41,7 @@ public final class AppInitialization { TextSecurePreferences.setTypingIndicatorsEnabled(context, true); AppDependencies.getMegaphoneRepository().onFirstEverAppLaunch(); SignalStore.onFirstEverAppLaunch(); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.ZOZO.getPackId(), BlessedPacks.ZOZO.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.BANDIT.getPackId(), BlessedPacks.BANDIT.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.DAY_BY_DAY.getPackId(), BlessedPacks.DAY_BY_DAY.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_HANDS.getPackId(), BlessedPacks.SWOON_HANDS.getPackKey())); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_FACES.getPackId(), BlessedPacks.SWOON_FACES.getPackKey())); + AppDependencies.getJobManager().addAll(BlessedPacks.getFirstInstallJobs()); } public static void onPostBackupRestore(@NonNull Context context) { @@ -59,11 +55,7 @@ public final class AppInitialization { SignalStore.notificationProfile().setHasSeenTooltip(true); TextSecurePreferences.onPostBackupRestore(context); SignalStore.settings().setPassphraseDisabled(true); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.ZOZO.getPackId(), BlessedPacks.ZOZO.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.BANDIT.getPackId(), BlessedPacks.BANDIT.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.DAY_BY_DAY.getPackId(), BlessedPacks.DAY_BY_DAY.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_HANDS.getPackId(), BlessedPacks.SWOON_HANDS.getPackKey())); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_FACES.getPackId(), BlessedPacks.SWOON_FACES.getPackKey())); + AppDependencies.getJobManager().addAll(BlessedPacks.getFirstInstallJobs()); EmojiSearchIndexDownloadJob.scheduleImmediately(); DeleteAbandonedAttachmentsJob.enqueue(); @@ -87,10 +79,6 @@ public final class AppInitialization { SignalStore.settings().setPassphraseDisabled(true); AppDependencies.getMegaphoneRepository().onFirstEverAppLaunch(); SignalStore.onFirstEverAppLaunch(); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.ZOZO.getPackId(), BlessedPacks.ZOZO.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.BANDIT.getPackId(), BlessedPacks.BANDIT.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forInstall(BlessedPacks.DAY_BY_DAY.getPackId(), BlessedPacks.DAY_BY_DAY.getPackKey(), false)); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_HANDS.getPackId(), BlessedPacks.SWOON_HANDS.getPackKey())); - AppDependencies.getJobManager().add(StickerPackDownloadJob.forReference(BlessedPacks.SWOON_FACES.getPackId(), BlessedPacks.SWOON_FACES.getPackKey())); + AppDependencies.getJobManager().addAll(BlessedPacks.getFirstInstallJobs()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java deleted file mode 100644 index ef0678a47b..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.thoughtcrime.securesms.stickers; - -import androidx.annotation.NonNull; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.whispersystems.signalservice.internal.util.JsonUtil; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -/** - * Maintains a list of "blessed" sticker packs that essentially serve as defaults. - */ -public final class BlessedPacks { - - public static final Pack ZOZO = new Pack("fb535407d2f6497ec074df8b9c51dd1d", "17e971c134035622781d2ee249e6473b774583750b68c11bb82b7509c68b6dfd"); - public static final Pack BANDIT = new Pack("9acc9e8aba563d26a4994e69263e3b25", "5a6dff3948c28efb9b7aaf93ecc375c69fc316e78077ed26867a14d10a0f6a12"); - public static final Pack SWOON_HANDS = new Pack("e61fa0867031597467ccc036cc65d403", "13ae7b1a7407318280e9b38c1261ded38e0e7138b9f964a6ccbb73e40f737a9b"); - public static final Pack SWOON_FACES = new Pack("cca32f5b905208b7d0f1e17f23fdc185", "8bf8e95f7a45bdeafe0c8f5b002ef01ab95b8f1b5baac4019ccd6b6be0b1837a"); - public static final Pack DAY_BY_DAY = new Pack("cfc50156556893ef9838069d3890fe49", "5f5beab7d382443cb00a1e48eb95297b6b8cadfd0631e5d0d9dc949e6999ff4b"); - public static final Pack MY_DAILY_LIFE = new Pack("ccc89a05dc077856b57351e90697976c", "45730e60f09d5566115223744537a6b7d9ea99ceeacb77a1fbd6801b9607fbcf"); - - private static final Set BLESSED_PACK_IDS = new HashSet() {{ - add(ZOZO.getPackId()); - add(BANDIT.getPackId()); - add(SWOON_HANDS.getPackId()); - add(SWOON_FACES.getPackId()); - add(DAY_BY_DAY.getPackId()); - add(MY_DAILY_LIFE.getPackId()); - }}; - - public static boolean contains(@NonNull String packId) { - return BLESSED_PACK_IDS.contains(packId); - } - - public static class Pack { - @JsonProperty private final String packId; - @JsonProperty private final String packKey; - - public Pack(@NonNull @JsonProperty("packId") String packId, - @NonNull @JsonProperty("packKey") String packKey) - { - this.packId = packId; - this.packKey = packKey; - } - - public @NonNull String getPackId() { - return packId; - } - - public @NonNull String getPackKey() { - return packKey; - } - - public @NonNull String toJson() { - return JsonUtil.toJson(this); - } - - public static @NonNull Pack fromJson(@NonNull String json) { - try { - return JsonUtil.fromJson(json, Pack.class); - } catch (IOException e) { - throw new AssertionError(e); - } - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.kt b/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.kt new file mode 100644 index 0000000000..f24333e184 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.kt @@ -0,0 +1,113 @@ +package org.thoughtcrime.securesms.stickers + +import com.fasterxml.jackson.annotation.JsonProperty +import org.thoughtcrime.securesms.jobmanager.Job +import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob +import org.whispersystems.signalservice.internal.util.JsonUtil + +/** + * Maintains a list of "blessed" sticker packs that essentially serve as defaults. + */ +object BlessedPacks { + + @JvmField + val ZOZO = Pack("fb535407d2f6497ec074df8b9c51dd1d", "17e971c134035622781d2ee249e6473b774583750b68c11bb82b7509c68b6dfd") + + @JvmField + val BANDIT = Pack("9acc9e8aba563d26a4994e69263e3b25", "5a6dff3948c28efb9b7aaf93ecc375c69fc316e78077ed26867a14d10a0f6a12") + + @JvmField + val SWOON_HANDS = Pack("e61fa0867031597467ccc036cc65d403", "13ae7b1a7407318280e9b38c1261ded38e0e7138b9f964a6ccbb73e40f737a9b") + + @JvmField + val SWOON_FACES = Pack("cca32f5b905208b7d0f1e17f23fdc185", "8bf8e95f7a45bdeafe0c8f5b002ef01ab95b8f1b5baac4019ccd6b6be0b1837a") + + @JvmField + val DAY_BY_DAY = Pack("cfc50156556893ef9838069d3890fe49", "5f5beab7d382443cb00a1e48eb95297b6b8cadfd0631e5d0d9dc949e6999ff4b") + + @JvmField + val MY_DAILY_LIFE = Pack("ccc89a05dc077856b57351e90697976c", "45730e60f09d5566115223744537a6b7d9ea99ceeacb77a1fbd6801b9607fbcf") + + private val packs = listOf( + BlessedPackInfo( + pack = ZOZO, + installMode = BlessedPackInfo.InstallMode.InstallByDefault + ), + BlessedPackInfo( + pack = BANDIT, + installMode = BlessedPackInfo.InstallMode.InstallByDefault + ), + BlessedPackInfo( + pack = DAY_BY_DAY, + installMode = BlessedPackInfo.InstallMode.InstallByDefault + ), + BlessedPackInfo( + pack = MY_DAILY_LIFE, + installMode = BlessedPackInfo.InstallMode.InstallByDefault + ), + BlessedPackInfo( + pack = SWOON_HANDS, + installMode = BlessedPackInfo.InstallMode.AvailableAsReference + ), + BlessedPackInfo( + pack = SWOON_FACES, + installMode = BlessedPackInfo.InstallMode.AvailableAsReference + ) + ) + + private val packIds: Set by lazy { + packs.map { it.pack.packId }.toSet() + } + + /** + * A list of [Job]s you should run on first app launch to install all of the required packs. + */ + @JvmStatic + fun getFirstInstallJobs(): List { + val installedByDefault = packs + .filter { it.installMode == BlessedPackInfo.InstallMode.InstallByDefault } + .map { it.pack } + .map { StickerPackDownloadJob.forInstall(it.packId, it.packKey, false) } + + val availableForReference = packs + .filter { it.installMode == BlessedPackInfo.InstallMode.AvailableAsReference } + .map { it.pack } + .map { StickerPackDownloadJob.forReference(it.packId, it.packKey) } + + return installedByDefault + availableForReference + } + + @JvmStatic + fun contains(packId: String): Boolean { + return packIds.contains(packId) + } + + private data class BlessedPackInfo( + val pack: Pack, + val installMode: InstallMode + ) { + enum class InstallMode { + /** Install the pack on initial app launch. */ + InstallByDefault, + + /** Do not fully install the pack. Instead, have it show up as an "available" pack in the sticker manager. */ + AvailableAsReference + } + } + + class Pack( + @field:JsonProperty val packId: String, + @field:JsonProperty val packKey: String + ) { + fun toJson(): String { + return JsonUtil.toJson(this) + } + + companion object { + @JvmStatic + fun fromJson(json: String): Pack { + return JsonUtil.fromJson(json, Pack::class.java) + } + } + } +}