2182 Commits
Author SHA1 Message Date
Kurt Himebauch dfc0fd4340 fix: harden diagnostic staging lifecycle 2026-11-05 14:49:11 -05:00
Kurt Himebauch 11c0763fba fix: preserve log cleanup failures 2026-11-05 14:42:22 -05:00
Kurt Himebauch ff686d7c3b fix: expire stale log exports safely 2026-11-05 14:42:22 -05:00
Kurt Himebauch 4765644451 fix: harden log export transactions 2026-11-05 14:42:22 -05:00
Kurt Himebauch 718712eb01 fix: secure and refresh unrooted log exports 2026-11-05 14:42:22 -05:00
Kurt Himebauch ca0689d254 fix(steam): default listed titles with a bundled arm64 Linux build to FEX (#2126)
Refs #1774.

Maldhalla (4385780) ships its x64 and arm64 Linux builds side by side in
one depot. Its launcher starts the arm64 build when it runs on an Arm
host, natively or as an x86 shell under FEX. Steamworks offers no arm64
value for a launch option's CPU architecture, so the appinfo still reads
`oslist` linux+windows and `osarch` 64. `native_targets()` therefore
leaves the title on the Proton ARM64 default, which runs the Windows
build.

This PR adds `FEX_DEFAULT_APPS`, an explicit allowlist (the opt-in
suggested in #1774). A listed title defaults to `droiddeck-fex` instead
of `NATIVE_CHOICE`. Nothing else changes:
- A player's own pick is kept, as before.
- Unlisted titles keep today's behaviour, including the Factorio
native-choice case.

On the Snapdragon 8+ Gen 1 tablet from #1774, our benchmark scores 8–11
with the Windows build under Proton ARM64 and above 100 with the native
arm64 build.

Test:
`ProtonDefaultTest.test_a_listed_title_with_a_bundled_arm64_linux_build_defaults_to_fex`
in `tools/tests/test_game_environment.py`. It fails without the change.
`ProtonDefaultTest`, `test_droiddeck_proton_default`,
`test_steam_compat_mapping`, `test_appinfo_lookup` and
`test_steam_compat_live` pass.
2026-11-05 14:41:54 -05:00
phj1081 7e0859872b fix(steam): keep a cleared FEX default for a listed title as a native choice
A listed title whose automatic FEX mapping the player clears now records
the empty mapping as a native choice, as titles with NATIVE_CHOICE do,
instead of getting FEX again on the next run.
2026-11-05 14:22:15 -05:00
phj1081 28d4f58f33 fix(steam): default listed titles with a bundled arm64 Linux build to FEX
Steamworks has no arm64 launch-option architecture, so a title that ships
x64 and arm64 Linux builds side by side still reads as osarch 64 and gets
the Proton ARM64 default. List such titles in FEX_DEFAULT_APPS so they
default to Linux x86 (FEX), whose launch runs the bundled arm64 build. A
player's own pick is kept, and unlisted titles are unchanged.

Refs #1774
2026-11-05 14:22:15 -05:00
Kurt Himebauch ee0d8d9997 fix: guard session clock logger lifecycle 2026-11-05 14:00:30 -05:00
angelrenefm 5805631be5 Session logs: record clocks, thermal status and battery temperature in every session
ClockLogComponent was only created inside startVkBridge(), so it never ran
on Adreno. Create it for every session (clocks.log, was vkbridge-clocks.log)
and append the battery temperature from ACTION_BATTERY_CHANGED to each
sample.

Part 1 of #1837.
2026-11-05 14:00:30 -05:00
K baf7d90df9 build: drop the unused androidTest variant so the VS Code Kotlin import works
The project has no instrumented tests. The Kotlin extension's Gradle import
reads the debugAndroidTest outputs without running their tasks and fails.
2026-11-05 14:00:11 -05:00
K11MCH1 cb3c3cb2c9 Added games: a reused ranking is not remembered as a fresh walk
A ranking a scan took from added-games-scan.json was also put in the
60-second in-memory cache with the current time, so for the next minute
single(), addFolder() and the exe picker, which ask for a fresh walk, got
a ranking that could be a week old. Kept rankings are now returned without
entering that cache, so it only ever holds rankings from real walks.
2026-11-05 13:59:59 -05:00
K11MCH1 df60fdb194 Added games cache: skip bad records, expire names on read, retry failed saves
A record whose fields could not be decoded threw while the cache loaded,
and since every scan loads it first, one bad record blocked every scan;
each record is now decoded on its own and skipped if it is malformed.

name() returned names older than a week that were still in memory; it now
applies the same age limit as rank().

save() cleared its dirty flag before writing and called startWrite outside
its try, so a write that failed was never retried and could replace the
scan's result with an exception; a failed write now leaves the cache dirty
and is tried again on the next save.
2026-11-05 13:59:59 -05:00
K11MCH1 93923e125d Added games: one scan at a time, and keep what it found across launches
Every Steam session scans the added games before the Linux side starts,
walking each game folder for its exe and reading the exe's version info.
On an AYANEO Pocket FIT Elite with 40 games on an exFAT SD card that walk
took 10 s with a warm cache and up to 155 s after Android had dropped it,
and the front end's art pass and library load ran the same scan at the
same time, so the session waited on all of them.

Scans now run one at a time, so a waiting scan reuses what the one before
it just found. Each game folder's exe ranking and identified name are kept
in added-games-scan.json; a scan reuses a ranking while the folder's
modification time is unchanged, its first exe still exists and it is under
a week old, and walks the folder again otherwise. The exe picker, single
game refreshes and adding a folder still walk the folder fresh.
2026-11-05 13:59:59 -05:00
K11MCH1 fcbd45453f Steam imports: read only the linked manifest, and leave staged ones alone
seed_install read the app's manifest from every library before checking
that it was the linked DroidDeck install, so a manifest in another library
that is not UTF-8 raised past the caller and stopped routing for later
games. It now returns before reading anything but the linked manifest.

An untouched manifest from an older version was migrated even while
steamapps/downloading/<appid> existed; that migration now waits until
Steam is not staging the app, like the rewrite of a queued import.
2026-11-05 13:59:44 -05:00
K11MCH1 1ec1c20be1 Steam: imported games with no known build update only when launched
An added game the account owns is linked into Steam as DroidDeck-<appid>.
When the folder carries no Steam build, Steam marks it Update Required and
checks every file before updating. That check reads the whole game, and an
interrupted one starts over, so on an SD card it ran again in every session
and kept the card busy: Lords of the Fallen (33 GB) restarted 51 times in a
day on an AYANEO Pocket FIT Elite.

The manifest for such an import now asks Steam to update the game when it
is launched. Imports that Steam already rewrote, but whose update has not
started, switch from "always keep updated" to "update when launched"; a
priority of 2, an update in progress, or an import with a recorded build is
left alone.
2026-11-05 13:59:44 -05:00
Kurt Himebauch ccab14384d test: isolate unrooted log archive output 2026-11-05 13:52:43 -05:00
angelrenefm 8cc652e812 fix(droiddeckctl): address review on logs latest
Stream each archive entry to disk instead of reading it into memory,
refuse an archive from a session that started after the state call, and
delete the exported zip from shared storage once it has been pulled.
2026-11-05 13:52:43 -05:00
angelrenefm 2fb066507a fix(droiddeckctl): logs latest works without root
`logs latest` pulled the session folder under getFilesDir(), which adb
cannot read on an unrooted device, so it always failed with "Permission
denied" and droiddeck-scenario kept no logs for failed runs.

The agent bridge gets a `logs` method that writes the Share logs archive
to the app's external files folder (agent-logs/), and droiddeckctl pulls
that zip and unpacks it into the destination with the session's files at
the top, as before. Builds without the method still get the old pull.
2026-11-05 13:52:43 -05:00
Kurt Himebauch 4b6cba0a6d fix(l10n): mark Russian percent string unformatted 2026-11-05 13:49:20 -05:00
flexeykinDev 4f831fbd34 l10n(ru): translate strings added since the last translation pass
Adds the 83 Russian strings that showed in English: extra Steam libraries, session logs, dual screen launcher and sessions, PC keyboard options, the bottom screen desktop, screen swap, the stats HUD and the Mali bridge GPU info.
2026-11-05 13:49:20 -05:00
Kurt Himebauch a28ff05981 fix: handle enhanced log chooser launch failures 2026-11-05 13:32:46 -05:00
Kurt Himebauch 2ab8a1bac3 test: validate enhanced log share descriptor reads 2026-11-05 13:32:46 -05:00
wallentx 7053058db6 Harden enhanced diagnostics collection and sharing 2026-11-05 13:32:46 -05:00
wallentx 44f8d5de70 Check the matching diagnostic manifest entry 2026-11-05 13:32:46 -05:00
wallentx 3c6447528a Make secure log export testable under Robolectric 2026-11-05 13:32:46 -05:00
wallentx 5614bd5d5a Add enhanced one-session diagnostic bundles 2026-11-05 13:32:46 -05:00
KeegantheVeganat0r b563b8d1eb fix(hud): translate low FPS toggles in all supported locales 2026-11-05 12:38:55 -05:00
KeegantheVeganat0r 6b887c42af feat(hud): add independent 1% and 0.1% low toggles 2026-11-05 12:38:55 -05:00
Omar Al Taki 3d1f0f63b9 fix(input): release a held mouse Back only when its own device disconnects 2026-11-05 12:13:51 -05:00
Omar Al Taki aad60fef5b fix(input): keep the right button down until every overlapping mouse Back is released 2026-11-05 12:13:51 -05:00
Omar Al Taki db8c66b107 fix(input): keep mouse Back routed to screen-key text fields while editing them 2026-11-05 12:13:51 -05:00
Omar Al Taki abb28792e8 fix(input): release a mouse Back right click on focus loss and pass nav Back through
Address review: a navigation-bar Back that arrives while an injected mouse
Back is held now stays Back instead of releasing the right button early.
A held right button is released on pause, focus loss and input-device
removal, like the other held Back handling. While the session is
suspended or still loading, Back is no longer sent to the guest.
2026-11-05 12:13:51 -05:00
Omar Al Taki 57b3623a9a fix(input): mouse right click no longer acts as Back in REDMAGIC cast mode
REDMAGIC's cast mode replaces a mouse's right button with a Back key that
names no device and lacks the virtual-hard-key flag that the navigation
bar and back gesture set. During a session, a Back from a mouse, or that
injected form while a mouse is connected, now presses the guest's right
button. The navigation bar, back gesture and controller Back still act
as Back, and so does a right click while a DroidDeck menu is open.

A mouse's Back and Forward buttons no longer also send a left click;
Android delivers them as key events.
2026-11-05 12:13:51 -05:00
Anton bae4ecd867 fix: leave run-mode apps unpinned when all cores are selected 2026-11-05 12:13:45 -05:00
Boran Miao 17fb80ad51 test: quote emulator installer paths with spaces 2026-11-05 12:09:56 -05:00
Boran Miao 5e0f5cb9cd fix: install bundled PPSSPP through the Flatpak helper 2026-11-05 12:09:56 -05:00
HCOOKIELYT 0544933abd fix(steam): show progress while applying client updates
Forward extraction and installation messages from the x64 bootstrap log and replace stale download percentages with the applying-update state. Add regression coverage for phase ordering and log forwarding.

Fixes #812
2026-11-05 11:56:42 -05:00
Kurt Himebauch fe1dd8ca72 test(battlenet): close the folder scan case 2026-11-05 11:56:37 -05:00
visail 969b7e625f fix: list Battle.net games installed under Blizzard's China uids
Blizzard's China client records some products under a CN uid, so the installs
it makes never reach the Library and their Stores card keeps offering Install:

  Diablo II: Resurrected  osic      (catalogue had osi)
  StarCraft II            s2_cn     (catalogue had s2)
  Diablo Immortal         anbs_cn   (catalogue had anbs)

title() now resolves those uids to the international title, so the Library, the
Stores "installed" state, the cover folder and the launch code all agree, while
Game.installUid keeps the uid the Agent recorded for updates and uninstalls.
TITLES and STORE are untouched.
2026-11-05 11:56:37 -05:00
sanogueralorenzo 1c24c600cd refactor: clarify adaptive stick hit testing and test setup 2026-11-05 11:43:46 -05:00
sanogueralorenzo d8c1bc6059 fix: extend left adaptive stick activation to the screen edge 2026-11-05 11:43:46 -05:00
uubooster-team e1fe6f99cf fix(network): handle gatewayless IPv4 VPN links
Provide compatible gateway metadata for IPv4 VPN links without changing
VPN routing, and keep text and JSON network snapshots consistent.

Add regression tests for gateway selection and network snapshots.
2026-11-05 11:43:30 -05:00
coffeemeist3r ef305c93cd fix(mesa): Steam's UI no longer crashes when scrolling the Home shelf fast on PowerVR
Zink's rebind_image() and zink_rebind_all_images() refreshed only a sampler
view's main image view after the resource got a new backing object. The
view's zs_view and cube_array surfaces stayed on the old object and were
freed with it, so the next descriptor update wrote a garbage VkImageView.

On PowerVR (needs_zs_shader_swizzle) every RGBX/BGRX view has a zs_view, and
Steam's web helper segfaulted in vkUpdateDescriptorSetWithTemplate within
seconds of fast Right presses on the Home shelf. The new Mesa patch rebuilds
all of the view's surfaces with init_sampler_view().
2026-11-05 11:28:51 -05:00
Systina12 f6f26d03f9 fix: quote GPU environment values before writing shell exports 2026-11-05 11:18:29 -05:00
dddms e72cddccd9 perf(steam): decode requested appinfo records only
Avoid decoding every app when Start without Steam resolves one game launch. Use wanted-app selection in the single-game helpers while keeping the existing field decoder and full-reader default for bulk callers.

Track partial coverage separately from complete results, share one immutable byte snapshot for incremental queries, and keep timestamp invalidation and warm hits. Preserve the last valid duplicate record and release the raw snapshot after a full decode.

Add format/cache/structural-budget and launch-resolution regressions, reuse the existing binary fixture encoder, and document the host-only performance scope.
2026-11-05 11:17:03 -05:00
vitamin663-sys 92a588ea16 fix(input): add radial stick dead zone setting 2026-11-05 10:53:15 -05:00
cphillamandmaxjivi05 e879375ca4 fix: upscale game buffers before native-resolution composition (#1367)
* fix: upscale game buffers before native-resolution composition

* fix: drop an added code comment from the effects source draw

* fix: effects source keeps pillarboxed games and near-full source rectangles

* fix: a larger opaque draw above keeps the full composition path

---------

Co-authored-by: maxjivi05 <maxjividen@gmail.com>
2026-11-05 10:34:19 -05:00
Kurt Himebauch 7c5bf77f17 fix: fit output after pip resize 2026-11-05 10:18:37 -05:00
visail a0a7a66470 fix: use Blizzard's China hosts for Battle.net installs and update checks
The Agent's install request pointed at http://cn.patch.battle.net:1119/<product>.
That host only 301-redirects to the country's version service today; Blizzard's
China client asks cn.patch.battlenet.com.cn:1119 directly.

The update check built <branch>.version.battle.net, so a China install (branch
cn) asked cn.version.battle.net, which does not answer; the China service is
cn.version.battlenet.com.cn.

Only region cn changes.
2026-11-05 09:56:40 -05:00