ProfileDeleteFragment.kt 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 android.widget.Toast
  7. import androidx.appcompat.app.AlertDialog
  8. import androidx.fragment.app.DialogFragment
  9. import androidx.lifecycle.lifecycleScope
  10. import im.angry.openeuicc.common.R
  11. import im.angry.openeuicc.core.EuiccChannel
  12. import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone
  13. import im.angry.openeuicc.util.*
  14. import kotlinx.coroutines.flow.onStart
  15. import kotlinx.coroutines.launch
  16. class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker {
  17. companion object {
  18. const val TAG = "ProfileDeleteFragment"
  19. private const val FIELD_ICCID = "iccid"
  20. private const val FIELD_NAME = "name"
  21. fun newInstance(slotId: Int, portId: Int, seId: EuiccChannel.SecureElementId, iccid: String, name: String) =
  22. newInstanceEuicc(ProfileDeleteFragment::class.java, slotId, portId, seId) {
  23. putString(FIELD_ICCID, iccid)
  24. putString(FIELD_NAME, name)
  25. }
  26. }
  27. private val iccid by lazy {
  28. requireArguments().getString(FIELD_ICCID)!!
  29. }
  30. private val name by lazy {
  31. requireArguments().getString(FIELD_NAME)!!
  32. }
  33. private val editText by lazy {
  34. EditText(requireContext()).apply {
  35. hint = Editable.Factory.getInstance()
  36. .newEditable(getString(R.string.profile_delete_confirm_input, name))
  37. }
  38. }
  39. private val inputMatchesName: Boolean
  40. get() = editText.text.toString() == name
  41. private var toast: Toast? = null
  42. private var deleting = false
  43. private val alertDialog: AlertDialog
  44. get() = requireDialog() as AlertDialog
  45. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
  46. AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply {
  47. setMessage(getString(R.string.profile_delete_confirm, name))
  48. setView(editText)
  49. setPositiveButton(android.R.string.ok, null) // Set listener to null to prevent auto closing
  50. setNegativeButton(android.R.string.cancel, null)
  51. }.create()
  52. override fun onResume() {
  53. super.onResume()
  54. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
  55. if (!deleting) delete()
  56. }
  57. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener {
  58. if (!deleting) dismiss()
  59. }
  60. }
  61. private fun delete() {
  62. toast?.cancel()
  63. if (!inputMatchesName) {
  64. val resId = R.string.toast_profile_delete_confirm_text_mismatched
  65. toast = Toast.makeText(requireContext(), resId, Toast.LENGTH_LONG).also {
  66. it.show()
  67. }
  68. return
  69. }
  70. deleting = true
  71. alertDialog.setCanceledOnTouchOutside(false)
  72. alertDialog.setCancelable(false)
  73. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
  74. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false
  75. requireParentFragment().lifecycleScope.launch {
  76. ensureEuiccChannelManager()
  77. euiccChannelManagerService.waitForForegroundTask()
  78. euiccChannelManagerService.launchProfileDeleteTask(slotId, portId, seId, iccid)
  79. .onStart {
  80. parentFragment?.notifyEuiccProfilesChanged()
  81. runCatching(::dismiss)
  82. }
  83. .waitDone()
  84. }
  85. }
  86. }