From 8a1f3b7c4164ffe5042a7d3ca62cb3bf8c4af3da Mon Sep 17 00:00:00 2001 From: Timotej Leginus Date: Sun, 11 Jun 2023 21:18:25 +0200 Subject: [PATCH] Added a Wi-Fi (non-metered) only setting --- .../java/org/yuzu/yuzu_emu/YuzuApplication.kt | 2 +- .../features/settings/model/Settings.kt | 2 ++ .../settings/ui/SettingsFragmentPresenter.kt | 25 +++++++++++++++++++ .../org/yuzu/yuzu_emu/utils/NetworkHelper.kt | 15 +++++++++-- src/android/app/src/main/jni/native.cpp | 2 +- .../app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt index 2e358cf8fa..2b24ef2d32 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt @@ -48,7 +48,7 @@ class YuzuApplication : Application() { documentsTree = DocumentsTree() DirectoryInitialization.start(applicationContext) GpuDriverHelper.initializeDriverParameters(applicationContext) - NetworkHelper.setRoutes(applicationContext) + NetworkHelper.getRoute(applicationContext) MultiplayerHelper.initRoom(applicationContext) NativeLibrary.logDeviceInfo() diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index 858c103fba..bced01ab0d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -132,6 +132,8 @@ class Settings { const val PREF_BUTTON_TOGGLE_13 = "buttonToggle13" const val PREF_BUTTON_TOGGLE_14 = "buttonToggle14" + const val PREF_FORCE_WIFI = "Network_ForceWifi" + const val PREF_ROOM_ADDRESS = "MultiplayerRoom_ServerAddress" const val PREF_ROOM_PORT = "MultiplayerRoom_ServerPort" const val PREF_ROOM_NICKNAME = "MultiplayerRoom_Nickname" diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 9f12261726..2bd4a7faf7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -450,6 +450,31 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.preferences_network)) sl.apply { + val forceWifi: AbstractBooleanSetting = object : AbstractBooleanSetting { + override var boolean: Boolean + get() = preferences.getBoolean(Settings.PREF_FORCE_WIFI, false) + set(value) { + preferences.edit() + .putBoolean(Settings.PREF_FORCE_WIFI, value) + .apply() + } + override val key: String? = null + override val section: String? = null + override val isRuntimeEditable: Boolean = false + override val valueAsString: String + get() = preferences.getBoolean(Settings.PREF_FORCE_WIFI, false).toString() + override val defaultValue: Any = false + } + + add( + SwitchSetting( + forceWifi, + R.string.set_force_wifi, + R.string.force_wifi_desc, + "", + false + ) + ) add( TextSetting( StringSetting.NETWORK_ROUTE, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NetworkHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NetworkHelper.kt index 805f778768..2ed12fd57e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NetworkHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NetworkHelper.kt @@ -5,13 +5,24 @@ package org.yuzu.yuzu_emu.utils import android.content.Context import android.net.ConnectivityManager +import androidx.preference.PreferenceManager +import org.yuzu.yuzu_emu.features.settings.model.Settings object NetworkHelper { - fun getRoutes(context: Context): String { + /** + * Gets available network interface info/route info - currently the active network info. + * @return The route info separated by semicolons (interface, address, netmask, gateway), or null if no networks are available. + */ + fun getRoute(context: Context): String? { val connectivity = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val lp = connectivity.getLinkProperties(connectivity.activeNetwork) ?: return "" + val preferences = PreferenceManager.getDefaultSharedPreferences(context) + + if(connectivity.isActiveNetworkMetered && preferences.getBoolean(Settings.PREF_FORCE_WIFI, false)) + return null + + val lp = connectivity.getLinkProperties(connectivity.activeNetwork) ?: return null val ifName = lp.interfaceName val addr = lp.linkAddresses[0] diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 4f2201a38b..0ba155be03 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -347,7 +347,7 @@ namespace { u16 server_port = Network::DefaultRoomPort, const std::string& password = "") { auto room_network = m_system.GetRoomNetwork(); - a + if (const auto member = room_network.GetRoomMember().lock()) { // Prevent the user from trying to join a room while they are already joining. if (member->GetState() == Network::RoomMember::State::Joining || member->IsConnected()) { diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 350eb1dedb..d1314aee64 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -155,6 +155,8 @@ Sets the default network route Set network route + Force Wi-Fi + Forces yuzu to use only Wi-Fi (non-metered connections in general) Server address