feat: game-friendly floating keyboard, offline hotword packs, nine-key gestures, package-by-feature layout - #121
Merged
Conversation
…re layout Floating keyboard - Slim toolbar in floating mode (no text edit/undo, quick-phrase shortcut). - Landscape floating window uses the portrait width and portrait key rows. - Long-press the top zone to drag, in addition to the drag handle. 26-key / nine-key - Comma key beside the space bar: tap for comma, long press for period. - Symmetric 26-key bottom row with a centered space bar; narrower mode key. - Nine-key bottom row: wider space bar, narrower 123 and mode keys. - English mode no longer auto-capitalizes; keys show lowercase letters. - 26-key letters one size smaller (KEY_LETTER_COMPACT_SP). - Nine-key long press offers digit plus lower/upper letters; swipe up types the digit, with a setting (exported with user data). Hotword packs (offline) - New hotword module: bundled packs (tech, apps, games) and user-imported text lists, switchable per pack, managed from About & data. - Voice: replace same-sounding spans in final text with the pack spelling (the streaming Paraformer model cannot take decoder hotwords). - Typing: enabled pack words whose full pinyin matches the composition are ranked right behind the top candidate. Architecture - Split the flat package into theme, core, editor, data, setup, widget, floating, handwriting, rime, candidate, hotword, voice, panel, keyboard; the root package keeps the service, activities and the JNI class. - Voice depends on VoiceSessionHost / VoiceEditorContext instead of the keyboard view and the service. - ArchitectureLayeringTest pins the allowed dependency directions. Tests: unit suite and the 123-test instrumented suite pass on an API 36 emulator. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Replace InputStream.readNBytes (API 33) with a bounded read; the import would have crashed on Android 8-12. - Use the SDK-aware window insets path in HotwordPacksActivity. - Add zh/en translations for the hotword activity label. - Write the byte-order mark in HotwordParser as an escape sequence. Found by :app:lintDebug; the emulator is API 36, so instrumented tests did not catch the first two. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Until librime has finished deploying (first start after an install or a data clear, minutes on the emulator), candidates come from the Kotlin fallback. Its character table has no frequencies, so every character tied at 0 and the first one in file order won: typing "ni" and picking the first candidate committed the rare variant 伱 instead of 你. - Load per-character weights from the bundled Rime 8105 table (same corpus and scale as the phrase weights) and use them for ranking. - core_regression.sh now waits for rimeReady before the candidate steps; partial picks need native candidates and cannot pass while Rime deploys. The four failures seen in core_regression.sh (033, 035, 036, 041) also occurred on main; with this change and the wait the script passes 19/19 on a fresh data directory. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Slacker-LLC
added a commit
that referenced
this pull request
Oct 3, 2026
…friendly floating keyboard (#122) ## What Second public beta. Sets `VERSION` to `0.0.2-beta.1` (versionCode 201) and turns `[Unreleased]` into the `0.0.2-beta.1` section, which becomes the GitHub Release notes. Highlights: offline hotword packs for voice and typing, nine-key long press and swipe-up digits, symmetric 26-key row with a comma/period key, no auto-capital in English mode, game-friendly floating keyboard. ## Impact - Publishes as a pre-release (not latest), arm64 only, signed with the release key. - Upgrade over `0.0.1-beta.1` keeps user data; the first start redeploys the Rime dictionary (versionCode is the deploy marker). ## Verification - `python3 scripts/release_check.py check` passes; script unit tests pass. - The code in this release was merged in #121 with a green CI and a full instrumented run. - This PR touches release files, so CI rehearses the whole release pipeline with a throwaway key. ## Next After merge: tag `v0.0.2-beta.1` on the merge commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: limuzi013 <128580527+limuzi013@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Floating (game) keyboard
26-key / nine-key
Hotword packs (offline, no INTERNET permission)
hotwordmodule: bundled packs (tech, apps, games; games off by default) and user-imported text lists, managed from About & data.Architecture
VoiceSessionHost/VoiceEditorContextinstead of the keyboard view and the service.ArchitectureLayeringTestpins the allowed dependency directions.Fixes found while verifying
InputStream.readNBytes(API 33) in the hotword import would crash on Android 8-12; replaced.main.Verification
scripts/core_regression.shpasses 19/19 against the live service on a fresh data directory; it now waits forrimeReadybefore the candidate steps.Known limitations
ImeKeyboardView(~3000 lines) andLocalVoiceImeService(~1800 lines) are still large; splittingImeKeyboardView.Listeneris the next step toward Gradle modules.🤖 Generated with Claude Code