android: Move driver installation off of main thread

Additionally creates an indeterminate loading dialog during installation
master
Charles Lombardo 2023-03-20 01:44:22 +07:00 committed by bunnei
parent 72bef4fa95
commit a49a24b079
4 changed files with 42 additions and 21 deletions

@ -17,15 +17,21 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity
import org.yuzu.yuzu_emu.model.GameProvider
import org.yuzu.yuzu_emu.ui.platform.PlatformGamesFragment
import org.yuzu.yuzu_emu.utils.*
import java.io.IOException
class MainActivity : AppCompatActivity(), MainView {
private var platformGamesFragment: PlatformGamesFragment? = null
@ -200,20 +206,40 @@ class MainActivity : AppCompatActivity(), MainView {
Uri.parse(result!!.dataString),
takeFlags
)
GpuDriverHelper.installCustomDriver(this, result.data)
val driverName = GpuDriverHelper.customDriverName
if (driverName != null) {
Toast.makeText(
this,
getString(R.string.select_gpu_driver_install_success, driverName),
Toast.LENGTH_SHORT
).show()
} else {
Toast.makeText(
this,
R.string.select_gpu_driver_error,
Toast.LENGTH_LONG
).show()
val progressBinding = DialogProgressBarBinding.inflate(layoutInflater)
progressBinding.progressBar.isIndeterminate = true
val installationDialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.installing_driver)
.setView(progressBinding.root)
.show()
lifecycleScope.launch {
withContext(Dispatchers.IO) {
// Ignore file exceptions when a user selects an invalid zip
try {
GpuDriverHelper.installCustomDriver(applicationContext, result.data)
} catch (_: IOException) {}
withContext(Dispatchers.Main) {
installationDialog.dismiss()
val driverName = GpuDriverHelper.customDriverName
if (driverName != null) {
Toast.makeText(
applicationContext,
getString(R.string.select_gpu_driver_install_success, driverName),
Toast.LENGTH_SHORT
).show()
} else {
Toast.makeText(
applicationContext,
R.string.select_gpu_driver_error,
Toast.LENGTH_LONG
).show()
}
}
}
}
}
}

@ -98,11 +98,7 @@ object GpuDriverHelper {
)
// Unzip the driver.
try {
unzip(driverInstallationPath + DRIVER_INTERNAL_FILENAME, driverInstallationPath!!)
} catch (e: IOException) {
throw RuntimeException(e)
}
unzip(driverInstallationPath + DRIVER_INTERNAL_FILENAME, driverInstallationPath!!)
// Initialize the driver parameters.
initializeDriverParameters(context)
@ -111,7 +107,6 @@ object GpuDriverHelper {
// Parse the custom driver metadata to retrieve the name.
val customDriverName: String?
get() {
// Parse the custom driver metadata to retrieve the name.
val metadata = GpuDriverMetadata(driverInstallationPath + META_JSON_FILENAME)
return metadata.name
}

@ -29,7 +29,6 @@ class GpuDriverMetadata(metadataFilePath: String) {
driverVersion = json.getString("driverVersion")
minApi = json.getInt("minApi")
libraryName = json.getString("libraryName")
Log.info("Guh")
} catch (e: JSONException) {
// JSON is malformed, ignore and treat as unsupported metadata.
} catch (e: IOException) {

@ -68,6 +68,7 @@
<string name="select_gpu_driver_use_default">Using default GPU driver</string>
<string name="select_gpu_driver_error">Invalid driver selected, using system default!</string>
<string name="system_gpu_driver">System GPU driver</string>
<string name="installing_driver">Installing driver…</string>
<!-- Preferences Screen -->
<string name="preferences_settings">Settings</string>