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; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.CommandsInterface; 28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardStatus; 29e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccFileHandler; 30e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccRecords; 31e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.PhoneConstants; 32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.UiccCard; 33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.UiccCardApplication; 34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/** 36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This class is responsible for keeping all knowledge about 37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Universal Integrated Circuit Card (UICC), also know as SIM's, 38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * in the system. It is also used as API to get appropriate 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * applications to pass them to phone and service trackers. 40e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController is created with the call to make() function. 42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController is a singleton and make() must only be called once 43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * and throws an exception if called multiple times. 44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 45e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Once created UiccController registers with RIL for "on" and "unsol_sim_status_changed" 46e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * notifications. When such notification arrives UiccController will call 47e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * getIccCardStatus (GET_SIM_STATUS). Based on the response of GET_SIM_STATUS 48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * request appropriate tree of uicc objects will be created. 49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 50e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Following is class diagram for uicc classes: 51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController 53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * # 54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * | 55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccCard 56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * # # 57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * | ------------------ 58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccCardApplication CatService 59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * # # 60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * | | 61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * IccRecords IccFileHandler 62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ^ ^ ^ ^ ^ ^ ^ ^ 63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * SIMRecords---- | | | | | | ---SIMFileHandler 64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * RuimRecords----- | | | | ----RuimFileHandler 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * IsimUiccRecords--- | | -----UsimFileHandler 66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * | ------CsimFileHandler 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ----IsimFileHandler 68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Legend: # stands for Composition 70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ^ stands for Generalization 71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * See also {@link com.android.internal.telephony.IccCard} 73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * and {@link com.android.internal.telephony.IccCardProxy} 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 75bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkapublic class UiccController extends Handler { 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean DBG = true; 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String LOG_TAG = "RIL_UiccController"; 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public static final int APP_FAM_3GPP = 1; 80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public static final int APP_FAM_3GPP2 = 2; 81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public static final int APP_FAM_IMS = 3; 82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 83bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka private static final int EVENT_ICC_STATUS_CHANGED = 1; 84bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka private static final int EVENT_GET_ICC_STATUS_DONE = 2; 85bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final Object mLock = new Object(); 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static UiccController mInstance; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Context mContext; 90bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka private CommandsInterface mCi; 91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccCard mUiccCard; 92bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 93bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka private RegistrantList mIccChangedRegistrants = new RegistrantList(); 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public static UiccController make(Context c, CommandsInterface ci) { 96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mInstance != null) { 98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka throw new RuntimeException("UiccController.make() should only be called once"); 99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mInstance = new UiccController(c, ci); 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mInstance; 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public static UiccController getInstance() { 106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mInstance == null) { 108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka throw new RuntimeException( 109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka "UiccController.getInstance can't be called before make()"); 110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mInstance; 112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public UiccCard getUiccCard() { 116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mUiccCard; 118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Easy to use API 122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public UiccCardApplication getUiccCardApplication(int family) { 123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard != null) { 125e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mUiccCard.getApplication(family); 126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 129bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 130bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Easy to use API 132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccRecords getIccRecords(int family) { 133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard != null) { 135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication app = mUiccCard.getApplication(family); 136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (app != null) { 137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return app.getIccRecords(); 138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Easy to use API 145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccFileHandler getIccFileHandler(int family) { 146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard != null) { 148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication app = mUiccCard.getApplication(family); 149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (app != null) { 150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return app.getIccFileHandler(); 151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 157bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka //Notifies when card status changes 158bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public void registerForIccChanged(Handler h, int what, Object obj) { 159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccChangedRegistrants.add(r); 162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Notify registrant right after registering, so that it will get the latest ICC status, 163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //otherwise which may not happen until there is an actual change in ICC status. 164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(); 165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 166bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 168bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public void unregisterForIccChanged(Handler h) { 169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccChangedRegistrants.remove(h); 171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 172bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 173bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 174bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka @Override 175bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public void handleMessage (Message msg) { 176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (msg.what) { 178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_ICC_STATUS_CHANGED: 179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus"); 180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE)); 181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_GET_ICC_STATUS_DONE: 183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE"); 184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult ar = (AsyncResult)msg.obj; 185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onGetIccCardStatusDone(ar); 186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Log.e(LOG_TAG, " Unknown Event " + msg.what); 189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 190bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 191bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 192bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccController(Context c, CommandsInterface ci) { 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Creating UiccController"); 195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mContext = c; 196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi = ci; 197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null); 198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // TODO remove this once modem correctly notifies the unsols 19922e3d13998dd36f78d14b3c5b8508ad6be689629Alex Yakavenka mCi.registerForOn(this, EVENT_ICC_STATUS_CHANGED, null); 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 202bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka private synchronized void onGetIccCardStatusDone(AsyncResult ar) { 203bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (ar.exception != null) { 204bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka Log.e(LOG_TAG,"Error getting ICC status. " 205bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka + "RIL_REQUEST_GET_ICC_STATUS should " 206bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka + "never return an error", ar.exception); 207bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka return; 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 210bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka IccCardStatus status = (IccCardStatus)ar.result; 211bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard == null) { 213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Create new card 214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccCard = new UiccCard(mContext, mCi, status); 215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Update already existing card 217e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccCard.update(mContext, mCi , status); 218bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 219bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 220bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (DBG) log("Notifying IccChangedRegistrants"); 221bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka mIccChangedRegistrants.notifyRegistrants(); 222bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 223bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String string) { 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.d(LOG_TAG, string); 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 227bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka} 228