From 51c3ad08f0baacac5993491a68a330c24fb38a7f Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Fri, 10 Jul 2026 00:18:34 +0200 Subject: [PATCH] Do not use username setting --- .../org/citra/citra_emu/dialogs/ChatDialog.kt | 2 +- .../citra/citra_emu/dialogs/LobbyBrowser.kt | 2 +- .../citra/citra_emu/dialogs/NetPlayDialog.kt | 34 ++++++++++++++++--- .../features/settings/SettingKeys.kt | 1 - .../features/settings/model/StringSetting.kt | 1 - .../settings/ui/SettingsFragmentPresenter.kt | 7 ++-- .../citra/citra_emu/utils/NetPlayManager.kt | 14 ++++---- src/android/app/src/main/jni/config.cpp | 3 +- src/android/app/src/main/jni/default_ini.h | 3 +- src/android/app/src/main/jni/multiplayer.cpp | 5 ++- src/android/app/src/main/jni/native.cpp | 5 +-- .../res/layout/dialog_multiplayer_room.xml | 7 +++- .../app/src/main/res/values/strings.xml | 2 ++ src/common/announce_multiplayer_room.h | 2 +- 14 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/ChatDialog.kt b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/ChatDialog.kt index 2a161b329..2faf637e8 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/ChatDialog.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/ChatDialog.kt @@ -76,7 +76,7 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) { } private fun sendMessage(message: String) { - val username = NetPlayManager.getUsername(context) + val username = NetPlayManager.getUsername() NetPlayManager.netPlaySendMessage(message) val chatMessage = ChatMessage( diff --git a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/LobbyBrowser.kt b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/LobbyBrowser.kt index ce3d02ca9..004ead919 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/LobbyBrowser.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/LobbyBrowser.kt @@ -123,7 +123,7 @@ class LobbyBrowser(context: Context) : BottomSheetDialog(context) { } private fun joinRoom(room: NetPlayManager.RoomInfo, password: String) { - val username = NetPlayManager.getUsername(context) + val username = NetPlayManager.getUsername() Thread { val result = NetPlayManager.netPlayJoinRoom(room.ip, room.port, username, password) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/NetPlayDialog.kt b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/NetPlayDialog.kt index 4221a3888..a26e33f88 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/NetPlayDialog.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/NetPlayDialog.kt @@ -102,6 +102,15 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { dismiss() } btnLobbyBrowser.setOnClickListener { + if (!NetPlayManager.isUsernameValid()) { + Toast.makeText( + it.context, + it.context.getString(R.string.username_invalid), + Toast.LENGTH_LONG + ).show() + return@setOnClickListener + } + LobbyBrowser(context).show() dismiss() } @@ -178,9 +187,9 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { PopupMenu(view.context, view).apply { inflate(R.menu.menu_netplay_member) menu.findItem(R.id.action_kick).isEnabled = - isModerator && netPlayItems.name != NetPlayManager.getUsername(context) + isModerator && netPlayItems.name != NetPlayManager.getUsername() menu.findItem(R.id.action_ban).isEnabled = - isModerator && netPlayItems.name != NetPlayManager.getUsername(context) + isModerator && netPlayItems.name != NetPlayManager.getUsername() setOnMenuItemClickListener { item -> if (item.itemId == R.id.action_kick) { NetPlayManager.netPlayKickUser(netPlayItems.name) @@ -322,7 +331,7 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { } ) binding.ipPort.setText(NetPlayManager.getRoomPort(activity)) - binding.username.setText(NetPlayManager.getUsername(activity)) + binding.username.setText(NetPlayManager.getUsername()) binding.dropdownPreferedGameName.apply { setAdapter(ArrayAdapter(activity, R.layout.dropdown_item, gameNameList.map { it[0] })) @@ -341,7 +350,25 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { context.getString(R.string.multiplayer_max_players_value, value.toInt()) } + binding.username.setOnClickListener { + Toast.makeText( + it.context, + it.context.getString(R.string.username_uses_system), + Toast.LENGTH_LONG + ).show() + true + } + binding.btnConfirm.setOnClickListener { + if (!NetPlayManager.isUsernameValid()) { + Toast.makeText( + it.context, + it.context.getString(R.string.username_invalid), + Toast.LENGTH_LONG + ).show() + return@setOnClickListener + } + binding.btnConfirm.isEnabled = false binding.btnConfirm.text = activity.getString(R.string.disabled_button_text) @@ -404,7 +431,6 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { } if (result == 0) { - NetPlayManager.setUsername(activity, username) NetPlayManager.setRoomPort(activity, portStr) if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress) Toast.makeText( diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt index dace312cb..275fe6b62 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/SettingKeys.kt @@ -128,7 +128,6 @@ object SettingKeys { external fun udp_pad_index(): String external fun record_frame_times(): String external fun web_api_url(): String - external fun network_username(): String external fun network_token(): String // Android diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.kt index bb496f71b..aee0659da 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.kt @@ -27,7 +27,6 @@ enum class StringSetting( "_back" ), WEB_API_URL(SettingKeys.web_api_url(), Settings.SECTION_NETWORK, ""), - NETWORK_USERNAME(SettingKeys.network_username(), Settings.SECTION_NETWORK, "Azahar"), NETWORK_TOKEN(SettingKeys.network_token(), Settings.SECTION_NETWORK, ""); override var string: String = defaultValue diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 2e61dd57a..12098373d 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -15,7 +15,6 @@ import android.text.TextUtils import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.citra.citra_emu.CitraApplication -import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R import org.citra.citra_emu.display.ScreenLayout import org.citra.citra_emu.display.StereoMode @@ -1762,7 +1761,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } } - private fun addNetworkSettings (sl: ArrayList) { + private fun addNetworkSettings(sl: ArrayList) { settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.preferences_network)) sl.apply { add( @@ -1771,7 +1770,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.web_api_url, R.string.web_api_url_description, StringSetting.WEB_API_URL.key, - StringSetting.WEB_API_URL.defaultValue, + StringSetting.WEB_API_URL.defaultValue ) ) add( @@ -1780,7 +1779,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.network_token, R.string.network_token_description, StringSetting.NETWORK_TOKEN.key, - StringSetting.NETWORK_TOKEN.defaultValue, + StringSetting.NETWORK_TOKEN.defaultValue ) ) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/NetPlayManager.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/NetPlayManager.kt index 7d2b7a437..9fa6634bb 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/NetPlayManager.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/NetPlayManager.kt @@ -76,6 +76,8 @@ object NetPlayManager { private var messageListener: ((Int, String) -> Unit)? = null private var adapterRefreshListener: ((Int, String) -> Unit)? = null + private val usernameRegex = Regex("^[a-zA-Z0-9._\\- ]{4,20}$") + fun setOnMessageReceivedListener(listener: (Int, String) -> Unit) { messageListener = listener } @@ -129,16 +131,12 @@ object NetPlayManager { adapterRefreshListener = listener } - fun getUsername(activity: Context): String { - val prefs = PreferenceManager.getDefaultSharedPreferences(activity) - val name = "Azahar${(Math.random() * 100).toInt()}" - return prefs.getString("NetPlayUsername", name) ?: name + fun getUsername(): String { + SystemSaveGame.load() + return SystemSaveGame.getUsername() } - fun setUsername(activity: Activity, name: String) { - val prefs = PreferenceManager.getDefaultSharedPreferences(activity) - prefs.edit().putString("NetPlayUsername", name).apply() - } + fun isUsernameValid(): Boolean = getUsername().matches(usernameRegex) fun getRoomAddress(activity: Activity): String { val prefs = PreferenceManager.getDefaultSharedPreferences(activity) diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 27d9c0547..fae4fb2f2 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -330,8 +330,7 @@ void Config::ReadValues() { // Web Service ReadSetting("WebService", Settings::values.web_api_url); - ReadSetting("WebService", Settings::values.citra_username); - ReadSetting("WebService", Settings::values.citra_token); + ReadSetting("WebService", Settings::values.network_token); } void Config::Reload() { diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index bf10695b1..309713231 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -583,8 +583,7 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"( [WebService] # URL for Web API )") DECLARE_KEY(web_api_url) BOOST_HANA_STRING(R"( -# Username and token for Citra Web Service -)") DECLARE_KEY(network_username) BOOST_HANA_STRING(R"( +# Token for Web Service )") DECLARE_KEY(network_token) BOOST_HANA_STRING("\n") ).c_str(); diff --git a/src/android/app/src/main/jni/multiplayer.cpp b/src/android/app/src/main/jni/multiplayer.cpp index 3655f37d5..c1c2fb4aa 100644 --- a/src/android/app/src/main/jni/multiplayer.cpp +++ b/src/android/app/src/main/jni/multiplayer.cpp @@ -8,7 +8,6 @@ #include #include -#include #include "common/logging/log.h" #include "core/core.h" #include "core/hle/service/cfg/cfg.h" @@ -171,8 +170,8 @@ NetPlayStatus AndroidMultiplayer::NetPlayCreateRoom(const std::string& ipaddress return NetPlayStatus::CREATE_ROOM_ERROR; } - if (!room->Create(room_name, "", ipaddress, port, password, std::min(max_players, 16), - NetSettings::values.citra_username, preferedGameName, preferedGameId, + if (!room->Create(room_name, "", ipaddress, port, password, std::min(max_players, 16), username, + preferedGameName, preferedGameId, std::make_unique(), {})) { return NetPlayStatus::CREATE_ROOM_ERROR; } diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index d9cc79fa3..0d980bff9 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -105,7 +105,7 @@ std::condition_variable running_cv; std::string inserted_cartridge; -// Abdroid Multiplayer which can be initialized with parameters +// Android Multiplayer which can be initialized with parameters std::unique_ptr multiplayer{nullptr}; std::shared_ptr announce_multiplayer_session; @@ -1020,7 +1020,8 @@ Java_org_citra_citra_1emu_NativeLibrary_initMultiplayer(JNIEnv* env, [[maybe_unu return; } - announce_multiplayer_session = std::make_shared(); + announce_multiplayer_session = std::make_shared( + Service::CFG::GetUsername(Core::System::GetInstance())); multiplayer = std::make_unique(Core::System::GetInstance(), announce_multiplayer_session); diff --git a/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml b/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml index 91ca8e775..800876d69 100644 --- a/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml +++ b/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml @@ -56,7 +56,12 @@ android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="text" /> + android:cursorVisible="false" + android:focusable="false" + android:focusableInTouchMode="false" + android:inputType="text" + android:longClickable="true" + android:textIsSelectable="true" /> Web API URL for public room functionality Network Token Token for public room functionality + This property is linked to the 3DS system username. + Username is not valid. Must be 4 to 20 alphanumeric characters. Select GPU driver diff --git a/src/common/announce_multiplayer_room.h b/src/common/announce_multiplayer_room.h index 94bfb9413..71f345f79 100644 --- a/src/common/announce_multiplayer_room.h +++ b/src/common/announce_multiplayer_room.h @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included.