Implement renaming in OpenEuiccService

This commit is contained in:
Peter Cai 2022-05-03 21:45:24 -04:00
parent f2a98b4fcb
commit 8b5bc04e08
4 changed files with 100 additions and 54 deletions

View File

@ -3,17 +3,22 @@ package im.angry.openeuicc.service
import android.service.euicc.*
import android.telephony.euicc.DownloadableSubscription
import android.telephony.euicc.EuiccInfo
import com.truphone.lpa.LocalProfileAssistant
import com.truphone.lpa.LocalProfileInfo
import com.truphone.util.TextUtil
import im.angry.openeuicc.OpenEuiccApplication
import im.angry.openeuicc.core.EuiccChannel
import im.angry.openeuicc.util.*
class OpenEuiccService : EuiccService() {
private fun findLpa(slotId: Int): LocalProfileAssistant? =
(application as OpenEuiccApplication).euiccChannelManager
.findEuiccChannelBySlotBlocking(slotId)?.lpa
private val openEuiccApplication
get() = application as OpenEuiccApplication
private fun findChannel(slotId: Int): EuiccChannel? =
openEuiccApplication.euiccChannelManager
.findEuiccChannelBySlotBlocking(slotId)
override fun onGetEid(slotId: Int): String? =
findLpa(slotId)?.eid
findChannel(slotId)?.lpa?.eid
override fun onGetOtaStatus(slotId: Int): Int {
// Not implemented
@ -46,7 +51,7 @@ class OpenEuiccService : EuiccService() {
}
override fun onGetEuiccProfileInfoList(slotId: Int): GetEuiccProfileInfoListResult? {
val profiles = (findLpa(slotId) ?: return null).profiles.filter {
val profiles = (findChannel(slotId) ?: return null).lpa.profiles.filter {
it.profileClass != LocalProfileInfo.Clazz.Testing
}.map {
EuiccProfileInfo.Builder(it.iccidLittleEndian).apply {
@ -89,8 +94,16 @@ class OpenEuiccService : EuiccService() {
TODO("Not yet implemented")
}
override fun onUpdateSubscriptionNickname(slotId: Int, iccid: String?, nickname: String?): Int {
TODO("Not yet implemented")
override fun onUpdateSubscriptionNickname(slotId: Int, iccid: String, nickname: String?): Int {
val channel = findChannel(slotId) ?: return RESULT_FIRST_USER
val success = channel.lpa
.setNickname(TextUtil.iccidLittleToBig(iccid), nickname)
openEuiccApplication.subscriptionManager.tryRefreshCachedEuiccInfo(channel.cardId)
return if (success) {
RESULT_OK
} else {
RESULT_FIRST_USER
}
}
@Deprecated("Deprecated in Java")

View File

@ -14,8 +14,8 @@
package com.truphone.lpa
import com.truphone.util.TextUtil.iccidBigToLittle
import java.lang.IllegalArgumentException
import java.lang.StringBuilder
data class LocalProfileInfo(
val iccid: String,
@ -56,14 +56,5 @@ data class LocalProfileInfo(
"2" -> Clazz.Operational
else -> throw IllegalArgumentException("Unknown profile class $clazz")
}
private fun iccidBigToLittle(iccid: String): String {
val builder = StringBuilder()
for (i in 0 until iccid.length / 2) {
builder.append(iccid[i * 2 + 1])
if (iccid[i * 2] != 'F') builder.append(iccid[i * 2])
}
return builder.toString()
}
}
}

View File

@ -1,36 +0,0 @@
package com.truphone.util;
public class TextUtil {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/**
* Converts the given byte array to its hex representation.
*
* @param data The byte array to convert.
* @return Hex-encoded data as a string.
* @see #toHexString(byte[], int, int)
*/
public static String toHexString(byte[] data) {
return data == null ? null : toHexString(data, 0, data.length);
}
/**
* Converts the given byte array slice to its hex representation.
*
* @param data The byte array to convert.
* @param offset Slice start.
* @param length Slice length.
* @return Hex-encoded data as a string.
*/
public static String toHexString(final byte[] data, int offset, int length) {
final char[] result = new char[length << 1];
length += offset;
for (int i = 0; offset < length; ++offset) {
result[i++] = HEX_DIGITS[(data[offset] >>> 4) & 0x0F];
result[i++] = HEX_DIGITS[data[offset] & 0x0F];
}
return new String(result);
}
}

View File

@ -0,0 +1,78 @@
package com.truphone.util
import java.lang.StringBuilder
object TextUtil {
private val HEX_DIGITS = charArrayOf(
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
)
/**
* Converts the given byte array to its hex representation.
*
* @param data The byte array to convert.
* @return Hex-encoded data as a string.
* @see .toHexString
*/
@JvmStatic
fun toHexString(data: ByteArray?): String? {
return if (data == null) null else toHexString(data, 0, data.size)
}
/**
* Converts the given byte array slice to its hex representation.
*
* @param data The byte array to convert.
* @param offset Slice start.
* @param length Slice length.
* @return Hex-encoded data as a string.
*/
@JvmStatic
fun toHexString(data: ByteArray, offset: Int, length: Int): String {
var offset = offset
var length = length
val result = CharArray(length shl 1)
length += offset
var i = 0
while (offset < length) {
result[i++] = HEX_DIGITS[data[offset].toInt() ushr 4 and 0x0F]
result[i++] = HEX_DIGITS[data[offset].toInt() and 0x0F]
++offset
}
return String(result)
}
/**
* Converts a big-endian representation of ICCID into little-endian
* Big-endian representation is used internally in communication with the SIM.
*
* @param iccid The ICCID to be converted
*/
fun iccidBigToLittle(iccid: String): String {
val builder = StringBuilder()
for (i in 0 until iccid.length / 2) {
builder.append(iccid[i * 2 + 1])
if (iccid[i * 2] != 'F') builder.append(iccid[i * 2])
}
return builder.toString()
}
/**
* Converts a little-endian representation of ICCID into big-endian
*
* @param iccid The ICCID to be converted
*/
fun iccidLittleToBig(iccidLittle: String): String {
val builder = StringBuilder()
for (i in 0 until iccidLittle.length / 2) {
builder.append(iccidLittle[i * 2 + 1])
builder.append(iccidLittle[i * 2])
}
if (iccidLittle.length % 2 == 1) {
builder.append('F')
builder.append(iccidLittle[iccidLittle.length - 1])
}
return builder.toString()
}
}