From d6f5161c344041d0661ac158cea7abd23c5c2293 Mon Sep 17 00:00:00 2001 From: septs Date: Thu, 12 Dec 2024 16:34:16 +0800 Subject: [PATCH 1/4] feat: if profile delete confirm text is unmatched then show toast --- .../openeuicc/ui/ProfileDeleteFragment.kt | 45 +++++++++++++------ app-common/src/main/res/values/strings.xml | 1 + 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt index a06b587..0b50111 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt @@ -4,6 +4,7 @@ import android.app.Dialog import android.os.Bundle import android.text.Editable import android.widget.EditText +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope @@ -16,31 +17,42 @@ import kotlinx.coroutines.launch class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { companion object { const val TAG = "ProfileDeleteFragment" + private const val FIELD_ICCID = "iccid" + private const val FIELD_NAME = "name" 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) + putString(FIELD_ICCID, iccid) + putString(FIELD_NAME, name) } return instance } } + private val iccid: String + get() = requireArguments().getString(FIELD_ICCID)!! + + private val name: String + get() = requireArguments().getString(FIELD_NAME)!! + private val editText by lazy { EditText(requireContext()).apply { - hint = Editable.Factory.getInstance().newEditable( - getString(R.string.profile_delete_confirm_input, requireArguments().getString("name")!!) - ) + hint = Editable.Factory.getInstance() + .newEditable(getString(R.string.profile_delete_confirm_input, name)) } } + private val inputMatchesName: Boolean - get() = editText.text.toString() == requireArguments().getString("name")!! + get() = editText.text.toString() == name + + private var toast: Toast? = null + private var deleting = false override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply { - setMessage(getString(R.string.profile_delete_confirm, requireArguments().getString("name"))) + setMessage(getString(R.string.profile_delete_confirm, name)) setView(editText) setPositiveButton(android.R.string.ok, null) // Set listener to null to prevent auto closing setNegativeButton(android.R.string.cancel, null) @@ -50,7 +62,7 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { super.onResume() val alertDialog = dialog!! as AlertDialog alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (!deleting && inputMatchesName) delete() + if (!deleting) delete() } alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener { if (!deleting) dismiss() @@ -58,6 +70,16 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { } private fun delete() { + if (!inputMatchesName) { + toast?.cancel() + toast = Toast.makeText( + requireContext(), + getString(R.string.toast_profile_delete_unmatched, name), + Toast.LENGTH_LONG + ) + toast!!.show() + return + } deleting = true val alertDialog = dialog!! as AlertDialog alertDialog.setCanceledOnTouchOutside(false) @@ -68,12 +90,7 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { requireParentFragment().lifecycleScope.launch { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() - - euiccChannelManagerService.launchProfileDeleteTask( - slotId, - portId, - requireArguments().getString("iccid")!! - ).onStart { + euiccChannelManagerService.launchProfileDeleteTask(slotId, portId, 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 diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index f308826..03eb5e0 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ Cannot switch to new eSIM profile. Nickname cannot be longer than 64 characters + The string you entered is not \'%s\', please check your input ICCID copied to clipboard Select Slot -- 2.45.3 From 331268b64b76d698efe7cb9b268a44a56a732bba Mon Sep 17 00:00:00 2001 From: septs Date: Thu, 12 Dec 2024 18:25:18 +0800 Subject: [PATCH 2/4] fix: toast cancel --- .../main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt index 0b50111..7fc3079 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt @@ -70,8 +70,8 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { } private fun delete() { + toast?.cancel() if (!inputMatchesName) { - toast?.cancel() toast = Toast.makeText( requireContext(), getString(R.string.toast_profile_delete_unmatched, name), -- 2.45.3 From 0ba4064acbfd2c615a3b27b3d58b5642cdc3c94e Mon Sep 17 00:00:00 2001 From: septs Date: Thu, 12 Dec 2024 18:30:36 +0800 Subject: [PATCH 3/4] chore: simplify alert dialog getter --- .../main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt index 7fc3079..e767fe3 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt @@ -50,6 +50,9 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { private var deleting = false + private val alertDialog: AlertDialog + get() = requireDialog() as AlertDialog + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply { setMessage(getString(R.string.profile_delete_confirm, name)) @@ -60,7 +63,6 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { override fun onResume() { super.onResume() - val alertDialog = dialog!! as AlertDialog alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { if (!deleting) delete() } @@ -81,7 +83,6 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { return } deleting = true - val alertDialog = dialog!! as AlertDialog alertDialog.setCanceledOnTouchOutside(false) alertDialog.setCancelable(false) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false -- 2.45.3 From 0c2439ef10b676be65ed3c0ba3b9afdeb166e1cb Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 13 Dec 2024 11:59:53 +0800 Subject: [PATCH 4/4] chore: accept reviews --- .../openeuicc/ui/ProfileDeleteFragment.kt | 20 +++++++++---------- app-common/src/main/res/values/strings.xml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt index e767fe3..7f82f22 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt @@ -30,11 +30,13 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { } } - private val iccid: String - get() = requireArguments().getString(FIELD_ICCID)!! + private val iccid by lazy { + requireArguments().getString(FIELD_ICCID)!! + } - private val name: String - get() = requireArguments().getString(FIELD_NAME)!! + private val name by lazy { + requireArguments().getString(FIELD_NAME)!! + } private val editText by lazy { EditText(requireContext()).apply { @@ -74,12 +76,10 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { private fun delete() { toast?.cancel() if (!inputMatchesName) { - toast = Toast.makeText( - requireContext(), - getString(R.string.toast_profile_delete_unmatched, name), - Toast.LENGTH_LONG - ) - toast!!.show() + val resId = R.string.toast_profile_delete_confirm_text_mismatched + toast = Toast.makeText(requireContext(), resId, Toast.LENGTH_LONG).also { + it.show() + } return } deleting = true diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 03eb5e0..c846bf4 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -29,7 +29,7 @@ Cannot switch to new eSIM profile. Nickname cannot be longer than 64 characters - The string you entered is not \'%s\', please check your input + Confirmation string mismatch ICCID copied to clipboard Select Slot -- 2.45.3