UiccController.java revision cbaa45bbf2cab852b6c9c3a887e9f803d4e857ea
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
2e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Copyright (C) 2011-2012 The Android Open Source Project
3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License.
6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at
7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software
11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and
14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License.
15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.uicc;
18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Context;
20bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport android.os.AsyncResult;
21bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport android.os.Handler;
22bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport android.os.Message;
23bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport android.os.Registrant;
24bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport android.os.RegistrantList;
25ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.CommandsInterface;
28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
2905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
3005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
3105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/**
33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This class is responsible for keeping all knowledge about
34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Universal Integrated Circuit Card (UICC), also know as SIM's,
35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * in the system. It is also used as API to get appropriate
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * applications to pass them to phone and service trackers.
37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController is created with the call to make() function.
39e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController is a singleton and make() must only be called once
40e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * and throws an exception if called multiple times.
41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Once created UiccController registers with RIL for "on" and "unsol_sim_status_changed"
43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * notifications. When such notification arrives UiccController will call
44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * getIccCardStatus (GET_SIM_STATUS). Based on the response of GET_SIM_STATUS
45e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * request appropriate tree of uicc objects will be created.
46e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
47e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Following is class diagram for uicc classes:
48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                       UiccController
50e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                            #
51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                            |
52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                        UiccCard
53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                          #   #
54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                          |   ------------------
55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                    UiccCardApplication    CatService
56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                      #            #
57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                      |            |
58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                 IccRecords    IccFileHandler
59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                 ^ ^ ^           ^ ^ ^ ^ ^
60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *    SIMRecords---- | |           | | | | ---SIMFileHandler
61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *    RuimRecords----- |           | | | ----RuimFileHandler
62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *    IsimUiccRecords---           | | -----UsimFileHandler
63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                                 | ------CsimFileHandler
64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *                                 ----IsimFileHandler
65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Legend: # stands for Composition
67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *         ^ stands for Generalization
68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka *
69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * See also {@link com.android.internal.telephony.IccCard}
70cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and {@link com.android.internal.telephony.uicc.IccCardProxy}
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
72bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkapublic class UiccController extends Handler {
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final boolean DBG = true;
74cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "UiccController";
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public static final int APP_FAM_3GPP =  1;
77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public static final int APP_FAM_3GPP2 = 2;
78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public static final int APP_FAM_IMS   = 3;
79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
80bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    private static final int EVENT_ICC_STATUS_CHANGED = 1;
81bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    private static final int EVENT_GET_ICC_STATUS_DONE = 2;
82bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final Object mLock = new Object();
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static UiccController mInstance;
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private Context mContext;
87bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    private CommandsInterface mCi;
88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccCard mUiccCard;
89bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
90bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    private RegistrantList mIccChangedRegistrants = new RegistrantList();
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public static UiccController make(Context c, CommandsInterface ci) {
93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mInstance != null) {
95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                throw new RuntimeException("UiccController.make() should only be called once");
96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mInstance = new UiccController(c, ci);
98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mInstance;
99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
102bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public static UiccController getInstance() {
103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mInstance == null) {
105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                throw new RuntimeException(
106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        "UiccController.getInstance can't be called before make()");
107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mInstance;
109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public UiccCard getUiccCard() {
113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return mUiccCard;
115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    // Easy to use API
119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public UiccCardApplication getUiccCardApplication(int family) {
120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccCard != null) {
122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                return mUiccCard.getApplication(family);
123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
125e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
126bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
127bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    // Easy to use API
129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccRecords getIccRecords(int family) {
130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccCard != null) {
132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                UiccCardApplication app = mUiccCard.getApplication(family);
133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (app != null) {
134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    return app.getIccRecords();
135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    // Easy to use API
142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccFileHandler getIccFileHandler(int family) {
143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccCard != null) {
145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                UiccCardApplication app = mUiccCard.getApplication(family);
146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (app != null) {
147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    return app.getIccFileHandler();
148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                }
149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return null;
151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
154bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    //Notifies when card status changes
155bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public void registerForIccChanged(Handler h, int what, Object obj) {
156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            Registrant r = new Registrant (h, what, obj);
158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccChangedRegistrants.add(r);
159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            //Notify registrant right after registering, so that it will get the latest ICC status,
160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            //otherwise which may not happen until there is an actual change in ICC status.
161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            r.notifyRegistrant();
162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
163bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
165bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public void unregisterForIccChanged(Handler h) {
166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mIccChangedRegistrants.remove(h);
168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
169bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
170bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
171bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    @Override
172bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public void handleMessage (Message msg) {
173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        synchronized (mLock) {
174e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            switch (msg.what) {
175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_ICC_STATUS_CHANGED:
176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    if (DBG) log("Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mCi.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                case EVENT_GET_ICC_STATUS_DONE:
180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE");
181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    AsyncResult ar = (AsyncResult)msg.obj;
182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    onGetIccCardStatusDone(ar);
183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    break;
184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                default:
185ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                    Rlog.e(LOG_TAG, " Unknown Event " + msg.what);
186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
187bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
188bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
189bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private UiccController(Context c, CommandsInterface ci) {
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("Creating UiccController");
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mContext = c;
193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi = ci;
194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        // TODO remove this once modem correctly notifies the unsols
19622e3d13998dd36f78d14b3c5b8508ad6be689629Alex Yakavenka        mCi.registerForOn(this, EVENT_ICC_STATUS_CHANGED, null);
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
199bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    private synchronized void onGetIccCardStatusDone(AsyncResult ar) {
200bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (ar.exception != null) {
201ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"Error getting ICC status. "
202bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                    + "RIL_REQUEST_GET_ICC_STATUS should "
203bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                    + "never return an error", ar.exception);
204bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            return;
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
207bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        IccCardStatus status = (IccCardStatus)ar.result;
208bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccCard == null) {
210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            //Create new card
211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccCard = new UiccCard(mContext, mCi, status);
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        } else {
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            //Update already existing card
214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            mUiccCard.update(mContext, mCi , status);
215bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
216bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
217bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (DBG) log("Notifying IccChangedRegistrants");
218bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        mIccChangedRegistrants.notifyRegistrants();
219bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
220bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void log(String string) {
222ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, string);
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
22405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
22505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
22605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("UiccController: " + this);
22705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mContext=" + mContext);
22805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mInstance=" + mInstance);
22905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCi=" + mCi);
23005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUiccCard=" + mUiccCard);
23105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mIccChangedRegistrants: size=" + mIccChangedRegistrants.size());
23205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mIccChangedRegistrants.size(); i++) {
23305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mIccChangedRegistrants[" + i + "]="
23405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mIccChangedRegistrants.get(i)).getHandler());
23505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
23605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println();
23705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
23805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        if (mUiccCard != null) {
23905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            mUiccCard.dump(fd, pw, args);
24005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
24105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
242bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka}
243