ProfileDeleteFragment.kt 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package im.angry.openeuicc.ui
  2. import android.app.Dialog
  3. import android.os.Bundle
  4. import android.text.Editable
  5. import android.widget.EditText
  6. import androidx.appcompat.app.AlertDialog
  7. import androidx.fragment.app.DialogFragment
  8. import androidx.lifecycle.lifecycleScope
  9. import im.angry.openeuicc.common.R
  10. import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone
  11. import im.angry.openeuicc.util.*
  12. import kotlinx.coroutines.flow.onStart
  13. import kotlinx.coroutines.launch
  14. class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker {
  15. companion object {
  16. const val TAG = "ProfileDeleteFragment"
  17. fun newInstance(slotId: Int, portId: Int, iccid: String, name: String): ProfileDeleteFragment {
  18. val instance = newInstanceEuicc(ProfileDeleteFragment::class.java, slotId, portId)
  19. instance.requireArguments().apply {
  20. putString("iccid", iccid)
  21. putString("name", name)
  22. }
  23. return instance
  24. }
  25. }
  26. private val editText by lazy {
  27. EditText(requireContext()).apply {
  28. hint = Editable.Factory.getInstance().newEditable(
  29. getString(R.string.profile_delete_confirm_input, requireArguments().getString("name")!!)
  30. )
  31. }
  32. }
  33. private val inputMatchesName: Boolean
  34. get() = editText.text.toString() == requireArguments().getString("name")!!
  35. private var deleting = false
  36. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
  37. return AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply {
  38. setMessage(getString(R.string.profile_delete_confirm, requireArguments().getString("name")))
  39. setView(editText)
  40. setPositiveButton(android.R.string.ok, null) // Set listener to null to prevent auto closing
  41. setNegativeButton(android.R.string.cancel, null)
  42. }.create()
  43. }
  44. override fun onResume() {
  45. super.onResume()
  46. val alertDialog = dialog!! as AlertDialog
  47. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
  48. if (!deleting && inputMatchesName) delete()
  49. }
  50. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener {
  51. if (!deleting) dismiss()
  52. }
  53. }
  54. private fun delete() {
  55. deleting = true
  56. val alertDialog = dialog!! as AlertDialog
  57. alertDialog.setCanceledOnTouchOutside(false)
  58. alertDialog.setCancelable(false)
  59. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
  60. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false
  61. requireParentFragment().lifecycleScope.launch {
  62. ensureEuiccChannelManager()
  63. euiccChannelManagerService.waitForForegroundTask()
  64. euiccChannelManagerService.launchProfileDeleteTask(
  65. slotId,
  66. portId,
  67. requireArguments().getString("iccid")!!
  68. ).onStart {
  69. if (parentFragment is EuiccProfilesChangedListener) {
  70. // Trigger a refresh in the parent fragment -- it should wait until
  71. // any foreground task is completed before actually doing a refresh
  72. (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged()
  73. }
  74. try {
  75. dismiss()
  76. } catch (e: IllegalStateException) {
  77. // Ignored
  78. }
  79. }.waitDone()
  80. }
  81. }
  82. }