One feature people ask about from time to time is stickers. Now, “stickers” isn’t really a feature, nor is it even universally agreed what it means, but we’ve been working on some improvements to Cheogram Android (and the Cheogram service) to make some sticker workflows better, released today in 2.12.1-3. This post will mostly talk about those changes and the technical implications; if you just want to see a demo of some UI you may want to skip to the video demo.
Many Android users already have pretty good support for inserting stickers (or GIFs) into Cheogram Android via their keyboard. However, as the app existed at the time, this would result in the sender re-uploading and the recipient re-downloading the sticker image every time, and fill up the sending server and receiving device with many copies of the same image. The first step to mitigating this was to switch local media storage in the app to content-addressed, which in this case means that the file is named after the hash of its contents. This prevents filling up the device when receiving the same image many times.
Now that we know the hashes of our stored media, we can use SIMS to transmit this hash when sending. If the app sees an image that it already has, it can display it without downloading at all, saving not only space but bandwidth and time as well. The Cheogram service also uses SIMS to transmit hashes of incoming MMS images for this purpose as well.
An existing Jabber client which uses the word “stickers” is Movim. It wouldn’t make sense to add the word to our UI without supporting what they already have. So we added support for XHTML-IM including Bits of Binary images. This also relies on hash-based storage or caching, which by now we had. This tech will also be useful in the future to extend beyond stickers into custom emoji.
Some stickers are animated, and users want to be able to send GIFs as well, so the app was updated to support inline playback of animated images (both GIF and WebP format).
Some users don’t have any sticker support in their keyboard or OS, so we want to provide some tools for these users as well. We have added the option to download some default sticker packs (mostly curated from the default set from Movim for now) so that users start with some options. We also built a small proxy to allow easily importing stickers intended for signal by clicking the regular “add to signal” links on eg signalstickers.com. Any sticker selected from these will get sent without even uploading, saving time and space on the server, and then will be received by any user of the app who has the default packs installed with no need for downloading, with fallbacks for other clients and situations of course.
If a user receives a sticker that they’d like to save for easily sending out again later, they can long-press any image they receive and choose “Save as sticker” which will prompt them to choose or create a sticker pack to keep it in, then save it there. Pointing a sticker sheet app or keyboard at this directory also allows re-using other sticker selection UIs with custom stickers saved in this way.
Taken together we hope these features produce real benefits for users of stickers, both with and without existing keyboard support, and also provide foundational work that we can build upon to provide custom emoji, thumbnails before downloading, URL previews, and other rich media features in the future. If you’d like to see some of these features in action, check out this short video.