Commit Graph
50476 Commits
Author SHA1 Message Date
Henrik Rydgård d4e3c7eb2b Merge pull request #22972 from Samueru-sama/patch-3
remove `llvm-libs-nano`
2026-11-07 07:18:49 +01:00
Samuel fa2f2eed50 remove llvm-libs-nano
not needed for a long time
2026-11-07 00:31:14 -04:00
Henrik Rydgård 0acbc18824 Merge pull request #22970 from hrydgard/missing-assets
Add missing fonts to CMakeLists.txt
2026-11-07 00:59:04 +01:00
Nemoumbra 1805e93d11 Add missing fonts to CMakeLists.txt 2026-11-07 02:25:35 +03:00
Henrik Rydgård c5563eda30 Merge pull request #22969 from hrydgard/more-ui-work
Confirm clearing the Recent list, settings prompts as popups
2026-11-07 00:03:17 +01:00
Henrik Rydgård 1b3ab1619f More spacing issues 2026-11-06 23:25:17 +01:00
Henrik Rydgård 08931322b4 Add string for previous commit 2026-11-06 23:20:37 +01:00
Henrik RydgårdandClaude Opus 5.5 a0007d19e9 Settings: Ask about restoring a page's defaults in a popup, not a full screen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 23:07:48 +01:00
Henrik RydgårdandClaude Opus 5.5 361ea4c824 Games list settings: Ask before clearing the Recent list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 23:07:13 +01:00
Henrik Rydgård b83d2ffe8f Fix spacing issues 2026-11-06 22:58:31 +01:00
Henrik Rydgård 7c3807b425 Merge pull request #22966 from hrydgard/vsh-host-battery
scePower: Report the host's battery level to the XMB
2026-11-06 22:47:08 +01:00
Henrik Rydgård 2dffa9efc2 Merge pull request #22968 from hrydgard/more-ui-work
Game browser: Just grid and list, with an icon size each
2026-11-06 22:44:04 +01:00
Henrik Rydgård cbaec7fac2 Merge pull request #22967 from hrydgard/android-java-review
Android: Java review fixes, dependency updates, leak instrumentation
2026-11-06 22:43:43 +01:00
Henrik RydgårdandClaude Opus 5.5 b35bfcc869 Android: Only count a "name (N)" result as a name conflict
The provider answers a taken name with a renamed copy, "name (1)" or
"name (1).ext", but it also replaces characters FAT doesn't allow with '_',
which isn't a conflict. Create, copy and rename now only report
ALREADY_EXISTS (and undo) for the numbered form of the sanitised name.

Also take the image picker's result from ClipData when there's no data URI,
like the document picker does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:37:24 +01:00
Henrik Rydgård 52c6a8237c Separate "Move data" from OK on MemStickScreen 2026-11-06 21:30:54 +01:00
Henrik RydgårdandClaude Opus 5.5 4abd722b54 Android: Cache one provider client per authority, add an Android todo doc
A query on a second authority closed the cached client while another
thread could still be using it. Now each authority keeps its own client,
dropped only when its provider dies.

docs/android-todo.md lists the review findings left for later (image picker
decoding on the main thread, the VR exit in onDestroy, the achievements
host override receiver), and android-device-testing.md describes the
LeakCanary/StrictMode setup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:29:40 +01:00
Henrik RydgårdandClaude Opus 5.5 334115da49 GameBrowser: Resize the grid cells when the icon size changes under the popup
The screen under a popup is only laid out, not recreated, so the grid kept the
cell size it was created with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:23:18 +01:00
Henrik RydgårdandClaude Opus 5.5 9c7125b55c FirmwareScreen: Show the description while loading
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:17:38 +01:00
Henrik RydgårdandClaude Opus 5.5 63ff8c8382 GameBrowser: Drop the small list, the large list is now just the list
The grid and the list each get their own icon size (GameGridScale and the new
GameListScale), changed by the zoom shortcuts and the settings popup for the
view mode of the browser it's opened from. A saved view of 2 (the old large
list) reads as the list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:17:38 +01:00
Henrik RydgårdandClaude Opus 5.5 156b9b3ee6 Android: Fixes from a review of the Java code, debug leak instrumentation
- A recreate (font scale, resolution change) re-sent the launch intent's
  game to native, which booted it over whatever was running.
