code refactor & wait for active downloads to pause before killing

This commit is contained in:
deniscerri 2025-08-26 18:35:56 +02:00
parent 57e0f16cef
commit d243e8c7f8
No known key found for this signature in database
GPG key ID: 95C43D517D830350
2 changed files with 53 additions and 56 deletions

View file

@ -1370,7 +1370,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
updateToStatus(id, DownloadRepository.Status.Paused) updateToStatus(id, DownloadRepository.Status.Paused)
} }
fun pauseAllDownloads() = viewModelScope.launch { suspend fun pauseAllDownloads() {
pausedAllDownloads.value = PausedAllDownloadsState.PROCESSING pausedAllDownloads.value = PausedAllDownloadsState.PROCESSING
isPausingResuming = true isPausingResuming = true
WorkManager.getInstance(application).cancelAllWorkByTag("download") WorkManager.getInstance(application).cancelAllWorkByTag("download")

View file

@ -9,6 +9,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@ -114,11 +115,32 @@ class MoreFragment : Fragment() {
findNavController().navigate(R.id.observeSourcesFragment) findNavController().navigate(R.id.observeSourcesFragment)
} }
fun showTerminateConfirmationDialog() { terminateApp.setOnClickListener {
val shouldAskToTerminate = mainSharedPreferences.getBoolean("ask_terminate_app", true) showTerminateConfirmationDialog()
val isDoNotAskAgainChecked = !shouldAskToTerminate }
var doNotShowAgainFinalState = isDoNotAskAgainChecked terminateApp.setOnLongClickListener {
showTerminateConfirmationDialog(skipPreference = true)
true
}
settings.setOnClickListener {
val intent = Intent(context, SettingsActivity::class.java)
startActivity(intent)
}
}
fun showTerminateConfirmationDialog(skipPreference: Boolean = false) {
val shouldAskToTerminate = mainSharedPreferences.getBoolean("ask_terminate_app", true)
if (!shouldAskToTerminate && !skipPreference) {
terminateApp.isEnabled = false
terminateApp()
return
}
var doNotShowAgainFinalState = !shouldAskToTerminate
lateinit var dialog: AlertDialog
val terminateDialog = MaterialAlertDialogBuilder(requireContext()) val terminateDialog = MaterialAlertDialogBuilder(requireContext())
terminateDialog.setTitle(getString(R.string.confirm_terminate)) terminateDialog.setTitle(getString(R.string.confirm_terminate))
val dialogView = layoutInflater.inflate(R.layout.dialog_terminate_app, null) val dialogView = layoutInflater.inflate(R.layout.dialog_terminate_app, null)
@ -134,50 +156,25 @@ class MoreFragment : Fragment() {
dialogInterface.cancel() dialogInterface.cancel()
} }
terminateDialog.setPositiveButton(getString(R.string.ok)) { _, _ -> terminateDialog.setPositiveButton(getString(R.string.ok), null)
dialog = terminateDialog.show()
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
dialog.setCanceledOnTouchOutside(false)
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false
mainSharedPreferencesEditor.putBoolean("ask_terminate_app", !doNotShowAgainFinalState).commit()
terminateApp()
}
}
fun terminateApp() {
lifecycleScope.launch { lifecycleScope.launch {
downloadViewModel.pauseAllDownloads() downloadViewModel.pauseAllDownloads()
mainSharedPreferencesEditor.putBoolean("ask_terminate_app", !doNotShowAgainFinalState).commit()
mainActivity.finishAndRemoveTask() mainActivity.finishAndRemoveTask()
mainActivity.finishAffinity() mainActivity.finishAffinity()
exitProcess(0) exitProcess(0)
} }
} }
terminateDialog.show()
}
// This handles the long press
terminateApp.setOnLongClickListener {
// A long press will ALWAYS show the dialog, ignoring the saved preference.
showTerminateConfirmationDialog()
// Return true to indicate that the long click event is consumed
// and the regular OnClickListener should NOT be triggered.
true
}
// This handles the regular (short) press
terminateApp.setOnClickListener {
// Check the saved preference, just like before.
if (mainSharedPreferences.getBoolean("ask_terminate_app", true)) {
// If the user wants to be asked, show the dialog.
showTerminateConfirmationDialog()
} else {
// If they checked "Don't ask again", terminate immediately.
mainActivity.finishAndRemoveTask()
mainActivity.finishAffinity()
exitProcess(0)
}
}
settings.setOnClickListener {
val intent = Intent(context, SettingsActivity::class.java)
startActivity(intent)
}
}
companion object { companion object {
const val TAG = "MoreFragment" const val TAG = "MoreFragment"