summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/IndeterminateProgressDialogFragment.kt40
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt42
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt39
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
3import android.app.Dialog 3import android.app.Dialog
4import android.os.Bundle 4import android.os.Bundle
5import android.widget.Toast
5import androidx.fragment.app.DialogFragment 6import androidx.fragment.app.DialogFragment
7import androidx.lifecycle.ViewModelProvider
6import com.google.android.material.dialog.MaterialAlertDialogBuilder 8import com.google.android.material.dialog.MaterialAlertDialogBuilder
7import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding 9import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
10import org.yuzu.yuzu_emu.model.TaskViewModel
11import java.io.Serializable
12
8 13
9class IndeterminateProgressDialogFragment : DialogFragment() { 14class 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 @@
1package org.yuzu.yuzu_emu.model
2
3import androidx.lifecycle.LiveData
4import androidx.lifecycle.MutableLiveData
5import androidx.lifecycle.ViewModel
6import androidx.lifecycle.viewModelScope
7import kotlinx.coroutines.Dispatchers
8import kotlinx.coroutines.launch
9
10class 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
26import com.google.android.material.color.MaterialColors 26import com.google.android.material.color.MaterialColors
27import com.google.android.material.dialog.MaterialAlertDialogBuilder 27import com.google.android.material.dialog.MaterialAlertDialogBuilder
28import com.google.android.material.navigation.NavigationBarView 28import com.google.android.material.navigation.NavigationBarView
29import kotlinx.coroutines.CoroutineScope
30import kotlinx.coroutines.Dispatchers 29import kotlinx.coroutines.Dispatchers
31import kotlinx.coroutines.launch 30import kotlinx.coroutines.launch
32import kotlinx.coroutines.withContext 31import 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 =