Implement renaming in OpenEuiccService
This commit is contained in:
parent
f2a98b4fcb
commit
8b5bc04e08
|
@ -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")
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue