From 022ca1da9d92012508815773101915deb9507b27 Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 18:51:48 +0100 Subject: [PATCH 01/18] chore: improve readability (#95) Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/95 Co-authored-by: septs Co-committed-by: septs --- .../im/angry/openeuicc/ui/MainActivity.kt | 42 ++++++++----------- .../openeuicc/ui/ProfileDeleteFragment.kt | 5 ++- .../openeuicc/ui/UsbCcidReaderFragment.kt | 8 ++-- .../angry/openeuicc/util/PermissionUtils.kt | 13 ++++++ .../openeuicc/service/OpenEuiccService.kt | 2 +- .../openeuicc/ui/PrivilegedMainActivity.kt | 7 ++-- 6 files changed, 41 insertions(+), 36 deletions(-) create mode 100644 app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt index 7711643..198226a 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt @@ -66,8 +66,9 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { private val usbReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { - if (intent?.action == UsbManager.ACTION_USB_DEVICE_ATTACHED || intent?.action == UsbManager.ACTION_USB_DEVICE_DETACHED) { - refresh(true) + when (intent?.action) { + UsbManager.ACTION_USB_DEVICE_ATTACHED -> refresh(fromUsbEvent = true) + UsbManager.ACTION_USB_DEVICE_DETACHED -> refresh(fromUsbEvent = true) } } } @@ -126,10 +127,10 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { } private fun ensureNotificationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requestPermissions( - arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), - PERMISSION_REQUEST_CODE + PERMISSION_REQUEST_CODE, + android.Manifest.permission.POST_NOTIFICATIONS ) } } @@ -160,38 +161,29 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { // but it could change in the future euiccChannelManager.notifyEuiccProfilesChanged(channel.logicalSlotId) - newPages.add( - Page( - channel.logicalSlotId, - getString(R.string.channel_name_format, channel.logicalSlotId) - ) { - appContainer.uiComponentFactory.createEuiccManagementFragment( - slotId, - portId - ) - }) + val channelName = getString(R.string.channel_name_format, channel.logicalSlotId) + newPages.add(Page(channel.logicalSlotId, channelName) { + appContainer.uiComponentFactory.createEuiccManagementFragment(slotId, portId) + }) } }.collect() // If USB readers exist, add them at the very last // We use a wrapper fragment to handle logic specific to USB readers usbDevice?.let { - newPages.add( - Page( - EuiccChannelManager.USB_CHANNEL_ID, - it.productName ?: getString(R.string.usb) - ) { UsbCcidReaderFragment() }) + val productName = it.productName ?: getString(R.string.usb) + newPages.add(Page(EuiccChannelManager.USB_CHANNEL_ID, productName) { + UsbCcidReaderFragment() + }) } viewPager.visibility = View.VISIBLE if (newPages.size > 1) { tabs.visibility = View.VISIBLE } else if (newPages.isEmpty()) { - newPages.add( - Page( - -1, - "" - ) { appContainer.uiComponentFactory.createNoEuiccPlaceholderFragment() }) + newPages.add(Page(-1, "") { + appContainer.uiComponentFactory.createNoEuiccPlaceholderFragment() + }) } newPages.sortBy { it.logicalSlotId } 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 181aeee..cde1fee 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 @@ -39,12 +39,13 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { private var deleting = false override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme).apply { + 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() + return create() + } } override fun onResume() { diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/UsbCcidReaderFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/UsbCcidReaderFragment.kt index d104582..7a52ca0 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/UsbCcidReaderFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/UsbCcidReaderFragment.kt @@ -120,7 +120,7 @@ class UsbCcidReaderFragment : Fragment(), OpenEuiccContextMarker { try { requireContext().unregisterReceiver(usbPermissionReceiver) } catch (_: Exception) { - + // ignore } } @@ -129,7 +129,7 @@ class UsbCcidReaderFragment : Fragment(), OpenEuiccContextMarker { try { requireContext().unregisterReceiver(usbPermissionReceiver) } catch (_: Exception) { - + // ignore } } @@ -155,8 +155,8 @@ class UsbCcidReaderFragment : Fragment(), OpenEuiccContextMarker { replace( R.id.child_container, appContainer.uiComponentFactory.createEuiccManagementFragment( - EuiccChannelManager.USB_CHANNEL_ID, - 0 + slotId = EuiccChannelManager.USB_CHANNEL_ID, + portId = 0 ) ) } diff --git a/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt new file mode 100644 index 0000000..ba02b79 --- /dev/null +++ b/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt @@ -0,0 +1,13 @@ +package im.angry.openeuicc.util + +import android.app.Activity +import android.content.pm.PackageManager + +fun Activity.requestPermissions(requestCode: Int, vararg permissions: String) { + val deniedPermissions = permissions.filter { name -> + checkSelfPermission(name) == PackageManager.PERMISSION_DENIED + } + if (deniedPermissions.isNotEmpty()) { + requestPermissions(deniedPermissions.toTypedArray(), requestCode) + } +} \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt index d626333..3c522c5 100644 --- a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt +++ b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt @@ -110,7 +110,7 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { telephonyManager.simSlotMapping = mappings return } catch (_: Exception) { - + // ignore } // Sometimes hardware supports one ordering but not the reverse diff --git a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt index 440e529..d00e3c0 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt @@ -16,10 +16,9 @@ class PrivilegedMainActivity : MainActivity() { menu.findItem(R.id.slot_mapping).isVisible = false } - if (tm.supportsDSDS) { - val dsds = menu.findItem(R.id.dsds) - dsds.isVisible = true - dsds.isChecked = tm.dsdsEnabled + menu.findItem(R.id.dsds).apply { + isVisible = tm.supportsDSDS + isChecked = tm.dsdsEnabled } return true From 38d38523f94d3c3ce10732020a41b8831a33adec Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 12:54:33 -0500 Subject: [PATCH 02/18] Revert MainActivity changes --- .../src/main/java/im/angry/openeuicc/ui/MainActivity.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt index 198226a..260d5cd 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt @@ -66,9 +66,8 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { private val usbReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { - when (intent?.action) { - UsbManager.ACTION_USB_DEVICE_ATTACHED -> refresh(fromUsbEvent = true) - UsbManager.ACTION_USB_DEVICE_DETACHED -> refresh(fromUsbEvent = true) + if (intent?.action == UsbManager.ACTION_USB_DEVICE_ATTACHED || intent?.action == UsbManager.ACTION_USB_DEVICE_DETACHED) { + refresh(true) } } } @@ -127,7 +126,7 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { } private fun ensureNotificationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { requestPermissions( PERMISSION_REQUEST_CODE, android.Manifest.permission.POST_NOTIFICATIONS From 5a000278d37688c4fdd0011e1cc2784602bbd218 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 12:55:42 -0500 Subject: [PATCH 03/18] Revert meaningless PermissionUtils --- .../main/java/im/angry/openeuicc/ui/MainActivity.kt | 4 ++-- .../java/im/angry/openeuicc/util/PermissionUtils.kt | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt index 260d5cd..84ce96d 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt @@ -128,8 +128,8 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { private fun ensureNotificationPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { requestPermissions( - PERMISSION_REQUEST_CODE, - android.Manifest.permission.POST_NOTIFICATIONS + arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), + PERMISSION_REQUEST_CODE ) } } diff --git a/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt deleted file mode 100644 index ba02b79..0000000 --- a/app-common/src/main/java/im/angry/openeuicc/util/PermissionUtils.kt +++ /dev/null @@ -1,13 +0,0 @@ -package im.angry.openeuicc.util - -import android.app.Activity -import android.content.pm.PackageManager - -fun Activity.requestPermissions(requestCode: Int, vararg permissions: String) { - val deniedPermissions = permissions.filter { name -> - checkSelfPermission(name) == PackageManager.PERMISSION_DENIED - } - if (deniedPermissions.isNotEmpty()) { - requestPermissions(deniedPermissions.toTypedArray(), requestCode) - } -} \ No newline at end of file From b4f562f90b2126548ebff70ef86081ca37e91120 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 12:58:24 -0500 Subject: [PATCH 04/18] Make MainActivity permission checks clearer --- .../src/main/java/im/angry/openeuicc/ui/MainActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt index 84ce96d..b11a3dd 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/MainActivity.kt @@ -126,7 +126,10 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { } private fun ensureNotificationPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + val needsNotificationPerms = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU; + val notificationPermsGranted = + needsNotificationPerms && checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED + if (needsNotificationPerms && !notificationPermsGranted) { requestPermissions( arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), PERMISSION_REQUEST_CODE From 400c2ff9f91681df63f49bc4199e6698af843174 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 12:59:27 -0500 Subject: [PATCH 05/18] ProfileDeleteFragment: Stop using non-local returns for no reason --- .../java/im/angry/openeuicc/ui/ProfileDeleteFragment.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 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 cde1fee..a06b587 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 @@ -38,15 +38,13 @@ class ProfileDeleteFragment : DialogFragment(), EuiccChannelFragmentMarker { get() = editText.text.toString() == requireArguments().getString("name")!! private var deleting = false - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = 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) - return create() - } - } + }.create() override fun onResume() { super.onResume() From 5b80afd5fe7921651c3ae57edc3ac8ee641a8d44 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 13:39:15 -0500 Subject: [PATCH 06/18] ui: Expose download error reason in diagnostics --- .../ui/wizard/DownloadWizardDiagnosticsFragment.kt | 8 ++++++++ app-common/src/main/res/values-ja/strings.xml | 1 + app-common/src/main/res/values/strings.xml | 1 + 3 files changed, 10 insertions(+) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt index 6c578dd..b281ec4 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt @@ -44,6 +44,14 @@ class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardS private fun buildDiagnosticsText(): String? = state.downloadError?.let { err -> val ret = StringBuilder() + ret.appendLine( + getString( + R.string.download_wizard_diagnostics_error_code, + err.lpaErrorReason + ) + ) + ret.appendLine() + err.lastHttpResponse?.let { resp -> if (resp.rcode != 200) { // Only show the status if it's not 200 diff --git a/app-common/src/main/res/values-ja/strings.xml b/app-common/src/main/res/values-ja/strings.xml index fed185d..ea8792d 100644 --- a/app-common/src/main/res/values-ja/strings.xml +++ b/app-common/src/main/res/values-ja/strings.xml @@ -68,6 +68,7 @@ eSIM プロファイルをダウンロード中です eSIM プロファイルをストレージに読み込み中です エラー診断 + エラーコード: %s 最終の HTTP ステータス (サーバー): %d 最終の HTTP レスポンス (サーバー): 最終の HTTP 例外: diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index a5a05ab..4c40eb2 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -86,6 +86,7 @@ Downloading eSIM profile Loading eSIM profile into storage Error diagnostics + Error code: %s Last HTTP status (from server): %d Last HTTP response (from server): Last HTTP exception: From eab60bf3d3ba4becdbdac592d8bdefca1663ec10 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 8 Dec 2024 13:44:02 -0500 Subject: [PATCH 07/18] ui: priv: Set isMEP and isRemovable when creating footer views Else, footer views may be created before we actually intialize that info. --- .../ui/PrivilegedEuiccManagementFragment.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt index 688ae6c..12b60bd 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt @@ -17,19 +17,16 @@ class PrivilegedEuiccManagementFragment: EuiccManagementFragment() { private var isMEP = false private var isRemovable = false - override suspend fun doRefresh() { - super.doRefresh() - withEuiccChannel { channel -> - isMEP = channel.isMEP - isRemovable = channel.port.card.isRemovable - } - } - override suspend fun onCreateFooterViews( parent: ViewGroup, profiles: List ): List = super.onCreateFooterViews(parent, profiles).let { footers -> + withEuiccChannel { channel -> + isMEP = channel.isMEP + isRemovable = channel.port.card.isRemovable + } + if (isMEP) { val view = layoutInflater.inflate(R.layout.footer_mep, parent, false) view.requireViewById