Browse Source

[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>
memory_changes
xbzk 4 days ago
committed by crueter
parent
commit
f0d77e86e3
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 13
      src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
  2. 21
      src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt

13
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.Settings
import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.features.settings.model.StringSetting
import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen 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.DriverViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.FileUtil
@ -216,19 +215,23 @@ class DriverManagerFragment : Fragment() {
val driverData = GpuDriverHelper.getMetadataFromZip(driverFile) val driverData = GpuDriverHelper.getMetadataFromZip(driverFile)
val driverInList = val driverInList =
driverViewModel.driverData.firstOrNull { it.second == driverData }
driverViewModel.driverData.firstOrNull {
it.first == driverPath || it.second == driverData
}
if (driverInList != null) { if (driverInList != null) {
return@newInstance getString(R.string.driver_already_installed) return@newInstance getString(R.string.driver_already_installed)
} else { } else {
driverViewModel.onDriverAdded(Pair(driverPath, driverData)) driverViewModel.onDriverAdded(Pair(driverPath, driverData))
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
if (_binding != null) { if (_binding != null) {
refreshDriverList()
val adapter = binding.listDrivers.adapter as DriverAdapter 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) driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global)
binding.listDrivers binding.listDrivers
.smoothScrollToPosition(adapter.currentList.indices.last)
.smoothScrollToPosition(selectedPosition)
} }
} }
} }

21
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) { 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>) { fun onDriverAdded(driver: Pair<String, GpuDriverMetadata>) {
if (driversToDelete.contains(driver.first)) { if (driversToDelete.contains(driver.first)) {
driversToDelete.remove(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) driverData.add(driver)
onDriverSelected(driverData.size) onDriverSelected(driverData.size)
} }

Loading…
Cancel
Save