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); 157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("updateOrInsert: inserting: " + hw); 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville list.add(hw); 161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * hardware configuration changed. 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static void handleGetHardwareConfigChanged(AsyncResult ar) { 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((ar.exception == null) && (ar.result != null)) { 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville List hwcfg = (List)ar.result; 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0 ; i < hwcfg.size() ; i++) { 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig hw = null; 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hw = (HardwareConfig) hwcfg.get(i); 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw != null) { 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_MODEM) { 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mModems); 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (hw.type == HardwareConfig.DEV_HARDWARE_TYPE_SIM) { 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateOrInsert(hw, mSims); 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* error detected, ignore. are we missing some real time configutation 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * at this point? what to do... 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("handleGetHardwareConfigChanged - returned an error."); 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get total number of registered modem. 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public static int getModemCount() { 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = mModems.size(); 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModemCount: " + count); 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return count; 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get modem at index 'index'. 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getModem(int index) { 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty()) { 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModem: no registered modem device?!?"); 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (index > getModemCount()) { 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModem: out-of-bounds access for modem device " + index + " max: " + getModemCount()); 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModem: " + index); 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mModems.get(index); 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get total number of registered sims. 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getSimCount() { 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = mSims.size(); 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getSimCount: " + count); 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return count; 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get sim at index 'index'. 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getSim(int index) { 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getSim: no registered sim device?!?"); 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (index > getSimCount()) { 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getSim: out-of-bounds access for sim device " + index + " max: " + getSimCount()); 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getSim: " + index); 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mSims.get(index); 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get modem associated with sim index 'simIndex'. 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public HardwareConfig getModemForSim(int simIndex) { 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty() || mSims.isEmpty()) { 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModemForSim: no registered modem/sim device?!?"); 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (simIndex > getSimCount()) { 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getModemForSim: out-of-bounds access for sim device " + simIndex + " max: " + getSimCount()); 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getModemForSim " + simIndex); 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig sim = getSim(simIndex); 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig modem: mModems) { 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (modem.uuid.equals(sim.modemUuid)) { 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return modem; 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all sim's associated with modem at index 'modemIndex'. 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllSimsForModem(int modemIndex) { 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getAllSimsForModem: no registered sim device?!?"); 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (modemIndex > getModemCount()) { 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("getAllSimsForModem: out-of-bounds access for modem device " + modemIndex + " max: " + getModemCount()); 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllSimsForModem " + modemIndex); 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> result = new ArrayList<HardwareConfig>(); 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HardwareConfig modem = getModem(modemIndex); 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig sim: mSims) { 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sim.modemUuid.equals(modem.uuid)) { 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result.add(sim); 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return result; 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all modem's registered. 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllModems() { 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> modems = new ArrayList<HardwareConfig>(); 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mModems.isEmpty()) { 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllModems: empty list."); 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig modem: mModems) { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville modems.add(modem); 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return modems; 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get all sim's registered. 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ArrayList<HardwareConfig> getAllSims() { 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ArrayList<HardwareConfig> sims = new ArrayList<HardwareConfig>(); 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSims.isEmpty()) { 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) logd("getAllSims: empty list."); 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (HardwareConfig sim: mSims) { 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sims.add(sim); 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sims; 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 344