diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 6f4b5b13f..bf315f355 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -5,46 +5,63 @@ package org.yuzu.yuzu_emu.disk_shader_cache import androidx.annotation.Keep import androidx.lifecycle.ViewModelProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +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.model.EmulationViewModel -import org.yuzu.yuzu_emu.utils.Log @Keep object DiskShaderCacheProgress { private lateinit var emulationViewModel: EmulationViewModel + private lateinit var emulationActivity: EmulationActivity private fun prepareViewModel() { - emulationViewModel = - ViewModelProvider( - NativeLibrary.sEmulationActivity.get() as EmulationActivity - )[EmulationViewModel::class.java] + val activity = NativeLibrary.sEmulationActivity.get() as? EmulationActivity + ?: throw IllegalStateException("EmulationActivity 不存在") + emulationActivity = activity + emulationViewModel = ViewModelProvider(emulationActivity)[EmulationViewModel::class.java] } @JvmStatic fun loadProgress(stage: Int, progress: Int, max: Int) { - val emulationActivity = NativeLibrary.sEmulationActivity.get() - if (emulationActivity == null) { - Log.error("[DiskShaderCacheProgress] EmulationActivity not present") - return - } + val activity = NativeLibrary.sEmulationActivity.get() as? EmulationActivity + ?: return - emulationActivity.runOnUiThread { - when (LoadCallbackStage.values()[stage]) { - LoadCallbackStage.Prepare -> prepareViewModel() - LoadCallbackStage.Build -> emulationViewModel.updateProgress( - emulationActivity.getString(R.string.building_shaders), - progress, - max - ) - - LoadCallbackStage.Complete -> {} + when (LoadCallbackStage.values()[stage]) { + LoadCallbackStage.Prepare -> { + prepareViewModel() + showMessage(activity.getString(R.string.prepare_loading_message)) } + LoadCallbackStage.Build -> { + GlobalScope.launch(Dispatchers.Main) { + updateProgressAsync(activity.getString(R.string.building_shaders), progress, max) + } + } + LoadCallbackStage.Complete -> {} } } - // Equivalent to VideoCore::LoadCallbackStage + private suspend fun updateProgressAsync(title: String, progress: Int, max: Int) { + withContext(Dispatchers.Main) { + showMessage("$title:异步进度执行中") + } + + // 模拟一些处理时间 + kotlinx.coroutines.delay(1000) + + withContext(Dispatchers.Main) { + emulationViewModel.updateProgress(title, progress, max) + } + } + + private fun showMessage(message: String) { + emulationActivity.showToast(message) + } + enum class LoadCallbackStage { Prepare, Build, Complete }