diff options
Diffstat (limited to '')
4 files changed, 84 insertions, 110 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 cc71254dc..82c966954 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 | |||
| @@ -13,16 +13,16 @@ import androidx.core.view.WindowInsetsCompat | |||
| 13 | import androidx.core.view.updatePadding | 13 | import androidx.core.view.updatePadding |
| 14 | import androidx.fragment.app.Fragment | 14 | import androidx.fragment.app.Fragment |
| 15 | import androidx.fragment.app.activityViewModels | 15 | import androidx.fragment.app.activityViewModels |
| 16 | import androidx.lifecycle.lifecycleScope | ||
| 17 | import androidx.navigation.findNavController | 16 | import androidx.navigation.findNavController |
| 18 | import androidx.navigation.fragment.navArgs | 17 | import androidx.navigation.fragment.navArgs |
| 19 | import androidx.recyclerview.widget.GridLayoutManager | 18 | import androidx.recyclerview.widget.GridLayoutManager |
| 20 | import com.google.android.material.transition.MaterialSharedAxis | 19 | import com.google.android.material.transition.MaterialSharedAxis |
| 21 | import kotlinx.coroutines.flow.collectLatest | 20 | import kotlinx.coroutines.Dispatchers |
| 22 | import kotlinx.coroutines.launch | 21 | import kotlinx.coroutines.withContext |
| 23 | import org.yuzu.yuzu_emu.R | 22 | import org.yuzu.yuzu_emu.R |
| 24 | import org.yuzu.yuzu_emu.adapters.DriverAdapter | 23 | import org.yuzu.yuzu_emu.adapters.DriverAdapter |
| 25 | import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding | 24 | import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding |
| 25 | import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver | ||
| 26 | import org.yuzu.yuzu_emu.model.DriverViewModel | 26 | import org.yuzu.yuzu_emu.model.DriverViewModel |
| 27 | import org.yuzu.yuzu_emu.model.HomeViewModel | 27 | import org.yuzu.yuzu_emu.model.HomeViewModel |
| 28 | import org.yuzu.yuzu_emu.utils.FileUtil | 28 | import org.yuzu.yuzu_emu.utils.FileUtil |
| @@ -85,25 +85,6 @@ class DriverManagerFragment : Fragment() { | |||
| 85 | adapter = DriverAdapter(driverViewModel) | 85 | adapter = DriverAdapter(driverViewModel) |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | viewLifecycleOwner.lifecycleScope.apply { | ||
| 89 | launch { | ||
| 90 | driverViewModel.driverList.collectLatest { | ||
| 91 | (binding.listDrivers.adapter as DriverAdapter).submitList(it) | ||
| 92 | } | ||
| 93 | } | ||
| 94 | launch { | ||
| 95 | driverViewModel.newDriverInstalled.collect { | ||
| 96 | if (_binding != null && it) { | ||
| 97 | (binding.listDrivers.adapter as DriverAdapter).apply { | ||
| 98 | notifyItemChanged(driverViewModel.previouslySelectedDriver) | ||
| 99 | notifyItemChanged(driverViewModel.selectedDriver) | ||
| 100 | driverViewModel.setNewDriverInstalled(false) | ||
| 101 | } | ||
| 102 | } | ||
| 103 | } | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | setInsets() | 88 | setInsets() |
| 108 | } | 89 | } |
| 109 | 90 | ||
| @@ -177,12 +158,20 @@ class DriverManagerFragment : Fragment() { | |||
| 177 | 158 | ||
| 178 | val driverData = GpuDriverHelper.getMetadataFromZip(driverFile) | 159 | val driverData = GpuDriverHelper.getMetadataFromZip(driverFile) |
| 179 | val driverInList = | 160 | val driverInList = |
| 180 | driverViewModel.driverList.value.firstOrNull { it.second == driverData } | 161 | driverViewModel.driverData.firstOrNull { it.second == driverData } |
| 181 | if (driverInList != null) { | 162 | if (driverInList != null) { |
| 182 | return@newInstance getString(R.string.driver_already_installed) | 163 | return@newInstance getString(R.string.driver_already_installed) |
| 183 | } else { | 164 | } else { |
| 184 | driverViewModel.addDriver(Pair(driverPath, driverData)) | 165 | driverViewModel.onDriverAdded(Pair(driverPath, driverData)) |
| 185 | driverViewModel.setNewDriverInstalled(true) | 166 | withContext(Dispatchers.Main) { |
| 167 | if (_binding != null) { | ||
| 168 | val adapter = binding.listDrivers.adapter as DriverAdapter | ||
| 169 | adapter.addItem(driverData.toDriver()) | ||
| 170 | adapter.selectItem(adapter.currentList.indices.last) | ||
| 171 | binding.listDrivers | ||
| 172 | .smoothScrollToPosition(adapter.currentList.indices.last) | ||
| 173 | } | ||
| 174 | } | ||
| 186 | } | 175 | } |
| 187 | return@newInstance Any() | 176 | return@newInstance Any() |
| 188 | }.show(childFragmentManager, IndeterminateProgressDialogFragment.TAG) | 177 | }.show(childFragmentManager, IndeterminateProgressDialogFragment.TAG) |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Driver.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Driver.kt new file mode 100644 index 000000000..de342212a --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Driver.kt | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.model | ||
| 5 | |||
| 6 | import org.yuzu.yuzu_emu.utils.GpuDriverMetadata | ||
| 7 | |||
| 8 | data class Driver( | ||
| 9 | override var selected: Boolean, | ||
| 10 | val title: String, | ||
| 11 | val version: String = "", | ||
| 12 | val description: String = "" | ||
| 13 | ) : SelectableItem { | ||
| 14 | override fun onSelectionStateChanged(selected: Boolean) { | ||
| 15 | this.selected = selected | ||
| 16 | } | ||
| 17 | |||
| 18 | companion object { | ||
| 19 | fun GpuDriverMetadata.toDriver(selected: Boolean = false): Driver = | ||
| 20 | Driver( | ||
| 21 | selected, | ||
| 22 | this.name ?: "", | ||
| 23 | this.version ?: "", | ||
| 24 | this.description ?: "" | ||
| 25 | ) | ||
| 26 | } | ||
| 27 | } | ||
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 76accf8f3..a1fee48cc 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 | |||
| @@ -17,11 +17,10 @@ import org.yuzu.yuzu_emu.R | |||
| 17 | import org.yuzu.yuzu_emu.YuzuApplication | 17 | import org.yuzu.yuzu_emu.YuzuApplication |
| 18 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting | 18 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting |
| 19 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | 19 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile |
| 20 | import org.yuzu.yuzu_emu.utils.FileUtil | 20 | import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver |
| 21 | import org.yuzu.yuzu_emu.utils.GpuDriverHelper | 21 | import org.yuzu.yuzu_emu.utils.GpuDriverHelper |
| 22 | import org.yuzu.yuzu_emu.utils.GpuDriverMetadata | 22 | import org.yuzu.yuzu_emu.utils.GpuDriverMetadata |
| 23 | import org.yuzu.yuzu_emu.utils.NativeConfig | 23 | import org.yuzu.yuzu_emu.utils.NativeConfig |
| 24 | import java.io.BufferedOutputStream | ||
| 25 | import java.io.File | 24 | import java.io.File |
| 26 | 25 | ||
| 27 | class DriverViewModel : ViewModel() { | 26 | class DriverViewModel : ViewModel() { |
| @@ -38,97 +37,74 @@ class DriverViewModel : ViewModel() { | |||
| 38 | !loading && ready && !deleting | 37 | !loading && ready && !deleting |
| 39 | }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), initialValue = false) | 38 | }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), initialValue = false) |
| 40 | 39 | ||
| 41 | private val _driverList = MutableStateFlow(GpuDriverHelper.getDrivers()) | 40 | var driverData = GpuDriverHelper.getDrivers() |
| 42 | val driverList: StateFlow<MutableList<Pair<String, GpuDriverMetadata>>> get() = _driverList | ||
| 43 | 41 | ||
| 44 | var previouslySelectedDriver = 0 | 42 | private val _driverList = MutableStateFlow(emptyList<Driver>()) |
| 45 | var selectedDriver = -1 | 43 | val driverList: StateFlow<List<Driver>> get() = _driverList |
| 46 | 44 | ||
| 47 | // Used for showing which driver is currently installed within the driver manager card | 45 | // Used for showing which driver is currently installed within the driver manager card |
| 48 | private val _selectedDriverTitle = MutableStateFlow("") | 46 | private val _selectedDriverTitle = MutableStateFlow("") |
| 49 | val selectedDriverTitle: StateFlow<String> get() = _selectedDriverTitle | 47 | val selectedDriverTitle: StateFlow<String> get() = _selectedDriverTitle |
| 50 | 48 | ||
| 51 | private val _newDriverInstalled = MutableStateFlow(false) | 49 | private val driversToDelete = mutableListOf<String>() |
| 52 | val newDriverInstalled: StateFlow<Boolean> get() = _newDriverInstalled | ||
| 53 | |||
| 54 | val driversToDelete = mutableListOf<String>() | ||
| 55 | 50 | ||
| 56 | init { | 51 | init { |
| 57 | val currentDriverMetadata = GpuDriverHelper.installedCustomDriverData | 52 | updateDriverList() |
| 58 | findSelectedDriver(currentDriverMetadata) | ||
| 59 | |||
| 60 | // If a user had installed a driver before the manager was implemented, this zips | ||
| 61 | // the installed driver to UserData/gpu_drivers/CustomDriver.zip so that it can | ||
| 62 | // be indexed and exported as expected. | ||
| 63 | if (selectedDriver == -1) { | ||
| 64 | val driverToSave = | ||
| 65 | File(GpuDriverHelper.driverStoragePath, "CustomDriver.zip") | ||
| 66 | driverToSave.createNewFile() | ||
| 67 | FileUtil.zipFromInternalStorage( | ||
| 68 | File(GpuDriverHelper.driverInstallationPath!!), | ||
| 69 | GpuDriverHelper.driverInstallationPath!!, | ||
| 70 | BufferedOutputStream(driverToSave.outputStream()) | ||
| 71 | ) | ||
| 72 | _driverList.value.add(Pair(driverToSave.path, currentDriverMetadata)) | ||
| 73 | setSelectedDriverIndex(_driverList.value.size - 1) | ||
| 74 | } | ||
| 75 | |||
| 76 | // If a user had installed a driver before the config was reworked to be multiplatform, | ||
| 77 | // we have save the path of the previously selected driver to the new setting. | ||
| 78 | if (StringSetting.DRIVER_PATH.getString(true).isEmpty() && selectedDriver > 0 && | ||
| 79 | StringSetting.DRIVER_PATH.global | ||
| 80 | ) { | ||
| 81 | StringSetting.DRIVER_PATH.setString(_driverList.value[selectedDriver].first) | ||
| 82 | NativeConfig.saveGlobalConfig() | ||
| 83 | } else { | ||
| 84 | findSelectedDriver(GpuDriverHelper.customDriverSettingData) | ||
| 85 | } | ||
| 86 | updateDriverNameForGame(null) | 53 | updateDriverNameForGame(null) |
| 87 | } | 54 | } |
| 88 | 55 | ||
| 89 | fun setSelectedDriverIndex(value: Int) { | 56 | fun reloadDriverData() { |
| 90 | if (selectedDriver != -1) { | 57 | _areDriversLoading.value = true |
| 91 | previouslySelectedDriver = selectedDriver | 58 | driverData = GpuDriverHelper.getDrivers() |
| 92 | } | 59 | updateDriverList() |
| 93 | selectedDriver = value | 60 | _areDriversLoading.value = false |
| 94 | } | 61 | } |
| 95 | 62 | ||
| 96 | fun setNewDriverInstalled(value: Boolean) { | 63 | private fun updateDriverList() { |
| 97 | _newDriverInstalled.value = value | 64 | val selectedDriver = GpuDriverHelper.customDriverSettingData |
| 98 | } | 65 | val newDriverList = mutableListOf( |
| 99 | 66 | Driver( | |
| 100 | fun addDriver(driverData: Pair<String, GpuDriverMetadata>) { | 67 | selectedDriver == GpuDriverMetadata(), |
| 101 | val driverIndex = _driverList.value.indexOfFirst { it == driverData } | 68 | YuzuApplication.appContext.getString(R.string.system_gpu_driver) |
| 102 | if (driverIndex == -1) { | 69 | ) |
| 103 | _driverList.value.add(driverData) | 70 | ) |
| 104 | setSelectedDriverIndex(_driverList.value.size - 1) | 71 | driverData.forEach { |
| 105 | _selectedDriverTitle.value = driverData.second.name | 72 | newDriverList.add(it.second.toDriver(it.second == selectedDriver)) |
| 106 | ?: YuzuApplication.appContext.getString(R.string.system_gpu_driver) | ||
| 107 | } else { | ||
| 108 | setSelectedDriverIndex(driverIndex) | ||
| 109 | } | 73 | } |
| 110 | } | 74 | _driverList.value = newDriverList |
| 111 | |||
| 112 | fun removeDriver(driverData: Pair<String, GpuDriverMetadata>) { | ||
| 113 | _driverList.value.remove(driverData) | ||
| 114 | } | 75 | } |
| 115 | 76 | ||
| 116 | fun onOpenDriverManager(game: Game?) { | 77 | fun onOpenDriverManager(game: Game?) { |
| 117 | if (game != null) { | 78 | if (game != null) { |
| 118 | SettingsFile.loadCustomConfig(game) | 79 | SettingsFile.loadCustomConfig(game) |
| 119 | } | 80 | } |
| 81 | updateDriverList() | ||
| 82 | } | ||
| 120 | 83 | ||
| 121 | val driverPath = StringSetting.DRIVER_PATH.getString() | 84 | fun onDriverSelected(position: Int) { |
| 122 | if (driverPath.isEmpty()) { | 85 | if (position == 0) { |
| 123 | setSelectedDriverIndex(0) | 86 | StringSetting.DRIVER_PATH.setString("") |
| 124 | } else { | 87 | } else { |
| 125 | findSelectedDriver(GpuDriverHelper.getMetadataFromZip(File(driverPath))) | 88 | StringSetting.DRIVER_PATH.setString(driverData[position - 1].first) |
| 126 | } | 89 | } |
| 127 | } | 90 | } |
| 128 | 91 | ||
| 92 | fun onDriverRemoved(removedPosition: Int, selectedPosition: Int) { | ||
| 93 | driversToDelete.add(driverData[removedPosition - 1].first) | ||
| 94 | driverData.removeAt(removedPosition - 1) | ||
| 95 | onDriverSelected(selectedPosition) | ||
| 96 | } | ||
| 97 | |||
| 98 | fun onDriverAdded(driver: Pair<String, GpuDriverMetadata>) { | ||
| 99 | if (driversToDelete.contains(driver.first)) { | ||
| 100 | driversToDelete.remove(driver.first) | ||
| 101 | } | ||
| 102 | driverData.add(driver) | ||
| 103 | onDriverSelected(driverData.size) | ||
| 104 | } | ||
| 105 | |||
| 129 | fun onCloseDriverManager(game: Game?) { | 106 | fun onCloseDriverManager(game: Game?) { |
| 130 | _isDeletingDrivers.value = true | 107 | _isDeletingDrivers.value = true |
| 131 | StringSetting.DRIVER_PATH.setString(driverList.value[selectedDriver].first) | ||
| 132 | updateDriverNameForGame(game) | 108 | updateDriverNameForGame(game) |
| 133 | if (game == null) { | 109 | if (game == null) { |
| 134 | NativeConfig.saveGlobalConfig() | 110 | NativeConfig.saveGlobalConfig() |
| @@ -181,20 +157,6 @@ class DriverViewModel : ViewModel() { | |||
| 181 | } | 157 | } |
| 182 | } | 158 | } |
| 183 | 159 | ||
| 184 | private fun findSelectedDriver(currentDriverMetadata: GpuDriverMetadata) { | ||
| 185 | if (driverList.value.size == 1) { | ||
| 186 | setSelectedDriverIndex(0) | ||
| 187 | return | ||
| 188 | } | ||
| 189 | |||
| 190 | driverList.value.forEachIndexed { i: Int, driver: Pair<String, GpuDriverMetadata> -> | ||
| 191 | if (driver.second == currentDriverMetadata) { | ||
| 192 | setSelectedDriverIndex(i) | ||
| 193 | return | ||
| 194 | } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | fun updateDriverNameForGame(game: Game?) { | 160 | fun updateDriverNameForGame(game: Game?) { |
| 199 | if (!GpuDriverHelper.supportsCustomDriverLoading()) { | 161 | if (!GpuDriverHelper.supportsCustomDriverLoading()) { |
| 200 | return | 162 | return |
| @@ -217,7 +179,6 @@ class DriverViewModel : ViewModel() { | |||
| 217 | 179 | ||
| 218 | private fun setDriverReady() { | 180 | private fun setDriverReady() { |
| 219 | _isDriverReady.value = true | 181 | _isDriverReady.value = true |
| 220 | _selectedDriverTitle.value = GpuDriverHelper.customDriverSettingData.name | 182 | updateName() |
| 221 | ?: YuzuApplication.appContext.getString(R.string.system_gpu_driver) | ||
| 222 | } | 183 | } |
| 223 | } | 184 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt index 685272288..a8f9dcc34 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt | |||
| @@ -62,9 +62,6 @@ object GpuDriverHelper { | |||
| 62 | ?.sortedByDescending { it: Pair<String, GpuDriverMetadata> -> it.second.name } | 62 | ?.sortedByDescending { it: Pair<String, GpuDriverMetadata> -> it.second.name } |
| 63 | ?.distinct() | 63 | ?.distinct() |
| 64 | ?.toMutableList() ?: mutableListOf() | 64 | ?.toMutableList() ?: mutableListOf() |
| 65 | |||
| 66 | // TODO: Get system driver information | ||
| 67 | drivers.add(0, Pair("", GpuDriverMetadata())) | ||
| 68 | return drivers | 65 | return drivers |
| 69 | } | 66 | } |
| 70 | 67 | ||