GammaOS Next Changelog - TheGammaSqueeze/GammaOSNext GitHub Wiki

v1.3.2 (May 2026)

A stability and compatibility release focused on lock screen reliability, Nano boot improvements, and input fixes.

Fixed

  • Lock screen unlock loop on software keymaster devices (e.g. AYANEO Pocket AIR Mini): entering the correct PIN/password/pattern crashed SystemUI in a loop instead of unlocking. Root cause was the HIDL Keymaster 4.0 compat layer rejecting auth tokens for SID-bound synthetic password keys. The SP protector key now skips auth-binding when the keymaster security level is SOFTWARE - the inner credential-derived encryption layer still protects the blob. Devices with hardware-backed keymaster/KeyMint are unaffected.
  • GammaPad grabbed the touchscreen when no controller was defined, leaving the user with only a mouse cursor and no touch input. When persist.gammaos.gamepad.devices was empty, shouldGrabDevice() returned true for all devices, bypassing gamepad capability checks. Now returns false so only devices passing the standard stick-axes + gamepad-button checks are grabbed.
  • locksettings verify crashed in Nano minimal boot with a NullPointerException on TrustManager and DevicePolicyManager. Added null guards in LockPatternUtils.reportSuccessful/FailedPasswordAttempt().
  • Libretro Quick Resume preview broken for zip ROMs, CE storage race on early boot, and RZIP save state format not recognised.
  • SensorService crash-loop on Nano boot from residual boot timing log calls.

