diff options
3 files changed, 94 insertions, 27 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt index edf7b8a3c..10a897392 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt | |||
| @@ -2,33 +2,69 @@ package org.yuzu.yuzu_emu.fragments | |||
| 2 | 2 | ||
| 3 | import android.app.Dialog | 3 | import android.app.Dialog |
| 4 | import android.os.Bundle | 4 | import android.os.Bundle |
| 5 | import android.widget.Toast | ||
| 5 | import androidx.fragment.app.DialogFragment | 6 | import androidx.fragment.app.DialogFragment |
| 7 | import androidx.lifecycle.ViewModelProvider | ||
| 6 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 8 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 7 | import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding | 9 | import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding |
| 10 | import org.yuzu.yuzu_emu.model.TaskViewModel | ||
| 11 | import java.io.Serializable | ||
| 12 | |||
| 8 | 13 | ||
| 9 | class IndeterminateProgressDialogFragment : DialogFragment() { | 14 | class IndeterminateProgressDialogFragment : DialogFragment() { |
| 15 | private lateinit var taskViewModel: TaskViewModel | ||
| 16 | |||
| 10 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { | 17 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { |
| 18 | taskViewModel = ViewModelProvider(requireActivity())[TaskViewModel::class.java] | ||
| 19 | |||
| 11 | val titleId = requireArguments().getInt(TITLE) | 20 | val titleId = requireArguments().getInt(TITLE) |
| 12 | 21 | ||
| 13 | val progressBinding = DialogProgressBarBinding.inflate(layoutInflater) | 22 | val progressBinding = DialogProgressBarBinding.inflate(layoutInflater) |
| 14 | progressBinding.progressBar.isIndeterminate = true | 23 | progressBinding.progressBar.isIndeterminate = true |
| 15 | return MaterialAlertDialogBuilder(requireContext()) | 24 | val dialog = MaterialAlertDialogBuilder(requireContext()) |
| 16 | .setTitle(titleId) | 25 | .setTitle(titleId) |
| 17 | .setView(progressBinding.root) | 26 | .setView(progressBinding.root) |
| 18 | .show() | 27 | .create() |
| 28 | dialog.setCanceledOnTouchOutside(false) | ||
| 29 | |||
| 30 | taskViewModel.isComplete.observe(this) { complete -> | ||
| 31 | if (complete) { | ||
| 32 | dialog.dismiss() | ||
| 33 | when (val result = taskViewModel.result.value) { | ||
| 34 | is String -> Toast.makeText(requireContext(), result, Toast.LENGTH_LONG).show() | ||
| 35 | is MessageDialogFragment -> result.show( | ||
| 36 | parentFragmentManager, | ||
| 37 | MessageDialogFragment.TAG | ||
| 38 | ) | ||
| 39 | } | ||
| 40 | taskViewModel.clear() | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | if (taskViewModel.isRunning.value == false) { | ||
| 45 | val task = requireArguments().getSerializable(TASK) as? () -> Any | ||
| 46 | if (task != null) { | ||
| 47 | taskViewModel.task = task | ||
| 48 | taskViewModel.runTask() | ||
| 49 | } | ||
| 50 | } | ||
| 51 | return dialog | ||
| 19 | } | 52 | } |
| 20 | 53 | ||
| 21 | companion object { | 54 | companion object { |
| 22 | const val TAG = "IndeterminateProgressDialogFragment" | 55 | const val TAG = "IndeterminateProgressDialogFragment" |
| 23 | 56 | ||
| 24 | private const val TITLE = "Title" | 57 | private const val TITLE = "Title" |
| 58 | private const val TASK = "Task" | ||
| 25 | 59 | ||
| 26 | fun newInstance( | 60 | fun newInstance( |
| 27 | titleId: Int, | 61 | titleId: Int, |
| 62 | task: () -> Any | ||
| 28 | ): IndeterminateProgressDialogFragment { | 63 | ): IndeterminateProgressDialogFragment { |
| 29 | val dialog = IndeterminateProgressDialogFragment() | 64 | val dialog = IndeterminateProgressDialogFragment() |
| 30 | val args = Bundle() | 65 | val args = Bundle() |
| 31 | args.putInt(TITLE, titleId) | 66 | args.putInt(TITLE, titleId) |
| 67 | args.putSerializable(TASK, task as Serializable) | ||
| 32 | dialog.arguments = args | 68 | dialog.arguments = args |
| 33 | return dialog | 69 | return dialog |
| 34 | } | 70 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt new file mode 100644 index 000000000..23723bceb --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | package org.yuzu.yuzu_emu.model | ||
| 2 | |||
| 3 | import androidx.lifecycle.LiveData | ||
| 4 | import androidx.lifecycle.MutableLiveData | ||
| 5 | import androidx.lifecycle.ViewModel | ||
| 6 | import androidx.lifecycle.viewModelScope | ||
| 7 | import kotlinx.coroutines.Dispatchers | ||
| 8 | import kotlinx.coroutines.launch | ||
| 9 | |||
| 10 | class TaskViewModel : ViewModel() { | ||
| 11 | private val _result = MutableLiveData<Any>() | ||
| 12 | val result: LiveData<Any> = _result | ||
| 13 | |||
| 14 | private val _isComplete = MutableLiveData<Boolean>() | ||
| 15 | val isComplete: LiveData<Boolean> = _isComplete | ||
| 16 | |||
| 17 | private val _isRunning = MutableLiveData<Boolean>() | ||
| 18 | val isRunning: LiveData<Boolean> = _isRunning | ||
| 19 | |||
| 20 | lateinit var task: () -> Any | ||
| 21 | |||
| 22 | init { | ||
| 23 | clear() | ||
| 24 | } | ||
| 25 | |||
| 26 | fun clear() { | ||
| 27 | _result.value = Any() | ||
| 28 | _isComplete.value = false | ||
| 29 | _isRunning.value = false | ||
| 30 | } | ||
| 31 | |||
| 32 | fun runTask() { | ||
| 33 | if (_isRunning.value == true) return | ||
| 34 | _isRunning.value = true | ||
| 35 | |||
| 36 | viewModelScope.launch(Dispatchers.IO) { | ||
| 37 | val res = task() | ||
| 38 | _result.postValue(res) | ||
| 39 | _isComplete.postValue(true) | ||
| 40 | } | ||
| 41 | } | ||
| 42 | } \ No newline at end of file | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index bb8311023..2001ad704 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt | |||
| @@ -26,7 +26,6 @@ import androidx.preference.PreferenceManager | |||
| 26 | import com.google.android.material.color.MaterialColors | 26 | import com.google.android.material.color.MaterialColors |
| 27 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 27 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 28 | import com.google.android.material.navigation.NavigationBarView | 28 | import com.google.android.material.navigation.NavigationBarView |
| 29 | import kotlinx.coroutines.CoroutineScope | ||
| 30 | import kotlinx.coroutines.Dispatchers | 29 | import kotlinx.coroutines.Dispatchers |
| 31 | import kotlinx.coroutines.launch | 30 | import kotlinx.coroutines.launch |
| 32 | import kotlinx.coroutines.withContext | 31 | import kotlinx.coroutines.withContext |
| @@ -340,44 +339,34 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 340 | File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/") | 339 | File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/") |
| 341 | val cacheFirmwareDir = File("${cacheDir.path}/registered/") | 340 | val cacheFirmwareDir = File("${cacheDir.path}/registered/") |
| 342 | 341 | ||
| 343 | val installingFirmwareDialog = IndeterminateProgressDialogFragment.newInstance( | 342 | val task: () -> Any = { |
| 344 | R.string.firmware_installing | 343 | var messageToShow: Any |
| 345 | ) | ||
| 346 | installingFirmwareDialog.isCancelable = false | ||
| 347 | installingFirmwareDialog.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) | ||
| 348 | |||
| 349 | lifecycleScope.launch(Dispatchers.IO) { | ||
| 350 | try { | 344 | try { |
| 351 | FileUtil.unzip(inputZip, cacheFirmwareDir) | 345 | FileUtil.unzip(inputZip, cacheFirmwareDir) |
| 352 | val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 | 346 | val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 |
| 353 | val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 | 347 | val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 |
| 354 | if (unfilteredNumOfFiles != filteredNumOfFiles) { | 348 | if (unfilteredNumOfFiles != filteredNumOfFiles) { |
| 355 | withContext(Dispatchers.Main) { | 349 | messageToShow = MessageDialogFragment.newInstance( |
| 356 | installingFirmwareDialog.dismiss() | 350 | R.string.firmware_installed_failure, |
| 357 | MessageDialogFragment.newInstance( | 351 | R.string.firmware_installed_failure_description |
| 358 | R.string.firmware_installed_failure, | 352 | ) |
| 359 | R.string.firmware_installed_failure_description | ||
| 360 | ).show(supportFragmentManager, MessageDialogFragment.TAG) | ||
| 361 | } | ||
| 362 | } else { | 353 | } else { |
| 363 | firmwarePath.deleteRecursively() | 354 | firmwarePath.deleteRecursively() |
| 364 | cacheFirmwareDir.copyRecursively(firmwarePath, true) | 355 | cacheFirmwareDir.copyRecursively(firmwarePath, true) |
| 365 | withContext(Dispatchers.Main) { | 356 | messageToShow = getString(R.string.save_file_imported_success) |
| 366 | installingFirmwareDialog.dismiss() | ||
| 367 | Toast.makeText( | ||
| 368 | applicationContext, | ||
| 369 | getString(R.string.save_file_imported_success), | ||
| 370 | Toast.LENGTH_LONG | ||
| 371 | ).show() | ||
| 372 | } | ||
| 373 | } | 357 | } |
| 374 | } catch (e: Exception) { | 358 | } catch (e: Exception) { |
| 375 | Toast.makeText(applicationContext, getString(R.string.fatal_error), Toast.LENGTH_LONG) | 359 | messageToShow = getString(R.string.fatal_error) |
| 376 | .show() | ||
| 377 | } finally { | 360 | } finally { |
| 378 | cacheFirmwareDir.deleteRecursively() | 361 | cacheFirmwareDir.deleteRecursively() |
| 379 | } | 362 | } |
| 363 | messageToShow | ||
| 380 | } | 364 | } |
| 365 | |||
| 366 | IndeterminateProgressDialogFragment.newInstance( | ||
| 367 | R.string.firmware_installing, | ||
| 368 | task | ||
| 369 | ).show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) | ||
| 381 | } | 370 | } |
| 382 | 371 | ||
| 383 | val getAmiiboKey = | 372 | val getAmiiboKey = |