❗ What happened?
The on-screen keyboard never shows when tapping text fields in apps that use custom InputConnection implementations:
- Web page fields in GeckoView browsers (IronFox, Firefox/Fennec)
- Flutter apps (LocalSend device-name field)
- Google Earth search
Native EditText fields work fine (browser address bar, Termux, Settings search bar).
This is a framework-level regression: client-initiated IME show requests (InputMethodManager.showSoftInput) are silently dropped or cancelled by system_server. The request dies at ImeTracker PHASE_CLIENT_REPORT_REQUESTED_VISIBLE_TYPES — before the IME is ever contacted (no bind attempt, no session request, no IME process involvement). Server-initiated shows (native EditText via the insets listener, ORIGIN_SERVER/IME_REQUESTED_CHANGED_LISTENER) work correctly.
The IME machinery itself is healthy: mHasMainConnection comes up for native fields, typing works (I can type in Termux and the address bar with real key taps), and all 9 installed IMEs fail identically on web/Flutter/GL fields — the request is cancelled client-side before any IME is asked.
📱 Device Model
Pixel 8 Pro (husky)
🆕 AxionOS Version
2.7-PROXIMA_BETA-20260603-OFFICIAL-VANILLA-husky (Android 16, fingerprint BP4A.251205.006, incremental 1780497146). Confirmed to be the latest available build — the OTA manifest (AxionAOSP/official_devices → OTA/VANILLA/husky.json) lists exactly this build, no newer release exists.
📦 Are you using GApps?
No (VANILLA build)
📂 Is your device rooted?
Yes — Magisk 30.7. Note: the bug reproduces identically with root present AND the native IME paths (Termux/address bar) work under the same root, so root is not a factor in the app→system IME path.
🔄 Steps to Reproduce
- Open IronFox / Firefox (or any GeckoView browser) and load a page with a text input (e.g.
data:text/html,<input type="text">)
- Tap the input field
- No keyboard appears. Repeat indefinitely — every tap fails
- Control test: tap the browser's address bar (native EditText) → keyboard appears and typing works
- Also reproduces in: LocalSend (Flutter) device-name field, Google Earth search — anything with a custom input connection
📜 Log Output
Broken case — IronFox web field tap (this device):
I ImeTracker: org.ironfoxoss.ironfox:xxxx: onRequestShow at ORIGIN_CLIENT reason SHOW_SOFT_INPUT fromUser false
I ImeTracker: org.ironfoxoss.ironfox:xxxx: onCancelled at PHASE_CLIENT_REPORT_REQUESTED_VISIBLE_TYPES
dumpsys input_method: mServedView=GeckoEngineView (correctly served), but sessionRequested=false, curSession=null, mHasMainConnection=false, mInputShown=false. mCurSeq increments on each tap (bind attempted), zero AMS events (logcat -b events shows no am_bind/am_proc_start for the IME) — the request never leaves the IME policy layer.
Working case — address bar tap (same device, same session):
I ImeTracker: system_server:xxxx: onRequestShow at ORIGIN_SERVER reason IME_REQUESTED_CHANGED_LISTENER fromUser false
I ImeTracker: system_server:xxxx: onShown
mHasMainConnection=true, mInputShown=true.
A/B control — identical app, identical Android 16, different ROM:
Same IronFox, same page, same tap, on Pixel 7 Pro (cheetah) running crDroid:
I ImeTracker: org.ironfoxoss.ironfox:xxxx: onRequestShow at ORIGIN_CLIENT reason SHOW_SOFT_INPUT fromUser false
I ImeTracker: org.ironfoxoss.ironfox:xxxx: onShown ← keyboard shows!
Window attributes are byte-identical between the two ROMs (FIT_INSETS_CONTROLLED, adjust=resize, no FLAG_ALT_FOCUSABLE_IM); IME-related settings and device_config flags are identical. The only difference is the ROM's system_server IME policy handling of client-initiated show requests.
✅ Verification Checklist
❗ What happened?
The on-screen keyboard never shows when tapping text fields in apps that use custom
InputConnectionimplementations:Native
EditTextfields work fine (browser address bar, Termux, Settings search bar).This is a framework-level regression: client-initiated IME show requests (
InputMethodManager.showSoftInput) are silently dropped or cancelled by system_server. The request dies atImeTracker PHASE_CLIENT_REPORT_REQUESTED_VISIBLE_TYPES— before the IME is ever contacted (no bind attempt, no session request, no IME process involvement). Server-initiated shows (native EditText via the insets listener,ORIGIN_SERVER/IME_REQUESTED_CHANGED_LISTENER) work correctly.The IME machinery itself is healthy:
mHasMainConnectioncomes up for native fields, typing works (I can type in Termux and the address bar with real key taps), and all 9 installed IMEs fail identically on web/Flutter/GL fields — the request is cancelled client-side before any IME is asked.📱 Device Model
Pixel 8 Pro (husky)
🆕 AxionOS Version
2.7-PROXIMA_BETA-20260603-OFFICIAL-VANILLA-husky(Android 16, fingerprintBP4A.251205.006, incremental1780497146). Confirmed to be the latest available build — the OTA manifest (AxionAOSP/official_devices→OTA/VANILLA/husky.json) lists exactly this build, no newer release exists.📦 Are you using GApps?
No (VANILLA build)
📂 Is your device rooted?
Yes — Magisk 30.7. Note: the bug reproduces identically with root present AND the native IME paths (Termux/address bar) work under the same root, so root is not a factor in the app→system IME path.
🔄 Steps to Reproduce
data:text/html,<input type="text">)📜 Log Output
Broken case — IronFox web field tap (this device):
dumpsys input_method:mServedView=GeckoEngineView(correctly served), butsessionRequested=false,curSession=null,mHasMainConnection=false,mInputShown=false.mCurSeqincrements on each tap (bind attempted), zero AMS events (logcat -b eventsshows noam_bind/am_proc_startfor the IME) — the request never leaves the IME policy layer.Working case — address bar tap (same device, same session):
mHasMainConnection=true,mInputShown=true.A/B control — identical app, identical Android 16, different ROM:
Same IronFox, same page, same tap, on Pixel 7 Pro (cheetah) running crDroid:
Window attributes are byte-identical between the two ROMs (
FIT_INSETS_CONTROLLED,adjust=resize, noFLAG_ALT_FOCUSABLE_IM); IME-related settings anddevice_configflags are identical. The only difference is the ROM'ssystem_serverIME policy handling of client-initiated show requests.✅ Verification Checklist