104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville/*
204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * Copyright (C) 2006 The Android Open Source Project
304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville *
404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * you may not use this file except in compliance with the License.
604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * You may obtain a copy of the License at
704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville *
804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville *
1004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * Unless required by applicable law or agreed to in writing, software
1104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
1204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * See the License for the specific language governing permissions and
1404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * limitations under the License.
1504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville */
1604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
1704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savillepackage com.android.internal.telephony;
1804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
1904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.content.pm.PackageManager;
2004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.os.AsyncResult;
2104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.os.Handler;
2204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.os.Looper;
2304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.os.Message;
2404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.os.ServiceManager;
2504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.telephony.PhoneNumberUtils;
2604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport android.util.Log;
2704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport java.util.ArrayList;
2904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport java.util.List;
3004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
3104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville/**
3204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * SimPhoneBookInterfaceManager to provide an inter-process communication to
3304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville * access ADN-like SIM records.
3404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville */
3504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savillepublic abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub {
3604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected static final boolean DBG = true;
3704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
3804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected PhoneBase phone;
3904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected AdnRecordCache adnCache;
4004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected Object mLock = new Object();
4104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected int recordSize[];
4204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected boolean success;
4304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected List<AdnRecord> records;
4404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
4504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected static final boolean ALLOW_SIM_OP_IN_UI_THREAD = false;
4604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
4704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected static final int EVENT_GET_SIZE_DONE = 1;
4804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected static final int EVENT_LOAD_DONE = 2;
4904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected static final int EVENT_UPDATE_DONE = 3;
5004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
5104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected Handler mBaseHandler = new Handler() {
5204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        @Override
5304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        public void handleMessage(Message msg) {
5404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            AsyncResult ar;
5504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
5604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            switch (msg.what) {
5704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                case EVENT_GET_SIZE_DONE:
5804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    ar = (AsyncResult) msg.obj;
5904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    synchronized (mLock) {
6004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        if (ar.exception == null) {
6104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            recordSize = (int[])ar.result;
6204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            // recordSize[0]  is the record length
6304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            // recordSize[1]  is the total length of the EF file
6404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            // recordSize[2]  is the number of records in the EF file
6504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            logd("GET_RECORD_SIZE Size " + recordSize[0] +
6604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                                    " total " + recordSize[1] +
6704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                                    " #record " + recordSize[2]);
6804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            mLock.notifyAll();
6904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        }
7004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    }
7104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    break;
7204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                case EVENT_UPDATE_DONE:
7304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    ar = (AsyncResult) msg.obj;
7404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    synchronized (mLock) {
7504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        success = (ar.exception == null);
7604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        mLock.notifyAll();
7704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    }
7804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    break;
7904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                case EVENT_LOAD_DONE:
8004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    ar = (AsyncResult)msg.obj;
8104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    synchronized (mLock) {
8204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        if (ar.exception == null) {
8304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            records = (List<AdnRecord>)
8404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                                    ((ArrayList<AdnRecord>) ar.result);
8504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        } else {
8604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            if(DBG) logd("Cannot load ADN records");
8704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            if (records != null) {
8804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                                records.clear();
8904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                            }
9004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        }
9104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        mLock.notifyAll();
9204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    }
9304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    break;
9404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
9504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
9604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    };
9704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
9804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public IccPhoneBookInterfaceManager(PhoneBase phone) {
9904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        this.phone = phone;
10004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
10104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
10204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public void dispose() {
10304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
10404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
10504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected void publish() {
10604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        //NOTE service "simphonebook" added by IccSmsInterfaceManagerProxy
10704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        ServiceManager.addService("simphonebook", this);
10804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
10904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
11004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected abstract void logd(String msg);
11104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
11204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected abstract void loge(String msg);
11304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
11404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    /**
11504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * Replace oldAdn with newAdn in ADN-like record in EF
11604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
11704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * getAdnRecordsInEf must be called at least once before this function,
11834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh     * otherwise an error will be returned. Currently the email field
11934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh     * if set in the ADN record is ignored.
12004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * throws SecurityException if no WRITE_CONTACTS permission
12104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
12204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
12304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param oldTag adn tag to be replaced
12404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param oldPhoneNumber adn number to be replaced
12504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        Set both oldTag and oldPhoneNubmer to "" means to replace an
12604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        empty record, aka, insert new record
12704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param newTag adn tag to be stored
12804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param newPhoneNumber adn number ot be stored
12904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        Set both newTag and newPhoneNubmer to "" means to replace the old
13004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        record with empty one, aka, delete old record
13104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param pin2 required to update EF_FDN, otherwise must be null
13204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @return true for success
13304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     */
13404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public boolean
13504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    updateAdnRecordsInEfBySearch (int efid,
13604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            String oldTag, String oldPhoneNumber,
13704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            String newTag, String newPhoneNumber, String pin2) {
13804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
13904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
14004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (phone.getContext().checkCallingOrSelfPermission(
14104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                android.Manifest.permission.WRITE_CONTACTS)
14204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            != PackageManager.PERMISSION_GRANTED) {
14304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            throw new SecurityException(
14404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    "Requires android.permission.WRITE_CONTACTS permission");
14504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
14604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
14704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
14804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) logd("updateAdnRecordsInEfBySearch: efid=" + efid +
14904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                " ("+ oldTag + "," + oldPhoneNumber + ")"+ "==>" +
15004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                " ("+ newTag + "," + newPhoneNumber + ")"+ " pin2=" + pin2);
15104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        synchronized(mLock) {
15204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            checkThread();
15304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            success = false;
15404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE);
15504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            AdnRecord oldAdn = new AdnRecord(oldTag, oldPhoneNumber);
15604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber);
15704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            adnCache.updateAdnBySearch(efid, oldAdn, newAdn, pin2, response);
15804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            try {
15904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mLock.wait();
16004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            } catch (InterruptedException e) {
16104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                logd("interrupted while trying to update by search");
16204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
16304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
16404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        return success;
16504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
16604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
16704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    /**
16804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * Update an ADN-like EF record by record index
16904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
17004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * This is useful for iteration the whole ADN file, such as write the whole
17134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh     * phone book or erase/format the whole phonebook. Currently the email field
17234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh     * if set in the ADN record is ignored.
17304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * throws SecurityException if no WRITE_CONTACTS permission
17404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
17504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
17604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param newTag adn tag to be stored
17704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param newPhoneNumber adn number to be stored
17804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        Set both newTag and newPhoneNubmer to "" means to replace the old
17904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *        record with empty one, aka, delete old record
18004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param index is 1-based adn record index to be updated
18104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param pin2 required to update EF_FDN, otherwise must be null
18204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @return true for success
18304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     */
18404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public boolean
18504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    updateAdnRecordsInEfByIndex(int efid, String newTag,
18604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            String newPhoneNumber, int index, String pin2) {
18704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
18804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (phone.getContext().checkCallingOrSelfPermission(
18904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                android.Manifest.permission.WRITE_CONTACTS)
19004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                != PackageManager.PERMISSION_GRANTED) {
19104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            throw new SecurityException(
19204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    "Requires android.permission.WRITE_CONTACTS permission");
19304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
19404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
19504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) logd("updateAdnRecordsInEfByIndex: efid=" + efid +
19604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                " Index=" + index + " ==> " +
19704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                "("+ newTag + "," + newPhoneNumber + ")"+ " pin2=" + pin2);
19804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        synchronized(mLock) {
19904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            checkThread();
20004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            success = false;
20104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE);
20204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber);
20304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            adnCache.updateAdnByIndex(efid, newAdn, index, pin2, response);
20404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            try {
20504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mLock.wait();
20604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            } catch (InterruptedException e) {
20704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                logd("interrupted while trying to update by index");
20804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
20904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
21004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        return success;
21104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
21204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
21304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    /**
21404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * Get the capacity of records in efid
21504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
21604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param efid the EF id of a ADN-like ICC
21704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @return  int[3] array
21804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *            recordSizes[0]  is the single record length
21904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *            recordSizes[1]  is the total length of the EF file
22004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *            recordSizes[2]  is the number of records in the EF file
22104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     */
22204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public abstract int[] getAdnRecordsSize(int efid);
22304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
22404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    /**
22504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * Loads the AdnRecords in efid and returns them as a
22604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * List of AdnRecords
22704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
22804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * throws SecurityException if no READ_CONTACTS permission
22904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     *
23004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @param efid the EF id of a ADN-like ICC
23104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     * @return List of AdnRecord
23204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville     */
23304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    public List<AdnRecord> getAdnRecordsInEf(int efid) {
23404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
23504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (phone.getContext().checkCallingOrSelfPermission(
23604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                android.Manifest.permission.READ_CONTACTS)
23704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                != PackageManager.PERMISSION_GRANTED) {
23804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            throw new SecurityException(
23904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    "Requires android.permission.READ_CONTACTS permission");
24004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
24104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
24234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        efid = updateEfForIccType(efid);
24304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) logd("getAdnRecordsInEF: efid=" + efid);
24404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
24504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        synchronized(mLock) {
24604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            checkThread();
24704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE);
24834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            adnCache.requestLoadAllAdnLike(efid, adnCache.extensionEfForEf(efid), response);
24904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            try {
25004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mLock.wait();
25104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            } catch (InterruptedException e) {
25204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                logd("interrupted while trying to load from the SIM");
25304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
25404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
25504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            return records;
25604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
25704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
25804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    protected void checkThread() {
25904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (!ALLOW_SIM_OP_IN_UI_THREAD) {
26004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // Make sure this isn't the UI thread, since it will block
26104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (mBaseHandler.getLooper().equals(Looper.myLooper())) {
26204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                loge("query() called on the main UI thread!");
26304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                throw new IllegalStateException(
26404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        "You cannot call query on this provder from the main UI thread.");
26504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
26604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
26704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
26834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
26934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private int updateEfForIccType(int efid) {
27034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // Check if we are trying to read ADN records
27134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        if (efid == IccConstants.EF_ADN) {
27234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (phone.getIccCard().isApplicationOnIcc(IccCardApplication.AppType.APPTYPE_USIM)) {
27334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                return IccConstants.EF_PBR;
27434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
27534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        }
27634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        return efid;
27734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    }
27804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville}
27904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
280