Skip to content
CleverKeys Wiki
implemented v2.0.0 development User guide

Emoji Technical Specification

The emoji panel uses native views and the emoji data bundled in res/raw/emojis.txt. Search and category browsing share the same font-support filter, so entries the actual button font cannot draw are hidden rather than shown as empty boxes.

Components

ComponentResponsibility
EmojiResource groups, names, and search results
EmojiKeywordIndexIndexed keyword lookup
EmojiGridViewAdapter, glyph filtering, insertion, and usage counts
EmojiSearchManagerVisible search field and keyboard routing while searching
EmojiGroupButtonsBarUsage-history button and resource category buttons
EmojiTooltipManagerLong-press name tooltip

These are the production classes under src/main/kotlin/tribixbite/cleverkeys/. There is no separate EmojiCategory enum or EmojiCompat dependency.

Search and insertion

Emoji.searchByName trims and lowercases the query, requests up to 60 indexed matches, and supplements sparse results with legacy name matching. Results are deduplicated and capped at 100 before the grid applies font filtering. The displayed count therefore reflects renderable results, rather than every keyword match.

The panel has a visible search field with clear and close controls. Keyboard text and deletion are routed to the active emoji search instead of the app editor. Selecting a result temporarily leaves that routing mode to send its string through Config.handler.key_up, then restores the panel’s routing and saves usage.

Font support

The support check uses the Paint of a real EmojiView themed with R.style.emojiGridButton. Ordinary emoji sequences require Paint.hasGlyph for the whole sequence. The final resource group contains text emoticons: its visible characters are checked individually, ignoring whitespace, format/control characters, and variation selectors. Treating :) as one emoji ligature would incorrectly hide it. Results are cached within the grid instance. Device font and Android version can change which entries are visible; this is not a downloadable font installation.

Categories and usage history

The first category button opens usage history. Other buttons come from the resource groups and use a representative entry as their icon. History is ordered by descending use count, rather than strictly by last-use time.

Preferences file emoji_last_use contains a string set under the same key, with count-string entries. Saving is debounced by 500 ms. There is no JSON recent-list format or fixed 50-entry history cap. Long-press displays the entry’s name in a tooltip that dismisses after two seconds and is hidden when scrolling. A global skin-tone picker is not implemented.

Verification

EmojiSearchTest exercises real resource search and the native themed grid, including supported category/search results and preservation of text faces. Pure EmojiGlyphSupport tests protect the sequence/visible-character rules. Test totals and the current full cloud verdict live in the internal testing strategy.

User guide