From f395cee2e0fa0dc65de26241caf77f6bc8defc2e Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 15 Dec 2024 18:47:57 +0100 Subject: [PATCH 1/8] 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/8] 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/8] 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/8] 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/8] 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/8] 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/8] 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 adaa600f2e89628a26e272734015980d8c9191f6 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 16 Dec 2024 11:56:17 +0800 Subject: [PATCH 8/8] chore: simplify settings activity --- .../src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt index bb299a3..9898558 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/SettingsActivity.kt @@ -8,10 +8,7 @@ import im.angry.openeuicc.OpenEuiccApplication import im.angry.openeuicc.common.R import im.angry.openeuicc.util.* -class SettingsActivity: AppCompatActivity() { - private val appContainer - get() = (application as OpenEuiccApplication).appContainer - +class SettingsActivity: AppCompatActivity(), EuiccChannelFragmentMarker { override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState)