Emulation Screen Orientation (Render > Display & Resolution): lock the app to Device / Landscape / Portrait / Auto-Rotate; applied on launch and on change.
Settings menu now remembers the tab you were on across opens (instead of snapping back to the first tab) and persists each collapsible section's expanded/collapsed state.
Portrait: the in-game/settings header no longer overlaps the title, brand and close button on a narrow screen (hide the decorative brand and inset the header in portrait). Remove the bottom-right "Scroll up/down and left/right to navigate" hint.
Touch Haptics: a short vibration tick on every on-screen button press (PPSSPP/Azahar style) via the device vibrator, coalesced so simultaneous presses / mashing can't saturate it. Default on; toggle under Pad > On-Screen Controls. Separate from controller rumble.
Touch Gliding: slide a finger across the multi-touch layer to latch every button it crosses (held until lift), for combos like hold-X + L1. Default off; toolbar chip.
Revert the shoulder hit-layer padding to 18dp: the 100dp box (added so you could slide onto L1/R1) sits on top and, by Compose's overlapping-sibling rule, stole fresh taps from the buttons under it — the up-D-pad arm and Triangle. Sliding onto shoulders from afar needs the single-layer rework instead.
Button binds, stick modes and custom stick directions can be overridden per game under a game.<serial>. key prefix, resolved per-game-first then global at runtime; the existing Global/Game scope toggle drives the Pad tab, and Reset clears a game's overrides back to global. Global keys are unchanged for single-player.
Custom stick directions now pick their target (any PS2 button incl. the D-pad, an ARMSX2 hotkey, or Analog) directly from a dialog instead of press-to-capture, so a direction can be mapped even to a button that has been unbound; each direction gains a visible Clear. Adds a Touch Haptics toggle row.
Folder memory cards mirror the PS2 filesystem as real host directories, so formatting one calls FileSystem::CreateDirectoryPath. On Android 11+ FUSE-emulated external storage, raw libc mkdir() is denied on a user-picked custom data folder even with all-files access (file cards, which only fopen, worked) — so folder cards failed with "Format failed!".
CreateDirectoryPath now falls back to NativeApp.createDirectoryPath (java.io.File.mkdirs) via a JNI bridge when the POSIX mkdir fails; no-op on app-private storage. The bridge frees local refs and clears any pending exception on every path (called many times while a folder card runs).
Also: deleting a memory card recreates a fresh default slot instead of leaving it empty; add NativeApp.touchHaptic (used by on-screen touch haptics).