summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar t8952024-01-10 13:09:06 -0500
committerGravatar t8952024-01-10 23:14:04 -0500
commit6bfc3c530ce0c8ba3ac0a62609d1266aa8d67d35 (patch)
treecea29b9b2357d7f4b28419027bbcc4fb0844ade5
parentandroid: Refactor DriverAdapter to use AbstractSingleSelectionList (diff)
downloadyuzu-6bfc3c530ce0c8ba3ac0a62609d1266aa8d67d35.tar.gz
yuzu-6bfc3c530ce0c8ba3ac0a62609d1266aa8d67d35.tar.xz
yuzu-6bfc3c530ce0c8ba3ac0a62609d1266aa8d67d35.zip
android: Rework driver fragment
Applies settings upon selection and uses a new Driver model to represent the information in-view. Also switches from an async diff list to a plain one.
Diffstat (limited to '')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt39
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Driver.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt125
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt3
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
13import androidx.core.view.updatePadding 13import androidx.core.view.updatePadding
14import androidx.fragment.app.Fragment 14import androidx.fragment.app.Fragment
15import androidx.fragment.app.activityViewModels 15import androidx.fragment.app.activityViewModels
16import androidx.lifecycle.lifecycleScope
17import androidx.navigation.findNavController 16import androidx.navigation.findNavController
18import androidx.navigation.fragment.navArgs 17import androidx.navigation.fragment.navArgs
19import androidx.recyclerview.widget.GridLayoutManager 18import androidx.recyclerview.widget.GridLayoutManager
20import com.google.android.material.transition.MaterialSharedAxis 19import com.google.android.material.transition.MaterialSharedAxis
21import kotlinx.coroutines.flow.collectLatest 20import kotlinx.coroutines.Dispatchers
22import kotlinx.coroutines.launch 21import kotlinx.coroutines.withContext
23import org.yuzu.yuzu_emu.R 22import org.yuzu.yuzu_emu.R
24import org.yuzu.yuzu_emu.adapters.DriverAdapter 23import org.yuzu.yuzu_emu.adapters.DriverAdapter
25import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding 24import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding
25import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
26import org.yuzu.yuzu_emu.model.DriverViewModel 26import org.yuzu.yuzu_emu.model.DriverViewModel
27import org.yuzu.yuzu_emu.model.HomeViewModel 27import org.yuzu.yuzu_emu.model.HomeViewModel
28import org.yuzu.yuzu_emu.utils.FileUtil 28import 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
4package org.yuzu.yuzu_emu.model
5
6import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
7
8data 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
17import org.yuzu.yuzu_emu.YuzuApplication 17import org.yuzu.yuzu_emu.YuzuApplication
18import org.yuzu.yuzu_emu.features.settings.model.StringSetting 18import org.yuzu.yuzu_emu.features.settings.model.StringSetting
19import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile 19import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
20import org.yuzu.yuzu_emu.utils.FileUtil 20import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
21import org.yuzu.yuzu_emu.utils.GpuDriverHelper 21import org.yuzu.yuzu_emu.utils.GpuDriverHelper
22import org.yuzu.yuzu_emu.utils.GpuDriverMetadata 22import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
23import org.yuzu.yuzu_emu.utils.NativeConfig 23import org.yuzu.yuzu_emu.utils.NativeConfig
24import java.io.BufferedOutputStream
25import java.io.File 24import java.io.File
26 25
27class DriverViewModel : ViewModel() { 26class 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