Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f36f518 authored by Jake Hamby's avatar Jake Hamby Committed by Jean-Baptiste Queru
Browse files

Fix updating and deleting FDN entries with an empty alpha identifier.

- Fix AdnRecord.buildAdnString() to generate the correct record when alpha
identifier is empty. This allows the user to update an FDN entry to remove
the alpha identifier. Previously the entire entry would be deleted because
an empty record was generated here when the alpha identifier was empty,
rather than a record containing the phone number with an empty alpha tag.
Also, return null if the number or alpha tag are too long.

- Fix bug in IccProvider.delete() where efType was compared against local
FDN constant rather than IccConstants.EF_FDN. This would always return
false. Comparing with IccConstants.EF_FDN gives the intended behavior.

Change-Id: I0ea75d7e107c7318c9a48ae6e0a15845a718f4c0
parent 27b2267c
Loading
Loading
Loading
Loading
+44 −33
Original line number Original line Diff line number Diff line
@@ -19,10 +19,9 @@ package com.android.internal.telephony;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.telephony.PhoneNumberUtils;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;


import com.android.internal.telephony.GsmAlphabet;

import java.util.Arrays;
import java.util.Arrays;




@@ -38,8 +37,8 @@ public class AdnRecord implements Parcelable {


    //***** Instance Variables
    //***** Instance Variables


    String alphaTag = "";
    String alphaTag = null;
    String number = "";
    String number = null;
    String[] emails;
    String[] emails;
    int extRecord = 0xff;
    int extRecord = 0xff;
    int efid;                   // or 0 if none
    int efid;                   // or 0 if none
@@ -63,8 +62,8 @@ public class AdnRecord implements Parcelable {
    // ADN offset
    // ADN offset
    static final int ADN_BCD_NUMBER_LENGTH = 0;
    static final int ADN_BCD_NUMBER_LENGTH = 0;
    static final int ADN_TON_AND_NPI = 1;
    static final int ADN_TON_AND_NPI = 1;
    static final int ADN_DAILING_NUMBER_START = 2;
    static final int ADN_DIALING_NUMBER_START = 2;
    static final int ADN_DAILING_NUMBER_END = 11;
    static final int ADN_DIALING_NUMBER_END = 11;
    static final int ADN_CAPABILITY_ID = 12;
    static final int ADN_CAPABILITY_ID = 12;
    static final int ADN_EXTENSION_ID = 13;
    static final int ADN_EXTENSION_ID = 13;


@@ -152,17 +151,31 @@ public class AdnRecord implements Parcelable {
    }
    }


    public boolean isEmpty() {
    public boolean isEmpty() {
        return alphaTag.equals("") && number.equals("") && emails == null;
        return TextUtils.isEmpty(alphaTag) && TextUtils.isEmpty(number) && emails == null;
    }
    }


    public boolean hasExtendedRecord() {
    public boolean hasExtendedRecord() {
        return extRecord != 0 && extRecord != 0xff;
        return extRecord != 0 && extRecord != 0xff;
    }
    }


    /** Helper function for {@link #isEqual}. */
    private static boolean stringCompareNullEqualsEmpty(String s1, String s2) {
        if (s1 == s2) {
            return true;
        }
        if (s1 == null) {
            s1 = "";
        }
        if (s2 == null) {
            s2 = "";
        }
        return (s1.equals(s2));
    }

    public boolean isEqual(AdnRecord adn) {
    public boolean isEqual(AdnRecord adn) {
        return ( alphaTag.equals(adn.getAlphaTag()) &&
        return ( stringCompareNullEqualsEmpty(alphaTag, adn.alphaTag) &&
                number.equals(adn.getNumber()) &&
                stringCompareNullEqualsEmpty(number, adn.number) &&
                Arrays.equals(emails, adn.getEmails()));
                Arrays.equals(emails, adn.emails));
    }
    }
    //***** Parcelable Implementation
    //***** Parcelable Implementation


@@ -184,36 +197,33 @@ public class AdnRecord implements Parcelable {
     *
     *
     * @param recordSize is the size X of EF record
     * @param recordSize is the size X of EF record
     * @return hex byte[recordSize] to be written to EF record
     * @return hex byte[recordSize] to be written to EF record
     *          return nulll for wrong format of dialing nubmer or tag
     *          return null for wrong format of dialing number or tag
     */
     */
    public byte[] buildAdnString(int recordSize) {
    public byte[] buildAdnString(int recordSize) {
        byte[] bcdNumber;
        byte[] bcdNumber;
        byte[] byteTag;
        byte[] byteTag;
        byte[] adnString = null;
        byte[] adnString;
        int footerOffset = recordSize - FOOTER_SIZE_BYTES;
        int footerOffset = recordSize - FOOTER_SIZE_BYTES;


        if (number == null || number.equals("") ||
        // create an empty record
                alphaTag == null || alphaTag.equals("")) {

            Log.w(LOG_TAG, "[buildAdnString] Empty alpha tag or number");
        adnString = new byte[recordSize];
        adnString = new byte[recordSize];
        for (int i = 0; i < recordSize; i++) {
        for (int i = 0; i < recordSize; i++) {
            adnString[i] = (byte) 0xFF;
            adnString[i] = (byte) 0xFF;
        }
        }

        if (TextUtils.isEmpty(number)) {
            Log.w(LOG_TAG, "[buildAdnString] Empty dialing number");
            return adnString;   // return the empty record (for delete)
        } else if (number.length()
        } else if (number.length()
                > (ADN_DAILING_NUMBER_END - ADN_DAILING_NUMBER_START + 1) * 2) {
                > (ADN_DIALING_NUMBER_END - ADN_DIALING_NUMBER_START + 1) * 2) {
            Log.w(LOG_TAG,
            Log.w(LOG_TAG,
                    "[buildAdnString] Max length of dailing number is 20");
                    "[buildAdnString] Max length of dialing number is 20");
        } else if (alphaTag.length() > footerOffset) {
            return null;
        } else if (alphaTag != null && alphaTag.length() > footerOffset) {
            Log.w(LOG_TAG,
            Log.w(LOG_TAG,
                    "[buildAdnString] Max length of tag is " + footerOffset);
                    "[buildAdnString] Max length of tag is " + footerOffset);
            return null;
        } else {
        } else {

            adnString = new byte[recordSize];
            for (int i = 0; i < recordSize; i++) {
                adnString[i] = (byte) 0xFF;
            }

            bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(number);
            bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(number);


            System.arraycopy(bcdNumber, 0, adnString,
            System.arraycopy(bcdNumber, 0, adnString,
@@ -222,17 +232,18 @@ public class AdnRecord implements Parcelable {
            adnString[footerOffset + ADN_BCD_NUMBER_LENGTH]
            adnString[footerOffset + ADN_BCD_NUMBER_LENGTH]
                    = (byte) (bcdNumber.length);
                    = (byte) (bcdNumber.length);
            adnString[footerOffset + ADN_CAPABILITY_ID]
            adnString[footerOffset + ADN_CAPABILITY_ID]
                    = (byte) 0xFF; // Capacility Id
                    = (byte) 0xFF; // Capability Id
            adnString[footerOffset + ADN_EXTENSION_ID]
            adnString[footerOffset + ADN_EXTENSION_ID]
                    = (byte) 0xFF; // Extension Record Id
                    = (byte) 0xFF; // Extension Record Id


            if (!TextUtils.isEmpty(alphaTag)) {
                byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag);
                byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag);
                System.arraycopy(byteTag, 0, adnString, 0, byteTag.length);
                System.arraycopy(byteTag, 0, adnString, 0, byteTag.length);

            }
            }


            return adnString;
            return adnString;
        }
        }
    }


    /**
    /**
     * See TS 51.011 10.5.10
     * See TS 51.011 10.5.10
+3 −3
Original line number Original line Diff line number Diff line
@@ -106,7 +106,7 @@ public class AdnRecordLoader extends Handler {
     * It will get the record size of EF record and compose hex adn array
     * It will get the record size of EF record and compose hex adn array
     * then write the hex array to EF record
     * then write the hex array to EF record
     *
     *
     * @param adn is set with alphaTag and phoneNubmer
     * @param adn is set with alphaTag and phone number
     * @param ef EF fileid
     * @param ef EF fileid
     * @param extensionEF extension EF fileid
     * @param extensionEF extension EF fileid
     * @param recordNumber 1-based record index
     * @param recordNumber 1-based record index
@@ -159,7 +159,7 @@ public class AdnRecordLoader extends Handler {
                    data = adn.buildAdnString(recordSize[0]);
                    data = adn.buildAdnString(recordSize[0]);


                    if(data == null) {
                    if(data == null) {
                        throw new RuntimeException("worong ADN format",
                        throw new RuntimeException("wrong ADN format",
                                ar.exception);
                                ar.exception);
                    }
                    }


@@ -218,7 +218,7 @@ public class AdnRecordLoader extends Handler {
                        throw new RuntimeException("load failed", ar.exception);
                        throw new RuntimeException("load failed", ar.exception);
                    }
                    }


                    Log.d(LOG_TAG,"ADN extention EF: 0x"
                    Log.d(LOG_TAG,"ADN extension EF: 0x"
                        + Integer.toHexString(extensionEF)
                        + Integer.toHexString(extensionEF)
                        + ":" + adn.extRecord
                        + ":" + adn.extRecord
                        + "\n" + IccUtils.bytesToHexString(data));
                        + "\n" + IccUtils.bytesToHexString(data));
+1 −1
Original line number Original line Diff line number Diff line
@@ -277,7 +277,7 @@ public class IccProvider extends ContentProvider {
            return 0;
            return 0;
        }
        }


        if (efType == FDN && TextUtils.isEmpty(pin2)) {
        if (efType == IccConstants.EF_FDN && TextUtils.isEmpty(pin2)) {
            return 0;
            return 0;
        }
        }