Harley wanted a pink/violet keyboard. The alternates use the exact violet sampled
from his own UI accent (#c67dff); letters are pink (#ff8ad8), activated keys
(shift/Esc/123+) are filled violet (#a855f7) with dark glyphs, caps-lock is
periwinkle blue (#9db8ff), background is violet-black (#100a1c). Contrast checked:
9.13 / 7.19 / 9.92 / 4.9 :1. Five edits: themes.xml style, arrays.xml entries+values
(kept index-aligned), strings.xml label, Config.java case.
- UsageGauge: WireGuard-only JSON fetch, cached, background thread, stale-aware
- Gauge key: gradient fill rises with the tightest Codex window, %.1f of today's
DeepSeek spend, red below a $1.00 balance, flat grey when stale/offline
- Display-only: marker lives in the key indication field, no character, touch swallowed
- Settings entries; cleartext permitted only for 10.10.10.1
- ComposeKey: composing to U+00A0 keeps the named nbsp key, since adding a layout
key perturbs the generated compose table and would otherwise emit the display glyph
- 5 new unit tests; all 21 tests pass
Standalone top-row emoji key replaced by a badge in the Alt key key2 swipe slot, drawn as a smile-in-a-circle glyph: new special-font codepoint 0xE01D from Font Awesome face-smile, rebuilt into assets/special_font.ttf with fontforge. Corner slots carry FLAG_SECONDARY so labelColor dims them to secondaryLabelColor; the badge overrides to _theme.labelColor to match the rest of the keyboard labels, and is identified by its codepoint rather than an Event or Kind accessor, because those are only valid for specific kinds and crashed the IME when called unguarded in the draw path. Swipe toward the key top-right to reach it; the config gear stays in the bottom-left. check_layout.output excluded on purpose - unrelated latn_neo2 drift.
KeyValue.getEditing is only defined when getKind is Kind.Editing. _code is overloaded, so on a character key it holds the character and Editing.values() indexed with it threw ArrayIndexOutOfBoundsException length=16 index=113 from drawLabel, crashing the IME on every draw. The phone was rolled back to the previous build first, then this fix was installed. Verified no crash after reinstall.
The indicator is the space bar label itself (Editing.SPACE_BAR), so it needs no extra UI. Keyboard2 repaints the keyboard view every 60s while the input view is visible. Regenerated ComposeKeyData follows the layout change (moving the tilde and equals keys changes which keys compose), which is also what made the two unit tests pass again: they were failing on a stale generated state, not on real behaviour.
switch_emoji uses a normal-font smiley label: 0xE001 is the joypad glyph in this fork. Peak dot: UTC Mon-Fri 01-04 and 06-10 pink, else blue; refreshes every 60s while the keyboard is visible.
- '!' moved to bottom-left of '1' (q sw), removed from e ne
- Dash on o sw, underscore on o se
- ':' on l sw (replaced backslash)
- Bottom row: Ctrl | Alt | Space | Fn | Enter
- Fn moved right of space bar, corner swipes cleaned up
- Voice typing moved from Enter to Fn bottom-left (key6)
- Clipboard on Ctrl bottom-left (key6)
- New 'tux' key: META modifier displayed as Tux penguin (0xE002)
from special_font/002.svg, toggleable (latch+double-tap lock)
- Enter only has action corner (key2), no voice typing
- Config (settings) kept on Fn up-swipe (key1)
- Top row numbers moved from ne (top-right) to nw (top-left) per request
- Existing nw symbols (tilde, !) shifted to ne positions
- Shift restored in z-row (normal key width)
- Backspace now normal key width (no more 1.5x)
- Fn key now has corner swipes: config, change_method, emoji, switch_numeric
- Bottom row: Fn | Ctrl | Alt | Space | Enter
- Joypad no longer uses displacement-accumulation (useless on space bar).
- After long-press space bar, determine direction from finger offset vs origin.
- Direction locks, fires one cursor event, then auto-repeats at
longPressInterval rate via _longpress_handler.
- Changing finger direction updates the lock (fires in new dir immediately).
- Returning finger to dead zone stops auto-repeat.
- Removed SPEED_VERTICAL_MULT and startup threshold:space bar has no room.
- Space bar icon changed to 0xE001 (4-directional arrows).
- Space bar long-press now activates Joypad cursor mode
(long-press detected in handleLongPress before key-repeat)
- Removed separate cursor_joystick key from bottom row
- Widened space bar (4.2 → 6.0) to compensate
- Bottom row: Shift | Fn | Ctrl | Alt | Space (joypad on long-press) | Enter
- Removed redundant shift key from latn_qwerty_us.xml third row
(shift is now on the bottom row only)
- Rebuilt assets/special_font.ttf to include 001.svg (4-directional
joystick icon at codepoint 0xE001)
When the layout is split, insert a middle column showing the
complete_first, complete_second, etc.. keys.
These keys are rendered without borders and background with a new role.
The suggestion bar is hidden for split layouts. The intention is to gain
much needed vertical space.
* Add tests
* Fix compose-space sequences not working
KeyModifier didn't pass editing keys to ComposeKey.
* Cleanup test code
* Show the nbsp symbol when typing compose-space-space
The number pane and the pin entry layouts are split in landscape
orientation. Instead of inserting empty space in the middle of the
layout, the numpad is duplicated. The other keys are not duplicated.
This adds the new "Stateful" kind of keys, for which the symbol is
dynamically computed from the app's state. This is implemented with a
hook directly in KeyValue.
3 keys are added for accessing the 3 words on the candidates view.
* Automatically split layouts in landscape
This inserts empty space in the center of layouts when in landscape
orientation. The keys are smaller and pushed to the edges of the screen.
This way, the fingers don't have to reach the center of the screen,
which is inconvenient in landscape orientation.
* Duplicate keys that are on the middle
Keys that are almost aligned on the middle of the screen are duplicated
on both sides. These keys are most probably hit with both thumbs.
This is especially useful for large keys like the space bar on the
bottom row.
* Split the bottom row
* Add an option to control layout splitting
* Different color for action keys and space bar
Keys can be made darker or dimmer individually in layouts.
This is done by setting the new 'role' attributes. Roles are "normal",
"action" and "space_bar".
The "action" role is intended to be used for keys like shift, backspace
and other keys from the bottom row.
Themes and special layouts are updated.
* Set 'role="action"' for shift and backspace keys, the number row and numpad.
* check_layout.py: Check that some keys have a role
Since SDK 29, calling setSystemGestureExclusionRects is mandatory to
continue supporting the keyboard's gestures but since SDK 30, this is
done automatically.
The option can be set to "Show everything" to show the keyboard even
when a physical keyboard is present.
This is a list preference to allow adding a "Show suggestions" option
later.
* gen_method_xml.py: Add missing dictionary for English
* gen_method_xml.py: Propagate dictionary specified in default locales
For example, propagate the dictionary specified for 'en' to 'en-IN',
'en-NG', etc..
* Use the dictionary en_US for locale en_CA