Added

  • Nano CE auto-unlock: when a PIN/password/pattern is set in normal Android, the credential is cached in DE storage. On Nano boot, a new nano-ce-unlock service reads it and verifies against LockSettingsService, unlocking CE storage so game saves and ROM data are accessible without the Android lock screen.
  • Boot animation with 60 fps fade-in/out and XP-style loading bar.
  • Rockchip DP and HDMI audio output: auto-detects Rockchip boards via ro.hardware and registers external audio devices on hotplug. DP over USB-C registers as SPDIF (matching the vendor HAL's internal mapping of the rockchipdp0 card), HDMI registers as DEVICE_OUT_HDMI (for boards with the rockchiphdmi card via DTBO). Preferred routing: HDMI > DP > speaker, with independent hotplug tracking and automatic fallback to speakers on disconnect.

Fixed

  • WiFi unable to connect on Rockchip devices: customization.sh killed tee-supplicant on every boot, breaking the OPTEE-backed KeyMint HAL. All keystore2 key generation calls hung indefinitely, preventing WPA authentication. Removed the tee-supplicant kill so the TEE stays available for cryptographic operations.
  • logcat permanently broken and app launches delayed on Pocket AIR Mini (GApps build only): logd's reader thread called waitForService("logcat") when a privileged Google Play Services process connected to the log socket, deadlocking logd_lock and blocking all future log reads plus any code path that writes to logd. Fixed by starting LogcatManagerService in the Nano minimal boot path so the binder endpoint is available immediately.

v1.3.0 / v1.3.1 (April 2026)

This is a milestone release: a brand-new boot-to-game experience called GammaOS Nano, a full in-place OTA update system, a native gamepad daemon that replaces the older input plumbing, a Settings Toolbox that finally exposes GammaOS's hidden persist.gammaos.* knobs to end users, and a mountain of stability and boot-speed wins underneath.

First device release: Anbernic RG Vita Pro. This is the first handheld to ship with GammaOS Next v1.3.0 and the first device to get a factory overclock baked into the build: A72 big cluster raised from 2208 to 2304 MHz, Mali-G52 GPU from 900 to 1100 MHz, A53 voltage retuned for higher sustained clocks under thermal load, delivering up to +33.6% sustained throughput on hot runs. The Vita Pro has no active cooling, so a small aftermarket heatsink is recommended to hold those clocks for longer.

New: GammaOS Nano - instant boot to games

Big picture: handhelds spend tens of seconds booting a full Android stack you never interact with. Nano carves out a native, minimal boot path so you power on and see your game or XMB menu within a few seconds, then the rest of Android quietly comes up in the background.

  • Added - Minimal Android runtime (sys.gammaos.minimal_boot=1): skips ~120 non-essential SystemServer services (print, NFC, TV, MIDI, WebView preload, dreams, wallpaper manager, secondary zygote preload, etc.) and parallelises zygote startup. On RG DS this cuts cold boot from ~168 s to ~27 s to sys.boot_completed, with SystemServer‑to‑RetroArch in about 1.6 s.
  • Added - PS3/PSP-style XMB menu rendered natively (FreeType glyphs, mixed text/emoji batching, flowing-wave background, stick navigation, hold-to-repeat with 350 ms initial / 45 ms steady, black-outlined text). The whole engine is split across seven focused TUs (NanoMenu*.cpp) instead of one 9 000-line file.
  • Added - Columns you actually use: Recently Played parses RetroArch content_history.lpl; a search column with a 5x10 OSK; Applications column backed by a SystemServer-generated label cache; a pinned Settings column (leftmost) with Wi-Fi and Bluetooth full-screen overlays.
  • Added - Native libretro runner: LibretroRunner.cpp dlopens a core .so directly into the Nano EGL context before zygote even starts. You see a playable game preview around T+3 s, then hand off seamlessly to full RetroArch when the framework is ready.
  • Added - Native Drastic runner (drastic-nano): standalone init service that runs DraStic with real audio using its actual /data/user/0/com.dsemu.drastic data directory. Drops first DS frame at T+1.5 s (down from 15 s) via in-memory patches that skip the blocking slCreateEngine audio init and fix the BG-layer rendering bug. Includes touch/stylus input (real gt9xx-0 node, DS 256x192 scaling), correct button slots after reverse-engineering DraStic's keymap, stick-as-DPad layering, overlay menu with runtime shader switching, and dual-DSI Frame Sync for phase-aligned panels.
  • Added - Dedicated drastic-android-mod APK (six smali patches) replaces stock r2.6.0.4a: ESC saves to slot 9 and finishAffinity(), autosave on any exit, A/B remap, detail-panel ENTER bypass. Means closing the game never loses progress, Quick Resume always has a fresh state, and controller navigation works throughout the app.
  • Added - DRM direct-output path: while Nano owns DRM master, NEON-blitted AHB buffers with DRM PRIME zero-copy scan directly to the panel. Per-frame flip work drops from 3 ms to 150 us; triple-buffer AHB ring with per-slot EGL fences kills microhitches; per-CRTC page-flip pacing cuts secondary-display EBUSY noise from 76/min to 1/min. Result: a buttery 60 fps XMB and Quick Resume preview even on thermally-constrained handhelds.
  • Added - Quick Resume that survives reboots: persist.gammaos.nano.qr_prepared is primed at launch (before any reboot), cleared on clean exit, and FUSE-mount-gated (isQrRomStorageReady) so external-SD ROMs never fail to resolve. Applies only to Drastic + RetroArch launches; Boot Android / Recovery / Safe Mode / XMB apps all clear it so you never auto-resume a stale game.
  • Added - Quick Resume preview controls: during the live Quick Resume preview, short-press BACK hides the "Quick Resuming..." overlay text so you can keep playing on the preview with no visual clutter, and long-press BACK (3 seconds) exits the game and returns to the Nano menu. All other buttons (including SELECT) are forwarded to the game as normal input.
  • Added - Quick Resume toggle (R1): pressing R1 inside the Nano menu toggles Quick Resume on/off, with a green/red dot indicator and "Quick Resume" label in the top-right corner of both menu layouts. State persists via persist.gammaos.nano.quick_resume.
  • Added - Menu-layout toggle (L1): inside Nano, pressing L1 toggles between the XMB layout (PlayStation-style cross-media bar with columns, settings overlays, and battery/time/WiFi/BT HUDs) and a simpler List layout. Choice is remembered across reboots via persist.gammaos.nano.xmb_mode.
  • Added - Multi-path ROM scanner with case-insensitive folder matching across internal + SD storage, async threaded scans, SELECT manual refresh, 30 s background re-scan, and a 60 s post-boot grace + path-count guard so a late-mounting SD card cannot wipe your library.
  • Added - Per-display wallpaper split (nano renders wallpaper only on secondaries, XMB only on your chosen primary via persist.gammaos.nano.primary_display) plus drm_flip_h/_v props to correct mirror-mounted panels.
  • Added - Battery + time + Wi-Fi + Bluetooth HUD at 0.5 Hz, brightness/volume HUDs driven through real AudioService (so volume_music_speaker actually persists), and a full Power menu (Sleep / Shutdown / Boot Android / Recovery / Safe Mode / Boot Nano) with inline brightness slider.
  • Added - Wi-Fi and Bluetooth in minimal boot via opt-in persist.gammaos.nano.wifi=1: a gammaos-net root helper bridges Wi-Fi/BT calls, auto-confirms SSP/PIN pairing, retries failed LE/BR-EDR on the opposite transport, and survives stale opPackageName via an AVRCP absolute-volume fallback.
  • Added - SensorService started unconditionally in minimal boot so SDL emulators (PPSSPP, vita3k) no longer hang on ASensorManager_getInstance.
  • Added - DE cache quick-resume: ROMs, cores, configs and saves copied to /data/system/nano_cache/ and accessed directly (no bind-mounts), with delta-sync and ROM-mismatch guard so re-launches stay snappy.
  • Added - Native libretro + Vulkan shader chains for RetroArch .glslp/.slangp presets (26/116 CRT and 36/80 handheld LCD shaders compile natively), plus a custom Vulkan-GLSL-to-SkSL transpiler for multi-pass chains with #pragma parameter, LUTs, and loop conversion.

Fixed

  • No more black screen in normal boot when Nano's DRM takeover races SurfaceFlinger: StartPropertySetThread now waits for persist-props readiness and only starts gammaos-nano when the skip-nano flag is clear.
  • No more SystemServer crash on game launch: added an sNanoLaunchInProgress re-entry guard so forceStopPackage cannot recurse into startHomeOnTaskDisplayArea and blow the stack.
  • No more 20 s hang on game launch: the synchronous setclock_max.sh CPU-pinning script now runs in the background.
  • Lost controllers after hotplug fixed: tighter IN_DELETE matching plus a 1 Hz defensive sweep re-enumerates /dev/input/event* so a disconnected Xbox pad never stays gone.
  • No more orphan emulator processes hogging an RT CPU core after you exit a game.
  • Input bleed-through blocked via a timestamp fence on InputDispatcher plus a boolean gate cleared only on true focus entry.
  • Quick Resume reliability: survives power-menu reboots, no longer reads stale props, handles legacy XMB cache format, and clears qr_prepared when you exit back to Nano.
  • Dozens of smaller Nano fixes: XMB icons clipped in HWC mode, QR text collapsed to origin in HWC, overlay VBO leak ("Quick Resuming..." missing on dual screens), loading screen upside down in DRM, half-speed libretro preview, drastic forced-tall desync after exit+re-entry, LockSettingsService NPE loop, wallpaper persistence, FX shader stutter on low-precision GPUs, orphaned bootanim frames rendering over the Nano menu, and more.
New: GammaOS OTA - in-place updates, no recovery hop

Big picture: old-school OTAs reboot into recovery, sideload a zip, verify, then reboot. GammaOS OTA flashes the full system image in place, on the running device, with a full-screen progress UI and no trip through recovery. Optimised for small-RAM handhelds that cannot buffer a full system verification.

  • Added - gammaos-ota native binary with EGL/GLES2 UI, FreeType text, gamepad/keyboard/touch input, and a file-picker for manual package selection. SurfaceFlinger is kept alive throughout the flash so you always see progress.
  • Added - Direct block-device writes to RO-mounted partitions, with a tmpfs bind-mount over /system/bin and /system/lib64 to avoid page-cache conflicts, and a decompress-to-/data-then-stream strategy for low-RAM safety.
  • Added - Logical partition (super) flash end-to-end: authoritative extents via liblp ReadMetadata, pre-resize cache before framework stop, dmctl replace to reload the dm-linear table without the DM read-only flag, tmpfs staging at /data/gammaos-ota-stage.
  • Added - Low-RAM-safe flashing: vendor bind-mount, triple drop_caches on framework stop, periodic flush every 256 MB during writes. Verified on 1 GB devices.
  • Added - O_DIRECT SHA-256 readback verification with a smart skip for mounted logical partitions so 3.7 GB system readbacks never trigger an OOM kernel panic.
  • Added - Full/Lite variant routing: ro.gammaos.variant (lowercase full/lite) is slotted into the manifest URL (https://ota.gammaos.sh/api/v1/{device}/{variant}). tdgsi_arm64_ab no longer leaks into URLs.
  • Added - Dedicated compatibility check: OTAs now validate against ro.gammaos.build.version (1.3.0) instead of ro.lineage.build.version (21.0), with >= comparison so point releases install cleanly.
  • Added - gen_ota_package.sh packaging script with parallel XZ compression, SHA-256 hashing, widened partition list (system_dlkm, vendor_dlkm, odm_dlkm, vendor_boot, vbmeta_system, vbmeta_vendor), and build-time minimum-battery gating.
  • Added - Updater hand-off polish: the in-app progress dialog stays visible until gammaos-ota's fullscreen overlay renders, so there is no perceptible blank window between the two.
  • Added - Dedicated gammaosota SELinux domain (mirrored to 34.0 and 202404 prebuilts).

Fixed

  • Display-version truncation in build strings (GammaOS Next Lite v1.3.0 now survives Make's whitespace splitting).
  • A/B fallback tries both slots with blockdev --setrw for physical partitions.
  • Correct partition index passed through to UI so progress bars match the partition actually being written.
  • Unreliable per-SoC battery sysfs removed from runtime - minimum battery is enforced at package-build time instead.
New: GammaPad - native gamepad daemon with full UI

Big picture: gamepads on Android have never been great - partial .kl mappings, missing per-app profiles, broken triggers, no combo keys, clunky mouse mode, no calibration. GammaPad replaces the whole stack with a native daemon that exclusively grabs physical pads, merges them into a single clean virtual device, and exposes everything in Settings with a live input tester.

  • Added - Native daemon (frameworks/native/services/gammapad/) that EVIOCGRABs physical pads, runs .kl parsing with heuristic fallback, does per-axis calibration with circular deadzones and inversion, supports axis-to-button triggers with hysteresis, bidirectional analog/DPAD conversion, virtual/passthrough blacklists, and forwards force feedback. Config hot-reloads via config_version bump - you never need to re-plug.
  • Added - Full Settings UI with live input tester, multi-step calibration wizard, remap dialog with physical-input detection, activity picker for the Launch Activity action, and per-app profile management with an icon-based picker.
  • Added - Button combo mapping (Select+Start etc.) and per-app profiles tracked via TaskStackListener on a 300 ms foreground re-check.
  • Added - Mouse mode you can actually use: virtual multi-touch (Protocol B, slot cap at 1 for reliable drag), 1:1 cursor-follow, framework acceleration skipped, cursor-fade prevented, coexisting hover + virtual touch, configurable scroll speed, Select+R1 hold toggle, per-display orientation via primary_touch_orientation.
  • Added - Hides physical device nodes while captured (default on). Your gamepad disappears from /dev/input/ entirely while the daemon has it, with state-file-based crash recovery and a gammapad_restore binary for clean shutdown.
  • Added - Circle-to-square stick expansion (so ±32767 is reachable at diagonals on square-gate sticks) and per-device preset normalisation (so Xbox BT PID 0x0b13 and other PIDs both land on the layout SDL/GameMaker expects).
  • Added - Direct force-feedback output mode that writes FF_RUMBLE straight to the kernel device (e.g. sc27xx:vibrator), bypassing the 25 ms binder IPC.
  • Added - "Launch Activity" button action (ordinal 12) - bind any hardware key to any app/activity, selected via an activity picker with search.
  • Added - Screen Mapping: on-screen overlay editor that maps gamepad buttons, sticks, and DPAD to multi-touch, per-app, with radial selector, per-button colours, bounding-box resize, pinch-zoom, tap-to-delete, smart non-overlap placement, opacity slider, QS tile toggle + long-press editor, and 25-language translations.
  • Added - Controller calibration moved into SetupWizard as a 5-step inline flow with right-stick auto-detection on every motion event, so you are not fighting controls before the device is even set up.
  • Added - 65 locales of translations covering GammaPad, JoystickLedPicker effect labels, combo/per-app strings, and every new UI string.

Fixed

  • Right-stick axes now always use full signed 16-bit normalisation regardless of .kl remapping (stopping half-range right-stick output).
  • Bipolar stick normalisation correctly applied when GAS/BRAKE triggers are present but RX/RY sticks are not.
  • KEY_UP/DOWN/LEFT/RIGHT correctly converted to ABS_HAT0X/Y on devices that expose DPAD as keys but no hat axes.
  • Vibration double-scaling eliminated; calibration deadzone slider now 0-50 % instead of raw 0-8192 with correct display alignment.
  • Remap dialog no longer dismisses on BACK (captures both down + up events for non-touchscreen keys); HOME capture works via sys.gammaos.gamepad.capture_mode.
  • Mouse-mode cursor lands correctly on rotated displays (pre-applies inverse rotation before InputFlinger's ROT_270).
  • Short + long HOME press in RetroArch now sends ESC, mirroring BACK behaviour.
New: Settings, UX & platform features
  • Added - GammaOS Toolbox in Settings: surfaces 147 persist.gammaos.* knobs grouped by Display, BFI, CRT Shader, Dual-Stack, External Display, Multi-Display, IME, Audio, Gamepad, RGB LED, Launch Guard, System, Power, RetroArch, and USB/Docking. Type-appropriate Switch / List / EditText controls, a clear "advanced users" banner, and 58-locale translations. Why it matters: hundreds of hidden tuning knobs are finally visible without setprop.
  • Added - Lite / Full variant tag baked into PRODUCT_MODEL and the display version string (GammaOS Next Full v1.3.0 / GammaOS Next Lite v1.3.0), so it's obvious at a glance which build you are running and OTAs route to the right variant.
  • Added - Display settings gained Reading Mode (via LineageHardwareManager FEATURE_READING_ENHANCEMENT), Color Calibration (RGB+saturation seekbars through LiveDisplayManager), and Custom Resolution (via IWindowManager.setForcedDisplaySize).
  • Added - DPAD / gamepad navigation across Settings homepage (focus-stealing removed, auto-collapse of the toolbar on DPAD input) and Quick Settings (full navigability with auto-expand from QQS, focus initiation, page-boundary navigation, dark-orange focus indicators, no escape to footer actions). Why it matters: handhelds without touchscreens can now fully operate Settings and QS.
  • Added - Phone-taskbar gating via persist.gammaos.taskbar.phone with a real-time toggle, so form factors that need the taskbar off can kill it without a reboot.
  • Added - QS tile blacklist (persist.gammaos.qs.blacklist, comma-separated with _0.._4fragments) filters both the legacy QSTileHost and newUserTileSpecRepository` pipelines. Per-device QS layouts without forking SystemUI.
  • Added - Lockscreen disabled by default for a console-like power-on experience; users still opt-in via Settings → Security.
  • Added - adbd always root from boot with no Developer Options toggle required.
  • Changed - PRODUCT_MODEL rebranded from "TrebleDroid with GApps" / "TrebleDroid vanilla" to "GammaOS Next Full" / "GammaOS Next Lite".
  • Changed - Daijisho bumped to 1.8.1 (426 split APKs) so Play signature and future updates persist; PPSSPP to 1.20.3 (official signed); DraStic config refreshed (DefaultLayout=1, RotationMode=0, ExtDisplayBorder=5, LC_2.dat, per-game Pokemon DP layout); setup.sh auto-grants RECORD_AUDIO + BLUETOOTH_CONNECT to DraStic on first boot.
  • Changed - Translations expanded across LineageParts, Settings, frameworks/base, SetupWizard and all custom GammaOS apps (25-65 locales).

Fixed

  • 7-second SurfaceFlinger boot stall rooted out: getBootDisplayModeSupport() (a synchronous binder on the SF main thread) is deferred to lazy init, and EventThread replays hotplug events for late-registering clients. DisplayManagerService onBootPhase drops from 6636 ms to 111 ms; PackageManagerService starts 6.2 s earlier.
  • MediaTek HWC BliterNode crash on boot mitigated via a time-limited debug.sf.disable_hwc_overlays workaround scoped to affected SoCs (mt6761-mt6785, mt8766-mt8768). Starts as a 10 s window, extends until persist.gammaos.setupwizard_run=0 and provisioned, then another 10 s grace. Earlier permanent-latch version replaced.
  • Bluetooth LE pairing fix for MediaTek controllers with a broken Supported Commands bitmask (byte 37=0x00 falsely reporting no LE extended support). Uses LE-features bit 12 as fallback detection; synthesises CommandStatus from CommandComplete; legacy LE_CREATE_CONNECTION fallback with scan-disable + direct peer addressing.
  • Bluetooth crash loop on malformed HCI responses (MT6785 especially) fixed by dropping a redundant ASSERT that fired before the existing IsValid() guard.
  • hwcomposer rotation crashes tamed with persist.gammaos.rotation_cooldown (opt-in), SF skipping 5 HWC frames on orientation change, a 2 s GPU-only window, and a 1.5 s WMS rotation cooldown.
  • STREAM_MUSIC volume now persists across reboots: the multi-display volume controller seeds FROM the authoritative global stream on boot instead of overwriting it; FLAG_FROM_KEY / SHOW_UI gates removed so cmd audio and programmatic sets stay in sync with UI.
  • Timezone selection now applies when Settings is launched from a third-party launcher (Daijisho etc.) - picker fragments call TimeZoneDetector before finish().
  • APEX signing details cached across boots at /data/system/apex_sig_cache.bin. PMS scan 1.8 s → 1.6 s, PMS ready ~300 ms earlier.
  • KPOC (offline charging) backlight now controlled via the AIDL/HIDL Light HAL on MediaTek SoCs, with a prime-to-nonzero hack so the subsequent set-to-0 is honoured. Power-press re-enables BLED.
  • Tablet/taskbar mode no longer leaks into gesture and 2-button nav (shouldCreateNavBarAndTaskBar gated on 3-button mode; Trebuchet isTaskBarEnabled gated on isTablet; live recheck on mode change).
  • SetupWizard recovery page removed; right-stick preview runs on every motion event so it works before calibration; button clipping fixed in immersive mode; FLAG_KEEP_SCREEN_ON added throughout.
  • GammaEQ stopped hammering property_service from the audio mix loop: atomic cache collapses redundant writes; self-heal throttled to 100 ms via a thread_local timestamp. Audioserver CPU drops from ~25 % to near-zero per mix buffer.
  • Build fingerprint shortened to fit PROP_VALUE_MAX (91 chars) so apps reading __system_property_get (e.g. Prince of Persia) stop crashing.
  • SideFpsEventHandler null-checks FingerprintManager before use (stops system_server crashing on devices that report FEATURE_FINGERPRINT without a HAL/service).
  • RenderEngine retries EGL init when GPU drivers aren't ready at boot.
  • Non-blocking rw-system.sh via rw_system_early service (saves ~2 s); duplicate vndk-detect exec removed. Total boot on AYANEO Pocket AIR Mini (MT6785) cut from ~31.5 s to ~24.6 s.
  • 3 GB low-RAM optimisation: build-time removal of DeskClock, PrintSpooler, PrintRecommendationService, ManagedProvisioning, DeviceAsWebcam, StatementService, CalendarProvider, AudioFX. Cached-process kill grace 600 s → 0 s. phh-on-boot.sh disables APEX bloat on first boot. 60 s compaction loop pushes cold pages to ZRAM. Vendor build.prop tuned (heapgrowthlimit=96m, heapsize=192m, PSI-based LMK). Idle RAM drops from 1200 MB to 800 MB.
  • SELinux: property contexts added for sys.gammaos.*, ro.gammaos.*, sys.gamma_tweak_update; broad appdomain grants to GammaEQ/speaker-route props; 34.0 and 202404 prebuilts synced; new gammaosota domain; gammaossetupwizard.te added; gammaoscustomization.te updated.

v1.2.2 (February 2026)

A DualStack-centric release. DualStack goes from a foundational feature to a real dual-screen gaming UX with per-screen controls, plus new Launch Guard and Secondary Display Launch tiles for the handhelds with two panels.

New features

DualStack

Why this matters: dual-screen handhelds (RG DS, DS-style devices) need per-screen volume, per-screen brightness, and IME routing to feel like real two-screen consoles instead of one stretched Android display.

  • Added - Per-screen volume control (#140). New GammaMultiDisplayVolumeDialog, GammaMultiVolumeStore, AudioService + PlaybackActivityMonitor hooks, WindowManager APIs - each display holds its own media volume while DualStack is active.
  • Added - Per-screen brightness adjustment (#141). New GammaSplitBrightnessTile, per-physical-display LocalDisplayAdapter, brightness strategy selector honours the split.
  • Added - Force IME to a specific screen (#189). InputMethodManagerService, DisplayContent, and WindowManagerService route IME windows to the configured display.
  • Added - Hide SystemUI during DualStack (#216). Toggle in the DualStackControl app for clean in-game blanking.
  • Added - Full clean kill of background processes on DualStack launch (#170 / #194). Tears down every non-whitelisted process at DualStack app start, with an expanded sweep covering both displays.
  • Added - RetroArch clean-exit handshake on DualStack launch (#172). Prevents orphan emulator instances.
  • Added - DualStack apps run at top priority (#173). Per-process priority/scheduling boost on the active DualStack app.
  • Added - Multi-prop whitelist (#214). persist.gammaos.dualstack.pkgs now supports numbered continuation (_1, _2, ...), so the allowlist can exceed a single property's length limit.

Launch Guard & Secondary Display Routing

Why this matters: handhelds accidentally launching Google apps or vendor junk on a secondary display was a recurring annoyance. Launch Guard blocks unwanted launches; Secondary Display Routing pins specific apps to the secondary panel on purpose.

  • Added - Launch Guard app + Secondary Display Control app (#212) - two new standalone platform-signed apps (com.gammaos.launchguardcontrol, com.gammaos.secondarydisplaycontrol) with full layouts, shared per-app row UI, and companion SystemUI QS tiles (LaunchGuardTile, SecondaryDisplayAppsTile).
  • Added - Secondary Display state QS tile (#209) to toggle the secondary display on/off directly from Quick Settings.
  • Added - Secondary-display default app picker in Settings → Apps (#206) with SecondaryHomePicker/SecondaryHomePreferenceController and auto-launch on the secondary display.
  • Added - Multi-prop whitelist for Launch Guard and Secondary Display Routing (#215) using the same _1/_2/... continuation scheme.

Other

  • Added - Android TV build target (AndroidProducts.mk entries + per-variant lineage_tv_a64_* makefiles + rewritten generate.sh) so every existing flavour has a TV counterpart.
  • Added - GCore+ (Core+) initial A14 patches for older-SoC devices: device/google/atv product definitions, TV framework overlay tweaks, SDK excluded-core-hardware permission list, phh Treble TV overrides for A14.
  • Added - sys.gammaos.usb.connected prop derived from the sticky ACTION_USB_STATE intent (OR of device and host) for cleaner USB-aware behaviour.
  • Added - Background-process limit prop for RG DS (#169).
  • Added - /storage traversable for any app (#149) - init.rc + vold patched so any app can list /storage without hitting the zygote mount-namespace restriction.
  • Added - New CRT/LCD shader pipeline: new GammaLcdShader Skia filter, rewritten GammaCrtSimple and GammaLcd3x, ShaderControl UI vastly expanded.
  • Added - Apache License 2.0 at the repository root.
Changes
  • GammaShader performance optimisations across the system-wide pipeline.
  • DualStack stability + scheduling pass (#177): DisplayManagerService, DualStackController, RootWindowContainer and WindowManagerService reworked so stale processes are reaped consistently and the DualStack transition is idempotent. Net −700 lines of code in DualStackController.
  • "Display over apps" restriction disabled (#182) - Settings Utils.java returns the relaxed result for the gate.
Bug fixes
  • SystemUI aspect-ratio in DualStack (#139) - no more stretched/squashed UI when the stack layout changes.
  • GammaEQ audio-preview delay (#210) - MainActivity reworked, preview.mp3 replaced with a larger preview_fast.wav, follow-up stability pass on the preview-playback race.
  • Recents previews + Recents-not-showing-on-trigger fixes across NavigationBarControllerImpl, TaskbarActivityContext, AbsSwipeUpHandler, OverviewCommandHelper, TaskViewSimulator, RecentsView.
  • Trebuchet taskbar alignment/sizing (#207).
  • Disabling the secondary display no longer blanks the primary (#208).
  • SyncThing access to restricted directories (#142) - StorageManagerService + vold Utils.cpp / EmulatedVolume.cpp / PublicVolume.cpp whitelist it against the restricted-dir check.
  • GCore+ stability + unwanted lockscreen fix - StatusBarStateControllerImpl / KeyguardStateControllerImpl suppress the lockscreen path when the NoKeyguard TV overlay is active.
  • 120 Hz / 60 Hz work-in-progress commit plus MediaTek offline-charging groundwork lays the foundation for the stability wins in v1.3.

v1.2.1 (December 2025)

A short release focused on the D8300 display pipeline plus a Magisk refresh.

New features
  • Added - Half-4K external display flag. DisplayManagerService can mark an external display as forced half-4K and reapply the forced size with retries on hotplug, with a generation counter so a late retry never stomps a freshly re-attached display. Source modes at or above 3840x2160 are halved; non-4K sources are untouched.
  • Added - D8300 120 Hz vsync / BFI enforcement. On refresh-lock toggle, SurfaceFlinger resyncs to real hardware VSYNC, reapplies phase config, disables synthetic VSYNC, clears layer history, requests a full-damage repaint, and forces the pipeline hot so Black Frame Insertion stays stable. ro.surface_flinger.primary_display_orientation is now always honoured over vendor-reported orientation.
Changes
  • persist.gammaos.refresh.lock hardening: scheduler-side refresh-rate heuristics suppressed while locked, RefreshRatePolicy holds the locked rate across windowing changes, VsyncModulator cannot silently drop cadence to ~60 Hz on a 120 Hz panel.
  • Magisk updated (both magisk.tar.gz and magisk2.tar.gz).
  • Trebuchet all-apps drawer column/row math fixed for 1:1 aspect-ratio panels.
Bug fixes
  • D8300 hotplug races on both Audio and Display: DisplayManagerService, ActivityTaskManagerService, DisplayAreaPolicy, DisplayContent, RootWindowContainer, and the Performance QS tile hardened so same-cycle plug/unplug no longer leaves the window hierarchy bound to a stale display.
  • GammaEQ speaker-route flag stuck at 0 after hotplug - sys.gammaeq.route.spk can now only be cleared by mixer-style output threads (MIXER / DUPLICATING / SPATIALIZER / BIT_PERFECT); any output thread may assert "1" whenever speaker is in the output device set. Stops GammaEQ going silent on speaker until reboot when a transient DIRECT/OFFLOAD thread lost a race with the mixer thread during headphone unplug.

v1.2.0 (December 2025)

A major feature-expansion release: the first cut of DualStack for multi-display handhelds, a system-wide shader pipeline (GammaShader), a Black Frame Insertion (GammaBFI) engine for motion clarity, GammaRGB rewritten as an in-process framework sampler, an audio EQ (GammaEQ), and a long list of UI, orientation, HDMI, and taskbar improvements from the v1.0→v1.2 development cycle.

New: DualStack - initial multi-display emulation framework

Why this matters: dual-screen handhelds are powerful but painful on stock Android - everything assumes one display. DualStack gives apps a real second SystemUI, per-app resolution targeting, and lifecycle management for the second screen.

  • Added - DualStackController (~640 LoC) plus hooks in DisplayManagerService, DisplayContent, DisplayRotation, ActivityTaskManagerService, RootWindowContainer, WindowManagerService and StorageManager - the foundation for running two independent app stacks, one per display.
  • Added - DualStackControl user-facing app and a DualStack Quick Settings configuration tile.
  • Added - Per-app resolution enhancement path for DualStack via ActivityRecord override.
  • Added - RetroArch secondary-display override (GammaDualFocusTile, ActivityStarter + RootWindowContainer mods).
  • Added - Secondary-screen application lifecycle management (start options, pause/resume, finish semantics).
  • Added - Secondary-screen live wallpaper support (WallpaperManagerService + SecondaryDisplayLauncher).
  • Added - Secondary-display launcher override prop (persist.gammaos.secondary_home).
  • Added - Per-display rotation + per-device touch→display mapping via runtime props (persist.gsf.rot.<displayId>, persist.gsf.sec_rot, persist.gif.map.<device>, persist.gif.map.uid.<device>, persist.gif.map.port.<device>, persist.gif.rot.<device>).
  • Added - Unique display names so ES-DE and similar apps can target "the other" display by name.
New: GammaShader - system-wide post-processing

Why this matters: retro and emulator fans want CRT masks, LCD grids, and scanline effects across the whole UI, not just inside RetroArch. GammaShader hooks Skia's SkRuntimeEffect into SurfaceFlinger's RenderEngine so everything on screen gets the same look.

  • Added - CRT-Simple Skia filter (with optional blur and a WIP border-blur effect).
  • Added - LCD3x pixel-grid shader.
  • Added - Dedicated ShaderControl app and GammaShader QS tile for picking and tuning effects.
  • Changed - Multiple passes of GPU-cost optimisations; CRT-Simple decoupled from the old BFI+CTM coupling so shaders and BFI can be enabled independently.
New: GammaBFI - Black Frame Insertion for motion clarity

Why this matters: LCD sample-and-hold blur is brutal on fast-scrolling retro games. BFI inserts black frames between rendered frames so moving pixels look sharp, at the cost of some brightness. GammaBFI implements it two ways so it works everywhere, and pairs with a hard 120 Hz lock so the display never drops to 60 Hz and breaks the effect.

  • Added - Present-aligned BFI (CTM mode, default) via per-frame HWC Color Transform blackout.
  • Added - RenderEngine fallback (RE mode) via Skia black-replace for HWCs that dislike CTM.
  • Added - Global 120 Hz refresh lock (persist.gammaos.refresh.lock=1) that ignores per-layer setFrameRate() votes, pins min=max=highest Hz in the DisplayModeDirector, and no-ops the idle/kernel refresh-rate timers. Apps and animations can no longer drag the panel down to 60.
  • Added - Cadence presets (persist.gammaos.bfi.preset = 120:60 | 180:60 | 240:120 | 240:60) and arbitrary insertion patterns via persist.gammaos.bfi.pattern, with persist.gammaos.bfi.debug for diagnostics.
  • Added - Polarity-change scheduling to avoid long-term panel burn-in; persist.gammaos.bfi.black_floor 0.01 for vendors that can't drive literal-zero blacks.
  • Added - Global BFI QS tile and Global Refresh Rate QS tile.

Fixed

  • BFI no longer flickers when a background blur is active (dialogs, wallpaper picker).
  • Screen no longer goes permanently black on disable - clean fallback to the last content frame.
  • Hardened BFI behaviour across SystemUI dialogs and overlays, including polarity-change flutter reduction.
  • VSync enforcement regressions across non-BFI builds guarded behind additional persist.gammaos.* props so default behaviour is unchanged.
New: GammaRGB - in-process LED colour sync

Why this matters: devices with RGB LEDs (analog sticks, case accents) look way better when the LEDs sample on-screen colour live. The old version was an out-of-tree C binary that drifted from Android's brightness slider and raced the GPU. The rewrite runs inside SurfaceFlinger and just works.

  • Added - GammaRgbSampler ported into frameworks under SurfaceFlinger, replacing the standalone C sampler with an in-process implementation hooked directly into composition.
  • Added - Manual colour mode + split left/right colour support.
  • Added - Fade transitions between sampled RGB values (smooths stepping at lower sample rates).
  • Added - Brightness sync via the user brightness prop instead of sysfs, so LED intensity tracks the Android brightness slider precisely.
  • Added - Persistent primary hex colour so your last manual colour survives reboot.
  • Added - Dedicated JoystickLedPicker app (com.gammaos.joystickled) with a colour-wheel UI and custom-effects support.
  • Added - GammaRGB QS tile alongside Immersive Mode, External Docking, External Mirror, and External Resize tiles.
  • Changed - Sampler pauses while the device is asleep or otherwise off, saving power and avoiding spurious LED flashes. PowerManagerService gained additional screen-state checks.
New: GammaEQ - system-wide audio EQ

Why this matters: built-in Android audio is flat and no emulator ships its own EQ. GammaEQ hooks in near the fast mixer so every output - games, emulators, music, even UI - gets the same curve.

  • Added - In-process audio EQ near the fast mixer (FastMixer + Threads + AudioPolicyManager). Applied to all audio output, not just media.
  • Added - Runtime gate via persist.sys.gammaeq.enable.
  • Added - GammaEQ settings app (com.gammaos.gammaeq) with 10-band UI and a bundled preview track, plus a QS tile.
New: Taskbar & Trebuchet overhaul for handheld navigation

Why this matters: Android's stock 3-button nav bar is tiny, hard to hit, and wastes screen space on handhelds. Repurposing the Taskbar as the nav surface gives you bigger targets, an app-drawer icon, and consistent UX on secondary displays.

  • Added - Taskbar drives 3-button navigation system-wide (NavigationBarControllerImpl + TaskbarActivityContext wired together). Taskbar also runs on secondary displays.
  • Added - Reworked taskbar layout for handhelds: hotseat icons removed, all-apps icon moved to the left, nav buttons centred, taskbar height reduced, transient/auto-hide disabled.
  • Changed - Touch above the taskbar captured correctly (no more dead-zone touches leaking past it); Trebuchet logging trimmed.

Fixed

  • App launches from the taskbar no longer fail.
  • Quickstep overview no longer overlaps the nav bar.
  • Split-screen transitions from Quickstep no longer hang.
  • Crash when switching between gesture and 3-button nav on dual-taskbar devices.
  • Tablet-UI detection regression on wide panels.
New: Immersive Mode, Forced Landscape, Orientation & Platform
  • Added - Immersive Mode (persist.gammaos.immersive) with full-screen UX across SystemUI (DisplayPolicy + InsetsPolicy + NotificationPanelViewController + QuickSettingsController + ShadeControllerImpl) plus a dedicated QS tile.
  • Added - DC Dimming emulation via DisplayPowerController's modulated brightness curve, with Settings + QS tile entry.
  • Added - Ultra Powersave mode in PowerManagerService.
  • Added - Forced landscape when auto-rotate is off, with square-panel handling: natural orientation preserved and immediate 90°/270° flips blocked via a short grace window while sensor autorotation still works.
  • Added - Sensor + touch orientation decoupled from device tree via runtime props.
  • Added - ANR disabled (AppNotRespondingDialog / AnrController / AnrHelper / StackTracesDumpHelper / ActivityManagerService) so the system never interrupts gaming with "app not responding" prompts.
  • Added - "Stop random wakes" guard in PowerManagerService.
  • Added - Delay before entering deep sleep (audio-aware entry via FastMixer).
  • Added - A14 port of GammaOS button behaviour into PhoneWindowManager: BACK + VOLUME UP/DOWN for stepped screen brightness, RetroArch override (persist.gammaos.retroarchoverride.backbutton) turning short BACK into F1, long BACK into ESC, and BACK + any physical key into BTN_SELECT via sendevent.
  • Changed - RetroArch updated; hotkey combos no longer stick with the back-button override enabled.
New: HDMI, external display & audio routing
  • Added - AudioDeviceBroker priority order: SCO / LE / HearingAid (comm paths) → BT A2DP → wired headset/headphones/line → USB headset/device, with HDMI slotting correctly instead of stealing the speaker path.
  • Added - Allwinner HDMI audio workaround; HDMI-specific logic gated to non-Unisoc chipsets after an Allwinner-vs-Unisoc regression.
  • Added - Optionally forced GPU composition while an external physical display is connected (two rounds keyed off vendor behaviour).
  • Added - External monitor options to resize the external display and turn off the primary built-in display.

Fixed

  • Display mirroring no longer fails to show on external displays.
  • Mirror aspect ratio now correct.
  • HDMI audio switching lag on disconnect reduced.
  • AudioDeviceInventory consistency fix so HDMI detection no longer overrides the speaker path.
New: Storage, Telephony, SetupWizard, SystemUI assets
  • Added - Stable UUID for external storage (PublicVolume/PrivateVolume/VolumeBase + init.rc bootstrap), so app data tied to an SD card survives remount.
  • Changed - Scoped storage further relaxed; input-device wake disabled in the same pass; a narrower file-access relaxation after reverting the earlier, more aggressive patch.
  • Changed - Telephony support removed (generic_system.mk / handheld_system.mk / telephony_*.mk / no_telephony.xml SystemConfig + PHH Treble + framework/SystemUI resource tweaks). Handhelds don't need a dialer or SMS.
  • Changed - SetupWizard fully rebranded for GammaOS (new logo, reworked welcome/settings layouts, rewritten Lineage + user-mode scripts, updated TV layout, substantial changes to BaseSetupWizardActivity and LineageSettingsActivity).
  • Added - Ported A13 QS tiles: ABXY, AnalogAxis/Calibration/Deadzone/Sensitivity, DC Dimming, Deep Sleep, Dpad/Analog Toggle, Fan, GammaRGB, Mapping Editor, Performance.
  • Added - USB QS tile for AYANEO; removed XBOX controller .kl in favour of the new remapping stack.
  • Added - GammaOS Global Actions / Power menu: live memory/CPU/battery header, forced white tint for legacy global-actions icons, kill-foreground/kill-background/kill-all and Home shortcuts, Home key action added alongside Kill App in LineageParts.
  • Added - SurfaceFlinger background-blur enabled by default; Berry Black theme on by default; reduced dialog/button corner radii; letterbox blur/dark scrim adjusted.
  • Added - LineageParts saturation slider with live SurfaceFlinger integration and a rainbow preview bar; TwoStatePreference migration; recycler padding for DPAD focus; Trust onboarding removed.
  • Fixed - LegacyGlobalActions CPU usage calculation now aggregates /proc/stat's cpu line (iowait treated as idle), delta-based with priming, EMA smoothing α=0.3, 500 ms poll.
  • Added - Defaults changed: dark/night mode on, freeform/multi-window on, seamless rotation on, accelerated colour transforms on; strong-auth-on-boot, safe media volume, AOD, pickup gestures, QR lockscreen shortcut, and Safety Center all off.

Fixed

  • Immersive mode + QS shade closing early.
  • Presentation on secondary displays.
  • Secondary-panel sleep.
  • Crash when switching nav modes with dual taskbar.
  • VSync enforcement regressions (guarded behind props for per-device compatibility).
  • Random wakes stopped.
  • Storage access regression on some MTK devices.
  • LegacyGlobalActions UI fixes, QS updates, WM rotation updates.

v1.1 series (August-November 2025)

Point releases for Anbernic T618 (RG405M / RG405V / RG505), a GameMT E6 MAX re-release, the Anbernic RG DS preview, and Mangmi Air X. These builds brought the A14 / LineageOS 21 port online on a wider device set while the v1.2 feature rollout was in progress.

Highlights
  • A14 port of GammaOS key customisations (PhoneWindowManager, SetupWizard, Settings, custom system props, SELinux domains) from the A13 codebase.
  • Port of button remap / analog calibration / layout persistence stack from A13.
  • Early Taskbar-driven 3-button navigation migration.
  • Initial immersive-mode and forced-landscape experimentation.
  • Vendor quirk fixes for Allwinner, MediaTek and Unisoc targets (HDMI audio, storage, rotation).
  • GNext branding added (boot logo, default wallpapers, GammaOS assets).
  • GammaEQ initial integration (refined and gated in v1.2).
  • Relaxed scoped storage + stable external-storage UUID.

v1.0.0 - Initial release

Core System
  • Android 13 / LineageOS 20 Base: A clean, debloated build for snappy performance and minimal bloat.
  • Google Services & Lite Option: Full Google Play Store support in standard builds, or choose "Lite" to forgo Google apps and maximize performance.
  • Aurora Store: Seamlessly sideload apps without needing a Google account.
User Interface & Navigation
  • Daijisho Launcher: Pre-configured for RetroArch (GB, GBC, GBA, NES, SNES, Genesis, PSX). (BIOS files must be supplied by the user.)
  • App Drawer in Navigation Bar: Instantly access any installed app from the nav bar, no more returning to home to switch apps.
  • Screen Rotation Controls: Enforce landscape mode when rotation is disabled, ensuring your games and apps stay in the correct orientation.
Input & Controls
  • Universal Button Remapping: Remap any physical button to any other key or button input, giving you total flexibility over your gamepad layout.
  • Analog Stick Calibration: Fine-tune stick behavior by adjusting range and deadzone settings for tighter, more precise controls.
  • L2/R2 Fixes: Corrected L2 and R2 button behavior to ensure compatibility in games and apps.
  • Layout Persistence: Once you choose a button layout (XBOX, NS, etc.), it remains across reboots, no reconfiguration required.
Display & Lighting
  • DC Dimming Emulation: Reduce PWM flicker on devices that exhibit it, making long play sessions easier on the eyes.
  • GammaRGB LED Sync: For supported devices, mirror on-screen colors to RGB LEDs on the analog sticks and synchronize LED brightness with screen brightness.
  • 60 Hz Refresh Rate & Oversharpening Fixes: Smooth display performance with corrected refresh and oversharpening issues.
Performance & Power
  • Performance Governors: CPU, GPU, and memory tuned to performance profiles for extra speed when you need it.
  • Quick Settings Tiles: One-tap toggles for performance modes, analog sensitivity adjustments, ABXY remapping, axis inversion, and D-pad/analog swaps, and much more.
  • Deep Sleep Mode: Force-freeze background apps via cgroup modifications to prevent emulators or other apps from running unnecessarily (use with caution, some apps may break).
Root & Modding
  • Magisk Root: Pre-installed root access with Magisk, ready for modules, custom ROM tweaks, or system modifications.
Storage & Security
  • Relaxed Scoped Storage: Loosened security requirements so apps can freely access files without being blocked, making file management and emulator setups simpler.
⚠️ **GitHub.com Fallback** ⚠️