- Exceptions in posted commands (bad parameters, setPrimaryClip) no longer
  crash the app; the request is answered as failed.
- Close tombstone streams and the free-space fd on error paths.
- Keep the CameraHelper across graphics restarts (it leaked a SurfaceTexture).
- Don't treat an unreadable document name as a name conflict, which deleted
  the file just created.
- Tree picker: convert to a document URI even if the persistable grant fails.
- ShortcutActivity: don't open a second picker on recreate, and finish when
  the old file chooser is backed out of.
- Skip null names/MIME types in listings, null device in the Joy-Con check.

Debug builds now set a StrictMode VM policy (leaked closables, registrations,
activities), and -PleakCanary adds LeakCanary to debug builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:13:52 +01:00
Henrik RydgårdandClaude Opus 5.5 98c127bbb3 Android: Update Gradle to 9.9.0, AGP to 9.5.1, protobuf to 4.36.2
protoc was still on 3.25.3 while the runtime was on 4.x; both are now 4.36.2.
appcompat stays at 1.7.1, since 1.8.0 needs minSdk 23.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 20:57:56 +01:00
Henrik RydgårdandClaude Opus 5.5 8a78c7ba96 scePower: Report the host's battery level to the XMB
The XMB polls scePowerGetBatteryLifePercent about once a second and draws
it in its status bar. When running the VSH, return the host's battery
level there and in the power callback's percentage bits. Games still see
a full battery, so a run doesn't depend on the host's charge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:49:51 +01:00
Henrik Rydgård 3809223111 Merge pull request #22965 from hrydgard/more-ui-tweaks
More UI tweaks: Two-pane memory stick move screen, PPGe font
2026-11-06 19:13:38 +01:00
Henrik RydgårdandClaude Opus 5.5 29cc2f20bb ConfirmMemstickMoveScreen: Make it a two-pane screen, like the memory stick screen
The two columns of loose text didn't fit in portrait. Now the status, warnings
and folders are in groups on the left (or on top), and Move Data and OK on the
right (or below). The move's progress gets a progress bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:34:24 +01:00
Henrik RydgårdandClaude Opus 5.5 55d98c24dc ProgressBar: Draw the track, and the done part in the focus color
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:29:59 +01:00
Henrik RydgårdandClaude Opus 5.5 da79b621b0 TwoPane dialogs: Respect NoBackButton in landscape too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:29:59 +01:00
Henrik Rydgård 3229e79003 Merge pull request #22964 from hrydgard/symbolmap-roundtrip
SymbolMap: Fix loading symbol maps while a game runs
2026-11-06 18:28:50 +01:00
Henrik Rydgård c37c089bc5 Use the wider version of the font for PPGe drawing (PSP dialogs). 2026-11-06 18:16:31 +01:00
Henrik Rydgård 7a88c1521e Merge pull request #22962 from hrydgard/memstick-screen-fixes
MemStickScreen: Folder checks, safe moves, progress and readable folder names
2026-11-06 18:16:25 +01:00
Henrik RydgårdandClaude Opus 5.5 5c0b39e8f6 SymbolMap: Fix loading a symbol map while a game runs, and saving unnamed data
Loading a .ppmap cleared the map first, which also forgot which modules were
loaded and where. The file's modules came back at the addresses they had when
it was saved, and none of them active, so every symbol in a module vanished
until that module happened to load again. It now merges into the map: the
file's modules are matched to ours by name, and its names win.

Unnamed data was saved with "(null)" as its name, which came back as a label,
and data without a name was dropped on load.

