From b08d25274e36d73c6b7ed66c8b102010cd4f4a5f Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 16 Dec 2024 12:18:30 +0800 Subject: [PATCH 1/9] feat: profile rename state restore --- .../openeuicc/ui/ProfileRenameFragment.kt | 75 ++++++++++++------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index e3f2d8d..e5b5c64 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -5,8 +5,10 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.EditText import android.widget.ProgressBar import android.widget.Toast +import androidx.annotation.StringRes import androidx.appcompat.widget.Toolbar import androidx.lifecycle.lifecycleScope import com.google.android.material.textfield.TextInputLayout @@ -19,33 +21,56 @@ import net.typeblog.lpac_jni.LocalProfileAssistant class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker { companion object { const val TAG = "ProfileRenameFragment" + const val FIELD_ICCID = "iccid" + const val FIELD_CURRENT_NAME = "currentName" + const val FIELD_EDITED_NAME = "editedName" fun newInstance(slotId: Int, portId: Int, iccid: String, currentName: String): ProfileRenameFragment { val instance = newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId) instance.requireArguments().apply { - putString("iccid", iccid) - putString("currentName", currentName) + putString(FIELD_ICCID, iccid) + putString(FIELD_CURRENT_NAME, currentName) } return instance } } private lateinit var toolbar: Toolbar - private lateinit var profileRenameNewName: TextInputLayout + private lateinit var editText: EditText private lateinit var progress: ProgressBar + private val iccid by lazy { + requireArguments().getString(FIELD_ICCID)!! + } + + private val currentName by lazy { + requireArguments().getString(FIELD_CURRENT_NAME)!! + } + + private val editedName: String + get() = editText.text.toString().trim() + private var renaming = false + set(value) { + if (value) { + progress.isIndeterminate = true + progress.visibility = View.VISIBLE + } else { + progress.visibility = View.GONE + } + field = value + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val view = inflater.inflate(R.layout.fragment_profile_rename, container, false) - - toolbar = view.requireViewById(R.id.toolbar) - profileRenameNewName = view.requireViewById(R.id.profile_rename_new_name) - progress = view.requireViewById(R.id.progress) + val view = inflater.inflate(R.layout.fragment_profile_rename, container, false).apply { + toolbar = requireViewById(R.id.toolbar) + editText = requireViewById(R.id.profile_rename_new_name).editText!! + progress = requireViewById(R.id.progress) + } toolbar.inflateMenu(R.menu.fragment_profile_rename) @@ -66,9 +91,14 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } - override fun onStart() { - super.onStart() - profileRenameNewName.editText!!.setText(requireArguments().getString("currentName")) + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putString(FIELD_EDITED_NAME, editedName) + } + + override fun onViewStateRestored(savedInstanceState: Bundle?) { + super.onViewStateRestored(savedInstanceState) + editText.setText(savedInstanceState?.getString(FIELD_EDITED_NAME) ?: currentName) } override fun onResume() { @@ -82,33 +112,24 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } - private fun showErrorAndCancel(errorStrRes: Int) { - Toast.makeText( - requireContext(), - errorStrRes, - Toast.LENGTH_LONG - ).show() + private fun showErrorAndCancel(@StringRes errorResId: Int) { + Toast.makeText(requireContext(), errorResId, Toast.LENGTH_LONG) + .show() renaming = false - progress.visibility = View.GONE } private fun rename() { renaming = true - progress.isIndeterminate = true - progress.visibility = View.VISIBLE lifecycleScope.launch { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() - val res = euiccChannelManagerService.launchProfileRenameTask( - slotId, - portId, - requireArguments().getString("iccid")!!, - profileRenameNewName.editText!!.text.toString().trim() - ).waitDone() + val throwable = euiccChannelManagerService + .launchProfileRenameTask(slotId, portId, iccid, editedName) + .waitDone() - when (res) { + when (throwable) { is LocalProfileAssistant.ProfileNameTooLongException -> { showErrorAndCancel(R.string.profile_rename_too_long) } -- 2.45.3 From c27d245668a5172feeefcf735cbe0567ddf33d01 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 16 Dec 2024 12:24:26 +0800 Subject: [PATCH 2/9] chore: simplify --- .../im/angry/openeuicc/ui/ProfileRenameFragment.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index e5b5c64..88eb55d 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -52,12 +52,8 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment private var renaming = false set(value) { - if (value) { - progress.isIndeterminate = true - progress.visibility = View.VISIBLE - } else { - progress.visibility = View.GONE - } + progress.isIndeterminate = value + progress.visibility = if (value) View.VISIBLE else View.GONE field = value } @@ -72,6 +68,8 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment progress = requireViewById(R.id.progress) } + onViewStateRestored(savedInstanceState) + toolbar.inflateMenu(R.menu.fragment_profile_rename) return view -- 2.45.3 From 7f1dce15a5c144d17b761c7ba139c1aaea13ba5a Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 16 Dec 2024 22:09:03 +0800 Subject: [PATCH 3/9] refactor --- .../openeuicc/ui/ProfileRenameFragment.kt | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index 88eb55d..d736ded 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -10,6 +10,7 @@ import android.widget.ProgressBar import android.widget.Toast import androidx.annotation.StringRes import androidx.appcompat.widget.Toolbar +import androidx.core.widget.addTextChangedListener import androidx.lifecycle.lifecycleScope import com.google.android.material.textfield.TextInputLayout import im.angry.openeuicc.common.R @@ -68,7 +69,11 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment progress = requireViewById(R.id.progress) } - onViewStateRestored(savedInstanceState) + editText.addTextChangedListener { + val isUnchanged = currentName == editedName + dialog!!.setCancelable(isUnchanged) + dialog!!.setCanceledOnTouchOutside(isUnchanged) + } toolbar.inflateMenu(R.menu.fragment_profile_rename) @@ -110,35 +115,23 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } - private fun showErrorAndCancel(@StringRes errorResId: Int) { - Toast.makeText(requireContext(), errorResId, Toast.LENGTH_LONG) - .show() - - renaming = false - } - private fun rename() { renaming = true - lifecycleScope.launch { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() val throwable = euiccChannelManagerService .launchProfileRenameTask(slotId, portId, iccid, editedName) .waitDone() + val toastResId = when (throwable) { + is LocalProfileAssistant.ProfileNameTooLongException -> + R.string.profile_rename_too_long - when (throwable) { - is LocalProfileAssistant.ProfileNameTooLongException -> { - showErrorAndCancel(R.string.profile_rename_too_long) - } + is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> + R.string.profile_rename_encoding_error - is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> { - showErrorAndCancel(R.string.profile_rename_encoding_error) - } - - is Throwable -> { - showErrorAndCancel(R.string.profile_rename_failure) - } + is Throwable -> + R.string.profile_rename_failure else -> { if (parentFragment is EuiccProfilesChangedListener) { @@ -150,8 +143,13 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } catch (e: IllegalStateException) { // Ignored } + null } } + if (toastResId != null) Toast + .makeText(requireContext(), toastResId, Toast.LENGTH_LONG) + .show() } + renaming = false } } \ No newline at end of file -- 2.45.3 From 400062f2804b37338ba56934d2819980a7fb27c5 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 16 Dec 2024 22:37:03 +0800 Subject: [PATCH 4/9] refactor --- .../ui/BaseMaterialDialogFragment.kt | 6 ++ .../openeuicc/ui/ProfileRenameFragment.kt | 85 ++++++++++--------- app-common/src/main/res/values/strings.xml | 2 + 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt index 5c33bee..42cd15c 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt @@ -8,6 +8,7 @@ import androidx.appcompat.view.ContextThemeWrapper import androidx.fragment.app.DialogFragment import com.google.android.material.color.DynamicColors import im.angry.openeuicc.common.R +import im.angry.openeuicc.util.EuiccProfilesChangedListener abstract class BaseMaterialDialogFragment: DialogFragment() { override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater { @@ -23,4 +24,9 @@ abstract class BaseMaterialDialogFragment: DialogFragment() { it.window?.setBackgroundDrawableResource(R.drawable.dialog_background) } } + + protected fun notifyProfileListChanged() { + val fragment = parentFragment + if (fragment is EuiccProfilesChangedListener) fragment.onEuiccProfilesChanged() + } } \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index d736ded..fce3103 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import android.widget.EditText import android.widget.ProgressBar import android.widget.Toast -import androidx.annotation.StringRes import androidx.appcompat.widget.Toolbar import androidx.core.widget.addTextChangedListener import androidx.lifecycle.lifecycleScope @@ -52,11 +51,6 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment get() = editText.text.toString().trim() private var renaming = false - set(value) { - progress.isIndeterminate = value - progress.visibility = if (value) View.VISIBLE else View.GONE - field = value - } override fun onCreateView( inflater: LayoutInflater, @@ -88,7 +82,13 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment if (!renaming) dismiss() } setOnMenuItemClickListener { - if (!renaming) rename() + if (!renaming) { + progress.isIndeterminate = true + progress.visibility = View.VISIBLE + lifecycleScope.launch { invokeRename() } + progress.isIndeterminate = false + progress.visibility = View.GONE + } true } } @@ -115,41 +115,44 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } - private fun rename() { - renaming = true - lifecycleScope.launch { - ensureEuiccChannelManager() - euiccChannelManagerService.waitForForegroundTask() - val throwable = euiccChannelManagerService - .launchProfileRenameTask(slotId, portId, iccid, editedName) - .waitDone() - val toastResId = when (throwable) { - is LocalProfileAssistant.ProfileNameTooLongException -> - R.string.profile_rename_too_long - - is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> - R.string.profile_rename_encoding_error - - is Throwable -> - R.string.profile_rename_failure - - else -> { - if (parentFragment is EuiccProfilesChangedListener) { - (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged() - } - - try { - dismiss() - } catch (e: IllegalStateException) { - // Ignored - } - null - } - } - if (toastResId != null) Toast - .makeText(requireContext(), toastResId, Toast.LENGTH_LONG) + private suspend fun invokeRename() { + ensureEuiccChannelManager() + euiccChannelManagerService.waitForForegroundTask() + if (editedName == currentName) { + Toast + .makeText(requireContext(), R.string.profile_rename_unchanged, Toast.LENGTH_LONG) .show() + dismiss() + return } - renaming = false + val throwable = euiccChannelManagerService + .launchProfileRenameTask(slotId, portId, iccid, editedName) + .waitDone() + val toastResId = when (throwable) { + is LocalProfileAssistant.ProfileNameTooLongException -> + R.string.profile_rename_too_long + + is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> + R.string.profile_rename_encoding_error + + is Throwable -> + R.string.profile_rename_failure + + else -> { + notifyProfileListChanged() + try { + dismiss() + } catch (e: IllegalStateException) { + // Ignored + } + if (editedName.isEmpty()) + R.string.profile_rename_restore_defaults + else + null + } + } + if (toastResId != null) Toast + .makeText(requireContext(), toastResId, Toast.LENGTH_LONG) + .show() } } \ No newline at end of file diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 95ea261..3ac3e0a 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -96,6 +96,8 @@ Logs have been saved to the selected path. Would you like to share the log through another app? New nickname + The profile nickname is unchanged + The profile nickname restored to defaults Failed to encode nickname as UTF-8 Nickname is too long Unknown failure when renaming profile -- 2.45.3 From 7898d9473da2e38a32b68ac674df12019f1a96a5 Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 17 Dec 2024 00:22:39 +0800 Subject: [PATCH 5/9] refactor --- .../ui/BaseMaterialDialogFragment.kt | 6 ++- .../openeuicc/ui/ProfileDeleteFragment.kt | 9 +--- .../openeuicc/ui/ProfileRenameFragment.kt | 41 +++++++++---------- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt index 42cd15c..a7514b1 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt @@ -25,7 +25,11 @@ abstract class BaseMaterialDialogFragment: DialogFragment() { } } - protected fun notifyProfileListChanged() { + /** + * Trigger a refresh in the parent fragment -- it should wait until + * any foreground task is completed before actually doing a refresh + */ + protected fun notifyEuiccProfilesChanged() { val fragment = parentFragment if (fragment is EuiccProfilesChangedListener) fragment.onEuiccProfilesChanged() } 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 7f82f22..22bdc74 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 @@ -6,7 +6,6 @@ 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 import im.angry.openeuicc.common.R import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone @@ -14,7 +13,7 @@ import im.angry.openeuicc.util.* import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { +class ProfileDeleteFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker { companion object { const val TAG = "ProfileDeleteFragment" private const val FIELD_ICCID = "iccid" @@ -92,11 +91,7 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() 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 - (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged() - } + notifyEuiccProfilesChanged() try { dismiss() diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index fce3103..079b54d 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -51,6 +51,11 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment get() = editText.text.toString().trim() private var renaming = false + set(value) { + progress.isIndeterminate = value + progress.visibility = if (value) View.VISIBLE else View.GONE + field = value + } override fun onCreateView( inflater: LayoutInflater, @@ -82,12 +87,10 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment if (!renaming) dismiss() } setOnMenuItemClickListener { - if (!renaming) { - progress.isIndeterminate = true - progress.visibility = View.VISIBLE - lifecycleScope.launch { invokeRename() } - progress.isIndeterminate = false - progress.visibility = View.GONE + if (!renaming) lifecycleScope.launch { + renaming = true + invokeRename() + renaming = false } true } @@ -118,39 +121,35 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment private suspend fun invokeRename() { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() - if (editedName == currentName) { - Toast - .makeText(requireContext(), R.string.profile_rename_unchanged, Toast.LENGTH_LONG) - .show() - dismiss() - return - } + val throwable = euiccChannelManagerService .launchProfileRenameTask(slotId, portId, iccid, editedName) .waitDone() + val toastResId = when (throwable) { is LocalProfileAssistant.ProfileNameTooLongException -> R.string.profile_rename_too_long - is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> R.string.profile_rename_encoding_error - is Throwable -> R.string.profile_rename_failure - else -> { - notifyProfileListChanged() + notifyEuiccProfilesChanged() try { dismiss() } catch (e: IllegalStateException) { // Ignored } - if (editedName.isEmpty()) - R.string.profile_rename_restore_defaults - else - null + when { + editedName.isEmpty() -> + R.string.profile_rename_restore_defaults + editedName == currentName -> + R.string.profile_rename_unchanged + else -> null + } } } + if (toastResId != null) Toast .makeText(requireContext(), toastResId, Toast.LENGTH_LONG) .show() -- 2.45.3 From 9be44ce9bc1ac6c96ed8de04450b30af6de09731 Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 17 Dec 2024 00:27:19 +0800 Subject: [PATCH 6/9] refactor: managed toast --- .../im/angry/openeuicc/ui/ProfileRenameFragment.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index 079b54d..e13daa5 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -57,6 +57,13 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment field = value } + private var toast: Toast? = null + set(value) { + field?.cancel() + field = value + field?.show() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -119,6 +126,8 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } private suspend fun invokeRename() { + toast?.cancel() + ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() @@ -150,8 +159,7 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } - if (toastResId != null) Toast + if (toastResId != null) toast = Toast .makeText(requireContext(), toastResId, Toast.LENGTH_LONG) - .show() } } \ No newline at end of file -- 2.45.3 From d9d85d4c1fbd8e7fd4c0aa7c7468afb331cbe1bf Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 17 Dec 2024 08:46:30 +0800 Subject: [PATCH 7/9] refactor --- .../openeuicc/ui/ProfileRenameFragment.kt | 46 +++++++------------ .../util/EuiccChannelFragmentUtils.kt | 2 +- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index e13daa5..0995048 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -1,6 +1,5 @@ package im.angry.openeuicc.ui -import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -21,18 +20,15 @@ import net.typeblog.lpac_jni.LocalProfileAssistant class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker { companion object { const val TAG = "ProfileRenameFragment" - const val FIELD_ICCID = "iccid" - const val FIELD_CURRENT_NAME = "currentName" - const val FIELD_EDITED_NAME = "editedName" + private const val FIELD_ICCID = "iccid" + private const val FIELD_CURRENT_NAME = "currentName" + private const val FIELD_EDITED_NAME = "editedName" - fun newInstance(slotId: Int, portId: Int, iccid: String, currentName: String): ProfileRenameFragment { - val instance = newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId) - instance.requireArguments().apply { + fun newInstance(slotId: Int, portId: Int, iccid: String, currentName: String) = + newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId) { putString(FIELD_ICCID, iccid) putString(FIELD_CURRENT_NAME, currentName) } - return instance - } } private lateinit var toolbar: Toolbar @@ -68,22 +64,18 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - val view = inflater.inflate(R.layout.fragment_profile_rename, container, false).apply { - toolbar = requireViewById(R.id.toolbar) - editText = requireViewById(R.id.profile_rename_new_name).editText!! - progress = requireViewById(R.id.progress) + ): View = inflater.inflate(R.layout.fragment_profile_rename, container, false).apply { + toolbar = requireViewById(R.id.toolbar).apply { + inflateMenu(R.menu.fragment_profile_rename) } - - editText.addTextChangedListener { - val isUnchanged = currentName == editedName - dialog!!.setCancelable(isUnchanged) - dialog!!.setCanceledOnTouchOutside(isUnchanged) + editText = requireViewById(R.id.profile_rename_new_name).editText!!.apply { + addTextChangedListener { + val isUnchanged = currentName == editedName + dialog!!.setCancelable(isUnchanged) + dialog!!.setCanceledOnTouchOutside(isUnchanged) + } } - - toolbar.inflateMenu(R.menu.fragment_profile_rename) - - return view + progress = requireViewById(R.id.progress) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -119,14 +111,8 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment setWidthPercent(95) } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return super.onCreateDialog(savedInstanceState).also { - it.setCanceledOnTouchOutside(false) - } - } - private suspend fun invokeRename() { - toast?.cancel() + toast = null ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() diff --git a/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt index 3f3c4ee..028c512 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt @@ -13,7 +13,7 @@ interface EuiccChannelFragmentMarker: OpenEuiccContextMarker // in the definition of an interface, so the only way is to limit where the extension functions // can be applied. fun newInstanceEuicc(clazz: Class, slotId: Int, portId: Int, addArguments: Bundle.() -> Unit = {}): T where T: Fragment, T: EuiccChannelFragmentMarker { - val instance = clazz.newInstance() + val instance = clazz.getDeclaredConstructor().newInstance() instance.arguments = Bundle().apply { putInt("slotId", slotId) putInt("portId", portId) -- 2.45.3 From 6c7c4f5e1f6a69b4e205ce6848eca025a9f75563 Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 17 Dec 2024 08:49:48 +0800 Subject: [PATCH 8/9] refactor --- .../im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt | 9 --------- .../im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt | 5 +++++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt index a7514b1..a717e43 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt @@ -24,13 +24,4 @@ abstract class BaseMaterialDialogFragment: DialogFragment() { it.window?.setBackgroundDrawableResource(R.drawable.dialog_background) } } - - /** - * Trigger a refresh in the parent fragment -- it should wait until - * any foreground task is completed before actually doing a refresh - */ - protected fun notifyEuiccProfilesChanged() { - val fragment = parentFragment - if (fragment is EuiccProfilesChangedListener) fragment.onEuiccProfilesChanged() - } } \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt index 028c512..fff0e69 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/EuiccChannelFragmentUtils.kt @@ -37,6 +37,11 @@ val T.euiccChannelManager: EuiccChannelManager where T: Fragment, T: OpenEui val T.euiccChannelManagerService: EuiccChannelManagerService where T: Fragment, T: OpenEuiccContextMarker get() = (requireActivity() as BaseEuiccAccessActivity).euiccChannelManagerService +fun T.notifyEuiccProfilesChanged() where T : Fragment, T : OpenEuiccContextMarker { + val fragment = parentFragment + if (fragment is EuiccProfilesChangedListener) fragment.onEuiccProfilesChanged() +} + suspend fun T.withEuiccChannel(fn: suspend (EuiccChannel) -> R): R where T : Fragment, T : EuiccChannelFragmentMarker { ensureEuiccChannelManager() return euiccChannelManager.withEuiccChannel(slotId, portId, fn) -- 2.45.3 From 6f29e6b2675581ffc885602a39c92d98fc14f52d Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 17 Dec 2024 08:50:41 +0800 Subject: [PATCH 9/9] refactor --- .../im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt | 1 - .../java/im/angry/openeuicc/ui/ProfileRenameFragment.kt | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt index a717e43..5c33bee 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/BaseMaterialDialogFragment.kt @@ -8,7 +8,6 @@ import androidx.appcompat.view.ContextThemeWrapper import androidx.fragment.app.DialogFragment import com.google.android.material.color.DynamicColors import im.angry.openeuicc.common.R -import im.angry.openeuicc.util.EuiccProfilesChangedListener abstract class BaseMaterialDialogFragment: DialogFragment() { override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater { diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt index 0995048..65698e6 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileRenameFragment.kt @@ -20,9 +20,9 @@ import net.typeblog.lpac_jni.LocalProfileAssistant class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker { companion object { const val TAG = "ProfileRenameFragment" - private const val FIELD_ICCID = "iccid" - private const val FIELD_CURRENT_NAME = "currentName" - private const val FIELD_EDITED_NAME = "editedName" + const val FIELD_ICCID = "iccid" + const val FIELD_CURRENT_NAME = "currentName" + const val FIELD_EDITED_NAME = "editedName" fun newInstance(slotId: Int, portId: Int, iccid: String, currentName: String) = newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId) { -- 2.45.3