1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/* 2a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Copyright (C) 2014 The Android Open Source Project 3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * you may not use this file except in compliance with the License. 6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * You may obtain a copy of the License at 7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unless required by applicable law or agreed to in writing, software 11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See the License for the specific language governing permissions and 14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * limitations under the License. 15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony; 18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.res.Resources; 20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.*; 21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager; 22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult; 24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.BitSet; 26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.List; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.ArrayList; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.text.TextUtils; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler; 30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message; 31a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Registrant; 32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.RegistrantList; 33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.ServiceState; 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 36a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * TelephonyDevController - provides a unified view of the 37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * telephony hardware resources on a device. 38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * manages the set of HardwareConfig for the framework. 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepublic class TelephonyDevController extends Handler { 42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String LOG_TAG = "TDC"; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final boolean DBG = true; 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final Object mLock = new Object(); 45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_HARDWARE_CONFIG_CHANGED = 1; 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static TelephonyDevController sTelephonyDevController; 49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static ArrayList<HardwareConfig> mModems = new ArrayList<HardwareConfig>(); 50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static ArrayList<HardwareConfig> mSims = new ArrayList<HardwareConfig>(); 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static Message sRilHardwareConfig; 53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static void logd(String s) { 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, s); 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static void loge(String s) { 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, s); 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static TelephonyDevController create() { 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sTelephonyDevController != null) { 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException("TelephonyDevController already created!?!"); 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sTelephonyDevController = new TelephonyDevController(); 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sTelephonyDevController; 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static TelephonyDevController getInstance() { 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sTelephonyDevController == null) { 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException("TelephonyDevController not yet created!?!"); 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sTelephonyDevController; 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void initFromResource() { 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Resources resource = Resources.getSystem(); 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String[] hwStrings = resource.getStringArray( 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.array.config_telephonyHardware); 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hwStrings != null) { 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (String hwString : hwStrings) { 87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig hw = new HardwareConfig(hwString); 88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw != null) { 89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_MODEM) { 90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mModems); 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_SIM) { 92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mSims); 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private TelephonyDevController() { 100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville initFromResource(); 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mModems.trimToSize(); 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSims.trimToSize(); 104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * each RIL call this interface to register/unregister the unsolicited hardware 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * configuration callback data it can provide. 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static void registerRIL(CommandsInterface cmdsIf) { 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* get the current configuration from this ril... */ 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cmdsIf.getHardwareConfig(sRilHardwareConfig); 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* ... process it ... */ 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sRilHardwareConfig != null) { 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = (AsyncResult) sRilHardwareConfig.obj; 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception == null) { 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville handleGetHardwareConfigChanged(ar); 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* and register for async device configuration change. */ 121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cmdsIf.registerForHardwareConfigChanged(sTelephonyDevController, EVENT_HARDWARE_CONFIG_CHANGED, null); 122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static void unregisterRIL(CommandsInterface cmdsIf) { 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cmdsIf.unregisterForHardwareConfigChanged(sTelephonyDevController); 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * handle callbacks from RIL. 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void handleMessage(Message msg) { 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar; 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (msg.what) { 134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_HARDWARE_CONFIG_CHANGED: 135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("handleMessage: received EVENT_HARDWARE_CONFIG_CHANGED"); 136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) msg.obj; 137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville handleGetHardwareConfigChanged(ar); 138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("handleMessage: Unknown Event " + msg.what); 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * hardware configuration update or insert. 146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static void updateOrInsert(HardwareConfig hw, ArrayList<HardwareConfig> list) { 148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int size; 149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig item; 150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville size = list.size(); 152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0 ; i < size ; i++) { 153a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville item = list.get(i); 154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (item.uuid.compareTo(hw.uuid) == 0) { 155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("updateOrInsert: removing: " + item); 156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville list.remove(i); 1579c2f83fb889781ff2c0cd284fa5e8387bee39592Denis Hsu break; 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("updateOrInsert: inserting: " + hw); 161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville list.add(hw); 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * hardware configuration changed. 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static void handleGetHardwareConfigChanged(AsyncResult ar) { 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((ar.exception == null) && (ar.result != null)) { 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville List hwcfg = (List)ar.result; 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0 ; i < hwcfg.size() ; i++) { 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig hw = null; 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hw = (HardwareConfig) hwcfg.get(i); 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw != null) { 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_MODEM) { 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mModems); 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_SIM) { 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mSims); 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* error detected, ignore. are we missing some real time configutation 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * at this point? what to do... 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("handleGetHardwareConfigChanged - returned an error."); 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get total number of registered modem. 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static int getModemCount() { 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = mModems.size(); 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModemCount: " + count); 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return count; 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get modem at index 'index'. 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getModem(int index) { 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty()) { 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModem: no registered modem device?!?"); 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (index > getModemCount()) { 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModem: out-of-bounds access for modem device " + index + " max: " + getModemCount()); 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModem: " + index); 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mModems.get(index); 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get total number of registered sims. 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getSimCount() { 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = mSims.size(); 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getSimCount: " + count); 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return count; 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get sim at index 'index'. 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getSim(int index) { 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getSim: no registered sim device?!?"); 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (index > getSimCount()) { 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getSim: out-of-bounds access for sim device " + index + " max: " + getSimCount()); 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getSim: " + index); 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mSims.get(index); 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get modem associated with sim index 'simIndex'. 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getModemForSim(int simIndex) { 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty() || mSims.isEmpty()) { 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModemForSim: no registered modem/sim device?!?"); 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (simIndex > getSimCount()) { 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModemForSim: out-of-bounds access for sim device " + simIndex + " max: " + getSimCount()); 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModemForSim " + simIndex); 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig sim = getSim(simIndex); 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig modem: mModems) { 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (modem.uuid.equals(sim.modemUuid)) { 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return modem; 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all sim's associated with modem at index 'modemIndex'. 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllSimsForModem(int modemIndex) { 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getAllSimsForModem: no registered sim device?!?"); 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (modemIndex > getModemCount()) { 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getAllSimsForModem: out-of-bounds access for modem device " + modemIndex + " max: " + getModemCount()); 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllSimsForModem " + modemIndex); 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> result = new ArrayList<HardwareConfig>(); 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig modem = getModem(modemIndex); 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig sim: mSims) { 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sim.modemUuid.equals(modem.uuid)) { 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result.add(sim); 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return result; 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all modem's registered. 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllModems() { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> modems = new ArrayList<HardwareConfig>(); 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty()) { 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllModems: empty list."); 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig modem: mModems) { 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville modems.add(modem); 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return modems; 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all sim's registered. 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllSims() { 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> sims = new ArrayList<HardwareConfig>(); 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllSims: empty list."); 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig sim: mSims) { 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sims.add(sim); 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sims; 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 345