51 Commits
Author SHA1 Message Date
Tom Pratt 6877e436fb Android: Dual core warning when hosting netplay
Using dual core during netplay seems sufficiently detrimental that its worth showing this warning message and the option to turn dual core off when starting netplay.
2026-07-19 20:30:53 +02:00
Tom Pratt 009a87de59 Scaffold / Appbar composable
Custom composable that switched between compact and medium size app bar depending on a combination of orientation and screen size. (Small app bar when horizontal on small devices, medium app bar otherwise. Medium app bar supports collapse on scroll.
2026-07-13 12:34:06 +02:00
Tom Pratt 11cf49de06 Android: Coloured netplay chat messages 2026-07-07 23:26:06 +02:00
Tom Pratt 6825a4a954 Enable USE_UPNP in android builds
The UI already exists in the Android netplay menu so just need to enable it in the build.
2026-07-01 15:59:46 +02:00
Tom Pratt e8da93d52f Fix android gradle sync error on windows
Workaround for the following error on gradle sync:

 java.nio.file.InvalidPathException: Illegal char <:> at index 68:
  C:\Users\tompr\Development\dolphin\Externals\minizip-ng\minizip-ng\C:\Users\tompr\Development\dolphin\Source\Android\app\.cxx\RelWithDebInfo\3b681gem\arm64-v8a\Externals\zlib-ng\zlib-ng
2026-05-20 12:31:12 +02:00
Tom Pratt 1d1c9696ae lint formatting 2026-05-19 12:03:02 +02:00
Tom Pratt 5b49060a9d Fix NetplayScreen edge to edge
NetplayScreen was not drawing under the bottom nav bar like other screens. In landscape mode half of the screen scrolls and half is fixed, to make this look natural with edge to edge, provide a fade on the bottom of the scrolling side so things look natural when the screens loads and is resting at 0 scroll offset.
2026-05-19 12:03:02 +02:00
Tom Pratt fde035dc0c Replace hardcoded save progress string 2026-05-19 12:03:02 +02:00
Tom Pratt 8d565e0331 Use the dual pane netplay screen layout only if the width is sufficient
To avoid using dual pane layout on very small devices, ensure that the current width available for display is at least medium (600dp).

It also has to be landscape, the dual pane mode looks weird on a tablet in portrait mode since there's not that much content.
2026-05-19 12:03:02 +02:00
Tom Pratt 4d1e749977 WithSession helper function
Handles the repeated boiler plate of using a weak reference to NetplaySession from NetplayUICallbacks
2026-05-19 12:03:02 +02:00
Tom Pratt 06cc09cf09 Pass immutable games list to NetplayUICallbacks
Remove corresponding jni config.

Rename Netplay to NetplaySession in jni config to match new kotlin name.
2026-05-19 12:03:02 +02:00
Tom Pratt f63b81dd39 Use unique_ptr when creating netplay client / server 2026-05-19 12:03:01 +02:00
Tom Pratt 22863b3703 Add @Keep annotation to Player constructor
Since it's only instantiated from c++.
2026-05-19 12:03:01 +02:00
Tom Pratt 1bc64a0e6e Fix netplay license headers 2026-05-19 12:03:01 +02:00
Tom Pratt df5e7a9767 Update compose dependencies
Was using 2025 instead of 2026! Fixed some buggy bottom sheet behaviour.

Minor tidying of the chat UI in the bottom sheet
2026-05-19 12:03:01 +02:00
Tom Pratt 4c0bf2944b Implement DoAllPlayersHaveGame() check 2026-05-19 12:03:01 +02:00
Tom Pratt 76ae445694 Add network mode picker for host 2026-05-19 12:03:00 +02:00
Tom Pratt 1c2806dfe9 Add host buffer settings for fair input delay mode
Also rename max buffer to client buffer for better consistency with settings and c++
2026-05-19 12:03:00 +02:00
Tom Pratt 86de5ef4b0 Handle traversal state changes and errors
Traversal connections show in the joining info UI.
Non fatal errors show the retry button.
Fatal errors end the netplay session.
2026-05-19 12:03:00 +02:00
Tom Pratt 86a0f22887 Show joining info for local and external IP addresses
Doesn't support traversal yet
2026-05-19 12:03:00 +02:00
Tom Pratt eb02680cb6 Separate out GetExternalIPAddress helper function
De-duplicates the two inline implementations and prepares it for use from Android.
2026-05-19 12:03:00 +02:00
Tom Pratt 6655672ee3 Add ability to choose game when hosting
Also fix bottom sheets so they survive rotation
2026-05-19 12:02:59 +02:00
Tom Pratt 68e9fd6cde Send own messages to chat
A player's own messages don't come back via the server.
2026-05-19 12:02:59 +02:00
Tom Pratt 77f08364db Create NetPlayServer and start game 2026-05-19 12:02:59 +02:00
Tom Pratt b63ccacdfa Hosting UI 2026-05-19 12:02:59 +02:00
Tom Pratt f9baecd5ed Implement OnMsgPowerButton 2026-05-19 12:02:59 +02:00
Tom Pratt acbf9e155f Game digest progress dialog
We just about get away with using a StateFlow in NetplaySession since the host sends AbortGameDigest when closing their own dialog. Without that it would be harder for the UI to distinguish between subsequent dialogs. If that wasn't the case then NetplaySession might need to expose the individual progress and result updates and have the view model assemble it into the overall GameDigestProgress.
2026-05-19 12:02:58 +02:00
Tom Pratt 117d1d71ac Handle desync messages
Show them in the chat window and also in a toast during game play.
2026-05-19 12:02:58 +02:00
Tom Pratt abd324e98d Make NetplaySession not a singleton
Create a new NetplaySession each time we try to join a netplay game. Hold onto it in NetplayManager so its available to the different activities that need to access it. Close the session when backing out of the netplay UI. Some guardrails in case things go out of sync: creating a session closes the old one if it is still around for some reason, finalizer in NetplaySession to release native resources if not closed explicitly for some reason. Profiling done to ensure all kotlin and native objects are successfully cleared / garbage collected.
2026-05-19 12:02:58 +02:00
Tom Pratt 183d6d778c Use existing settings API instead of custom jni calls 2026-05-19 12:02:58 +02:00
Tom Pratt 8141a74671 Show save transfer progress
When transferring saves from the host. Equivalent of ChunkedProgressDialog in QT.
2026-05-19 12:02:57 +02:00
Tom Pratt 480968f05e Dont try to load temporary save states when launching netplay
An orientation change can trigger this code path immediately when a game starts. e.g. dolphin is portrait when launching the game but settings force gameplay to landscape. We want to avoid this and continue to the netplay launch code below.

If the user backgrounds dolphin during netplay and then resumes after the process has died it will actually resume from the save state in single player mode, not sure if thats good or bad but fine for now.

Netplay doesnt handle rotation very well, seems to go more and more out of sync the more rotations.
2026-05-19 12:02:57 +02:00
Tom Pratt b52ffa3e8b Release boot session data during Netplay cleanup
Boot session data is already handled when the game is booted so this is just fallback in case the game launch fails in some weird way.

Add missing @Keep annotations to functions called from C++
2026-05-19 12:02:57 +02:00
Tom Pratt b1b133b036 Implement OnConnectionLost, show a dialog on the main netplay screen forcing the user to exit 2026-05-19 12:02:56 +02:00
Tom Pratt 38b5c7370c Implement StopGame callback and use it to finish the emulation activity 2026-05-19 12:02:56 +02:00
Tom Pratt 86956b21be Settings refactor
Remove the big saveSetup function and set individual settings immediately after being changed in the UI. Group them all under Netplay.Settings
2026-05-19 12:02:56 +02:00
Tom Pratt 65e4c60158 Max buffer 2026-05-19 12:02:56 +02:00
Tom Pratt e49451b28e Put players table in an OutlinedBox, makes the UI look more consistent. 2026-05-19 12:02:56 +02:00
Tom Pratt c32732714e Implement more NetPlayUICallbacks
Includes chat, game changes, pad buffer changes and host input authority. Merges them all into the chat window.
2026-05-19 12:02:55 +02:00
Tom Pratt dfa3384281 Netplay chat UI 2026-05-19 12:02:55 +02:00
Tom Pratt d9e2725e85 Implement player list 2026-05-19 12:02:55 +02:00
Tom Pratt af2fda5649 Reorder netplay class
Put all the boring settings at the bottom to reduce scrolling!
2026-05-19 12:02:55 +02:00
Tom Pratt b72f3c1afc Add mostly empty Netplay screen, equivalent of NetPlayDialog in QT.
All it can do at this point is quit the current netplay session when backing out of this screen.
2026-05-19 12:02:55 +02:00
Tom Pratt 5527e8138e Move NetplaySetupScreen to its own file 2026-05-19 12:02:55 +02:00
Tom Pratt f52ca02ca2 Show client connection errors and handle connection result
If result is a success sent event to launch the next netplay screen. if it fails, clear up the netplay client
2026-05-19 12:02:54 +02:00
Tom Pratt 3ed9174208 Store netplay BootSessionData and use it to run the netplay game 2026-05-19 12:02:54 +02:00
Tom Pratt 766374434c Pass game list to NetPlayUICallbacks and implement OnMsgChangeGame, OnMsgStartGame, FindGameFile 2026-05-19 12:02:54 +02:00
Tom Pratt 1464fdfc28 Add NetPlayClient join and stub NetPlayUICallbacks 2026-05-19 12:02:54 +02:00
Tom Pratt a1983e5fa2 Add Netplay settings JNI layer and wire up NetplaySetupViewModel 2026-05-19 12:02:54 +02:00
Tom Pratt f10022f2dc Netplay setup UI
Only for connecting, no hosting yet.
2026-05-19 12:02:53 +02:00
Tom Pratt c716c32ce8 Add compose dependencies for Android and empty NetplaySetupActivity
Derive compose colour theming from the existing XML styles already set at the activity level.
2026-05-19 12:02:53 +02:00