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