ProfileDeleteFragment.kt 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package im.angry.openeuicc.ui
  2. import android.app.Dialog
  3. import android.os.Bundle
  4. import android.text.Editable
  5. import android.util.Log
  6. import android.widget.EditText
  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.util.*
  12. import kotlinx.coroutines.flow.first
  13. import kotlinx.coroutines.launch
  14. import java.lang.Exception
  15. class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker {
  16. companion object {
  17. const val TAG = "ProfileDeleteFragment"
  18. fun newInstance(slotId: Int, portId: Int, iccid: String, name: String): ProfileDeleteFragment {
  19. val instance = newInstanceEuicc(ProfileDeleteFragment::class.java, slotId, portId)
  20. instance.requireArguments().apply {
  21. putString("iccid", iccid)
  22. putString("name", name)
  23. }
  24. return instance
  25. }
  26. }
  27. private val editText by lazy {
  28. EditText(requireContext()).apply {
  29. hint = Editable.Factory.getInstance().newEditable(
  30. getString(R.string.profile_delete_confirm_input, requireArguments().getString("name")!!)
  31. )
  32. }
  33. }
  34. private val inputMatchesName: Boolean
  35. get() = editText.text.toString() == requireArguments().getString("name")!!
  36. private var deleting = false
  37. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
  38. return AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply {
  39. setMessage(getString(R.string.profile_delete_confirm, requireArguments().getString("name")))
  40. setView(editText)
  41. setPositiveButton(android.R.string.ok, null) // Set listener to null to prevent auto closing
  42. setNegativeButton(android.R.string.cancel, null)
  43. }.create()
  44. }
  45. override fun onResume() {
  46. super.onResume()
  47. val alertDialog = dialog!! as AlertDialog
  48. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
  49. if (!deleting && inputMatchesName) delete()
  50. }
  51. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener {
  52. if (!deleting) dismiss()
  53. }
  54. }
  55. private fun delete() {
  56. deleting = true
  57. val alertDialog = dialog!! as AlertDialog
  58. alertDialog.setCanceledOnTouchOutside(false)
  59. alertDialog.setCancelable(false)
  60. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
  61. alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false
  62. lifecycleScope.launch {
  63. try {
  64. doDelete()
  65. } catch (e: Exception) {
  66. Log.d(ProfileDownloadFragment.TAG, "Error deleting profile")
  67. Log.d(ProfileDownloadFragment.TAG, Log.getStackTraceString(e))
  68. } finally {
  69. if (parentFragment is EuiccProfilesChangedListener) {
  70. (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged()
  71. }
  72. dismiss()
  73. }
  74. }
  75. }
  76. private suspend fun doDelete() = channel.lpa.beginOperation {
  77. channel.lpa.deleteProfile(requireArguments().getString("iccid")!!)
  78. preferenceRepository.notificationDeleteFlow.first()
  79. }
  80. }