aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxbzk <xbzk@eden-emu.dev>2026-03-25 12:13:04 +0100
committercrueter <crueter@eden-emu.dev>2026-03-25 12:13:04 +0100
commitf0d77e86e34cde3813f7b1dbfc4d1a9e8940b21b (patch)
treeab84ac17897a11ca1d287b9d9a8f64a4744907fb
parent24fe223692af988770bcc336d5b1138a2ba91399 (diff)
[android,ui] driver management: fixed driver add/removal unsync (#3757)
Complementary for 3750. User found a way to get same driver doubled and deleting one would lead to a crash. Reason: manual driver install was still adding drivers directly to adapter, instead of thru drivermodel. fixed. Also added guards against crash upon driver removal. Thoroughly tested. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3757 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: xbzk <xbzk@eden-emu.dev> Co-committed-by: xbzk <xbzk@eden-emu.dev>
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt21
2 files changed, 26 insertions, 8 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
index 877097dc80..3aa55522e6 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
@@ -29,7 +29,6 @@ import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding
import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen
-import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
import org.yuzu.yuzu_emu.model.DriverViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.FileUtil
@@ -216,19 +215,23 @@ class DriverManagerFragment : Fragment() {
val driverData = GpuDriverHelper.getMetadataFromZip(driverFile)
val driverInList =
- driverViewModel.driverData.firstOrNull { it.second == driverData }
+ driverViewModel.driverData.firstOrNull {
+ it.first == driverPath || it.second == driverData
+ }
if (driverInList != null) {
return@newInstance getString(R.string.driver_already_installed)
} else {
driverViewModel.onDriverAdded(Pair(driverPath, driverData))
withContext(Dispatchers.Main) {
if (_binding != null) {
+ refreshDriverList()
val adapter = binding.listDrivers.adapter as DriverAdapter
- adapter.addItem(driverData.toDriver())
- adapter.selectItem(adapter.currentList.indices.last)
+ val selectedPosition = adapter.currentList
+ .indexOfFirst { it.selected }
+ .let { if (it == -1) 0 else it }
driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global)
binding.listDrivers
- .smoothScrollToPosition(adapter.currentList.indices.last)
+ .smoothScrollToPosition(selectedPosition)
}
}
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
index fc7fbc9bfc..3904f83279 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
@@ -154,15 +154,30 @@ class DriverViewModel : ViewModel() {
}
fun onDriverRemoved(removedPosition: Int, selectedPosition: Int) {
- driversToDelete.add(driverData[removedPosition - 1].first)
- driverData.removeAt(removedPosition - 1)
- onDriverSelected(selectedPosition)
+ val driverIndex = removedPosition - 1
+ if (driverIndex !in driverData.indices) {
+ updateDriverList()
+ return
+ }
+
+ driversToDelete.add(driverData[driverIndex].first)
+ driverData.removeAt(driverIndex)
+ val safeSelectedPosition = selectedPosition.coerceIn(0, driverData.size)
+ onDriverSelected(safeSelectedPosition)
}
fun onDriverAdded(driver: Pair<String, GpuDriverMetadata>) {
if (driversToDelete.contains(driver.first)) {
driversToDelete.remove(driver.first)
}
+
+ val existingDriverIndex = driverData.indexOfFirst {
+ it.first == driver.first || it.second == driver.second
+ }
+ if (existingDriverIndex != -1) {
+ onDriverSelected(existingDriverIndex + 1)
+ return
+ }
driverData.add(driver)
onDriverSelected(driverData.size)
}