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