From 630b09ffeb4f61f885a7165df7cf66697b1c0f09 Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 18:41:09 +0800 Subject: [PATCH 1/6] chore: improve readability --- .../im/angry/openeuicc/ui/MainActivity.kt | 46 ++++++++----------- .../openeuicc/ui/ProfileDeleteFragment.kt | 5 +- .../openeuicc/ui/UsbCcidReaderFragment.kt | 8 ++-- .../ui/CompatibilityCheckActivity.kt | 21 +++++---- .../openeuicc/service/OpenEuiccService.kt | 42 ++++++++--------- .../openeuicc/ui/PrivilegedMainActivity.kt | 7 ++- 6 files changed, 62 insertions(+), 67 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 7711643..b54b91d 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,12 +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) { - requestPermissions( - arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), - PERMISSION_REQUEST_CODE - ) - } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return + val permission = android.Manifest.permission.POST_NOTIFICATIONS + if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) return + requestPermissions(arrayOf(permission), PERMISSION_REQUEST_CODE) } private suspend fun init(fromUsbEvent: Boolean = false) { @@ -160,38 +159,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-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index 433f9c3..73f615e 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -1,6 +1,8 @@ package im.angry.openeuicc.ui +import android.annotation.SuppressLint import android.os.Bundle +import android.text.Html import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -8,6 +10,7 @@ import android.widget.TextView import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.children +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -29,15 +32,17 @@ class CompatibilityCheckActivity: AppCompatActivity() { setupToolbarInsets() supportActionBar!!.setDisplayHomeAsUpEnabled(true) - compatibilityCheckList = requireViewById(R.id.recycler_view) - compatibilityCheckList.layoutManager = - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - compatibilityCheckList.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) - compatibilityCheckList.adapter = adapter + compatibilityCheckList = requireViewById(R.id.recycler_view).apply { + val context = this@CompatibilityCheckActivity + layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) + adapter = context.adapter + } setupRootViewInsets(compatibilityCheckList) } + @SuppressLint("NotifyDataSetChanged") override fun onStart() { super.onStart() lifecycleScope.launch { @@ -61,10 +66,10 @@ class CompatibilityCheckActivity: AppCompatActivity() { fun bindItem(item: CompatibilityCheck) { titleView.text = item.title - descView.text = item.description + descView.text = Html.fromHtml(item.description, Html.FROM_HTML_MODE_COMPACT) statusContainer.children.forEach { - it.visibility = View.GONE + it.isVisible = false } val viewId = when (item.state) { @@ -73,7 +78,7 @@ class CompatibilityCheckActivity: AppCompatActivity() { CompatibilityCheck.State.FAILURE_UNKNOWN -> R.id.compatibility_check_unknown else -> R.id.compatibility_check_progress_bar } - root.requireViewById(viewId).visibility = View.VISIBLE + root.requireViewById(viewId).isVisible = true } } 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..73df343 100644 --- a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt +++ b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt @@ -28,20 +28,23 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { // TODO: Should this be configurable? private fun shouldIgnoreSlot(physicalSlotId: Int) = - if (hasInternalEuicc) { - // For devices with an internal eUICC slot, ignore any removable UICC - telephonyManager.uiccCardsInfoCompat.find { it.physicalSlotIndex == physicalSlotId }!!.isRemovable - } else { - // Otherwise, we can report at least one removable eUICC to the system without confusing - // it too much. - telephonyManager.uiccCardsInfoCompat.firstOrNull { it.isEuicc }?.physicalSlotIndex == physicalSlotId + telephonyManager.uiccCardsInfoCompat.let { cards -> + if (hasInternalEuicc) { + // For devices with an internal eUICC slot, ignore any removable UICC + cards.find { it.physicalSlotIndex == physicalSlotId }!!.isRemovable + } else { + // Otherwise, we can report at least one removable eUICC to the system without confusing + // it too much. + cards.firstOrNull { it.isEuicc }?.physicalSlotIndex == physicalSlotId + } } - private data class EuiccChannelManagerContext( - val euiccChannelManagerService: EuiccChannelManagerService - ) { + private data class EuiccChannelManagerContext(val service: EuiccChannelManagerService) { + val euiccChannelManagerService + get() = service + val euiccChannelManager - get() = euiccChannelManagerService.euiccChannelManager + get() = service.euiccChannelManager } /** @@ -57,10 +60,8 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { private fun withEuiccChannelManager(fn: suspend EuiccChannelManagerContext.() -> T): T { val (binder, unbind) = runBlocking { bindServiceSuspended( - Intent( - this@OpenEuiccService, - EuiccChannelManagerService::class.java - ), Context.BIND_AUTO_CREATE + Intent(this@OpenEuiccService, EuiccChannelManagerService::class.java), + Context.BIND_AUTO_CREATE ) } @@ -110,7 +111,7 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { telephonyManager.simSlotMapping = mappings return } catch (_: Exception) { - + // ignore } // Sometimes hardware supports one ordering but not the reverse @@ -267,12 +268,13 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { } } + @Suppress("DeprecatedCallableAddReplaceWith") @Deprecated("Deprecated in Java") override fun onSwitchToSubscription( slotId: Int, iccid: String?, forceDeactivateSim: Boolean - ): Int = + ) = // -1 = any port onSwitchToSubscriptionWithPort(slotId, -1, iccid, forceDeactivateSim) @@ -406,11 +408,9 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { } } + @Suppress("DeprecatedCallableAddReplaceWith") @Deprecated("Deprecated in Java") - override fun onEraseSubscriptions(slotId: Int): Int { - // No-op - return RESULT_FIRST_USER - } + override fun onEraseSubscriptions(slotId: Int) = onRetainSubscriptionsForFactoryReset(slotId) override fun onRetainSubscriptionsForFactoryReset(slotId: Int): Int { // No-op -- we do not care 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 -- 2.45.3 From a01d24b3b571a21b865a1c4686d224896642af19 Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 18:46:32 +0800 Subject: [PATCH 2/6] chore: improve compatibility-check list initialized --- .../angry/openeuicc/ui/CompatibilityCheckActivity.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index 73f615e..659d959 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -32,11 +32,11 @@ class CompatibilityCheckActivity: AppCompatActivity() { setupToolbarInsets() supportActionBar!!.setDisplayHomeAsUpEnabled(true) - compatibilityCheckList = requireViewById(R.id.recycler_view).apply { - val context = this@CompatibilityCheckActivity - layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) - adapter = context.adapter + requireViewById(R.id.recycler_view).let { + it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + it.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) + it.adapter = adapter + compatibilityCheckList = it } setupRootViewInsets(compatibilityCheckList) -- 2.45.3 From 975746f9bde6f3b46f6395ea9d4b44019cb5534c Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 18:47:12 +0800 Subject: [PATCH 3/6] chore: improve compatibility-check list initialized --- .../java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index 659d959..39a360f 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -32,11 +32,10 @@ class CompatibilityCheckActivity: AppCompatActivity() { setupToolbarInsets() supportActionBar!!.setDisplayHomeAsUpEnabled(true) - requireViewById(R.id.recycler_view).let { + compatibilityCheckList = requireViewById(R.id.recycler_view).also { it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) it.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) it.adapter = adapter - compatibilityCheckList = it } setupRootViewInsets(compatibilityCheckList) -- 2.45.3 From bf026c4dd80417397f4103a6da330e6036af97d6 Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 19:07:22 +0800 Subject: [PATCH 4/6] revert: CompatibilityCheckActivity.kt --- .../ui/CompatibilityCheckActivity.kt | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index 39a360f..433f9c3 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -1,8 +1,6 @@ package im.angry.openeuicc.ui -import android.annotation.SuppressLint import android.os.Bundle -import android.text.Html import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -10,7 +8,6 @@ import android.widget.TextView import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.children -import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -32,16 +29,15 @@ class CompatibilityCheckActivity: AppCompatActivity() { setupToolbarInsets() supportActionBar!!.setDisplayHomeAsUpEnabled(true) - compatibilityCheckList = requireViewById(R.id.recycler_view).also { - it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - it.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) - it.adapter = adapter - } + compatibilityCheckList = requireViewById(R.id.recycler_view) + compatibilityCheckList.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + compatibilityCheckList.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL)) + compatibilityCheckList.adapter = adapter setupRootViewInsets(compatibilityCheckList) } - @SuppressLint("NotifyDataSetChanged") override fun onStart() { super.onStart() lifecycleScope.launch { @@ -65,10 +61,10 @@ class CompatibilityCheckActivity: AppCompatActivity() { fun bindItem(item: CompatibilityCheck) { titleView.text = item.title - descView.text = Html.fromHtml(item.description, Html.FROM_HTML_MODE_COMPACT) + descView.text = item.description statusContainer.children.forEach { - it.isVisible = false + it.visibility = View.GONE } val viewId = when (item.state) { @@ -77,7 +73,7 @@ class CompatibilityCheckActivity: AppCompatActivity() { CompatibilityCheck.State.FAILURE_UNKNOWN -> R.id.compatibility_check_unknown else -> R.id.compatibility_check_progress_bar } - root.requireViewById(viewId).isVisible = true + root.requireViewById(viewId).visibility = View.VISIBLE } } -- 2.45.3 From 28c20a520a0ffbec2d1d569b62df41678c60b7cd Mon Sep 17 00:00:00 2001 From: septs Date: Sun, 8 Dec 2024 23:40:58 +0800 Subject: [PATCH 5/6] revert: OpenEuiccService --- .../openeuicc/service/OpenEuiccService.kt | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) 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 73df343..3c522c5 100644 --- a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt +++ b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt @@ -28,23 +28,20 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { // TODO: Should this be configurable? private fun shouldIgnoreSlot(physicalSlotId: Int) = - telephonyManager.uiccCardsInfoCompat.let { cards -> - if (hasInternalEuicc) { - // For devices with an internal eUICC slot, ignore any removable UICC - cards.find { it.physicalSlotIndex == physicalSlotId }!!.isRemovable - } else { - // Otherwise, we can report at least one removable eUICC to the system without confusing - // it too much. - cards.firstOrNull { it.isEuicc }?.physicalSlotIndex == physicalSlotId - } + if (hasInternalEuicc) { + // For devices with an internal eUICC slot, ignore any removable UICC + telephonyManager.uiccCardsInfoCompat.find { it.physicalSlotIndex == physicalSlotId }!!.isRemovable + } else { + // Otherwise, we can report at least one removable eUICC to the system without confusing + // it too much. + telephonyManager.uiccCardsInfoCompat.firstOrNull { it.isEuicc }?.physicalSlotIndex == physicalSlotId } - private data class EuiccChannelManagerContext(val service: EuiccChannelManagerService) { - val euiccChannelManagerService - get() = service - + private data class EuiccChannelManagerContext( + val euiccChannelManagerService: EuiccChannelManagerService + ) { val euiccChannelManager - get() = service.euiccChannelManager + get() = euiccChannelManagerService.euiccChannelManager } /** @@ -60,8 +57,10 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { private fun withEuiccChannelManager(fn: suspend EuiccChannelManagerContext.() -> T): T { val (binder, unbind) = runBlocking { bindServiceSuspended( - Intent(this@OpenEuiccService, EuiccChannelManagerService::class.java), - Context.BIND_AUTO_CREATE + Intent( + this@OpenEuiccService, + EuiccChannelManagerService::class.java + ), Context.BIND_AUTO_CREATE ) } @@ -268,13 +267,12 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { } } - @Suppress("DeprecatedCallableAddReplaceWith") @Deprecated("Deprecated in Java") override fun onSwitchToSubscription( slotId: Int, iccid: String?, forceDeactivateSim: Boolean - ) = + ): Int = // -1 = any port onSwitchToSubscriptionWithPort(slotId, -1, iccid, forceDeactivateSim) @@ -408,9 +406,11 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { } } - @Suppress("DeprecatedCallableAddReplaceWith") @Deprecated("Deprecated in Java") - override fun onEraseSubscriptions(slotId: Int) = onRetainSubscriptionsForFactoryReset(slotId) + override fun onEraseSubscriptions(slotId: Int): Int { + // No-op + return RESULT_FIRST_USER + } override fun onRetainSubscriptionsForFactoryReset(slotId: Int): Int { // No-op -- we do not care -- 2.45.3 From 9d0cfc3d4f1b8fb84be70cbf4aa19de57898ade5 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 9 Dec 2024 00:27:44 +0800 Subject: [PATCH 6/6] refactor: request permissions --- .../main/java/im/angry/openeuicc/ui/MainActivity.kt | 10 ++++++---- .../java/im/angry/openeuicc/util/PermissionUtils.kt | 13 +++++++++++++ 2 files changed, 19 insertions(+), 4 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 b54b91d..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 @@ -127,10 +127,12 @@ open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker { } private fun ensureNotificationPermissions() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return - val permission = android.Manifest.permission.POST_NOTIFICATIONS - if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) return - requestPermissions(arrayOf(permission), PERMISSION_REQUEST_CODE) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + requestPermissions( + PERMISSION_REQUEST_CODE, + android.Manifest.permission.POST_NOTIFICATIONS + ) + } } private suspend fun init(fromUsbEvent: Boolean = false) { 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 -- 2.45.3