AdnRecord.java revision ded9c0af7fa49504c047275ed34c2d3b22bf0c3a
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcel; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcelable; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils; 23ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Used to load or store ADNs (Abbreviated Dialing Numbers). 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class AdnRecord implements Parcelable { 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String LOG_TAG = "GSM"; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Instance Variables 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String alphaTag = null; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String number = null; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] emails; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int extRecord = 0xff; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int efid; // or 0 if none 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordNumber; // or 0 if none 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Constants 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // In an ADN record, everything but the alpha identifier 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // is in a footer that's 14 bytes 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int FOOTER_SIZE_BYTES = 14; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Maximum size of the un-extended number field 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MAX_NUMBER_SIZE_BYTES = 11; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int EXT_RECORD_LENGTH_BYTES = 13; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int EXT_RECORD_TYPE_ADDITIONAL_DATA = 2; 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int EXT_RECORD_TYPE_MASK = 3; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MAX_EXT_CALLED_PARTY_LENGTH = 0xa; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // ADN offset 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_BCD_NUMBER_LENGTH = 0; 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_TON_AND_NPI = 1; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_DIALING_NUMBER_START = 2; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_DIALING_NUMBER_END = 11; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_CAPABILITY_ID = 12; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int ADN_EXTENSION_ID = 13; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Static Methods 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static final Parcelable.Creator<AdnRecord> CREATOR 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new Parcelable.Creator<AdnRecord>() { 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord createFromParcel(Parcel source) { 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int efid; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordNumber; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String alphaTag; 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String number; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] emails; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville efid = source.readInt(); 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumber = source.readInt(); 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville alphaTag = source.readString(); 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = source.readString(); 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville emails = source.readStringArray(); 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new AdnRecord(efid, recordNumber, alphaTag, number, emails); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord[] newArray(int size) { 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new AdnRecord[size]; 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Constructor 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord (byte[] record) { 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this(0, 0, record); 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord (int efid, int recordNumber, byte[] record) { 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.efid = efid; 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.recordNumber = recordNumber; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville parseRecord(record); 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord (String alphaTag, String number) { 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this(0, 0, alphaTag, number); 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord (String alphaTag, String number, String[] emails) { 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this(0, 0, alphaTag, number, emails); 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord (int efid, int recordNumber, String alphaTag, String number, String[] emails) { 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.efid = efid; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.recordNumber = recordNumber; 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.alphaTag = alphaTag; 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.number = number; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.emails = emails; 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public AdnRecord(int efid, int recordNumber, String alphaTag, String number) { 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.efid = efid; 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.recordNumber = recordNumber; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.alphaTag = alphaTag; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.number = number; 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.emails = null; 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Instance Methods 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getAlphaTag() { 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return alphaTag; 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getNumber() { 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return number; 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String[] getEmails() { 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return emails; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setEmails(String[] emails) { 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.emails = emails; 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String toString() { 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return "ADN Record '" + alphaTag + "' '" + number + " " + emails + "'"; 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isEmpty() { 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return TextUtils.isEmpty(alphaTag) && TextUtils.isEmpty(number) && emails == null; 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasExtendedRecord() { 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return extRecord != 0 && extRecord != 0xff; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Helper function for {@link #isEqual}. */ 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static boolean stringCompareNullEqualsEmpty(String s1, String s2) { 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (s1 == s2) { 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (s1 == null) { 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s1 = ""; 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (s2 == null) { 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s2 = ""; 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (s1.equals(s2)); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isEqual(AdnRecord adn) { 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ( stringCompareNullEqualsEmpty(alphaTag, adn.alphaTag) && 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stringCompareNullEqualsEmpty(number, adn.number) && 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Arrays.equals(emails, adn.emails)); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Parcelable Implementation 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int describeContents() { 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void writeToParcel(Parcel dest, int flags) { 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeInt(efid); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeInt(recordNumber); 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeString(alphaTag); 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeString(number); 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeStringArray(emails); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Build adn hex byte array based on record size 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The format of byte array is defined in 51.011 10.5.1 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param recordSize is the size X of EF record 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return hex byte[recordSize] to be written to EF record 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return null for wrong format of dialing number or tag 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public byte[] buildAdnString(int recordSize) { 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] bcdNumber; 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] byteTag; 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] adnString; 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int footerOffset = recordSize - FOOTER_SIZE_BYTES; 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // create an empty record 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville adnString = new byte[recordSize]; 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < recordSize; i++) { 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville adnString[i] = (byte) 0xFF; 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.isEmpty(number)) { 215ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "[buildAdnString] Empty dialing number"); 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return adnString; // return the empty record (for delete) 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (number.length() 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville > (ADN_DIALING_NUMBER_END - ADN_DIALING_NUMBER_START + 1) * 2) { 219ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "[buildAdnString] Max length of dialing number is 20"); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (alphaTag != null && alphaTag.length() > footerOffset) { 223ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "[buildAdnString] Max length of tag is " + footerOffset); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(number); 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(bcdNumber, 0, adnString, 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville footerOffset + ADN_TON_AND_NPI, bcdNumber.length); 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville adnString[footerOffset + ADN_BCD_NUMBER_LENGTH] 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = (byte) (bcdNumber.length); 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville adnString[footerOffset + ADN_CAPABILITY_ID] 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = (byte) 0xFF; // Capability Id 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville adnString[footerOffset + ADN_EXTENSION_ID] 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = (byte) 0xFF; // Extension Record Id 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!TextUtils.isEmpty(alphaTag)) { 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag); 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(byteTag, 0, adnString, 0, byteTag.length); 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return adnString; 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See TS 51.011 10.5.10 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville appendExtRecord (byte[] extRecord) { 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (extRecord.length != EXT_RECORD_LENGTH_BYTES) { 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((extRecord[0] & EXT_RECORD_TYPE_MASK) 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville != EXT_RECORD_TYPE_ADDITIONAL_DATA) { 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((0xff & extRecord[1]) > MAX_EXT_CALLED_PARTY_LENGTH) { 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // invalid or empty record 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number += PhoneNumberUtils.calledPartyBCDFragmentToString( 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville extRecord, 2, 0xff & extRecord[1]); 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We don't support ext record chaining. 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (RuntimeException ex) { 274ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "Error parsing AdnRecord ext record", ex); 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Private Methods 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * alphaTag and number are set to null on invalid format 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville parseRecord(byte[] record) { 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville alphaTag = IccUtils.adnStringFieldToString( 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville record, 0, record.length - FOOTER_SIZE_BYTES); 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int footerOffset = record.length - FOOTER_SIZE_BYTES; 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int numberLength = 0xff & record[footerOffset]; 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (numberLength > MAX_NUMBER_SIZE_BYTES) { 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Invalid number length 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = ""; 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Please note 51.011 10.5.1: 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // "If the Dialling Number/SSC String does not contain 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // a dialling number, e.g. a control string deactivating 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // a service, the TON/NPI byte shall be set to 'FF' by 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the ME (see note 2)." 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = PhoneNumberUtils.calledPartyBCDToString( 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville record, footerOffset + 1, numberLength); 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville extRecord = 0xff & record[record.length - 1]; 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville emails = null; 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (RuntimeException ex) { 315ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "Error parsing AdnRecord", ex); 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = ""; 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville alphaTag = ""; 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville emails = null; 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 322