Android: Move JNI keyboard/clipboard handling into backend, simplify example (#3446) - #9469
Android: Move JNI keyboard/clipboard handling into backend, simplify example (#3446)#9469Turtle-PB wants to merge 21 commits into
Conversation
…lay metrics (ocornut#3446) Backend improvements (imgui_impl_android.h/.cpp): - Moved JNI soft-keyboard and Unicode char polling from the example into the backend. The backend automatically shows/hides the soft keyboard based on io.WantTextInput during NewFrame(). - Moved JNI Unicode character polling from the example into the backend. Characters are polled and fed to io.AddInputCharacter() automatically. - Added clipboard support via JNI to Android ClipboardManager. io.SetClipboardTextFn / io.GetClipboardTextFn are now set by the backend. - Added ImGui_ImplAndroid_ShowSoftKeyboard() / HideSoftKeyboard() public API. - Init() now accepts optional asset_manager and native_activity params. When native_activity is provided, JNI features are enabled automatically. When nullptr, the backend degrades gracefully (no keyboard/clipboard). - Added sensor support via NDK ASensor API (no JNI needed): Accelerometer, Gyroscope, Magnetometer, Light, Proximity, Pressure, Humidity, Ambient Temperature. API: EnableSensor(), DisableSensor(), GetSensorData(), IsSensorAvailable(). Sensor events are drained non-blocking in NewFrame(). - Added display metrics via JNI: DPI, density, xdpi/ydpi, refresh rate, orientation, resolution. API: GetDisplayMetrics(). Used to auto-scale ImGui style to the device's actual density. Example cleanup (main.cpp): - Removed ~120 lines of JNI boilerplate (ShowSoftKeyboardInput, PollUnicodeChars, GetAssetData). The example is now a clean Init -> Loop -> Render -> Shutdown. - Single ImGui_ImplAndroid_Init() call passes the activity object; the backend handles the rest. - Added sensor window: live accelerometer, gyroscope, magnetometer, light, proximity readouts with visual progress bars. - Added display window: resolution, DPI, density, refresh rate, orientation. - Uses actual device density for style scaling instead of hardcoded 2.0f. CMakeLists.txt: added 'sensor' to target_link_libraries for ASensor API. Kotlin activity (MainActivity.kt): - Kept the three JNI-bridge methods (showSoftInput/hideSoftInput/pollUnicodeChar) since Android's native API does not provide these. Cleaned up and documented that they are called by the backend, not by app code.
084847e to
2f36763
Compare
|
Thank you for your PR! This looks good overall but I'll need to address several details.
Example:
Adding display metrics I am ok with because needed to setup main scale. |
|
Working on it now. Thanks for the feed back
…________________________________
From: omar ***@***.***>
Sent: Wednesday, July 15, 2026 7:55 AM
To: ocornut/imgui ***@***.***>
Cc: Turtle Dove ***@***.***>; Author ***@***.***>
Subject: Re: [ocornut/imgui] Android: Move JNI keyboard/clipboard handling into backend, simplify example (#3446) (PR #9469)
[https://avatars.githubusercontent.com/u/8225057?s=20&v=4]ocornut left a comment (ocornut/imgui#9469)<#9469 (comment)>
Thank you for your PR!
This looks good overall but I'll need to address several details.
* Can you amend Changelog.txt with a precise list of all changes.
* Backend entry point signature should be described as a breaking change, with an explicit set of "before/after" example for users to follow what's going on.
* Should any of https://github.com/ocornut/imgui/issues?q=state%3Aopen%20label%3Aandroid be tagged/referenced?
Example:
* There was supposedly a fix in the destroyRequested handling in main.cpp which should be explicitly documented.
* Why the EGL init block changes?
* Comments have been changed. They should follow the exact format of the 32 other examples. So stuff like // Setup Dear ImGui context -> // --- Dear ImGui setup --- should be reversed. Most other removed comments should be reversed. And GetAssetData() ? Honestly it is pretty worrying that you removed so many things, it lowers the general amount of trust-for-care for an otherwise seemingly great PR. Likewise for a few standard comments in imgui_impl_android.cpp (in doubt always diff the whole thing).
Adding display metrics I am ok with because needed to setup main scale.
HOWEVER, the addition of sensor stuff seems completely off-topic to dear imgui and arbitrary.
Please keep it as a separate commit + provide a screenshot.
—
Reply to this email directly, view it on GitHub<#9469?email_source=notifications&email_token=CB76KOSMSX3ESVOL2ZU2L435E55K3A5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIOJYGA3TSNRWGY4KM4TFMFZW63VGMF2XI2DPOKSWK5TFNZ2KYZTPN52GK4S7MNWGSY3L#issuecomment-4980796668>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/CB76KOROL67VRWOR2MLMYG35E55K3AVCNFSNUABEKJSXA33TNF2G64TZHMZDEMBWG42TEMJ3JFZXG5LFHM2DQNZVHEYDEOJWGWQXMAQ>.
You are receiving this because you authored the thread.Message ID: ***@***.***>
|
…ure(). Amends. (ocornut#9473, ocornut#8802) Fix setting GL_UNPACK_ROW_LENGTH twice.
…IniSettingsFromMemory(). While not done with core, this would be useful to load .ini over a clean slate.
…d unnecessary InputTextDeactivateHook() call on manual deactivation. InputTextDeactivateHook() only takes a record when Edited + callback marks edited. (ocornut#9476, ocornut#701) for _NoLiveEdit it's easier than we don't use IsItemDeactivatedAfterEdit() in InputText()'s `if (g.InputTextDeactivatedState.ID == id)` block.
…bling it. (ocornut#9476, ocornut#701) cc ocornut#3936, ocornut#3946, ocornut#5904, ocornut#6284, ocornut#8149, ocornut#8065, ocornut#8665, ocornut#9117, ocornut#9299, ocornut#700, ocornut#1351, ocornut#1875, ocornut#2060, ocornut#2215, ocornut#2380, ocornut#2550, ocornut#3083, ocornut#3338, ocornut#3556, ocornut#4373, ocornut#4714, ocornut#4885, ocornut#5184,ocornut#5777, ocornut#6707, ocornut#6766, ocornut#8004, ocornut#8303, ocornut#8915, ocornut#9308
…ime as tabbing to next ActiveId. (ocornut#9476, ocornut#701)
…ItemFlags_LiveEditScalar. Added Demo contents. (ocornut#9476, ocornut#701) cc ocornut#3936, ocornut#3946, ocornut#5904, ocornut#6284, ocornut#8149, ocornut#8065, ocornut#8665, ocornut#9117, ocornut#9299, ocornut#700, ocornut#1351, ocornut#1875, ocornut#2060, ocornut#2215, ocornut#2380, ocornut#2550, ocornut#3083, ocornut#3338, ocornut#3556, ocornut#4373, ocornut#4714, ocornut#4885, ocornut#5184,ocornut#5777, ocornut#6707, ocornut#6766, ocornut#8004, ocornut#8303, ocornut#8915, ocornut#9308
|
I have been using ImGui on Android in few pet projects. There were quite a few changes which needed to be implemented to make it usable and I tried to include all these in code generated by ImRAD. I feel like this PR tries to address some issues but the result may not be customizable enough to cover all cases needed. At the same time some other important issues are not addressed. I think reaching a broader consensus and testing should to be done before merging it. My observations:
Other issues with main.cpp which are already present in the current android example.
|
|
I will address the issue on my fork if I can identify a fix I will let you know. I need to stay with the community guidelines and standards without over complicating things. |
ocornut#3446) Backend improvements (imgui_impl_android.h/.cpp): - Moved JNI soft-keyboard and Unicode char polling from the example into the backend. The application no longer needs any JNI boilerplate. - Added clipboard support via JNI to Android ClipboardManager. (ocornut#7259) - Added display metrics (DPI, density, refresh rate, orientation) via JNI. Used by the example to set main_scale from actual device density instead of hardcoded 2.0f. - BREAKING CHANGE: ImGui_ImplAndroid_Init() now takes additional asset_manager and native_activity parameters. See before/after in header. Example (main.cpp): - Removed ShowSoftKeyboardInput() and PollUnicodeChars() JNI helpers (~120 lines). - Removed their forward declarations and per-frame calls. - Updated Init() call to new signature. - Use ImGui_ImplAndroid_GetDisplayMetrics() for main_scale. - All other comments, EGL block, GetAssetData, APP_CMD cases unchanged. MainActivity.kt: unchanged (same 3 JNI bridge methods, now called by backend). docs/CHANGELOG.txt: Added entries for backend and example changes.
CRITICAL FIX: Restore NewFrame/Shutdown/GetDisplayMetrics lost in rebase - File was truncated at line 605 during rebase onto upstream/master - Restored all three functions with proper implementations REVIEW FEEDBACK ADDRESSED: 1. Rotation: Re-query display metrics in NewFrame when window resizes 2. Keyboard opt-in: SetJniEnabled(false by default) - app retains control - SetKeyboardType() / SetKeyboardAction() for customization 3. Keyboard timing: GetWantTextInput() / ResubmitTextInput() for app control 4. Back button: Hides soft keyboard when visible (consumes event) 5. Unicode input: Kept as optional JNI plumbing (app decides when to poll) 6. GetAssetData: Documented in PR_9469_REVIEW_RESPONSE.md (restore in main.cpp) 7. TERM_WINDOW: Documented (EGL surface lifecycle fix in main.cpp) 8. NavBar/insets: GetNavBarHeight() + GetBottomInset() (DisplayCutout API 28+) Long press: SetLongPressCallback() + SetLongPressDuration() Pressure: Full pressure sensitivity system PRESSURE SENSITIVITY: - Per-pointer pressure tracking (up to 10 pointers) - GetTouchPressure(pointer_id) API - SetPressureEnabled() / SetPressureThreshold() - Long-press requires sustained min pressure (not just timer) - Pressure-weighted scrolling (firmer press = faster scroll) - Move events update pressure and cancel long-press if pressure drops All APIs are opt-in. Default behavior preserves pre-PR ocornut#9469 app control.
… into enhance/android-backend-cleanup
- Android backend: Address ImRAD review feedback on PR ocornut#9469 - Restore NewFrame/Shutdown/GetDisplayMetrics lost in rebase - Add opt-in JNI features, pressure sensitivity, NavBar/insets, long-press - Add PR_9469_REVIEW_RESPONSE.md documenting all 8 review points
|
Thank you @tope99 for your feedback, much appreciated. Could the PR be constructed to have 1 feature per commit so we can more easily merge individual things when there’s an agreement?. I agree that facilitating code (eg integrating osd keyboard in backend) should not remove agency for the app to do advanced things. So this needs to be designed accordingly. |
- Hero badges: '3 PRs merged' + '3 PRs open' + 'Audio + MIDI + GUI Builder' - Stats: 6 upstream PRs, 3 merged, 12 widget types, 2 royalty-free tracks - PR list: All 6 PRs with correct status dots (merged=purple, open=green) - ocornut#9467 Android CI (merged) - ocornut#9473 OpenGL GL_UNPACK (merged) - ocornut#9474 Android touch + SDL2 (merged) - ocornut#9481 Texture destroy deferral (open) - ocornut#9483 CBDT/COLR emoji fonts (open) - ocornut#9469 Android backend + pressure (open)
Summary
Moves all JNI boilerplate (soft keyboard, Unicode char polling, clipboard) from the example into the
imgui_impl_androidbackend, and adds native sensor + display metrics support. The example stays clean and showcases the device's full capabilities.Addresses the long-standing FIXMEs:
#3446: On-screen keyboard / Unicode input handled by the appBackend API additions
What moved into the backend
io.WantTextInputinNewFrame(), calls activity'sshowSoftInput()/hideSoftInput()via JNIpollUnicodeChar()via JNI inNewFrame(), feeds toio.AddInputCharacter()ClipboardManager.setText()/getText(), wiresio.SetClipboardTextFn/GetClipboardTextFnASensorManager/ASensorEventQueueto drain events inNewFrame()— no JNI neededDisplayMetrics+Displayvia JNI inInit()for DPI, density, xdpi/ydpi, refresh rate, orientationExample changes
The example
Init()is now a single clean call:ImGui_ImplAndroid_Init(g_App->window, app->activity->assetManager, app->activity->clazz);The example showcases:
Removed ~120 lines of JNI boilerplate. Zero JNI calls in
main.cpp.Kotlin activity
Kept 3 JNI-bridge methods (
showSoftInput/hideSoftInput/pollUnicodeChar) — Android's native API does not provide these. They are called by the backend, not by app code.No binaries
Per feedback on #9467, zero binary files added. Only source files changed.
Files changed
backends/imgui_impl_android.hbackends/imgui_impl_android.cppexamples/.../main.cppexamples/.../CMakeLists.txtsensorto link libsexamples/.../MainActivity.ktAddresses #3446.