diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt index b9fe4faa5515..5046e7c7c0ac 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt @@ -21,7 +21,6 @@ import org.dolphinemu.dolphinemu.dialogs.NotificationDialog import org.dolphinemu.dolphinemu.dialogs.TaskDialog import org.dolphinemu.dolphinemu.dialogs.UserDataImportWarningDialog import org.dolphinemu.dolphinemu.model.TaskViewModel -import org.dolphinemu.dolphinemu.model.UserDataViewModel import org.dolphinemu.dolphinemu.utils.* import org.dolphinemu.dolphinemu.utils.ThemeHelper.enableScrollTint import org.dolphinemu.dolphinemu.utils.ThemeHelper.setNavigationBarColor @@ -34,14 +33,11 @@ import java.util.zip.ZipInputStream import java.util.zip.ZipOutputStream class UserDataActivity : AppCompatActivity() { - private lateinit var userDataViewModel: UserDataViewModel private lateinit var taskViewModel: TaskViewModel private lateinit var mBinding: ActivityUserDataBinding override fun onCreate(savedInstanceState: Bundle?) { - userDataViewModel = ViewModelProvider(this)[UserDataViewModel::class.java] - ThemeHelper.setTheme(this) super.onCreate(savedInstanceState) @@ -85,6 +81,7 @@ class UserDataActivity : AppCompatActivity() { public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] if (requestCode == REQUEST_CODE_IMPORT && resultCode == RESULT_OK) { val arguments = Bundle() arguments.putString( @@ -92,18 +89,14 @@ class UserDataActivity : AppCompatActivity() { data!!.data!!.toString() ) - userDataViewModel.mustRestartApp = true - val dialog = UserDataImportWarningDialog() dialog.arguments = arguments dialog.show(supportFragmentManager, UserDataImportWarningDialog.TAG) } else if (requestCode == REQUEST_CODE_EXPORT && resultCode == RESULT_OK) { - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] taskViewModel.clear() - taskViewModel.resultGetter = { + taskViewModel.task = { val resultResource = exportUserData(data!!.data!!) - taskViewModel.result.postValue(resultResource) - taskViewModel.isComplete.postValue(true) + taskViewModel.setResult(resultResource) } val arguments = Bundle() @@ -129,7 +122,10 @@ class UserDataActivity : AppCompatActivity() { // Activity not found. Perhaps it was removed by the OEM, or by some new Android version // that didn't exist at the time of writing. Not much we can do other than tell the user. val arguments = Bundle() - arguments.putInt(NotificationDialog.KEY_MESSAGE, R.string.user_data_open_system_file_manager_failed) + arguments.putInt( + NotificationDialog.KEY_MESSAGE, + R.string.user_data_open_system_file_manager_failed + ) val dialog = NotificationDialog() dialog.arguments = arguments @@ -157,6 +153,8 @@ class UserDataActivity : AppCompatActivity() { if (!isDolphinUserDataBackup(source)) return R.string.user_data_import_invalid_file + taskViewModel.mustRestartApp = true + contentResolver.openInputStream(source).use { `is` -> ZipInputStream(`is`).use { zis -> val userDirectory = File(DirectoryInitialization.getUserDirectory()) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/TaskDialog.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/TaskDialog.kt index 50a82199b4fa..f28ff70884bf 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/TaskDialog.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/TaskDialog.kt @@ -21,7 +21,7 @@ class TaskDialog : DialogFragment() { .setTitle(requireArguments().getInt(KEY_TITLE)) .setView(R.layout.dialog_indeterminate_progress) if (requireArguments().getBoolean(KEY_CANCELLABLE)) { - dialogBuilder.setCancelable(false) + dialogBuilder.setCancelable(true) .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int -> viewModel.cancelled = true dialog.dismiss() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/UserDataImportWarningDialog.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/UserDataImportWarningDialog.kt index 92fe11bd2c08..4ae469bb17e0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/UserDataImportWarningDialog.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/UserDataImportWarningDialog.kt @@ -12,15 +12,12 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.dolphinemu.dolphinemu.R import org.dolphinemu.dolphinemu.activities.UserDataActivity import org.dolphinemu.dolphinemu.model.TaskViewModel -import org.dolphinemu.dolphinemu.model.UserDataViewModel import kotlin.system.exitProcess class UserDataImportWarningDialog : DialogFragment() { - private lateinit var userDataViewModel: UserDataViewModel private lateinit var taskViewModel: TaskViewModel override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - userDataViewModel = ViewModelProvider(requireActivity())[UserDataViewModel::class.java] taskViewModel = ViewModelProvider(requireActivity())[TaskViewModel::class.java] val dialog = MaterialAlertDialogBuilder(requireContext()) @@ -34,17 +31,16 @@ class UserDataImportWarningDialog : DialogFragment() { taskArguments.putInt(TaskDialog.KEY_MESSAGE, R.string.do_not_close_app) taskArguments.putBoolean(TaskDialog.KEY_CANCELLABLE, false) - taskViewModel.resultGetter = { - taskViewModel.result.postValue( + taskViewModel.task = { + taskViewModel.setResult( (requireActivity() as UserDataActivity).importUserData( requireArguments().getString(KEY_URI_RESULT)!!.toUri() ) ) - taskViewModel.isComplete.postValue(true) } taskViewModel.onResultDismiss = { - if (userDataViewModel.mustRestartApp) { + if (taskViewModel.mustRestartApp) { exitProcess(0) } } @@ -58,6 +54,6 @@ class UserDataImportWarningDialog : DialogFragment() { companion object { const val TAG = "UserDataImportWarningDialog" - const val KEY_URI_RESULT = "uri_result" + const val KEY_URI_RESULT = "uri" } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/TaskViewModel.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/TaskViewModel.kt index c2b80b00ac01..084ee0d512bb 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/TaskViewModel.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/TaskViewModel.kt @@ -2,42 +2,55 @@ package org.dolphinemu.dolphinemu.model +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.* class TaskViewModel : ViewModel() { - val result = MutableLiveData() - val isComplete = MutableLiveData() var cancelled = false - var isRunning = MutableLiveData() + var mustRestartApp = false - lateinit var resultGetter: () -> Unit + private val _result = MutableLiveData() + val result: LiveData get() = _result + + private val _isComplete = MutableLiveData() + val isComplete: LiveData get() = _isComplete + + private val _isRunning = MutableLiveData() + val isRunning: LiveData get() = _isRunning + + lateinit var task: () -> Unit var onResultDismiss: (() -> Unit)? = null init { - result.value = 0 - isComplete.value = false - isRunning.value = false + clear() } fun clear() { - result.value = 0 - isComplete.value = false + _result.value = 0 + _isComplete.value = false cancelled = false + mustRestartApp = false onResultDismiss = null + _isRunning.value = false } fun runTask() { if (isRunning.value == true) return - isRunning.value = true + _isRunning.value = true viewModelScope.launch { withContext(Dispatchers.IO) { - resultGetter.invoke() - isRunning.postValue(false) + task.invoke() + _isRunning.postValue(false) + _isComplete.postValue(true) } } } + + fun setResult(result: Int) { + _result.postValue(result) + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/UserDataViewModel.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/UserDataViewModel.kt deleted file mode 100644 index 3ab92249e98b..000000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/UserDataViewModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.model - -import androidx.lifecycle.ViewModel - -class UserDataViewModel : ViewModel() { - var mustRestartApp = false - - init { - mustRestartApp = false - } -}