From f395cee2e0fa0dc65de26241caf77f6bc8defc2e Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 15 Dec 2024 18:47:57 +0100 Subject: [PATCH 1/9] chore: cleanup unused resource from 343dfb43f8 (#119) Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/119 Co-authored-by: septs Co-committed-by: septs --- .../main/res/layout/fragment_slot_select.xml | 27 ------------------- .../main/res/menu/fragment_slot_select.xml | 9 ------- app-common/src/main/res/values-ja/strings.xml | 2 -- .../src/main/res/values-zh-rCN/strings.xml | 2 -- app-common/src/main/res/values/strings.xml | 3 --- 5 files changed, 43 deletions(-) delete mode 100644 app-common/src/main/res/layout/fragment_slot_select.xml delete mode 100644 app-common/src/main/res/menu/fragment_slot_select.xml diff --git a/app-common/src/main/res/layout/fragment_slot_select.xml b/app-common/src/main/res/layout/fragment_slot_select.xml deleted file mode 100644 index b818b80..0000000 --- a/app-common/src/main/res/layout/fragment_slot_select.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app-common/src/main/res/menu/fragment_slot_select.xml b/app-common/src/main/res/menu/fragment_slot_select.xml deleted file mode 100644 index e129008..0000000 --- a/app-common/src/main/res/menu/fragment_slot_select.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app-common/src/main/res/values-ja/strings.xml b/app-common/src/main/res/values-ja/strings.xml index dacfd68..1f1f389 100644 --- a/app-common/src/main/res/values-ja/strings.xml +++ b/app-common/src/main/res/values-ja/strings.xml @@ -18,8 +18,6 @@ 新しい eSIM プロファイルに切り替えることができません。 ニックネームは 64 文字以内にしてください ICCID をクリップボードにコピーしました - スロットを選択 - 選択 USB の権限を許可 USB スマートカードリーダーにアクセスするには許可が必要です。 USB スマートカードリーダー経由で eSIM に接続できません。 diff --git a/app-common/src/main/res/values-zh-rCN/strings.xml b/app-common/src/main/res/values-zh-rCN/strings.xml index b97969d..d9d6c77 100644 --- a/app-common/src/main/res/values-zh-rCN/strings.xml +++ b/app-common/src/main/res/values-zh-rCN/strings.xml @@ -19,8 +19,6 @@ 无法切换到新的 eSIM 配置文件。 昵称不能超过 64 个字符 已复制 ICCID 到剪贴板 - 选择卡槽 - 选择 授予 USB 权限 需要获得访问 USB 智能卡读卡器的权限。 无法通过 USB 智能卡读卡器连接到 eSIM。 diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index bd3b3af..196dbbe 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -33,9 +33,6 @@ ICCID copied to clipboard EID copied to clipboard - Select Slot - Select - Grant USB permission Permission is needed to access the USB smart card reader. Cannot connect to eSIM via a USB smart card reader. From 905d0c897eaedc1a2dbca4e022f6961388a60326 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 13:19:23 -0500 Subject: [PATCH 2/9] ui: wizard: Save activity before showing nvram warning dialog --- .../openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt index f16a086..3723aea 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt @@ -57,13 +57,15 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt super.beforeNext() if (adapter.selected.freeSpace < LOW_NVRAM_THRESHOLD) { + val activity = requireActivity() + AlertDialog.Builder(requireContext()).apply { setTitle(R.string.profile_download_low_nvram_title) setMessage(R.string.profile_download_low_nvram_message) setCancelable(true) setPositiveButton(android.R.string.ok, null) setNegativeButton(android.R.string.cancel) { _, _ -> - requireActivity().finish() + activity.finish() } show() } From 0fbda7dd78e5fe61237bbce1b39f704581b0e444 Mon Sep 17 00:00:00 2001 From: septs Date: Sat, 14 Dec 2024 21:49:09 +0800 Subject: [PATCH 3/9] feat: load lpa string from clipboard --- .../ui/wizard/DownloadWizardMethodSelectFragment.kt | 10 ++++++++++ app-common/src/main/res/values/strings.xml | 1 + 2 files changed, 11 insertions(+) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index d329048..16b9759 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -1,6 +1,7 @@ package im.angry.openeuicc.ui.wizard import android.app.AlertDialog +import android.content.ClipboardManager import android.graphics.BitmapFactory import android.os.Bundle import android.view.LayoutInflater @@ -68,6 +69,9 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard DownloadMethod(R.drawable.ic_gallery_black, R.string.download_wizard_method_gallery) { gallerySelectorLauncher.launch("image/*") }, + DownloadMethod(R.drawable.ic_scan_black, R.string.download_wizard_method_clipboard) { + handleLoadFromClipboard() + }, DownloadMethod(R.drawable.ic_edit, R.string.download_wizard_method_manual) { gotoNextFragment(DownloadWizardDetailsFragment()) } @@ -103,6 +107,12 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard return view } + private fun handleLoadFromClipboard() { + val clipboard = requireContext().getSystemService(ClipboardManager::class.java) + val text = clipboard.primaryClip?.getItemAt(0)?.text ?: return + processLpaString(text.toString()) + } + private fun processLpaString(s: String) { val components = s.split("$") if (components.size < 3 || components[0] != "LPA:1") { diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 196dbbe..90d9c29 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -72,6 +72,7 @@ How would you like to download the eSIM profile? Scan a QR code with camera Load a QR code from gallery + Load from Clipboard Enter manually Input or confirm details for downloading your eSIM: Downloading your eSIM… From 24f04f54e4bb5016e730578d4fdc44cb4861b6d8 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 14:37:30 -0500 Subject: [PATCH 4/9] Add icon for loading from clipboard --- .../ui/wizard/DownloadWizardMethodSelectFragment.kt | 2 +- app-common/src/main/res/drawable/ic_paste_go.xml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 app-common/src/main/res/drawable/ic_paste_go.xml diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 16b9759..7f5eaea 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -69,7 +69,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard DownloadMethod(R.drawable.ic_gallery_black, R.string.download_wizard_method_gallery) { gallerySelectorLauncher.launch("image/*") }, - DownloadMethod(R.drawable.ic_scan_black, R.string.download_wizard_method_clipboard) { + DownloadMethod(R.drawable.ic_paste_go, R.string.download_wizard_method_clipboard) { handleLoadFromClipboard() }, DownloadMethod(R.drawable.ic_edit, R.string.download_wizard_method_manual) { diff --git a/app-common/src/main/res/drawable/ic_paste_go.xml b/app-common/src/main/res/drawable/ic_paste_go.xml new file mode 100644 index 0000000..7536fff --- /dev/null +++ b/app-common/src/main/res/drawable/ic_paste_go.xml @@ -0,0 +1,7 @@ + + + + + + + From 343040660335e800195d3e39d6ba52e64383d362 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 14:40:59 -0500 Subject: [PATCH 5/9] ui: wizard: Add toast for when clipboard is empty --- .../ui/wizard/DownloadWizardMethodSelectFragment.kt | 13 ++++++++++++- app-common/src/main/res/values/strings.xml | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 7f5eaea..6203364 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration @@ -109,7 +110,17 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard private fun handleLoadFromClipboard() { val clipboard = requireContext().getSystemService(ClipboardManager::class.java) - val text = clipboard.primaryClip?.getItemAt(0)?.text ?: return + val text = clipboard.primaryClip?.getItemAt(0)?.text + + if (text == null) { + Toast.makeText( + requireContext(), + R.string.profile_download_no_lpa_string, + Toast.LENGTH_SHORT + ).show() + return + } + processLpaString(text.toString()) } diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 90d9c29..1521c61 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -55,6 +55,7 @@ This download may fail This download may fail due to low remaining capacity. + No LPA string found in clipboard Incorrect LPA String The LPA string could not be parsed From 74e946cc8f4d738f327a98b987ad46c6acb94c92 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 14:42:12 -0500 Subject: [PATCH 6/9] i18n: Update message for LPA string parsing failure --- app-common/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 1521c61..a0e8e50 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -57,7 +57,7 @@ This download may fail due to low remaining capacity. No LPA string found in clipboard Incorrect LPA String - The LPA string could not be parsed + Could not parse QR code or clipboard content as an LPA string for downloading eSIMs. Download Wizard Back From 3b7bd8b31e6e6404257a098360c3617e23769c4c Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 16:02:27 -0500 Subject: [PATCH 7/9] fix: Validate nickname and convert to proper UTF-8 before passing to JNI The JNI "modified" UTF-8 isn't what SGP.22 mandates. Let's encode properly, validate the length, and pass the string as a C null-terminated string directly over JNI. This also introduces new exceptions that are exposed via UI as Toasts. --- .../core/LocalProfileAssistantWrapper.kt | 3 +- .../service/EuiccChannelManagerService.kt | 6 +-- .../openeuicc/ui/ProfileRenameFragment.kt | 45 +++++++++++++++---- app-common/src/main/res/values/strings.xml | 3 ++ .../lpac_jni/LocalProfileAssistant.kt | 11 ++++- .../java/net/typeblog/lpac_jni/LpacJni.kt | 2 +- .../impl/LocalProfileAssistantImpl.kt | 19 +++++++- .../lpac-jni/src/main/jni/lpac-jni/lpac-jni.c | 10 ++--- 8 files changed, 76 insertions(+), 23 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt b/app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt index aab9e63..b715ca0 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt @@ -54,8 +54,9 @@ class LocalProfileAssistantWrapper(orig: LocalProfileAssistant) : override fun euiccMemoryReset() = lpa.euiccMemoryReset() - override fun setNickname(iccid: String, nickname: String): Boolean = + override fun setNickname(iccid: String, nickname: String) { lpa.setNickname(iccid, nickname) + } override fun close() = lpa.close() diff --git a/app-common/src/main/java/im/angry/openeuicc/service/EuiccChannelManagerService.kt b/app-common/src/main/java/im/angry/openeuicc/service/EuiccChannelManagerService.kt index c4d16df..a20c8db 100644 --- a/app-common/src/main/java/im/angry/openeuicc/service/EuiccChannelManagerService.kt +++ b/app-common/src/main/java/im/angry/openeuicc/service/EuiccChannelManagerService.kt @@ -414,16 +414,12 @@ class EuiccChannelManagerService : LifecycleService(), OpenEuiccContextMarker { getString(R.string.task_profile_rename_failure), R.drawable.ic_task_rename ) { - val res = euiccChannelManager.withEuiccChannel(slotId, portId) { channel -> + euiccChannelManager.withEuiccChannel(slotId, portId) { channel -> channel.lpa.setNickname( iccid, name ) } - - if (!res) { - throw RuntimeException("Profile not renamed") - } } fun launchProfileDeleteTask( 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 8582278..a3e4571 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 @@ -14,6 +14,7 @@ import im.angry.openeuicc.common.R import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone import im.angry.openeuicc.util.* import kotlinx.coroutines.launch +import net.typeblog.lpac_jni.LocalProfileAssistant class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker { companion object { @@ -95,21 +96,49 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment lifecycleScope.launch { ensureEuiccChannelManager() euiccChannelManagerService.waitForForegroundTask() - euiccChannelManagerService.launchProfileRenameTask( + val res = euiccChannelManagerService.launchProfileRenameTask( slotId, portId, requireArguments().getString("iccid")!!, name ).waitDone() - if (parentFragment is EuiccProfilesChangedListener) { - (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged() - } + when (res) { + is LocalProfileAssistant.ProfileNameTooLongException -> { + Toast.makeText( + requireContext(), + R.string.profile_rename_too_long, + Toast.LENGTH_LONG + ).show() + } - try { - dismiss() - } catch (e: IllegalStateException) { - // Ignored + is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> { + Toast.makeText( + requireContext(), + R.string.profile_rename_encoding_error, + Toast.LENGTH_LONG + ).show() + } + + is Throwable -> { + Toast.makeText( + requireContext(), + R.string.profile_rename_failure, + Toast.LENGTH_LONG + ).show() + } + + else -> { + if (parentFragment is EuiccProfilesChangedListener) { + (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged() + } + + try { + dismiss() + } catch (e: IllegalStateException) { + // Ignored + } + } } } } diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index a0e8e50..39d2c43 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -97,6 +97,9 @@ Logs have been saved to the selected path. Would you like to share the log through another app? New nickname + Failed to encode nickname as UTF-8 + Nickname is too long + Unknown failure when renaming profile Are you sure you want to delete the profile %s? This operation is irreversible. Type \'%s\' here to confirm deletion diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt index 4ff65fa..48ab1c5 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt @@ -12,6 +12,10 @@ interface LocalProfileAssistant { val lastApduException: Exception?, ) : Exception("Failed to download profile") + class ProfileRenameException() : Exception("Failed to rename profile") + class ProfileNameTooLongException() : Exception("Profile name too long") + class ProfileNameIsInvalidUTF8Exception() : Exception("Profile name is invalid UTF-8") + val valid: Boolean val profiles: List val notifications: List @@ -40,9 +44,14 @@ interface LocalProfileAssistant { fun euiccMemoryReset() + /** + * Nickname must be valid UTF-8 and shorter than 64 chars. + * + * May throw one of: ProfileRenameException, ProfileNameTooLongException, ProfileNameIsInvalidUTF8Exception + */ fun setNickname( iccid: String, nickname: String - ): Boolean + ) fun close() } \ No newline at end of file diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt index 8e3f53a..d50c1c1 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt @@ -19,7 +19,7 @@ internal object LpacJni { external fun es10cEnableProfile(handle: Long, iccid: String, refresh: Boolean): Int external fun es10cDisableProfile(handle: Long, iccid: String, refresh: Boolean): Int external fun es10cDeleteProfile(handle: Long, iccid: String): Int - external fun es10cSetNickname(handle: Long, iccid: String, nick: String): Int + external fun es10cSetNickname(handle: Long, iccid: String, nickNullTerminated: ByteArray): Int // es10b external fun es10bListNotification(handle: Long): Long // A native pointer to a linked list. Handle with linked list-related methods below. May be 0 (null) diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt index b617f2b..0330d82 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt @@ -239,8 +239,23 @@ class LocalProfileAssistantImpl( } == 0 @Synchronized - override fun setNickname(iccid: String, nickname: String): Boolean = - LpacJni.es10cSetNickname(contextHandle, iccid, nickname) == 0 + override fun setNickname(iccid: String, nickname: String) { + val encoded = try { + Charsets.UTF_8.encode(nickname).array() + } catch (e: CharacterCodingException) { + throw LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception() + } + + if (encoded.size >= 64) { + throw LocalProfileAssistant.ProfileNameTooLongException() + } + + val encodedNullTerminated = encoded + byteArrayOf(0) + + if (LpacJni.es10cSetNickname(contextHandle, iccid, encodedNullTerminated) != 0) { + throw LocalProfileAssistant.ProfileRenameException() + } + } override fun euiccMemoryReset() { LpacJni.es10cEuiccMemoryReset(contextHandle) diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c index 8f4752b..e438107 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c @@ -205,16 +205,16 @@ Java_net_typeblog_lpac_1jni_LpacJni_es10cDisableProfile(JNIEnv *env, jobject thi JNIEXPORT jint JNICALL Java_net_typeblog_lpac_1jni_LpacJni_es10cSetNickname(JNIEnv *env, jobject thiz, jlong handle, - jstring iccid, jstring nick) { + jstring iccid, jbyteArray nick) { struct euicc_ctx *ctx = (struct euicc_ctx *) handle; const char *_iccid = NULL; - const char *_nick = NULL; + jbyte *_nick = NULL; int ret; _iccid = (*env)->GetStringUTFChars(env, iccid, NULL); - _nick = (*env)->GetStringUTFChars(env, nick, NULL); - ret = es10c_set_nickname(ctx, _iccid, _nick); - (*env)->ReleaseStringUTFChars(env, nick, _nick); + _nick = (*env)->GetByteArrayElements(env, nick, NULL); + ret = es10c_set_nickname(ctx, _iccid, (const char *) _nick); + (*env)->ReleaseByteArrayElements(env, nick, _nick, JNI_ABORT); (*env)->ReleaseStringUTFChars(env, iccid, _iccid); return ret; } From f135a0da6065b4a9d47c6aa39813c2f9c5f5c165 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 22:49:02 -0500 Subject: [PATCH 8/9] ui: Fixup rename error toasts --- .../openeuicc/ui/ProfileRenameFragment.kt | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 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 a3e4571..915d82f 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 @@ -82,6 +82,17 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } } + private fun showErrorAndCancel(errorStrRes: Int) { + Toast.makeText( + requireContext(), + errorStrRes, + Toast.LENGTH_LONG + ).show() + + renaming = false + progress.visibility = View.GONE + } + private fun rename() { val name = profileRenameNewName.editText!!.text.toString().trim() if (name.length >= 64) { @@ -105,27 +116,15 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment when (res) { is LocalProfileAssistant.ProfileNameTooLongException -> { - Toast.makeText( - requireContext(), - R.string.profile_rename_too_long, - Toast.LENGTH_LONG - ).show() + showErrorAndCancel(R.string.profile_rename_too_long) } is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> { - Toast.makeText( - requireContext(), - R.string.profile_rename_encoding_error, - Toast.LENGTH_LONG - ).show() + showErrorAndCancel(R.string.profile_rename_encoding_error) } is Throwable -> { - Toast.makeText( - requireContext(), - R.string.profile_rename_failure, - Toast.LENGTH_LONG - ).show() + showErrorAndCancel(R.string.profile_rename_failure) } else -> { From 24076e8fb4dc4a14c7da0a064c4c97ba4444915b Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 15 Dec 2024 22:51:36 -0500 Subject: [PATCH 9/9] ui: Remove old toast for profile name length We'll add back i18n later. --- .../java/im/angry/openeuicc/ui/ProfileRenameFragment.kt | 8 +------- app-common/src/main/res/values-ja/strings.xml | 1 - app-common/src/main/res/values-zh-rCN/strings.xml | 1 - app-common/src/main/res/values/strings.xml | 1 - 4 files changed, 1 insertion(+), 10 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 915d82f..e3f2d8d 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 @@ -94,12 +94,6 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment } private fun rename() { - val name = profileRenameNewName.editText!!.text.toString().trim() - if (name.length >= 64) { - Toast.makeText(context, R.string.toast_profile_name_too_long, Toast.LENGTH_LONG).show() - return - } - renaming = true progress.isIndeterminate = true progress.visibility = View.VISIBLE @@ -111,7 +105,7 @@ class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragment slotId, portId, requireArguments().getString("iccid")!!, - name + profileRenameNewName.editText!!.text.toString().trim() ).waitDone() when (res) { diff --git a/app-common/src/main/res/values-ja/strings.xml b/app-common/src/main/res/values-ja/strings.xml index 1f1f389..54d5890 100644 --- a/app-common/src/main/res/values-ja/strings.xml +++ b/app-common/src/main/res/values-ja/strings.xml @@ -16,7 +16,6 @@ eSIM チップがプロファイルの切り替えの待機中にタイムアウトしました。これはデバイスのモデムファームウェアのバグの可能性があります。機内モードに切り替えるかアプリを再起動、デバイスを再起動してください。 操作は成功しましたが、デバイスのモデムが更新を拒否しました。新しいプロファイルを使用するには機内モードに切り替えるか、再起動する必要があります。 新しい eSIM プロファイルに切り替えることができません。 - ニックネームは 64 文字以内にしてください ICCID をクリップボードにコピーしました USB の権限を許可 USB スマートカードリーダーにアクセスするには許可が必要です。 diff --git a/app-common/src/main/res/values-zh-rCN/strings.xml b/app-common/src/main/res/values-zh-rCN/strings.xml index d9d6c77..200931a 100644 --- a/app-common/src/main/res/values-zh-rCN/strings.xml +++ b/app-common/src/main/res/values-zh-rCN/strings.xml @@ -17,7 +17,6 @@ 等待 eSIM 芯片切换配置文件时超时。这可能是您手机基带固件中的一个错误。请尝试切换飞行模式、重新启动应用程序或重新启动手机 操作成功, 但是您手机的基带拒绝刷新。您可能需要切换飞行模式或重新启动,以便使用新的配置文件。 无法切换到新的 eSIM 配置文件。 - 昵称不能超过 64 个字符 已复制 ICCID 到剪贴板 授予 USB 权限 需要获得访问 USB 智能卡读卡器的权限。 diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 39d2c43..95ea261 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -28,7 +28,6 @@ The operation was successful, but your phone\'s modem refused to refresh. You might need to toggle airplane mode or reboot in order to use the new profile. Cannot switch to new eSIM profile. - Nickname cannot be longer than 64 characters Confirmation string mismatch ICCID copied to clipboard EID copied to clipboard