From a55b42a3da8be324740541b878e87d3dcee38b45 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 20 Mar 2021 16:12:06 -0600 Subject: [PATCH] Fix blacklist dialog bug Fix a problem where the blacklist dialog wouldn't properly detect when there were no changes made to the list of paths. --- .../settings/blacklist/BlacklistDialog.kt | 16 +++++----- .../settings/blacklist/BlacklistViewModel.kt | 30 +++++++++---------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt index e474db850..d874d2759 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistDialog.kt @@ -63,7 +63,7 @@ class BlacklistDialog : BottomSheetDialogFragment() { } binding.blacklistConfirm.setOnClickListener { - if (blacklistModel.modified) { + if (blacklistModel.isModified()) { saveAndRestart() } else { dismiss() @@ -99,7 +99,6 @@ class BlacklistDialog : BottomSheetDialogFragment() { folderChooser( requireContext(), initialDirectory = File(Environment.getExternalStorageDirectory().absolutePath), - waitForPositiveButton = false, emptyTextRes = R.string.error_no_dirs ) @@ -135,19 +134,18 @@ class BlacklistDialog : BottomSheetDialogFragment() { private fun saveAndRestart() { blacklistModel.save { - playbackModel.savePlaybackState(requireContext(), ::reincarnate) + playbackModel.savePlaybackState(requireContext(), ::hardRestart) } } - private fun reincarnate() { - // Instead of having to do a ton of cleanup and make a ton of horrible code changes + private fun hardRestart() { + // Instead of having to do a ton of cleanup and horrible code changes // to restart this application non-destructively, I just restart the UI task [There is only // one, after all] and then kill the application using exitProcess. Works well enough. - val intent = Intent(requireContext().applicationContext, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - } + val intent = Intent(requireContext().applicationContext, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK - requireContext().startActivity(intent) + startActivity(intent) exitProcess(0) } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistViewModel.kt b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistViewModel.kt index b5bbe1e02..94fb63730 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/blacklist/BlacklistViewModel.kt @@ -21,8 +21,7 @@ class BlacklistViewModel(context: Context) : ViewModel() { val paths: LiveData> get() = mPaths private val blacklistDatabase = BlacklistDatabase.getInstance(context) - var modified = false - private set + private var dbPaths = listOf() init { loadDatabasePaths() @@ -33,12 +32,10 @@ class BlacklistViewModel(context: Context) : ViewModel() { * [save] is called. */ fun addPath(path: String) { - if (mPaths.value!!.contains(path)) return - - mPaths.value!!.add(path) - mPaths.value = mPaths.value - - modified = true + if (!mPaths.value!!.contains(path)) { + mPaths.value!!.add(path) + mPaths.value = mPaths.value + } } /** @@ -48,8 +45,6 @@ class BlacklistViewModel(context: Context) : ViewModel() { fun removePath(path: String) { mPaths.value!!.remove(path) mPaths.value = mPaths.value - - modified = true } /** @@ -58,7 +53,8 @@ class BlacklistViewModel(context: Context) : ViewModel() { fun save(onDone: () -> Unit) { viewModelScope.launch(Dispatchers.IO) { blacklistDatabase.writePaths(mPaths.value!!) - modified = false + dbPaths = mPaths.value!! + onDone() } } @@ -68,17 +64,19 @@ class BlacklistViewModel(context: Context) : ViewModel() { */ fun loadDatabasePaths() { viewModelScope.launch(Dispatchers.IO) { - val paths = blacklistDatabase.readPaths().toMutableList() + dbPaths = blacklistDatabase.readPaths() withContext(Dispatchers.Main) { - // Can only change LiveData on the main thread. - mPaths.value = paths + mPaths.value = dbPaths.toMutableList() } - - modified = false } } + /** + * Check if changes have been made to the viewmodel's paths. + */ + fun isModified() = dbPaths != paths.value + class Factory(private val context: Context) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { check(modelClass.isAssignableFrom(BlacklistViewModel::class.java)) {