1e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/*
2e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Copyright (C) 2012 The Android Open Source Project
3e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
4e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Licensed under the Apache License, Version 2.0 (the "License");
5e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * you may not use this file except in compliance with the License.
6e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * You may obtain a copy of the License at
7e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
8e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *      http://www.apache.org/licenses/LICENSE-2.0
9e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
10e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Unless required by applicable law or agreed to in writing, software
11e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * distributed under the License is distributed on an "AS IS" BASIS,
12e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * See the License for the specific language governing permissions and
14e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * limitations under the License.
15e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */
16e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc;
18e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
19e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport static android.Manifest.permission.READ_PHONE_STATE;
20ab57aa5d465ef3a6dc0895b2408276617a2f6fa0Tom Taylor
21e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.app.ActivityManagerNative;
22e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Context;
23e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Intent;
24e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.AsyncResult;
25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Handler;
26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Message;
27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Registrant;
28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.RegistrantList;
29e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.SystemProperties;
30565013a713156a0ddcc46dc3a0077e4c268ce272Wink Savilleimport android.os.UserHandle;
31ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.telephony.ServiceState;
33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.telephony.TelephonyManager;
35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
36d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface;
37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.IccCard;
38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.IccCardConstants;
39d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.PhoneConstants;
40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.MccTable;
41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.RILConstants;
42d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.TelephonyIntents;
43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardConstants.State;
44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
45be3dc4b04cd65e576d250cf68f310d47637167ffWink Savilleimport com.android.internal.telephony.Phone;
46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.SubscriptionController;
47d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
48d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
49d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.CardState;
50d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.PinState;
51d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccController;
52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
5305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
5405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
5505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/**
57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @Deprecated use {@link UiccController}.getUiccCard instead.
58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * The Phone App assumes that there is only one icc card, and one icc application
60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * available at a time. Moreover, it assumes such object (represented with IccCard)
61cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * is available all the time (whether {@link RILConstants#RIL_REQUEST_GET_SIM_STATUS} returned
62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * or not, whether card has desired application or not, whether there really is a card in the
63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * slot or not).
64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController, however, can handle multiple instances of icc objects (multiple
66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@link UiccCardApplication}, multiple {@link IccFileHandler}, multiple {@link IccRecords})
67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * created and destroyed dynamically during phone operation.
68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This class implements the IccCard interface that is always available (right after default
70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * phone object is constructed) to expose the current (based on voice radio technology)
71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * application on the uicc card, so that external apps won't break.
72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */
73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class IccCardProxy extends Handler implements IccCard {
75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final boolean DBG = true;
76cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "IccCardProxy";
77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 1;
79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_RADIO_ON = 2;
80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_ICC_CHANGED = 3;
81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_ICC_ABSENT = 4;
82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_ICC_LOCKED = 5;
83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_APP_READY = 6;
84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_RECORDS_LOADED = 7;
85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_IMSI_READY = 8;
86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_NETWORK_LOCKED = 9;
87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 11;
88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_ICC_RECORD_EVENTS = 500;
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_SUBSCRIPTION_ACTIVATED = 501;
91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_SUBSCRIPTION_DEACTIVATED = 502;
92c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal    private static final int EVENT_CARRIER_PRIVILIGES_LOADED = 503;
93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
94062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal    private Integer mPhoneId = null;
95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private final Object mLock = new Object();
97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Context mContext;
98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private CommandsInterface mCi;
99e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu    private TelephonyManager mTelephonyManager;
100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mAbsentRegistrants = new RegistrantList();
102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mPinLockedRegistrants = new RegistrantList();
103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mNetworkLockedRegistrants = new RegistrantList();
104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private int mCurrentAppType = UiccController.APP_FAM_3GPP; //default to 3gpp?
106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccController mUiccController = null;
107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccCard mUiccCard = null;
108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccCardApplication mUiccApplication = null;
109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccRecords mIccRecords = null;
110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private CdmaSubscriptionSourceManager mCdmaSSM = null;
111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean mRadioOn = false;
112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean mQuietMode = false; // when set to true IccCardProxy will not broadcast
113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                        // ACTION_SIM_STATE_CHANGED intents
114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean mInitialized = false;
115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private State mExternalState = State.UNKNOWN;
116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
117cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal    public static final String ACTION_INTERNAL_SIM_STATE_CHANGED = "android.intent.action.internal_sim_state_changed";
118cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal
119062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal    public IccCardProxy(Context context, CommandsInterface ci, int phoneId) {
120062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal        if (DBG) log("ctor: ci=" + ci + " phoneId=" + phoneId);
12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mContext = context;
12222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi = ci;
123062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal        mPhoneId = phoneId;
124e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager = (TelephonyManager) mContext.getSystemService(
125e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                Context.TELEPHONY_SERVICE);
126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(context,
127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                ci, this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccController = UiccController.getInstance();
129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        ci.registerForOn(this,EVENT_RADIO_ON, null);
131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        ci.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_UNAVAILABLE, null);
132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        resetProperties();
134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setExternalState(State.NOT_READY, false);
135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void dispose() {
138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            log("Disposing");
140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            //Cleanup icc references
141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccController.unregisterForIccChanged(this);
142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccController = null;
143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.unregisterForOn(this);
144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.unregisterForOffOrNotAvailable(this);
145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCdmaSSM.dispose(this);
146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /*
150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * The card application that the external world sees will be based on the
151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * voice radio technology only!
152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setVoiceRadioTech(int radioTech) {
154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) {
156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("Setting radio tech " + ServiceState.rilRadioTechnologyToString(radioTech));
157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ServiceState.isGsm(radioTech)) {
159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mCurrentAppType = UiccController.APP_FAM_3GPP;
160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mCurrentAppType = UiccController.APP_FAM_3GPP2;
162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            updateQuietMode();
164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * In case of 3gpp2 we need to find out if subscription used is coming from
169be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville     * NV in which case we shouldn't broadcast any sim states changes.
170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void updateQuietMode() {
172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            boolean newQuietMode;
174be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville            int cdmaSource = Phone.CDMA_SUBSCRIPTION_UNKNOWN;
175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mCurrentAppType == UiccController.APP_FAM_3GPP) {
176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                newQuietMode = false;
177be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                if (DBG) log("updateQuietMode: 3GPP subscription -> newQuietMode=" + newQuietMode);
178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
179be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                cdmaSource = mCdmaSSM != null ?
180be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                        mCdmaSSM.getCdmaSubscriptionSource() : Phone.CDMA_SUBSCRIPTION_UNKNOWN;
181be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville
182be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                newQuietMode = (cdmaSource == Phone.CDMA_SUBSCRIPTION_NV)
183a635fd92e8022f103fde2e8728b312b2cb8fa0c6Preeti Ahuja                        && (mCurrentAppType == UiccController.APP_FAM_3GPP2);
184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mQuietMode == false && newQuietMode == true) {
187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Last thing to do before switching to quiet mode is
188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // broadcast ICC_READY
189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("Switching to QuietMode.");
190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.READY);
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mQuietMode = newQuietMode;
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (mQuietMode == true && newQuietMode == false) {
193be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                if (DBG) {
194be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                    log("updateQuietMode: Switching out from QuietMode."
195be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                            + " Force broadcast of current state=" + mExternalState);
196be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                }
197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mQuietMode = newQuietMode;
198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(mExternalState, true);
1994fae501dc021c215c1f291a244466610bc3f7120Wink Saville            } else {
2004fae501dc021c215c1f291a244466610bc3f7120Wink Saville                if (DBG) log("updateQuietMode: no changes don't setExternalState");
201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
202be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville            if (DBG) {
203be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville                log("updateQuietMode: QuietMode is " + mQuietMode + " (app_type="
204a635fd92e8022f103fde2e8728b312b2cb8fa0c6Preeti Ahuja                    + mCurrentAppType + " cdmaSource=" + cdmaSource + ")");
205be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville            }
206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mInitialized = true;
207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            sendMessage(obtainMessage(EVENT_ICC_CHANGED));
208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void handleMessage(Message msg) {
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (msg.what) {
214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_RADIO_OFF_OR_UNAVAILABLE:
215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mRadioOn = false;
2165d8e4457b03d166aa249989916b66a85df898516Steven Liu                if (CommandsInterface.RadioState.RADIO_UNAVAILABLE == mCi.getRadioState()) {
2175d8e4457b03d166aa249989916b66a85df898516Steven Liu                    setExternalState(State.NOT_READY);
2185d8e4457b03d166aa249989916b66a85df898516Steven Liu                }
219e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
220e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_RADIO_ON:
221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mRadioOn = true;
222e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (!mInitialized) {
223e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    updateQuietMode();
224e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_ICC_CHANGED:
227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mInitialized) {
228e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    updateIccAvailability();
229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_ICC_ABSENT:
232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mAbsentRegistrants.notifyRegistrants();
233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.ABSENT);
234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_ICC_LOCKED:
236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                processLockedState();
237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_APP_READY:
239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.READY);
240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_RECORDS_LOADED:
242062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                // Update the MCC/MNC.
243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (mIccRecords != null) {
244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    String operator = mIccRecords.getOperatorNumeric();
245062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                    log("operator=" + operator + " mPhoneId=" + mPhoneId);
246062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal
247062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                    if (operator != null) {
248e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                        mTelephonyManager.setSimOperatorNumericForPhone(mPhoneId, operator);
249062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                        String countryCode = operator.substring(0,3);
250062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                        if (countryCode != null) {
251e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mTelephonyManager.setSimCountryIsoForPhone(mPhoneId,
252062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                                    MccTable.countryCodeForMcc(Integer.parseInt(countryCode)));
2534b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        } else {
254062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                            loge("EVENT_RECORDS_LOADED Country code is null");
255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        }
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    } else {
257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        loge("EVENT_RECORDS_LOADED Operator name is null");
258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
26056070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                if (mUiccCard != null && !mUiccCard.areCarrierPriviligeRulesLoaded()) {
26156070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                    mUiccCard.registerForCarrierPrivilegeRulesLoaded(
26256070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                        this, EVENT_CARRIER_PRIVILIGES_LOADED, null);
26356070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                } else {
26456070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                    onRecordsLoaded();
26556070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                }
266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_IMSI_READY:
268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                broadcastIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null);
269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_NETWORK_LOCKED:
271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mNetworkLockedRegistrants.notifyRegistrants();
272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.NETWORK_LOCKED);
273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                updateQuietMode();
276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case EVENT_SUBSCRIPTION_ACTIVATED:
278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("EVENT_SUBSCRIPTION_ACTIVATED");
279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                onSubscriptionActivated();
280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case EVENT_SUBSCRIPTION_DEACTIVATED:
283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("EVENT_SUBSCRIPTION_DEACTIVATED");
284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                onSubscriptionDeactivated();
285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case EVENT_ICC_RECORD_EVENTS:
288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if ((mCurrentAppType == UiccController.APP_FAM_3GPP) && (mIccRecords != null)) {
289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    AsyncResult ar = (AsyncResult)msg.obj;
290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    int eventCode = (Integer) ar.result;
291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    if (eventCode == SIMRecords.EVENT_SPN) {
292e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                        mTelephonyManager.setSimOperatorNameForPhone(
293e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                                mPhoneId, mIccRecords.getServiceProviderName());
294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
298c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal            case EVENT_CARRIER_PRIVILIGES_LOADED:
299c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal                log("EVENT_CARRIER_PRIVILEGES_LOADED");
30056070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                if (mUiccCard != null) {
30156070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                    mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this);
30256070d81b56a950a027d5adf87890221548ca666Shishir Agrawal                }
303c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal                onRecordsLoaded();
304c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal                break;
305c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal
306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            default:
307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Unhandled message with number: " + msg.what);
308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void onSubscriptionActivated() {
313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        updateIccAvailability();
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        updateStateProperty();
315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void onSubscriptionDeactivated() {
318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        resetProperties();
319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        updateIccAvailability();
320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        updateStateProperty();
321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
323c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal    private void onRecordsLoaded() {
324cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal        broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null);
325c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal    }
326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
327e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void updateIccAvailability() {
328e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
329062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            UiccCard newCard = mUiccController.getUiccCard(mPhoneId);
330e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            CardState state = CardState.CARDSTATE_ABSENT;
331e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            UiccCardApplication newApp = null;
332e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            IccRecords newRecords = null;
333e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (newCard != null) {
334e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                state = newCard.getCardState();
335e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                newApp = newCard.getApplication(mCurrentAppType);
336e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (newApp != null) {
337e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    newRecords = newApp.getIccRecords();
338e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
339e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
340e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
341e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccRecords != newRecords || mUiccApplication != newApp || mUiccCard != newCard) {
342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Icc changed. Reregestering.");
343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                unregisterUiccCardEvents();
344e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccCard = newCard;
345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication = newApp;
346e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords = newRecords;
347e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                registerUiccCardEvents();
348e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            updateExternalState();
350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    void resetProperties() {
354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mCurrentAppType == UiccController.APP_FAM_3GPP) {
355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            log("update icc_operator_numeric=" + "");
356e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNumericForPhone(mPhoneId, "");
357e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimCountryIsoForPhone(mPhoneId, "");
358e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNameForPhone(mPhoneId, "");
359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville         }
360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void HandleDetectedState() {
363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // CAF_MSIM SAND
364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville//        setExternalState(State.DETECTED, false);
365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
367e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void updateExternalState() {
36832e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja
36932e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja        // mUiccCard could be null at bootup, before valid card states have
37032e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja        // been received from UiccController.
37132e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja        if (mUiccCard == null) {
37232e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja            setExternalState(State.NOT_READY);
37332e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja            return;
37432e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja        }
37532e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja
37632e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja        if (mUiccCard.getCardState() == CardState.CARDSTATE_ABSENT) {
377e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mRadioOn) {
378e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.ABSENT);
379e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.NOT_READY);
381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
385e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta        if (mUiccCard.getCardState() == CardState.CARDSTATE_ERROR) {
386e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta            setExternalState(State.CARD_IO_ERROR);
387e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta            return;
388e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta        }
389e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta
390aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu        if (mUiccCard.getCardState() == CardState.CARDSTATE_RESTRICTED) {
391aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu            setExternalState(State.CARD_RESTRICTED);
392aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu            return;
393aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu        }
394aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu
395e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta        if (mUiccApplication == null) {
396e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta            setExternalState(State.NOT_READY);
397775f100b20a5c978bc07f621a4087f79b1f73e3fWink Saville            return;
398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (mUiccApplication.getState()) {
401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPSTATE_UNKNOWN:
402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.UNKNOWN);
403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case APPSTATE_DETECTED:
405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                HandleDetectedState();
406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPSTATE_PIN:
408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.PIN_REQUIRED);
409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPSTATE_PUK:
411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.PUK_REQUIRED);
412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPSTATE_SUBSCRIPTION_PERSO:
414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (mUiccApplication.getPersoSubState() ==
415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        PersoSubState.PERSOSUBSTATE_SIM_NETWORK) {
416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    setExternalState(State.NETWORK_LOCKED);
417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                } else {
418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    setExternalState(State.UNKNOWN);
419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPSTATE_READY:
422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.READY);
423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void registerUiccCardEvents() {
428c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal        if (mUiccCard != null) {
429c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal            mUiccCard.registerForAbsent(this, EVENT_ICC_ABSENT, null);
430c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal        }
431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplication != null) {
432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccApplication.registerForReady(this, EVENT_APP_READY, null);
433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccApplication.registerForLocked(this, EVENT_ICC_LOCKED, null);
434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccApplication.registerForNetworkLocked(this, EVENT_NETWORK_LOCKED, null);
435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mIccRecords != null) {
437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccRecords.registerForImsiReady(this, EVENT_IMSI_READY, null);
438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void unregisterUiccCardEvents() {
444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccCard != null) mUiccCard.unregisterForAbsent(this);
445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplication != null) mUiccApplication.unregisterForReady(this);
446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplication != null) mUiccApplication.unregisterForLocked(this);
447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplication != null) mUiccApplication.unregisterForNetworkLocked(this);
448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mIccRecords != null) mIccRecords.unregisterForImsiReady(this);
449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mIccRecords != null) mIccRecords.unregisterForRecordsLoaded(this);
450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mIccRecords != null) mIccRecords.unregisterForRecordsEvents(this);
451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void updateStateProperty() {
454e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString());
455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void broadcastIccStateChangedIntent(String value, String reason) {
458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
459062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            if (mPhoneId == null || !SubscriptionManager.isValidSlotId(mPhoneId)) {
460062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId
4614fae501dc021c215c1f291a244466610bc3f7120Wink Saville                        + " is invalid; Return!!");
462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return;
463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mQuietMode) {
4664fae501dc021c215c1f291a244466610bc3f7120Wink Saville                log("broadcastIccStateChangedIntent: QuietMode"
4674fae501dc021c215c1f291a244466610bc3f7120Wink Saville                        + " NOT Broadcasting intent ACTION_SIM_STATE_CHANGED "
4684fae501dc021c215c1f291a244466610bc3f7120Wink Saville                        + " value=" +  value + " reason=" + reason);
469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
473875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt            // TODO - we'd like this intent to have a single snapshot of all sim state,
474875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt            // but until then this should not use REPLACE_PENDING or we may lose
475875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt            // information
476875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt            // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
477875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone");
479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value);
480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason);
481062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId);
4824fae501dc021c215c1f291a244466610bc3f7120Wink Saville            log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value
483062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                + " reason=" + reason + " for mPhoneId=" + mPhoneId);
484565013a713156a0ddcc46dc3a0077e4c268ce272Wink Saville            ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE,
485565013a713156a0ddcc46dc3a0077e4c268ce272Wink Saville                    UserHandle.USER_ALL);
486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
489cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal    private void broadcastInternalIccStateChangedIntent(String value, String reason) {
490cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal        synchronized (mLock) {
491062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            if (mPhoneId == null) {
492cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                loge("broadcastInternalIccStateChangedIntent: Card Index is not set; Return!!");
493cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                return;
494cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            }
495cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal
496cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED);
497262aceca11c9cfeb910bc95765a17a801134d102Christopher Tate            intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
498262aceca11c9cfeb910bc95765a17a801134d102Christopher Tate                    | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
499cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone");
500cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value);
501cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason);
502062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            intent.putExtra(PhoneConstants.PHONE_KEY, mPhoneId);  // SubId may not be valid.
503062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            log("Sending intent ACTION_INTERNAL_SIM_STATE_CHANGED" + " for mPhoneId : " + mPhoneId);
504cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL);
505cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal        }
506cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal    }
507cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal
508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void setExternalState(State newState, boolean override) {
509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        synchronized (mLock) {
510062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            if (mPhoneId == null || !SubscriptionManager.isValidSlotId(mPhoneId)) {
511062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal                loge("setExternalState: mPhoneId=" + mPhoneId + " is invalid; Return!!");
512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return;
513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (!override && newState == mExternalState) {
5164fae501dc021c215c1f291a244466610bc3f7120Wink Saville                loge("setExternalState: !override and newstate unchanged from " + newState);
517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return;
518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mExternalState = newState;
520062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal            loge("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState);
521e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString());
522cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal
523cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            // For locked states, we should be sending internal broadcast.
524cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(getIccStateIntentString(mExternalState))) {
525cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState),
526cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                        getIccStateReason(mExternalState));
527cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            } else {
528cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState),
529cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal                        getIccStateReason(mExternalState));
530cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal            }
531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // TODO: Need to notify registrants for other states as well.
532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if ( State.ABSENT == mExternalState) {
533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mAbsentRegistrants.notifyRegistrants();
534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void processLockedState() {
539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication == null) {
541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //Don't need to do anything if non-existent application is locked
542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            PinState pin1State = mUiccApplication.getPin1State();
545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (pin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) {
546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                setExternalState(State.PERM_DISABLED);
547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AppState appState = mUiccApplication.getState();
551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            switch (appState) {
552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case APPSTATE_PIN:
553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPinLockedRegistrants.notifyRegistrants();
554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    setExternalState(State.PIN_REQUIRED);
555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case APPSTATE_PUK:
557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    setExternalState(State.PUK_REQUIRED);
558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                case APPSTATE_DETECTED:
560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                case APPSTATE_READY:
561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                case APPSTATE_SUBSCRIPTION_PERSO:
562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                case APPSTATE_UNKNOWN:
563cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // Neither required
564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    break;
565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void setExternalState(State newState) {
570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        setExternalState(newState, false);
571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccRecordsLoaded() {
574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccRecords != null) {
576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mIccRecords.getRecordsLoaded();
577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return false;
579e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String getIccStateIntentString(State state) {
583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (state) {
584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case ABSENT: return IccCardConstants.INTENT_VALUE_ICC_ABSENT;
585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case NETWORK_LOCKED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case READY: return IccCardConstants.INTENT_VALUE_ICC_READY;
589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case NOT_READY: return IccCardConstants.INTENT_VALUE_ICC_NOT_READY;
590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
591d4c858abee72a9c4935855b62418d2b306ceda4bAmit Mahajan            case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR;
592aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu            case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED;
593e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN;
594e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
598e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta     * Locked state have a reason (PIN, PUK, NETWORK, PERM_DISABLED, CARD_IO_ERROR)
599e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @return reason
600e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
601e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String getIccStateReason(State state) {
602e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (state) {
603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN;
604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK;
605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case NETWORK_LOCKED: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK;
606e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED;
607e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta            case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR;
608aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu            case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED;
609e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            default: return null;
610e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka       }
611e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
612e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
613e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /* IccCard interface implementation */
614e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
615e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public State getState() {
616e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
617e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mExternalState;
618e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
619e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
622e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccRecords getIccRecords() {
623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccRecords;
625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
629e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccFileHandler getIccFileHandler() {
630e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mUiccApplication.getIccFileHandler();
633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
636e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.ABSENT
640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForAbsent(Handler h, int what, Object obj) {
643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAbsentRegistrants.add(r);
647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (getState() == State.ABSENT) {
649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant();
650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForAbsent(Handler h) {
656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAbsentRegistrants.remove(h);
658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.NETWORK_LOCKED
663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForNetworkLocked(Handler h, int what, Object obj) {
666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.add(r);
670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (getState() == State.NETWORK_LOCKED) {
672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant();
673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForNetworkLocked(Handler h) {
679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.remove(h);
681e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
682e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
683e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
684e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
685e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.isPinLocked()
686e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
687e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
688e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForLocked(Handler h, int what, Object obj) {
689e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.add(r);
693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (getState().isPinLocked()) {
695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant();
696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
700e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
701e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForLocked(Handler h) {
702e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
703e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.remove(h);
704e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
705e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
706e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
707e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
708e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin(String pin, Message onComplete) {
709e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
710e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
711e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.supplyPin(pin, onComplete);
712e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
713e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
714e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
715e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
716e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
717e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
718e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
719e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
720e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
721e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
722e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk(String puk, String newPin, Message onComplete) {
723e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
724e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
725e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.supplyPuk(puk, newPin, onComplete);
726e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
727e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
728e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
729e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
730e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
732e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
733e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
734e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
735e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
736e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin2(String pin2, Message onComplete) {
737e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
738e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
739e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.supplyPin2(pin2, onComplete);
740e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
741e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
742e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
743e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
744e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
745e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
746e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
747e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
748e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
749e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
750e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk2(String puk2, String newPin2, Message onComplete) {
751e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
752e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
753e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.supplyPuk2(puk2, newPin2, onComplete);
754e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
755e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
756e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
757e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
758e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
759e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
760e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
761e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
762e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
763e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
764e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyNetworkDepersonalization(String pin, Message onComplete) {
765e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
766e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
767e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.supplyNetworkDepersonalization(pin, onComplete);
768e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
769e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("CommandsInterface is not set.");
770e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
771e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
772e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
773e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
774e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
775e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
776e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
777e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
778e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccLockEnabled() {
779e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
7803522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            /* defaults to false, if ICC is absent/deactivated */
7813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            Boolean retValue = mUiccApplication != null ?
7823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mUiccApplication.getIccLockEnabled() : false;
783e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return retValue;
784e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
785e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
786e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
787e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
788e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccFdnEnabled() {
789e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
7903522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            Boolean retValue = mUiccApplication != null ?
7913522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mUiccApplication.getIccFdnEnabled() : false;
792e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return retValue;
793e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
794e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
795e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
7963522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccFdnAvailable() {
7973522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        boolean retValue = mUiccApplication != null ? mUiccApplication.getIccFdnAvailable() : false;
7983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        return retValue;
7993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
8003522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
8013522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccPin2Blocked() {
8023522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        /* defaults to disabled */
8033522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        Boolean retValue = mUiccApplication != null ? mUiccApplication.getIccPin2Blocked() : false;
8043522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        return retValue;
8053522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
8063522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
8073522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccPuk2Blocked() {
8083522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        /* defaults to disabled */
8093522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        Boolean retValue = mUiccApplication != null ? mUiccApplication.getIccPuk2Blocked() : false;
8103522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        return retValue;
8113522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
8123522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
813e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
814e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccLockEnabled(boolean enabled, String password, Message onComplete) {
815e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
816e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
817e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.setIccLockEnabled(enabled, password, onComplete);
818e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
819e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
820e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
821e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
822e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
823e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
824e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
825e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
826e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
827e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
828e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccFdnEnabled(boolean enabled, String password, Message onComplete) {
829e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
830e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
831e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.setIccFdnEnabled(enabled, password, onComplete);
832e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
833e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
834e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
835e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
836e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
837e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
838e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
839e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
840e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
841e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
842e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccLockPassword(String oldPassword, String newPassword, Message onComplete) {
843e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
844e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
845e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.changeIccLockPassword(oldPassword, newPassword, onComplete);
846e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
847e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
848e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
849e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
850e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
851e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
852e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
853e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
854e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
855e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
856e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccFdnPassword(String oldPassword, String newPassword, Message onComplete) {
857e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
858e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplication != null) {
859e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.changeIccFdnPassword(oldPassword, newPassword, onComplete);
860e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else if (onComplete != null) {
861e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                Exception e = new RuntimeException("ICC card is absent.");
862e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                AsyncResult.forMessage(onComplete).exception = e;
863e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onComplete.sendToTarget();
864e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
865e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
866e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
867e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
868e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
869e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
870e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public String getServiceProviderName() {
871e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
872e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccRecords != null) {
873e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mIccRecords.getServiceProviderName();
874e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
875e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
876e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
877e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
878e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
879e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
880e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean isApplicationOnIcc(IccCardApplicationStatus.AppType type) {
881e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
882e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Boolean retValue = mUiccCard != null ? mUiccCard.isApplicationOnIcc(type) : false;
883e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return retValue;
884e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
885e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
886e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
887e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    @Override
888e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean hasIccCard() {
889e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
890e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) {
891e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return true;
892e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
893e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return false;
894e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
895e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
896e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
897062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal    private void setSystemProperty(String property, String value) {
898062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal        TelephonyManager.setTelephonyProperty(mPhoneId, property, value);
899a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
900a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
90156dbbcf63e9991ee83945fd10661190d917f700axinhe    public IccRecords getIccRecord() {
90256dbbcf63e9991ee83945fd10661190d917f700axinhe        return mIccRecords;
90356dbbcf63e9991ee83945fd10661190d917f700axinhe    }
904e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void log(String s) {
905ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, s);
906e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
907e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
908e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void loge(String msg) {
909ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, msg);
910e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
91105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
91205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
91305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("IccCardProxy: " + this);
91405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mContext=" + mContext);
91505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCi=" + mCi);
91605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mAbsentRegistrants: size=" + mAbsentRegistrants.size());
91705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mAbsentRegistrants.size(); i++) {
91805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mAbsentRegistrants[" + i + "]="
91905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mAbsentRegistrants.get(i)).getHandler());
92005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
92105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPinLockedRegistrants: size=" + mPinLockedRegistrants.size());
92205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mPinLockedRegistrants.size(); i++) {
92305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mPinLockedRegistrants[" + i + "]="
92405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mPinLockedRegistrants.get(i)).getHandler());
92505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
92605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mNetworkLockedRegistrants: size=" + mNetworkLockedRegistrants.size());
92705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mNetworkLockedRegistrants.size(); i++) {
92805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mNetworkLockedRegistrants[" + i + "]="
92905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mNetworkLockedRegistrants.get(i)).getHandler());
93005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
93105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCurrentAppType=" + mCurrentAppType);
93205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUiccController=" + mUiccController);
93305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUiccCard=" + mUiccCard);
93405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUiccApplication=" + mUiccApplication);
93505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccRecords=" + mIccRecords);
93605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCdmaSSM=" + mCdmaSSM);
93705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mRadioOn=" + mRadioOn);
93805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mQuietMode=" + mQuietMode);
93905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mInitialized=" + mInitialized);
94005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mExternalState=" + mExternalState);
94105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
94205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
94305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
944e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka}
945