| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package im.angry.openeuicc.ui
- import android.app.Dialog
- import android.os.Bundle
- import android.text.Editable
- import android.widget.EditText
- import androidx.appcompat.app.AlertDialog
- import androidx.fragment.app.DialogFragment
- import androidx.lifecycle.lifecycleScope
- import im.angry.openeuicc.common.R
- import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone
- import im.angry.openeuicc.util.*
- import kotlinx.coroutines.flow.onStart
- import kotlinx.coroutines.launch
- class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker {
- companion object {
- const val TAG = "ProfileDeleteFragment"
- fun newInstance(slotId: Int, portId: Int, iccid: String, name: String): ProfileDeleteFragment {
- val instance = newInstanceEuicc(ProfileDeleteFragment::class.java, slotId, portId)
- instance.requireArguments().apply {
- putString("iccid", iccid)
- putString("name", name)
- }
- return instance
- }
- }
- private val editText by lazy {
- EditText(requireContext()).apply {
- hint = Editable.Factory.getInstance().newEditable(
- getString(R.string.profile_delete_confirm_input, requireArguments().getString("name")!!)
- )
- }
- }
- private val inputMatchesName: Boolean
- get() = editText.text.toString() == requireArguments().getString("name")!!
- private var deleting = false
- override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- return AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply {
- setMessage(getString(R.string.profile_delete_confirm, requireArguments().getString("name")))
- setView(editText)
- setPositiveButton(android.R.string.ok, null) // Set listener to null to prevent auto closing
- setNegativeButton(android.R.string.cancel, null)
- }.create()
- }
- override fun onResume() {
- super.onResume()
- val alertDialog = dialog!! as AlertDialog
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
- if (!deleting && inputMatchesName) delete()
- }
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener {
- if (!deleting) dismiss()
- }
- }
- private fun delete() {
- deleting = true
- val alertDialog = dialog!! as AlertDialog
- alertDialog.setCanceledOnTouchOutside(false)
- alertDialog.setCancelable(false)
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false
- requireParentFragment().lifecycleScope.launch {
- ensureEuiccChannelManager()
- euiccChannelManagerService.waitForForegroundTask()
- euiccChannelManagerService.launchProfileDeleteTask(
- slotId,
- portId,
- requireArguments().getString("iccid")!!
- ).onStart {
- if (parentFragment is EuiccProfilesChangedListener) {
- // Trigger a refresh in the parent fragment -- it should wait until
- // any foreground task is completed before actually doing a refresh
- (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged()
- }
- try {
- dismiss()
- } catch (e: IllegalStateException) {
- // Ignored
- }
- }.waitDone()
- }
- }
- }
|