Skip to content

[Bug]: Soft keyboard never shows for client-initiated IME requests (custom InputConnection apps: GeckoView web fields, Flutter, Google Earth) #399

Description

@madmystic

❗ 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_devicesOTA/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

  1. Open IronFox / Firefox (or any GeckoView browser) and load a page with a text input (e.g. data:text/html,<input type="text">)
  2. Tap the input field
  3. No keyboard appears. Repeat indefinitely — every tap fails
  4. Control test: tap the browser's address bar (native EditText) → keyboard appears and typing works
  5. 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

  • 🔍 I have searched for existing issues and found none related to this bug. (Searched all 97 open issues in this tracker — only [Bug]: Type C earphones not working for calls #315 is input-related, and it's about earphones)
  • 🔄 I have reproduced the issue after a clean install without modifying system files. (Reproduced on the stock-installed build; only Magisk added — see root note above. Reproduced across 4+ independent apps and 9 different IMEs)
  • ⚙️ I have tested with different configurations (e.g., GApps/no GApps, rooted/non-rooted). (Tested with all 9 installed IMEs — AOSP LatinIME, FUTO, Keyboard2, hacker's keyboard, and 5 more — all fail identically on custom-input fields, all work on native fields; A/B'd against crDroid on a second Pixel where it works)
  • 📎 I have attached all necessary logs and provided reproduction steps.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions