ソースを参照

Show channel access mode and removable status

Peter Cai 1 年間 前
コミット
f285eacd55

+ 3 - 0
app-common/src/main/java/im/angry/openeuicc/core/DefaultEuiccChannelFactory.kt

@@ -6,6 +6,7 @@ import android.hardware.usb.UsbInterface
 import android.hardware.usb.UsbManager
 import android.hardware.usb.UsbManager
 import android.se.omapi.SEService
 import android.se.omapi.SEService
 import android.util.Log
 import android.util.Log
+import im.angry.openeuicc.common.R
 import im.angry.openeuicc.core.usb.UsbApduInterface
 import im.angry.openeuicc.core.usb.UsbApduInterface
 import im.angry.openeuicc.core.usb.getIoEndpoints
 import im.angry.openeuicc.core.usb.getIoEndpoints
 import im.angry.openeuicc.util.*
 import im.angry.openeuicc.util.*
@@ -34,6 +35,7 @@ open class DefaultEuiccChannelFactory(protected val context: Context) : EuiccCha
         Log.i(DefaultEuiccChannelManager.TAG, "Trying OMAPI for physical slot ${port.card.physicalSlotIndex}")
         Log.i(DefaultEuiccChannelManager.TAG, "Trying OMAPI for physical slot ${port.card.physicalSlotIndex}")
         try {
         try {
             return EuiccChannelImpl(
             return EuiccChannelImpl(
+                context.getString(R.string.omapi),
                 port,
                 port,
                 OmapiApduInterface(
                 OmapiApduInterface(
                     seService!!,
                     seService!!,
@@ -62,6 +64,7 @@ open class DefaultEuiccChannelFactory(protected val context: Context) : EuiccCha
         val conn = usbManager.openDevice(usbDevice) ?: return null
         val conn = usbManager.openDevice(usbDevice) ?: return null
         if (!conn.claimInterface(usbInterface, true)) return null
         if (!conn.claimInterface(usbInterface, true)) return null
         return EuiccChannelImpl(
         return EuiccChannelImpl(
+            context.getString(R.string.usb),
             FakeUiccPortInfoCompat(FakeUiccCardInfoCompat(EuiccChannelManager.USB_CHANNEL_ID)),
             FakeUiccPortInfoCompat(FakeUiccCardInfoCompat(EuiccChannelManager.USB_CHANNEL_ID)),
             UsbApduInterface(
             UsbApduInterface(
                 conn,
                 conn,

+ 2 - 0
app-common/src/main/java/im/angry/openeuicc/core/EuiccChannel.kt

@@ -4,6 +4,8 @@ import im.angry.openeuicc.util.*
 import net.typeblog.lpac_jni.LocalProfileAssistant
 import net.typeblog.lpac_jni.LocalProfileAssistant
 
 
 interface EuiccChannel {
 interface EuiccChannel {
+    val type: String
+
     val port: UiccPortInfoCompat
     val port: UiccPortInfoCompat
 
 
     val slotId: Int // PHYSICAL slot
     val slotId: Int // PHYSICAL slot

+ 1 - 0
app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelImpl.kt

@@ -8,6 +8,7 @@ import net.typeblog.lpac_jni.impl.HttpInterfaceImpl
 import net.typeblog.lpac_jni.impl.LocalProfileAssistantImpl
 import net.typeblog.lpac_jni.impl.LocalProfileAssistantImpl
 
 
 class EuiccChannelImpl(
 class EuiccChannelImpl(
+    override val type: String,
     override val port: UiccPortInfoCompat,
     override val port: UiccPortInfoCompat,
     apduInterface: ApduInterface,
     apduInterface: ApduInterface,
     verboseLoggingFlow: Flow<Boolean>
     verboseLoggingFlow: Flow<Boolean>

+ 3 - 0
app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelWrapper.kt

@@ -14,6 +14,9 @@ class EuiccChannelWrapper(orig: EuiccChannel) : EuiccChannel {
 
 
             return _inner!!
             return _inner!!
         }
         }
+
+    override val type: String
+        get() = channel.type
     override val port: UiccPortInfoCompat
     override val port: UiccPortInfoCompat
         get() = channel.port
         get() = channel.port
     override val slotId: Int
     override val slotId: Int

+ 22 - 4
app-common/src/main/java/im/angry/openeuicc/ui/EuiccInfoActivity.kt

@@ -68,17 +68,35 @@ class EuiccInfoActivity : BaseEuiccAccessActivity() {
 
 
             val unknownStr = getString(R.string.unknown)
             val unknownStr = getString(R.string.unknown)
 
 
-            val (euiccInfo2, eID) = euiccChannelManager.withEuiccChannel(logicalSlotId) { channel ->
-                Pair(channel.lpa.euiccInfo2, channel.lpa.eID)
-            }
+            euiccInfoItems.add(
+                Pair(
+                    getString(R.string.euicc_info_access_mode),
+                    euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.type }
+                )
+            )
+
+            euiccInfoItems.add(
+                Pair(
+                    getString(R.string.euicc_info_removable),
+                    if (euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.port.card.isRemovable }) {
+                        getString(R.string.yes)
+                    } else {
+                        getString(R.string.no)
+                    }
+                )
+            )
 
 
             euiccInfoItems.add(
             euiccInfoItems.add(
                 Pair(
                 Pair(
                     getString(R.string.euicc_info_eid),
                     getString(R.string.euicc_info_eid),
-                    eID
+                    euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.lpa.eID }
                 )
                 )
             )
             )
 
 
+            val euiccInfo2 = euiccChannelManager.withEuiccChannel(logicalSlotId) { channel ->
+                channel.lpa.euiccInfo2
+            }
+
             euiccInfoItems.add(
             euiccInfoItems.add(
                 Pair(
                 Pair(
                     getString(R.string.euicc_info_firmware_version),
                     getString(R.string.euicc_info_firmware_version),

+ 2 - 0
app-common/src/main/java/im/angry/openeuicc/util/TelephonyCompat.kt

@@ -45,6 +45,8 @@ fun SEService.getUiccReaderCompat(slotNumber: Int): Reader {
 interface UiccCardInfoCompat {
 interface UiccCardInfoCompat {
     val physicalSlotIndex: Int
     val physicalSlotIndex: Int
     val ports: Collection<UiccPortInfoCompat>
     val ports: Collection<UiccPortInfoCompat>
+    val isRemovable: Boolean
+        get() = true // This defaults to removable unless overridden
 }
 }
 
 
 interface UiccPortInfoCompat {
 interface UiccPortInfoCompat {

+ 6 - 0
app-common/src/main/res/values/strings.xml

@@ -8,6 +8,7 @@
 
 
     <string name="channel_name_format">Logical Slot %d</string>
     <string name="channel_name_format">Logical Slot %d</string>
     <string name="usb">USB</string>
     <string name="usb">USB</string>
+    <string name="omapi">OpenMobile API (OMAPI)</string>
 
 
     <string name="enabled">Enabled</string>
     <string name="enabled">Enabled</string>
     <string name="disabled">Disabled</string>
     <string name="disabled">Disabled</string>
@@ -73,6 +74,8 @@
 
 
     <string name="euicc_info">eUICC Info</string>
     <string name="euicc_info">eUICC Info</string>
     <string name="euicc_info_activity_title">eUICC Info (%s)</string>
     <string name="euicc_info_activity_title">eUICC Info (%s)</string>
+    <string name="euicc_info_access_mode">Access Mode</string>
+    <string name="euicc_info_removable">Removable</string>
     <string name="euicc_info_eid">EID</string>
     <string name="euicc_info_eid">EID</string>
     <string name="euicc_info_firmware_version">eUICC OS Version</string>
     <string name="euicc_info_firmware_version">eUICC OS Version</string>
     <string name="euicc_info_globalplatform_version">GlobalPlatform Version</string>
     <string name="euicc_info_globalplatform_version">GlobalPlatform Version</string>
@@ -85,6 +88,9 @@
     <string name="supported">Supported</string>
     <string name="supported">Supported</string>
     <string name="unsupported">Unsupported</string>
     <string name="unsupported">Unsupported</string>
 
 
+    <string name="yes">Yes</string>
+    <string name="no">No</string>
+
     <string name="logs_save">Save</string>
     <string name="logs_save">Save</string>
     <string name="logs_filename_template">Logs at %s</string>
     <string name="logs_filename_template">Logs at %s</string>
 
 

+ 2 - 0
app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt

@@ -3,6 +3,7 @@ package im.angry.openeuicc.core
 import android.content.Context
 import android.content.Context
 import android.util.Log
 import android.util.Log
 import im.angry.openeuicc.OpenEuiccApplication
 import im.angry.openeuicc.OpenEuiccApplication
+import im.angry.openeuicc.R
 import im.angry.openeuicc.util.*
 import im.angry.openeuicc.util.*
 import java.lang.IllegalArgumentException
 import java.lang.IllegalArgumentException
 
 
@@ -27,6 +28,7 @@ class PrivilegedEuiccChannelFactory(context: Context) : DefaultEuiccChannelFacto
             )
             )
             try {
             try {
                 return EuiccChannelImpl(
                 return EuiccChannelImpl(
+                    context.getString(R.string.telephony_manager),
                     port,
                     port,
                     TelephonyManagerApduInterface(
                     TelephonyManagerApduInterface(
                         port,
                         port,

+ 1 - 1
app/src/main/java/im/angry/openeuicc/ui/PrivilegedEuiccManagementFragment.kt

@@ -21,7 +21,7 @@ class PrivilegedEuiccManagementFragment: EuiccManagementFragment() {
         super.doRefresh()
         super.doRefresh()
         withEuiccChannel { channel ->
         withEuiccChannel { channel ->
             isMEP = channel.isMEP
             isMEP = channel.isMEP
-            isRemovable = channel.removable
+            isRemovable = channel.port.card.isRemovable
         }
         }
     }
     }
 
 

+ 1 - 1
app/src/main/java/im/angry/openeuicc/util/PrivilegedTelephonyCompat.kt

@@ -33,7 +33,7 @@ class RealUiccCardInfoCompat(val inner: UiccCardInfo): UiccCardInfoCompat {
     val isEuicc: Boolean
     val isEuicc: Boolean
         get() = inner.isEuicc
         get() = inner.isEuicc
 
 
-    val isRemovable: Boolean
+    override val isRemovable: Boolean
         get() = inner.isRemovable
         get() = inner.isRemovable
 
 
     val isMultipleEnabledProfilesSupported: Boolean
     val isMultipleEnabledProfilesSupported: Boolean

+ 2 - 5
app/src/main/java/im/angry/openeuicc/util/PrivilegedTelephonyUtils.kt

@@ -21,7 +21,7 @@ fun TelephonyManager.setDsdsEnabled(euiccManager: EuiccChannelManager, enabled:
 
 
     // Disable all eSIM profiles before performing a DSDS switch (only for internal eSIMs)
     // Disable all eSIM profiles before performing a DSDS switch (only for internal eSIMs)
     knownChannels.forEach {
     knownChannels.forEach {
-        if (!it.removable) {
+        if (!it.port.card.isRemovable) {
             it.lpa.disableActiveProfileWithUndo(false)
             it.lpa.disableActiveProfileWithUndo(false)
         }
         }
     }
     }
@@ -44,7 +44,7 @@ fun TelephonyManager.updateSimSlotMapping(
 
 
     val undo = unmapped.mapNotNull { mapping ->
     val undo = unmapped.mapNotNull { mapping ->
         euiccManager.findEuiccChannelByPortBlocking(mapping.physicalSlotIndex, mapping.portIndex)?.let { channel ->
         euiccManager.findEuiccChannelByPortBlocking(mapping.physicalSlotIndex, mapping.portIndex)?.let { channel ->
-            if (!channel.removable) {
+            if (!channel.port.card.isRemovable) {
                 return@mapNotNull channel.lpa.disableActiveProfileWithUndo(false)
                 return@mapNotNull channel.lpa.disableActiveProfileWithUndo(false)
             } else {
             } else {
                 // Do not do anything for external eUICCs -- we can't really trust them to work properly
                 // Do not do anything for external eUICCs -- we can't really trust them to work properly
@@ -75,9 +75,6 @@ fun SubscriptionManager.tryRefreshCachedEuiccInfo(cardId: Int) {
 
 
 // Every EuiccChannel we use here should be backed by a RealUiccPortInfoCompat
 // Every EuiccChannel we use here should be backed by a RealUiccPortInfoCompat
 // except when it is from a USB card reader
 // except when it is from a USB card reader
-val EuiccChannel.removable
-    get() = (port as? RealUiccPortInfoCompat)?.card?.isRemovable ?: true
-
 val EuiccChannel.cardId
 val EuiccChannel.cardId
     get() = (port as? RealUiccPortInfoCompat)?.card?.cardId ?: -1
     get() = (port as? RealUiccPortInfoCompat)?.card?.cardId ?: -1
 
 

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1,6 +1,7 @@
 <resources>
 <resources>
     <string name="app_name">OpenEUICC</string>
     <string name="app_name">OpenEUICC</string>
     <string name="no_euicc">No eUICC found on this device.\nOn some devices, you may need to enable dual SIM first in the menu of this app.</string>
     <string name="no_euicc">No eUICC found on this device.\nOn some devices, you may need to enable dual SIM first in the menu of this app.</string>
+    <string name="telephony_manager">TelephonyManager (Privileged)</string>
 
 
     <string name="dsds">Dual SIM</string>
     <string name="dsds">Dual SIM</string>