diff options
4 files changed, 66 insertions, 8 deletions
diff --git a/src/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java b/src/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java index 8ac80101e5..84a9d260a8 100644 --- a/src/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java +++ b/src/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java @@ -237,7 +237,7 @@ public class IccPhoneBookInterfaceManager { Request updateRequest = new Request(); synchronized (updateRequest) { Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, updateRequest); - AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber); + AdnRecord newAdn = new AdnRecord(efid, index, newTag, newPhoneNumber); if (mAdnCache != null) { mAdnCache.updateAdnByIndex(efid, newAdn, index, pin2, response); waitForResult(updateRequest); diff --git a/src/java/com/android/internal/telephony/uicc/AdnRecord.java b/src/java/com/android/internal/telephony/uicc/AdnRecord.java index e6968ec65e..7710a06534 100644 --- a/src/java/com/android/internal/telephony/uicc/AdnRecord.java +++ b/src/java/com/android/internal/telephony/uicc/AdnRecord.java @@ -104,6 +104,45 @@ public class AdnRecord implements Parcelable { } }; + /** + * Returns the maximum number of characters that supported by the alpha tag for a record with + * the specified maximum size. + */ + public static int getMaxAlphaTagBytes(int maxRecordLength) { + return Math.max(0, maxRecordLength - FOOTER_SIZE_BYTES); + } + + /** + * Encodes the alphaTag to a binary representation supported by the SIM. + * + * <p>This is the same representation as is used for this field in buildAdnString but there + * is no restriction on the length. + */ + public static byte[] encodeAlphaTag(String alphaTag) { + return !TextUtils.isEmpty(alphaTag) ? GsmAlphabet.stringToGsm8BitPacked(alphaTag) + : new byte[0]; + } + + /** + * Decodes an encoded alphaTag from a record or encoded tag. + * + * <p>This is the same as is used to construct an AdnRecord from byte[] + */ + public static String decodeAlphaTag(byte[] encodedTagOrRecord, int offset, int length) { + return IccUtils.adnStringFieldToString(encodedTagOrRecord, offset, length); + } + + /** + * Returns the maximum number of digits (or other dialable characters) that can be stored in + * the phone number. + * + * <p>Additional length is supported via the ext1 entity file but the current implementation + * doesn't support writing of that file so it is not included in this calculation. + */ + public static int getMaxPhoneNumberDigits() { + // Multiply by 2 because it is packed BCD encoded (2 digits per byte). + return (ADN_DIALING_NUMBER_END - ADN_DIALING_NUMBER_START + 1) * 2; + } //***** Constructor @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @@ -260,8 +299,7 @@ public class AdnRecord implements Parcelable { return null; } - byteTag = !TextUtils.isEmpty(mAlphaTag) ? GsmAlphabet.stringToGsm8BitPacked(mAlphaTag) - : new byte[0]; + byteTag = encodeAlphaTag(mAlphaTag); if (byteTag.length > footerOffset) { Rlog.w(LOG_TAG, "[buildAdnString] Max length of tag is " + footerOffset); @@ -329,7 +367,7 @@ public class AdnRecord implements Parcelable { private void parseRecord(byte[] record) { try { - mAlphaTag = IccUtils.adnStringFieldToString( + mAlphaTag = decodeAlphaTag( record, 0, record.length - FOOTER_SIZE_BYTES); int footerOffset = record.length - FOOTER_SIZE_BYTES; diff --git a/src/java/com/android/internal/telephony/uicc/AdnRecordCache.java b/src/java/com/android/internal/telephony/uicc/AdnRecordCache.java index d86b8c619b..21a6e37981 100644 --- a/src/java/com/android/internal/telephony/uicc/AdnRecordCache.java +++ b/src/java/com/android/internal/telephony/uicc/AdnRecordCache.java @@ -124,7 +124,9 @@ public class AdnRecordCache extends Handler implements IccConstants { case EF_FDN: return EF_EXT2; case EF_MSISDN: return EF_EXT1; case EF_PBR: return 0; // The EF PBR doesn't have an extension record - default: return -1; + default: + // See TS 131.102 4.4.2.1 '4FXX' are entity files from EF PBR + return (0x4FFF & efid) == efid ? 0 : -1; } } diff --git a/tests/telephonytests/src/com/android/internal/telephony/AdnRecordTest.java b/tests/telephonytests/src/com/android/internal/telephony/AdnRecordTest.java index 3b786b0162..8fe809c9f0 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/AdnRecordTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/AdnRecordTest.java @@ -16,19 +16,23 @@ package com.android.internal.telephony; +import static com.google.common.truth.Truth.assertThat; + import android.os.Parcel; -import java.util.Arrays; -import junit.framework.TestCase; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.uicc.AdnRecord; import com.android.internal.telephony.uicc.IccUtils; +import junit.framework.TestCase; + +import java.util.Arrays; + /** * {@hide} */ public class AdnRecordTest extends TestCase { - + @SmallTest public void testBasic() throws Exception { AdnRecord adn; @@ -189,6 +193,20 @@ public class AdnRecordTest extends TestCase { assertEquals(adn.getNumber(), copy.getNumber()); assertTrue(Arrays.equals(adn.getEmails(), copy.getEmails())); } + + public void testGetMaxAlphaTagBytes() { + assertThat(AdnRecord.getMaxAlphaTagBytes(-1)).isEqualTo(0); + assertThat(AdnRecord.getMaxAlphaTagBytes(0)).isEqualTo(0); + assertThat(AdnRecord.getMaxAlphaTagBytes(5)).isEqualTo(0); + assertThat(AdnRecord.getMaxAlphaTagBytes(14)).isEqualTo(0); + assertThat(AdnRecord.getMaxAlphaTagBytes(15)).isEqualTo(1); + assertThat(AdnRecord.getMaxAlphaTagBytes(25)).isEqualTo(11); + assertThat(AdnRecord.getMaxAlphaTagBytes(30)).isEqualTo(16); + } + + public void testGetMaxPhoneNumberDigits() { + assertThat(AdnRecord.getMaxPhoneNumberDigits()).isEqualTo(20); + } } |