The no$ format only has absolute addresses, so it now only saves functions of
loaded modules, and loading attaches them to the module they're in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:01:35 +01:00
Henrik Rydgård c6db1e0b46 Merge pull request #22963 from hrydgard/ptprecv-buffer-end
sceNetAdhocPtpRecv: Take a buffer that runs past the end of memory
2026-11-06 17:58:19 +01:00
Henrik RydgårdandClaude Opus 5.5 784b9e4b44 MemStick: Compare folder locations as a StorageLocation struct
Instead of "volume:path" strings, the volume and the path in it are kept
apart, and IsInside() says which side is the folder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:53:02 +01:00
Henrik RydgårdandClaude Opus 5.5 b3aee84a8e Path: Recognize content URIs on every platform
So code that handles them can be tested anywhere. Elsewhere, file operations
on them just fail, as they did when they were taken for native paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:53:02 +01:00
Henrik RydgårdandClaude Opus 5.5 185bbd5b5d sceNetAdhocPtpRecv: Take a buffer that runs past the end of memory
It's possible to try to recv more than fits in memory using
sceNetAdhocPtpRecv, but it's ok as long as the received data fits,
as shown by the new pspautotests net/adhoc/ptp. We refused it with
INVALID_ARG on every call. Now the recv is limited to what fits in
memory, and the game's length is put back if the call fails without
waiting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:32:46 +01:00
Henrik Rydgård 494968509b Merge pull request #22961 from hrydgard/apctl-scan-ids
sceNetApctl: Access point scans like a PSP's (MGS: Portable Ops and Peace Walker recruiting)
2026-11-06 16:45:28 +01:00
Henrik RydgårdandClaude Opus 5.5 a61893dcc1 Translations: Memory stick folder checks, move progress and failures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 16:16:29 +01:00
Henrik RydgårdandClaude Opus 5.5 edff9f4a95 MemStick: Delete the originals by top-level folder on content URIs
DeleteDir takes a folder's contents along there, so a copying move's cleanup
is one storage call per top-level item instead of one per file and folder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 16:16:29 +01:00
Henrik RydgårdandClaude Opus 5.5 ec532bd420 MemStickScreen: Count save states as existing data, warn that a move replaces files
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 16:16:29 +01:00
Henrik RydgårdandClaude Opus 5.5 57313b0673 sceNetApctl: ScanSSID2 is a scan of its own, scans take time before they end
From pspautotests net/inet/apscan2: sceNetApctlScanSSID2 takes an SSID
to look for (or NULL), doesn't change the state, and ends with
SCAN_STOP about 2.2s later. Its results, read with GetBSSDescIDList2
and GetBSSDescEntry2, are separate from the User ones and cleared when
it starts, and a ScanUser called meanwhile runs after it. A scan for
one SSID looks among the access points recent scans made up.

A User scan's SCAN_REQUEST now comes at once and SCAN_COMPLETE 2.2s
later; the handler used to see both at the end. Results are filled in
when a scan ends, so both lists are empty until then, and a second
ScanUser before the first ends fails with 0x80410a80 (net/inet/offline).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:30:09 +01:00
Henrik RydgårdandClaude Opus 5.5 d4b11f8870 sceNetApctl: Scan results like a PSP's, new made-up access points each scan
- Fixes #20703

MGS: Portable Ops makes a recruit from the strongest access point a scan
finds (after mashing O to fill the meter), and won't take the same one
again for a long time. The made-up access points never changed, and the
configured one was always the strongest at 99%, so after a recruit or
two every scan came up empty. Now each scan makes up new BSSIDs, SSIDs
and strengths, and sorts them strongest first.

The User functions now also match pspautotests net/inet/apscan and
net/inet/offline: IDs from 1 (slot 0 is valid but empty), 0x80410a09
past the last one found and 0x80410a82 past the 20 slots, a 33-byte
SSID, and no SCAN_STOP event after SCAN_COMPLETE. The ...2 functions
Peace Walker uses keep their old numbering and SCAN_STOP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:10:04 +01:00
Henrik RydgårdandClaude Opus 5.5 4079be9a05 StorageTest: Test the memory stick move and folder checks too
The rename, copy and undo paths of MoveDirectoryContentsSafe(), and
CheckNewMemstickFolder() on a renamed PSP folder, in the scratch folder,
so on a device they run through content URIs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:37 +01:00
Henrik RydgårdandClaude Opus 5.5 745602bd5c MemStickScreen: Count down five seconds to the restart after a move
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:37 +01:00
Henrik RydgårdandClaude Opus 5.5 dbca4f8069 MemStickScreen: Show the move's progress, and the free space after views are recreated
The spacer column was FILL_PARENT high, which in the new row of columns
took the whole screen and pushed the progress below off it. The free
space was set on a view that RecreateViews() then replaced with a new
one saying "...", so it's kept and used when creating the views.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:37 +01:00
Henrik RydgårdandClaude Opus 5.5 1c0d8a2b96 MemStickScreen: Readable folder names, say what the move is doing
- Folders show as "Internal storage / PSP" or "SD card (1234-ABCD) / PSP",
  and the app's own folder as "App private data", instead of content URIs
  and /storage/emulated/0/Android/data/... paths. Here and in the
  settings.
- The move's progress names the pass it's in (moving, finding files,
  copying, checking, deleting the originals, putting things back) with
  the count, on a line of its own above the file, across the whole width.
- A successful move shows "Done!" for three seconds before restarting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:37 +01:00
Henrik RydgårdandClaude Opus 5.5 86fcd95a4f Add a memory stick start screen for Tools/android_run.py
--start-screen=memstick opens the memory stick screen as the settings do, for
moving an existing memory stick, where memsticksetup is the first-boot one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:37 +01:00
Henrik RydgårdandClaude Opus 5.5 481a15ed93 Path: Make ToVisualString's relative root work off Windows
The non-Windows handling sat inside the content URI branch, after its
return, so the root was ignored. Found by PathMore on Android.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:36 +01:00
Henrik RydgårdandClaude Opus 5.5 3088cf5d3d Path, AndroidContentURI: Stop ComputePathTo at whole folder names, more tests
ComputePathTo() trusted StartsWith(), a plain string prefix, so "/a/b" was
a parent of "/a/bcd" (giving "d"), and "primary:Games" of
"primary:Games2/x". AndroidContentURI's also always skipped a separator,
so from a volume root like "1234-ABCD:" the first letter of the next
folder went missing. CreateFullPath() computes paths from the tree root
this way.

New tests cover parsing and building content URIs, escaping, extensions
and navigation, and Path's components, joining, prefixes, HTTP paths and
visual strings. EXPECT_EQ_STR now parenthesizes its arguments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:36 +01:00
Henrik RydgårdandClaude Opus 5.5 261d33f5a1 MemStick: Recognize renamed PSP folders, safer leaving after a move
- A PSP folder under another name is recognized: picking one is refused,
  since the data would go into a new PSP folder inside it, and so is
  picking anything in it. On disk that's SAVEDATA with SYSTEM or GAME, or
  PPSSPP_STATE. For a picked tree, whose parents we can't see, a SAVEDATA
  or PPSSPP_STATE anywhere in its path.
- The new folder is saved as the one to use after a rename-based move
  too, not only a copy. So leaving the screen after the data moved but
  the switch failed restarts onto the new folder, instead of staying on
  the emptied old one.
- Picked folders get the same write test as native ones, so a
  write-protected SD card is refused before anything is moved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:36 +01:00
Henrik RydgårdandClaude Opus 5.5 cff780f339 MemStick: Undo a failed move, save the new folder before deleting
A move that failed partway left the data split: what was renamed before
renaming gave up stayed in the new folder, and the copy's leftovers too.
The screen said "Failed to move some files!", which then wasn't even
shown. The move now records what it renames and creates, and a failure
puts it all back. The screen says nothing was changed, or in the rare
case that something couldn't be moved back, that the data is now partly
in each folder.

The copying move also deleted the originals before the new folder was
saved as the one to use, so being killed while deleting left the config
on a half-emptied folder. memstick_dir.txt is now written once the
copies are verified, before anything is deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:36 +01:00
Henrik RydgårdandClaude Opus 5.5 6f44800232 MemStickScreen: Finish directly, the screen manager handles it now
24d8955531 fixed a caller finishing itself from dialogFinished(), which
this screen worked around with a flag picked up in update().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:53:36 +01:00