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
17e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapackage com.android.internal.telephony;
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;
25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.util.Log;
26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState;
28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppType;
29e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.PersoSubState;
30e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardStatus.PinState;
31e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.RuimFileHandler;
32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.RuimRecords;
33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.gsm.SIMFileHandler;
34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.gsm.SIMRecords;
35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.ims.IsimFileHandler;
36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.ims.IsimUiccRecords;
37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/**
39e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@hide}
40e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */
41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class UiccCardApplication {
42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final String LOG_TAG = "RIL_UiccCardApplication";
43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final boolean DBG = true;
44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
45e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_QUERY_FACILITY_FDN_DONE = 1;
46e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 2;
47e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_QUERY_FACILITY_LOCK_DONE = 3;
48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 4;
49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
50e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private final Object  mLock = new Object();
51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccCard      mUiccCard; //parent
52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private AppState      mAppState;
53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private AppType       mAppType;
54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PersoSubState mPersoSubState;
55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String        mAid;
56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private String        mAppLabel;
57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mPin1Replaced;
58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PinState      mPin1State;
59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private PinState      mPin2State;
60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mIccFdnEnabled;
61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mDesiredFdnEnabled;
62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mIccLockEnabled;
63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean       mDesiredPinLocked;
64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private CommandsInterface mCi;
66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Context mContext;
67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccRecords mIccRecords;
68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccFileHandler mIccFh;
69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private boolean mDestroyed;//set to true once this App is commanded to be disposed of.
71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mReadyRegistrants = new RegistrantList();
73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mPinLockedRegistrants = new RegistrantList();
74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private RegistrantList mNetworkLockedRegistrants = new RegistrantList();
75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    UiccCardApplication(UiccCard uiccCard,
77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        IccCardApplicationStatus as,
78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        Context c,
79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface ci) {
80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (DBG) log("Creating UiccApp: " + as);
81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccCard = uiccCard;
82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppState = as.app_state;
83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppType = as.app_type;
84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPersoSubState = as.perso_substate;
85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAid = as.aid;
86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mAppLabel = as.app_label;
87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin1Replaced = (as.pin1_replaced != 0);
88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin1State = as.pin1;
89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mPin2State = as.pin2;
90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mContext = c;
92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi = ci;
93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mIccFh = createIccFileHandler(as.app_type);
95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mIccRecords = createIccRecords(as.app_type, mContext, mCi);
96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_READY) {
97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            queryFdn();
98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            queryPin1State();
99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) {
103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mDestroyed) {
105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Application updated after destroyed! Fix me!");
106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log(mAppType + " update. New " + as);
110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mContext = c;
111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi = ci;
112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AppType oldAppType = mAppType;
113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AppState oldAppState = mAppState;
114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            PersoSubState oldPersoSubState = mPersoSubState;
115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppType = as.app_type;
116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppState = as.app_state;
117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPersoSubState = as.perso_substate;
118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAid = as.aid;
119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAppLabel = as.app_label;
120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin1Replaced = (as.pin1_replaced != 0);
121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin1State = as.pin1;
122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPin2State = as.pin2;
123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mAppType != oldAppType) {
125f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka                if (mIccFh != null) { mIccFh.dispose();}
126f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka                if (mIccRecords != null) { mIccRecords.dispose();}
127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccFh = createIccFileHandler(as.app_type);
128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords = createIccRecords(as.app_type, c, ci);
129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPersoSubState != oldPersoSubState &&
132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) {
133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyNetworkLockedRegistrantsIfNeeded(null);
134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mAppState != oldAppState) {
137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState);
138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // If the app state turns to APPSTATE_READY, then query FDN status,
139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //as it might have failed in earlier attempt.
140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mAppState == AppState.APPSTATE_READY) {
141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    queryFdn();
142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    queryPin1State();
143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyPinLockedRegistrantsIfNeeded(null);
145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                notifyReadyRegistrantsIfNeeded(null);
146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    void dispose() {
151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log(mAppType + " being Disposed");
153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDestroyed = true;
154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccRecords != null) { mIccRecords.dispose();}
155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mIccFh != null) { mIccFh.dispose();}
156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccRecords = null;
157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccFh = null;
158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) {
162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) {
163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new SIMRecords(this, c, ci);
164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){
165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new RuimRecords(this, c, ci);
166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else if (type == AppType.APPTYPE_ISIM) {
167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return new IsimUiccRecords(this, c, ci);
168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else {
169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            // Unknown app type (maybe detection is still in progress)
170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
174e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IccFileHandler createIccFileHandler(AppType type) {
175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        switch (type) {
176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_SIM:
177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new SIMFileHandler(this, mAid, mCi);
178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_RUIM:
179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new RuimFileHandler(this, mAid, mCi);
180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_USIM:
181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new UsimFileHandler(this, mAid, mCi);
182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_CSIM:
183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new CsimFileHandler(this, mAid, mCi);
184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case APPTYPE_ISIM:
185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return new IsimFileHandler(this, mAid, mCi);
186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            default:
187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return null;
188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** Assumes mLock is held. */
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void queryFdn() {
193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        //This shouldn't change run-time. So needs to be called only once.
194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        int serviceClassX;
195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface.SERVICE_CLASS_DATA +
198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        CommandsInterface.SERVICE_CLASS_FAX;
199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.queryFacilityLockForApp (
200e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.CB_FACILITY_BA_FD, "", serviceClassX,
201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_FDN_DONE));
202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Interpret EVENT_QUERY_FACILITY_LOCK_DONE
205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param ar is asyncResult of Query_Facility_Locked
206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onQueryFdnEnabled(AsyncResult ar) {
208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception != null) {
210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Error in querying facility lock:" + ar.exception);
211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int[] ints = (int[])ar.result;
215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if(ints.length != 0) {
216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccFdnEnabled = (0!=ints[0]);
217e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Query facility lock : "  + mIccFdnEnabled);
218e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
219e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Bogus facility lock response");
220e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
222e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
223e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
224e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onChangeFdnDone(AsyncResult ar) {
225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception == null) {
227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccFdnEnabled = mDesiredFdnEnabled;
228e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("EVENT_CHANGE_FACILITY_FDN_DONE: " +
229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        "mIccFdnEnabled=" + mIccFdnEnabled);
230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Error change facility fdn with exception " + ar.exception);
232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message response = (Message)ar.userObj;
234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AsyncResult.forMessage(response).exception = ar.exception;
235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            response.sendToTarget();
236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed, assumes mLock is held */
240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void queryPin1State() {
241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        int serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
242e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.SERVICE_CLASS_DATA +
243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                CommandsInterface.SERVICE_CLASS_FAX;
244e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.queryFacilityLockForApp (
245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            CommandsInterface.CB_FACILITY_BA_SIM, "", serviceClassX,
246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_LOCK_DONE));
247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
248e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed*/
250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onQueryFacilityLock(AsyncResult ar) {
251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if(ar.exception != null) {
253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Error in querying facility lock:" + ar.exception);
254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
256e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int[] ints = (int[])ar.result;
258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if(ints.length != 0) {
259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Query facility lock : "  + ints[0]);
260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccLockEnabled = (ints[0] != 0);
262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mIccLockEnabled) {
264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPinLockedRegistrants.notifyRegistrants();
265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Sanity check: we expect mPin1State to match mIccLockEnabled.
268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // When mPin1State is DISABLED mIccLockEanbled should be false.
269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // When mPin1State is ENABLED mIccLockEnabled should be true.
270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //
271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Here we validate these assumptions to assist in identifying which ril/radio's
272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // have not correctly implemented GET_SIM_STATUS
273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                switch (mPin1State) {
274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_DISABLED:
275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (mIccLockEnabled) {
276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            loge("QUERY_FACILITY_LOCK:enabled GET_SIM_STATUS.Pin1:disabled."
277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                    + " Fixme");
278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        }
279e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        break;
280e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_NOT_VERIFIED:
281e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_VERIFIED:
282e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_BLOCKED:
283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    case PINSTATE_ENABLED_PERM_BLOCKED:
284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (!mIccLockEnabled) {
285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            loge("QUERY_FACILITY_LOCK:disabled GET_SIM_STATUS.Pin1:enabled."
286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                    + " Fixme");
287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        }
288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Bogus facility lock response");
291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
295e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** REMOVE when mIccLockEnabled is not needed */
296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void onChangeFacilityLock(AsyncResult ar) {
297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (ar.exception == null) {
299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccLockEnabled = mDesiredPinLocked;
300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log( "EVENT_CHANGE_FACILITY_LOCK_DONE: mIccLockEnabled= "
301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        + mIccLockEnabled);
302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Error change facility lock with exception " + ar.exception);
304e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
305e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AsyncResult.forMessage(((Message)ar.userObj)).exception = ar.exception;
306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            ((Message)ar.userObj).sendToTarget();
307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Handler mHandler = new Handler() {
311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        @Override
312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        public void handleMessage(Message msg){
313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            AsyncResult ar;
314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mDestroyed) {
316e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Received message " + msg + "[" + msg.what
317e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        + "] while being destroyed. Ignoring.");
318e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
319e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
320e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
321e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            switch (msg.what) {
322e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_QUERY_FACILITY_FDN_DONE:
323e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
324e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onQueryFdnEnabled(ar);
325e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
326e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_CHANGE_FACILITY_FDN_DONE:
327e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
328e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onChangeFdnDone(ar);
329e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
330e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_QUERY_FACILITY_LOCK_DONE:
331e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
332e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onQueryFacilityLock(ar);
333e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
334e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_CHANGE_FACILITY_LOCK_DONE:
335e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    ar = (AsyncResult)msg.obj;
336e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onChangeFacilityLock(ar);
337e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
338e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                default:
339e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    loge("Unknown Event " + msg.what);
340e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
341e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    };
343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
344e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForReady(Handler h, int what, Object obj) {
345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
346e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
347e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mReadyRegistrants.add(r);
348e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyReadyRegistrantsIfNeeded(r);
349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForReady(Handler h) {
353e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mReadyRegistrants.remove(h);
355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
357e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.isPinLocked()
360e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
361e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForLocked(Handler h, int what, Object obj) {
362e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
363e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
364e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.add(r);
365e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyPinLockedRegistrantsIfNeeded(r);
366e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
367e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
368e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
369e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForLocked(Handler h) {
370e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
371e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mPinLockedRegistrants.remove(h);
372e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
373e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
374e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
375e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
376e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies handler of any transition into State.NETWORK_LOCKED
377e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
378e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForNetworkLocked(Handler h, int what, Object obj) {
379e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.add(r);
382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            notifyNetworkLockedRegistrantsIfNeeded(r);
383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForNetworkLocked(Handler h) {
387e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
388e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mNetworkLockedRegistrants.remove(h);
389e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
393e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
394e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
395e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
396e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
397e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyReadyRegistrantsIfNeeded(Registrant r) {
398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_READY) {
402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1State == PinState.PINSTATE_ENABLED_NOT_VERIFIED ||
403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_ENABLED_BLOCKED ||
404e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) {
405e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Sanity check failed! APPSTATE is ready while PIN1 is not verified!!!");
406e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                // Don't notify if application is in insane state
407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: READY");
411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mReadyRegistrants.notifyRegistrants();
412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: READY");
414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyPinLockedRegistrantsIfNeeded(Registrant r) {
425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
428e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
429e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_PIN ||
430e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mAppState == AppState.APPSTATE_PUK) {
431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1State == PinState.PINSTATE_ENABLED_VERIFIED ||
432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mPin1State == PinState.PINSTATE_DISABLED) {
433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                loge("Sanity check failed! APPSTATE is locked while PIN1 is not!!!");
434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                //Don't notify if application is in insane state
435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return;
436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: LOCKED");
439e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mPinLockedRegistrants.notifyRegistrants();
440e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: LOCKED");
442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Notifies specified registrant, assume mLock is held.
449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
450e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param r Registrant to be notified. If null - all registrants will be notified
451e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
452e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void notifyNetworkLockedRegistrantsIfNeeded(Registrant r) {
453e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed) {
454e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mAppState == AppState.APPSTATE_SUBSCRIPTION_PERSO &&
458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) {
459e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (r == null) {
460e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying registrants: NETWORK_LOCKED");
461e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mNetworkLockedRegistrants.notifyRegistrants();
462e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            } else {
463e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (DBG) log("Notifying 1 registrant: NETWORK_LOCED");
464e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                r.notifyRegistrant(new AsyncResult(null, null, null));
465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
466e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
467e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
468e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public AppState getState() {
470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAppState;
472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
473e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
474e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
475e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public AppType getType() {
476e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
477e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAppType;
478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
481e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public PersoSubState getPersoSubState() {
482e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
483e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mPersoSubState;
484e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
485e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public String getAid() {
488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
489e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mAid;
490e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
491e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
492e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
493e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public PinState getPin1State() {
494e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
495e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mPin1Replaced) {
496e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mUiccCard.getUniversalPinState();
497e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
498e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mPin1State;
499e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
500e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
501e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
502e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccFileHandler getIccFileHandler() {
503e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
504e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccFh;
505e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
506e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
507e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
508e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccRecords getIccRecords() {
509e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
510e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccRecords;
511e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
512e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
513e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
514e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
515e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Supply the ICC PIN to the ICC
516e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
517e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its
518e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Handler.
519e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
520e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * onComplete.obj will be an AsyncResult
521e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
522e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception == null on success
523e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception != null on fail
524e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
525e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * If the supplied PIN is incorrect:
526e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * ((AsyncResult)onComplete.obj).exception != null
527e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * && ((AsyncResult)onComplete.obj).exception
528e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *       instanceof com.android.internal.telephony.gsm.CommandException)
529e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * && ((CommandException)(((AsyncResult)onComplete.obj).exception))
530e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *          .getCommandError() == CommandException.Error.PASSWORD_INCORRECT
531e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
532e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
533e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
534e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin (String pin, Message onComplete) {
535e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
536e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyIccPin(pin, onComplete);
537e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk (String puk, String newPin, Message onComplete) {
541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyIccPuk(puk, newPin, onComplete);
543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPin2 (String pin2, Message onComplete) {
547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyIccPin2(pin2, onComplete);
549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyPuk2 (String puk2, String newPin2, Message onComplete) {
553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyIccPuk2(puk2, newPin2, onComplete);
555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void supplyNetworkDepersonalization (String pin, Message onComplete) {
559e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
560e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("supplyNetworkDepersonalization");
561e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.supplyNetworkDepersonalization(pin, onComplete);
562e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
563e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
564e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Check whether ICC pin lock is enabled
567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * This is a sync call which returns the cached pin enabled state
568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @return true for ICC locked enabled
570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *         false for ICC locked disabled
571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccLockEnabled() {
573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mIccLockEnabled;
574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        /* STOPSHIP: Remove line above and all code associated with setting
575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka           mIccLockEanbled once all RIL correctly sends the pin1 state.
576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        // Use getPin1State to take into account pin1Replaced flag
577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        PinState pinState = getPin1State();
578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return pinState == PinState.PINSTATE_ENABLED_NOT_VERIFIED ||
579e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_VERIFIED ||
580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_BLOCKED ||
581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka               pinState == PinState.PINSTATE_ENABLED_PERM_BLOCKED;*/
582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     }
583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Check whether ICC fdn (fixed dialing number) is enabled
586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * This is a sync call which returns the cached pin enabled state
587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @return true for ICC fdn enabled
589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *         false for ICC fdn disabled
590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
591e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public boolean getIccFdnEnabled() {
592e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
593e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mIccFdnEnabled;
594e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
598e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Set the ICC pin lock enabled or disabled
599e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
600e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
601e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param enabled "true" for locked "false" for unlocked.
602e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param password needed to change the ICC pin state, aka. Pin1
603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
606e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
607e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
608e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccLockEnabled (boolean enabled,
609e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            String password, Message onComplete) {
610e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
611e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int serviceClassX;
612e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
613e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_DATA +
614e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_FAX;
615e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
616e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDesiredPinLocked = enabled;
617e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
618e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_SIM,
619e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    enabled, password, serviceClassX, mAid,
620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mHandler.obtainMessage(EVENT_CHANGE_FACILITY_LOCK_DONE, onComplete));
621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
622e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Set the ICC fdn enabled or disabled
626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param enabled "true" for locked "false" for unlocked.
629e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param password needed to change the ICC fdn enable, aka Pin2
630e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setIccFdnEnabled (boolean enabled,
636e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            String password, Message onComplete) {
637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            int serviceClassX;
639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +
640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_DATA +
641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_FAX +
642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    CommandsInterface.SERVICE_CLASS_SMS;
643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mDesiredFdnEnabled = enabled;
645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_FD,
647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    enabled, password, serviceClassX, mAid,
648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mHandler.obtainMessage(EVENT_CHANGE_FACILITY_FDN_DONE, onComplete));
649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Change the ICC password used in ICC pin lock
654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param oldPassword is the old password
657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param newPassword is the new password
658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccLockPassword(String oldPassword, String newPassword,
664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message onComplete) {
665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("changeIccLockPassword");
667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.changeIccPinForApp(oldPassword, newPassword, mAid,
668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onComplete);
669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Change the ICC password used in ICC fdn enable
674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * When the operation is complete, onComplete will be sent to its handler
675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *
676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param oldPassword is the old password
677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param newPassword is the new password
678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param onComplete
679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        onComplete.obj will be an AsyncResult
680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception == null on success
681e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     *        ((AsyncResult)onComplete.obj).exception != null on fail
682e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
683e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void changeIccFdnPassword(String oldPassword, String newPassword,
684e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Message onComplete) {
685e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
686e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (DBG) log("changeIccFdnPassword");
687e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mCi.changeIccPin2ForApp(oldPassword, newPassword, mAid,
688e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onComplete);
689e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void log(String msg) {
693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        Log.d(LOG_TAG, msg);
694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private void loge(String msg) {
697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        Log.e(LOG_TAG, msg);
698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka}
700