1e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/*
2e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Copyright (C) 2006, 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 android.content.Context;
20e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.AsyncResult;
21e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Handler;
22e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Message;
23e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Registrant;
24e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.RegistrantList;
25ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
27d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface;
28d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
29d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
30d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
31d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.PinState;
32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
3305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
3405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
3505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/**
37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@hide}
38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */
39e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class UiccCardApplication {
40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "UiccCardApplication";
41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final boolean DBG = true;
42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
433522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_PIN1_PUK1_DONE = 1;
443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_CHANGE_PIN1_DONE = 2;
453522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_CHANGE_PIN2_DONE = 3;
463522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_QUERY_FACILITY_FDN_DONE = 4;
473522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 5;
483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_QUERY_FACILITY_LOCK_DONE = 6;
493522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 7;
503522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private static final int EVENT_PIN2_PUK2_DONE = 8;
51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private final Object  mLock = new Object();
53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccCard      mUiccCard; //parent
54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private AppState      mAppState;
55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private AppType       mAppType;
56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PersoSubState mPersoSubState;
57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String        mAid;
58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String        mAppLabel;
59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mPin1Replaced;
60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PinState      mPin1State;
61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PinState      mPin2State;
62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mIccFdnEnabled;
63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mDesiredFdnEnabled;
64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mIccLockEnabled;
65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mDesiredPinLocked;
663522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private boolean       mIccFdnAvailable = true; // Default is enabled.
67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private CommandsInterface mCi;
69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Context mContext;
70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccRecords mIccRecords;
71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccFileHandler mIccFh;
72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean mDestroyed;//set to true once this App is commanded to be disposed of.
74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mReadyRegistrants = new RegistrantList();
76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mPinLockedRegistrants = new RegistrantList();
77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mNetworkLockedRegistrants = new RegistrantList();
78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    UiccCardApplication(UiccCard uiccCard,
80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        IccCardApplicationStatus as,
81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        Context c,
82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface ci) {
83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (DBG) log("Creating UiccApp: " + as);
84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccCard = uiccCard;
85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppState = as.app_state;
86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppType = as.app_type;
87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPersoSubState = as.perso_substate;
88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAid = as.aid;
89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppLabel = as.app_label;
90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin1Replaced = (as.pin1_replaced != 0);
91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin1State = as.pin1;
92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin2State = as.pin2;
93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mContext = c;
95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi = ci;
96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mIccFh = createIccFileHandler(as.app_type);
98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mIccRecords = createIccRecords(as.app_type, mContext, mCi);
99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_READY) {
100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            queryFdn();
101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            queryPin1State();
102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) {
106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mDestroyed) {
108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Application updated after destroyed! Fix me!");
109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log(mAppType + " update. New " + as);
113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mContext = c;
114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi = ci;
115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AppType oldAppType = mAppType;
116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AppState oldAppState = mAppState;
117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            PersoSubState oldPersoSubState = mPersoSubState;
118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppType = as.app_type;
119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppState = as.app_state;
120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPersoSubState = as.perso_substate;
121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAid = as.aid;
122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppLabel = as.app_label;
123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin1Replaced = (as.pin1_replaced != 0);
124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin1State = as.pin1;
125e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin2State = as.pin2;
126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mAppType != oldAppType) {
128f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka                if (mIccFh != null) { mIccFh.dispose();}
129f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka                if (mIccRecords != null) { mIccRecords.dispose();}
130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccFh = createIccFileHandler(as.app_type);
131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords = createIccRecords(as.app_type, c, ci);
132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPersoSubState != oldPersoSubState &&
135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) {
136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyNetworkLockedRegistrantsIfNeeded(null);
137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mAppState != oldAppState) {
140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState);
141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // If the app state turns to APPSTATE_READY, then query FDN status,
142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //as it might have failed in earlier attempt.
143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mAppState == AppState.APPSTATE_READY) {
144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    queryFdn();
145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    queryPin1State();
146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyPinLockedRegistrantsIfNeeded(null);
148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyReadyRegistrantsIfNeeded(null);
149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    void dispose() {
154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log(mAppType + " being Disposed");
156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDestroyed = true;
157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccRecords != null) { mIccRecords.dispose();}
158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccFh != null) { mIccFh.dispose();}
159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccRecords = null;
160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccFh = null;
161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) {
165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) {
166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new SIMRecords(this, c, ci);
167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){
168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new RuimRecords(this, c, ci);
169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else if (type == AppType.APPTYPE_ISIM) {
170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new IsimUiccRecords(this, c, ci);
171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else {
172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            // Unknown app type (maybe detection is still in progress)
173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
174e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccFileHandler createIccFileHandler(AppType type) {
178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (type) {
179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_SIM:
180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new SIMFileHandler(this, mAid, mCi);
181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_RUIM:
182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new RuimFileHandler(this, mAid, mCi);
183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_USIM:
184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new UsimFileHandler(this, mAid, mCi);
185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_CSIM:
186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new CsimFileHandler(this, mAid, mCi);
187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_ISIM:
188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new IsimFileHandler(this, mAid, mCi);
189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            default:
190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return null;
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** Assumes mLock is held. */
195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void queryFdn() {
196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        //This shouldn't change run-time. So needs to be called only once.
197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        int serviceClassX;
198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
200e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface.SERVICE_CLASS_DATA +
201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface.SERVICE_CLASS_FAX;
202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.queryFacilityLockForApp (
203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.CB_FACILITY_BA_FD, "", serviceClassX,
204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_FDN_DONE));
205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Interpret EVENT_QUERY_FACILITY_LOCK_DONE
208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param ar is asyncResult of Query_Facility_Locked
209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onQueryFdnEnabled(AsyncResult ar) {
211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception != null) {
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Error in querying facility lock:" + ar.exception);
214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
2173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            int[] result = (int[])ar.result;
2183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            if(result.length != 0) {
2193522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                //0 - Available & Disabled, 1-Available & Enabled, 2-Unavailable.
2203522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                if (result[0] == 2) {
2213522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mIccFdnEnabled = false;
2223522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mIccFdnAvailable = false;
2233522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                } else {
2243522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mIccFdnEnabled = (result[0] == 1) ? true : false;
2253522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mIccFdnAvailable = true;
2263522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                }
2273522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                log("Query facility FDN : FDN service available: "+ mIccFdnAvailable
2283522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                        +" enabled: "  + mIccFdnEnabled);
229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Bogus facility lock response");
231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onChangeFdnDone(AsyncResult ar) {
236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
2373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            int attemptsRemaining = -1;
2383522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception == null) {
240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccFdnEnabled = mDesiredFdnEnabled;
241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("EVENT_CHANGE_FACILITY_FDN_DONE: " +
242e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        "mIccFdnEnabled=" + mIccFdnEnabled);
243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
2443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                attemptsRemaining = parsePinPukErrorResult(ar);
245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Error change facility fdn with exception " + ar.exception);
246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message response = (Message)ar.userObj;
2483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            response.arg1 = attemptsRemaining;
249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AsyncResult.forMessage(response).exception = ar.exception;
250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            response.sendToTarget();
251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed, assumes mLock is held */
255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void queryPin1State() {
256e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        int serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.SERVICE_CLASS_DATA +
258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.SERVICE_CLASS_FAX;
259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.queryFacilityLockForApp (
260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            CommandsInterface.CB_FACILITY_BA_SIM, "", serviceClassX,
261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_LOCK_DONE));
262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed*/
265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onQueryFacilityLock(AsyncResult ar) {
266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if(ar.exception != null) {
268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Error in querying facility lock:" + ar.exception);
269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int[] ints = (int[])ar.result;
273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if(ints.length != 0) {
274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Query facility lock : "  + ints[0]);
275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccLockEnabled = (ints[0] != 0);
277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mIccLockEnabled) {
279e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPinLockedRegistrants.notifyRegistrants();
280e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
281e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
282e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Sanity check: we expect mPin1State to match mIccLockEnabled.
283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // When mPin1State is DISABLED mIccLockEanbled should be false.
284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // When mPin1State is ENABLED mIccLockEnabled should be true.
285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //
286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Here we validate these assumptions to assist in identifying which ril/radio's
287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // have not correctly implemented GET_SIM_STATUS
288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                switch (mPin1State) {
289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_DISABLED:
290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (mIccLockEnabled) {
291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            loge("QUERY_FACILITY_LOCK:enabled GET_SIM_STATUS.Pin1:disabled."
292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                    + " Fixme");
293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        }
294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        break;
295e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_NOT_VERIFIED:
296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_VERIFIED:
297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_BLOCKED:
298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_PERM_BLOCKED:
299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (!mIccLockEnabled) {
300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            loge("QUERY_FACILITY_LOCK:disabled GET_SIM_STATUS.Pin1:enabled."
301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                    + " Fixme");
302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        }
303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    case PINSTATE_UNKNOWN:
304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    default:
305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        if (DBG) log("Ignoring: pin1state=" + mPin1State);
306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        break;
307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Bogus facility lock response");
310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed */
315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onChangeFacilityLock(AsyncResult ar) {
316e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
3173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            int attemptsRemaining = -1;
3183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
319e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception == null) {
320e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccLockEnabled = mDesiredPinLocked;
321e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log( "EVENT_CHANGE_FACILITY_LOCK_DONE: mIccLockEnabled= "
322e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        + mIccLockEnabled);
323e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
3243522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                attemptsRemaining = parsePinPukErrorResult(ar);
325e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Error change facility lock with exception " + ar.exception);
326e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
3273522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            Message response = (Message)ar.userObj;
3283522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            AsyncResult.forMessage(response).exception = ar.exception;
3293522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            response.arg1 = attemptsRemaining;
3303522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            response.sendToTarget();
3313522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        }
3323522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
3333522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
3343522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    /**
3353522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * Parse the error response to obtain number of attempts remaining
3363522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     */
3373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    private int parsePinPukErrorResult(AsyncResult ar) {
3383522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        int[] result = (int[]) ar.result;
3393522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        if (result == null) {
3403522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            return -1;
3413522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        } else {
3423522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            int length = result.length;
3433522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            int attemptsRemaining = -1;
3443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            if (length > 0) {
3453522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                attemptsRemaining = result[0];
3463522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            }
3473522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            log("parsePinPukErrorResult: attemptsRemaining=" + attemptsRemaining);
3483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            return attemptsRemaining;
349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Handler mHandler = new Handler() {
353e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        @Override
354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        public void handleMessage(Message msg){
355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AsyncResult ar;
356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
357e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mDestroyed) {
358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Received message " + msg + "[" + msg.what
359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        + "] while being destroyed. Ignoring.");
360e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
361e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
362e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
363e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            switch (msg.what) {
3643522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                case EVENT_PIN1_PUK1_DONE:
3653522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                case EVENT_PIN2_PUK2_DONE:
3663522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                case EVENT_CHANGE_PIN1_DONE:
3673522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                case EVENT_CHANGE_PIN2_DONE:
3683522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    // a PIN/PUK/PIN2/PUK2 complete
3693522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    // request has completed. ar.userObj is the response Message
3703522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    int attemptsRemaining = -1;
3713522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    ar = (AsyncResult)msg.obj;
3723522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    if ((ar.exception != null) && (ar.result != null)) {
3733522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                        attemptsRemaining = parsePinPukErrorResult(ar);
3743522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    }
3753522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    Message response = (Message)ar.userObj;
3763522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    AsyncResult.forMessage(response).exception = ar.exception;
3773522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    response.arg1 = attemptsRemaining;
3783522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    response.sendToTarget();
3793522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    break;
380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_QUERY_FACILITY_FDN_DONE:
381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onQueryFdnEnabled(ar);
383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_CHANGE_FACILITY_FDN_DONE:
385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onChangeFdnDone(ar);
387e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
388e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_QUERY_FACILITY_LOCK_DONE:
389e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onQueryFacilityLock(ar);
391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_CHANGE_FACILITY_LOCK_DONE:
393e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
394e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onChangeFacilityLock(ar);
395e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
396e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                default:
397e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    loge("Unknown Event " + msg.what);
398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    };
401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForReady(Handler h, int what, Object obj) {
403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
404e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
405e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mReadyRegistrants.add(r);
406e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyReadyRegistrantsIfNeeded(r);
407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForReady(Handler h) {
411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mReadyRegistrants.remove(h);
413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.isPinLocked()
418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForLocked(Handler h, int what, Object obj) {
420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.add(r);
423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyPinLockedRegistrantsIfNeeded(r);
424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForLocked(Handler h) {
428e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
429e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.remove(h);
430e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.NETWORK_LOCKED
435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForNetworkLocked(Handler h, int what, Object obj) {
437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
439e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.add(r);
440e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyNetworkLockedRegistrantsIfNeeded(r);
441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForNetworkLocked(Handler h) {
445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.remove(h);
447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
450e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
451e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
452e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
453e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
454e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyReadyRegistrantsIfNeeded(Registrant r) {
456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
459e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_READY) {
460e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1State == PinState.PINSTATE_ENABLED_NOT_VERIFIED ||
461e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_ENABLED_BLOCKED ||
462e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) {
463e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Sanity check failed! APPSTATE is ready while PIN1 is not verified!!!");
464e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Don't notify if application is in insane state
465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
466e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
467e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
468e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: READY");
469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mReadyRegistrants.notifyRegistrants();
470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: READY");
472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
473e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
474e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
475e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
476e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
477e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
481e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
482e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyPinLockedRegistrantsIfNeeded(Registrant r) {
483e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
484e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
485e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_PIN ||
488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mAppState == AppState.APPSTATE_PUK) {
489e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1State == PinState.PINSTATE_ENABLED_VERIFIED ||
490e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_DISABLED) {
491e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Sanity check failed! APPSTATE is locked while PIN1 is not!!!");
492e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //Don't notify if application is in insane state
493e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
494e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
495e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
496e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: LOCKED");
497e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mPinLockedRegistrants.notifyRegistrants();
498e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
499e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: LOCKED");
500e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
501e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
502e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
503e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
504e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
505e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
506e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
507e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
508e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
509e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
510e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyNetworkLockedRegistrantsIfNeeded(Registrant r) {
511e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
512e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
513e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
514e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
515e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_SUBSCRIPTION_PERSO &&
516e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) {
517e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
518e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: NETWORK_LOCKED");
519e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mNetworkLockedRegistrants.notifyRegistrants();
520e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
521e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: NETWORK_LOCED");
522e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
523e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
524e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
525e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
526e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
527e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public AppState getState() {
528e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
529e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAppState;
530e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
531e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
532e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
533e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public AppType getType() {
534e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
535e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAppType;
536e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
537e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public PersoSubState getPersoSubState() {
540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mPersoSubState;
542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public String getAid() {
546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAid;
548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public PinState getPin1State() {
552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1Replaced) {
554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mUiccCard.getUniversalPinState();
555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mPin1State;
557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
559e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
560e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccFileHandler getIccFileHandler() {
561e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
562e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccFh;
563e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
564e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccRecords getIccRecords() {
567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccRecords;
569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Supply the ICC PIN to the ICC
574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its
576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Handler.
577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * onComplete.obj will be an AsyncResult
5793522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * onComplete.arg1 = remaining attempts before puk locked or -1 if unknown
580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception == null on success
582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception != null on fail
583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * If the supplied PIN is incorrect:
585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception != null
586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * && ((AsyncResult)onComplete.obj).exception
587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *       instanceof com.android.internal.telephony.gsm.CommandException)
588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * && ((CommandException)(((AsyncResult)onComplete.obj).exception))
589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *          .getCommandError() == CommandException.Error.PASSWORD_INCORRECT
590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
591e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin (String pin, Message onComplete) {
592e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
5933522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            mCi.supplyIccPinForApp(pin, mAid, mHandler.obtainMessage(EVENT_PIN1_PUK1_DONE,
5943522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    onComplete));
595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
5983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    /**
5993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * Supply the ICC PUK to the ICC
6003522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6013522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * When the operation is complete, onComplete will be sent to its
6023522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * Handler.
6033522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6043522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * onComplete.obj will be an AsyncResult
6053522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * onComplete.arg1 = remaining attempts before Icc will be permanently unusable
6063522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * or -1 if unknown
6073522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6083522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * ((AsyncResult)onComplete.obj).exception == null on success
6093522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * ((AsyncResult)onComplete.obj).exception != null on fail
6103522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6113522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * If the supplied PIN is incorrect:
6123522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * ((AsyncResult)onComplete.obj).exception != null
6133522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * && ((AsyncResult)onComplete.obj).exception
6143522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *       instanceof com.android.internal.telephony.gsm.CommandException)
6153522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * && ((CommandException)(((AsyncResult)onComplete.obj).exception))
6163522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *          .getCommandError() == CommandException.Error.PASSWORD_INCORRECT
6173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *
6193522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     */
620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk (String puk, String newPin, Message onComplete) {
621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
6223522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        mCi.supplyIccPukForApp(puk, newPin, mAid,
6233522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                mHandler.obtainMessage(EVENT_PIN1_PUK1_DONE, onComplete));
624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin2 (String pin2, Message onComplete) {
628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
6293522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            mCi.supplyIccPin2ForApp(pin2, mAid,
6303522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mHandler.obtainMessage(EVENT_PIN2_PUK2_DONE, onComplete));
631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk2 (String puk2, String newPin2, Message onComplete) {
635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
6363522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            mCi.supplyIccPuk2ForApp(puk2, newPin2, mAid,
6373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mHandler.obtainMessage(EVENT_PIN2_PUK2_DONE, onComplete));
638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyNetworkDepersonalization (String pin, Message onComplete) {
642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("supplyNetworkDepersonalization");
644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyNetworkDepersonalization(pin, onComplete);
645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Check whether ICC pin lock is enabled
650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * This is a sync call which returns the cached pin enabled state
651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @return true for ICC locked enabled
653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *         false for ICC locked disabled
654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccLockEnabled() {
656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mIccLockEnabled;
657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        /* STOPSHIP: Remove line above and all code associated with setting
658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka           mIccLockEanbled once all RIL correctly sends the pin1 state.
659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        // Use getPin1State to take into account pin1Replaced flag
660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        PinState pinState = getPin1State();
661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return pinState == PinState.PINSTATE_ENABLED_NOT_VERIFIED ||
662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_VERIFIED ||
663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_BLOCKED ||
664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_PERM_BLOCKED;*/
665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     }
666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Check whether ICC fdn (fixed dialing number) is enabled
669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * This is a sync call which returns the cached pin enabled state
670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @return true for ICC fdn enabled
672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *         false for ICC fdn disabled
673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccFdnEnabled() {
675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccFdnEnabled;
677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
6813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * Check whether fdn (fixed dialing number) service is available.
6823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * @return true if ICC fdn service available
6833522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *         false if ICC fdn service not available
6843522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     */
6853522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccFdnAvailable() {
6863522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        return mIccFdnAvailable;
6873522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
6883522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
6893522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    /**
690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Set the ICC pin lock enabled or disabled
691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param enabled "true" for locked "false" for unlocked.
694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param password needed to change the ICC pin state, aka. Pin1
695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
700e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccLockEnabled (boolean enabled,
701e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            String password, Message onComplete) {
702e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
703e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int serviceClassX;
704e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
705e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_DATA +
706e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_FAX;
707e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
708e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDesiredPinLocked = enabled;
709e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
710e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_SIM,
711e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    enabled, password, serviceClassX, mAid,
712e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mHandler.obtainMessage(EVENT_CHANGE_FACILITY_LOCK_DONE, onComplete));
713e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
714e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
715e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
716e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
717e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Set the ICC fdn enabled or disabled
718e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
719e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
720e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param enabled "true" for locked "false" for unlocked.
721e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param password needed to change the ICC fdn enable, aka Pin2
722e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
723e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
724e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
725e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
726e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
727e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccFdnEnabled (boolean enabled,
728e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            String password, Message onComplete) {
729e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
730e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int serviceClassX;
731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
732e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_DATA +
733e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_FAX +
734e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_SMS;
735e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
736e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDesiredFdnEnabled = enabled;
737e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
738e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_FD,
739e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    enabled, password, serviceClassX, mAid,
740e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mHandler.obtainMessage(EVENT_CHANGE_FACILITY_FDN_DONE, onComplete));
741e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
742e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
743e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
744e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
745e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Change the ICC password used in ICC pin lock
746e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
747e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
748e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param oldPassword is the old password
749e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param newPassword is the new password
750e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
751e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
7523522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     *        onComplete.arg1 = attempts remaining or -1 if unknown
753e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
754e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
755e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
756e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccLockPassword(String oldPassword, String newPassword,
757e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message onComplete) {
758e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
759e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("changeIccLockPassword");
760e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.changeIccPinForApp(oldPassword, newPassword, mAid,
7613522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mHandler.obtainMessage(EVENT_CHANGE_PIN1_DONE, onComplete));
762e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
763e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
764e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
765e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
766e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Change the ICC password used in ICC fdn enable
767e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
768e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
769e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param oldPassword is the old password
770e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param newPassword is the new password
771e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
772e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
773e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
774e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
775e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
776e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccFdnPassword(String oldPassword, String newPassword,
777e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message onComplete) {
778e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
779e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("changeIccFdnPassword");
780e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.changeIccPin2ForApp(oldPassword, newPassword, mAid,
7813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville                    mHandler.obtainMessage(EVENT_CHANGE_PIN2_DONE, onComplete));
7823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        }
7833522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
7843522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
7853522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    /**
7863522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * @return true if ICC card is PIN2 blocked
7873522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     */
7883522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccPin2Blocked() {
7893522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        synchronized (mLock) {
7903522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            return mPin2State == PinState.PINSTATE_ENABLED_BLOCKED;
7913522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        }
7923522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    }
7933522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville
7943522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    /**
7953522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     * @return true if ICC card is PUK2 blocked
7963522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville     */
7973522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville    public boolean getIccPuk2Blocked() {
7983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        synchronized (mLock) {
7993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville            return mPin2State == PinState.PINSTATE_ENABLED_PERM_BLOCKED;
800e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
801e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
802e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
803e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void log(String msg) {
804ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, msg);
805e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
806e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
807e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void loge(String msg) {
808ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, msg);
809e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
81005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
81105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
81205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("UiccCardApplication: " + this);
81305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUiccCard=" + mUiccCard);
81405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mAppState=" + mAppState);
81505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mAppType=" + mAppType);
81605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPersoSubState=" + mPersoSubState);
81705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mAid=" + mAid);
81805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mAppLabel=" + mAppLabel);
81905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPin1Replaced=" + mPin1Replaced);
82005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPin1State=" + mPin1State);
82105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPin2State=" + mPin2State);
82205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccFdnEnabled=" + mIccFdnEnabled);
82305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mDesiredFdnEnabled=" + mDesiredFdnEnabled);
82405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccLockEnabled=" + mIccLockEnabled);
82505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mDesiredPinLocked=" + mDesiredPinLocked);
82605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCi=" + mCi);
82705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccRecords=" + mIccRecords);
82805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccFh=" + mIccFh);
82905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mDestroyed=" + mDestroyed);
83005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mReadyRegistrants: size=" + mReadyRegistrants.size());
83105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mReadyRegistrants.size(); i++) {
83205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mReadyRegistrants[" + i + "]="
83305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mReadyRegistrants.get(i)).getHandler());
83405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
83505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mPinLockedRegistrants: size=" + mPinLockedRegistrants.size());
83605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mPinLockedRegistrants.size(); i++) {
83705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mPinLockedRegistrants[" + i + "]="
83805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mPinLockedRegistrants.get(i)).getHandler());
83905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
84005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mNetworkLockedRegistrants: size=" + mNetworkLockedRegistrants.size());
84105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mNetworkLockedRegistrants.size(); i++) {
84205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mNetworkLockedRegistrants[" + i + "]="
84305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mNetworkLockedRegistrants.get(i)).getHandler());
84405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
84505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
84605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
847e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka}
848