1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.telephony.qns;
18 
19 import android.content.Context;
20 import android.util.Log;
21 import android.util.SparseArray;
22 
23 import com.android.internal.annotations.VisibleForTesting;
24 
25 import java.io.PrintWriter;
26 import java.util.ArrayList;
27 import java.util.List;
28 
29 /**
30  * QnsComponents stores all the components used in QNS. It maintains the lifecycle of QNS classes.
31  * All QNS components are initialed at construction of this class.
32  */
33 class QnsComponents {
34 
35     private final String mLogTag = QnsComponents.class.getSimpleName();
36     private final Context mContext;
37     private final SparseArray<CellularNetworkStatusTracker> mCellularNetworkStatusTrackers;
38     private final SparseArray<CellularQualityMonitor> mCellularQualityMonitors;
39     private final SparseArray<QnsImsManager> mQnsImsManagers;
40     private final SparseArray<QnsCarrierConfigManager> mQnsCarrierConfigManagers;
41     private final SparseArray<QnsEventDispatcher> mQnsEventDispatchers;
42     private final SparseArray<QnsProvisioningListener> mQnsProvisioningListeners;
43     private final SparseArray<QnsTelephonyListener> mQnsTelephonyListeners;
44     private final SparseArray<QnsCallStatusTracker> mQnsCallStatusTracker;
45     private final SparseArray<WifiBackhaulMonitor> mWifiBackhaulMonitors;
46     private final List<Integer> mSlotIds;
47     private IwlanNetworkStatusTracker mIwlanNetworkStatusTracker;
48     private QnsTimer mQnsTimer;
49     private WifiQualityMonitor mWifiQualityMonitor;
50     private QnsMetrics mQnsMetrics;
51 
52     /** Constructor to instantiate QnsComponents class. */
QnsComponents(Context context)53     QnsComponents(Context context) {
54         mContext = context;
55         mCellularNetworkStatusTrackers = new SparseArray<>();
56         mCellularQualityMonitors = new SparseArray<>();
57         mQnsImsManagers = new SparseArray<>();
58         mQnsCarrierConfigManagers = new SparseArray<>();
59         mQnsEventDispatchers = new SparseArray<>();
60         mQnsProvisioningListeners = new SparseArray<>();
61         mQnsTelephonyListeners = new SparseArray<>();
62         mQnsCallStatusTracker = new SparseArray<>();
63         mWifiBackhaulMonitors = new SparseArray<>();
64         mSlotIds = new ArrayList<>();
65     }
66 
67     /** It initialises all the QNS components for given slotId */
createQnsComponents(int slotId)68     synchronized void createQnsComponents(int slotId) {
69         mSlotIds.add(slotId);
70         mQnsTelephonyListeners.put(slotId, new QnsTelephonyListener(mContext, slotId));
71         mQnsImsManagers.put(slotId, new QnsImsManager(mContext, slotId));
72         mCellularNetworkStatusTrackers.put(
73                 slotId,
74                 new CellularNetworkStatusTracker(mQnsTelephonyListeners.get(slotId), slotId));
75         mQnsProvisioningListeners.put(
76                 slotId, new QnsProvisioningListener(mContext, mQnsImsManagers.get(slotId), slotId));
77         mQnsEventDispatchers.put(
78                 slotId,
79                 new QnsEventDispatcher(
80                         mContext,
81                         mQnsProvisioningListeners.get(slotId),
82                         mQnsImsManagers.get(slotId),
83                         slotId));
84         mQnsCarrierConfigManagers.put(
85                 slotId,
86                 new QnsCarrierConfigManager(mContext, mQnsEventDispatchers.get(slotId), slotId));
87         mCellularQualityMonitors.put(
88                 slotId,
89                 new CellularQualityMonitor(mContext,
90                         mQnsCarrierConfigManagers.get(slotId),
91                         mQnsTelephonyListeners.get(slotId),
92                         slotId));
93         if (mQnsTimer == null) {
94             mQnsTimer = new QnsTimer(mContext);
95         }
96         mQnsCallStatusTracker.put(
97                 slotId,
98                 new QnsCallStatusTracker(
99                         mQnsTelephonyListeners.get(slotId),
100                         mQnsCarrierConfigManagers.get(slotId),
101                         mQnsTimer,
102                         slotId));
103         mWifiBackhaulMonitors.put(
104                 slotId,
105                 new WifiBackhaulMonitor(
106                         mContext,
107                         mQnsCarrierConfigManagers.get(slotId),
108                         mQnsImsManagers.get(slotId),
109                         mQnsTimer,
110                         slotId));
111         if (mWifiQualityMonitor == null) {
112             mWifiQualityMonitor = new WifiQualityMonitor(mContext, mQnsTimer);
113         }
114         if (mIwlanNetworkStatusTracker == null) {
115             mIwlanNetworkStatusTracker = new IwlanNetworkStatusTracker(mContext);
116         }
117         mIwlanNetworkStatusTracker.initBySlotIndex(
118                 mQnsCarrierConfigManagers.get(slotId),
119                 mQnsEventDispatchers.get(slotId),
120                 mQnsImsManagers.get(slotId),
121                 mQnsTelephonyListeners.get(slotId),
122                 slotId);
123         if (mQnsMetrics == null) {
124             mQnsMetrics = new QnsMetrics(mContext);
125         }
126 
127         Log.d(mLogTag, "QnsComponents created for slot " + slotId);
128     }
129 
130     @VisibleForTesting
QnsComponents( Context context, CellularNetworkStatusTracker cellularNetworkStatusTracker, CellularQualityMonitor cellularQualityMonitor, IwlanNetworkStatusTracker iwlanNetworkStatusTracker, QnsImsManager qnsImsManager, QnsCarrierConfigManager qnsCarrierConfigManager, QnsEventDispatcher qnsEventDispatcher, QnsProvisioningListener qnsProvisioningListener, QnsTelephonyListener qnsTelephonyListener, QnsCallStatusTracker qnsCallStatusTracker, QnsTimer qnsTimer, WifiBackhaulMonitor wifiBackhaulMonitor, WifiQualityMonitor wifiQualityMonitor, QnsMetrics qnsMetrics, int slotId)131     QnsComponents(
132             Context context,
133             CellularNetworkStatusTracker cellularNetworkStatusTracker,
134             CellularQualityMonitor cellularQualityMonitor,
135             IwlanNetworkStatusTracker iwlanNetworkStatusTracker,
136             QnsImsManager qnsImsManager,
137             QnsCarrierConfigManager qnsCarrierConfigManager,
138             QnsEventDispatcher qnsEventDispatcher,
139             QnsProvisioningListener qnsProvisioningListener,
140             QnsTelephonyListener qnsTelephonyListener,
141             QnsCallStatusTracker qnsCallStatusTracker,
142             QnsTimer qnsTimer,
143             WifiBackhaulMonitor wifiBackhaulMonitor,
144             WifiQualityMonitor wifiQualityMonitor,
145             QnsMetrics qnsMetrics,
146             int slotId) {
147         this(context);
148         mSlotIds.add(slotId);
149         mQnsTelephonyListeners.put(slotId, qnsTelephonyListener);
150         mQnsImsManagers.put(slotId, qnsImsManager);
151         mCellularNetworkStatusTrackers.put(slotId, cellularNetworkStatusTracker);
152         mCellularQualityMonitors.put(slotId, cellularQualityMonitor);
153         mQnsCallStatusTracker.put(slotId, qnsCallStatusTracker);
154 
155         mQnsProvisioningListeners.put(slotId, qnsProvisioningListener);
156         mQnsEventDispatchers.put(slotId, qnsEventDispatcher);
157         mQnsCarrierConfigManagers.put(slotId, qnsCarrierConfigManager);
158         mWifiBackhaulMonitors.put(slotId, wifiBackhaulMonitor);
159 
160         mWifiQualityMonitor = wifiQualityMonitor;
161         mQnsTimer = qnsTimer;
162         mIwlanNetworkStatusTracker = iwlanNetworkStatusTracker;
163         mIwlanNetworkStatusTracker.initBySlotIndex(
164                 qnsCarrierConfigManager,
165                 qnsEventDispatcher,
166                 qnsImsManager,
167                 qnsTelephonyListener,
168                 slotId);
169         mQnsMetrics = qnsMetrics;
170     }
171 
172     /** Returns instance of CellularNetworkStatusTracker for given slotId. */
getCellularNetworkStatusTracker(int slotId)173     CellularNetworkStatusTracker getCellularNetworkStatusTracker(int slotId) {
174         return mCellularNetworkStatusTrackers.get(slotId);
175     }
176 
177     /** Returns instance of CellularQualityMonitor for given slotId. */
getCellularQualityMonitor(int slotId)178     CellularQualityMonitor getCellularQualityMonitor(int slotId) {
179         return mCellularQualityMonitors.get(slotId);
180     }
181 
182     /** Returns instance of QnsCallStatusTracker for given slotId. */
getQnsCallStatusTracker(int slotId)183     QnsCallStatusTracker getQnsCallStatusTracker(int slotId) {
184         return mQnsCallStatusTracker.get(slotId);
185     }
186 
187     /** Returns instance of QnsImsManager for given slotId. */
getQnsImsManager(int slotId)188     QnsImsManager getQnsImsManager(int slotId) {
189         return mQnsImsManagers.get(slotId);
190     }
191 
192     /** Returns instance of QnsCarrierConfigManager for given slotId. */
getQnsCarrierConfigManager(int slotId)193     QnsCarrierConfigManager getQnsCarrierConfigManager(int slotId) {
194         return mQnsCarrierConfigManagers.get(slotId);
195     }
196 
197     /** Returns instance of QnsEventDispatcher for given slotId. */
getQnsEventDispatcher(int slotId)198     QnsEventDispatcher getQnsEventDispatcher(int slotId) {
199         return mQnsEventDispatchers.get(slotId);
200     }
201 
202     /** Returns instance of QnsProvisioningListener for given slotId. */
getQnsProvisioningListener(int slotId)203     QnsProvisioningListener getQnsProvisioningListener(int slotId) {
204         return mQnsProvisioningListeners.get(slotId);
205     }
206 
207     /** Returns instance of QnsTelephonyListener for given slotId. */
getQnsTelephonyListener(int slotId)208     QnsTelephonyListener getQnsTelephonyListener(int slotId) {
209         return mQnsTelephonyListeners.get(slotId);
210     }
211 
212     /** Returns instance of WifiBackhaulMonitor for given slotId. */
getWifiBackhaulMonitor(int slotId)213     WifiBackhaulMonitor getWifiBackhaulMonitor(int slotId) {
214         return mWifiBackhaulMonitors.get(slotId);
215     }
216 
217     /** Returns instance of IwlanNetworkStatusTracker. */
getIwlanNetworkStatusTracker()218     IwlanNetworkStatusTracker getIwlanNetworkStatusTracker() {
219         return mIwlanNetworkStatusTracker;
220     }
221 
222     /** Returns instance of WifiQualityMonitor. */
getWifiQualityMonitor()223     WifiQualityMonitor getWifiQualityMonitor() {
224         return mWifiQualityMonitor;
225     }
226 
227     /** Returns instance of QnsTimer. */
getQnsTimer()228     QnsTimer getQnsTimer() {
229         return mQnsTimer;
230     }
231 
232     /** Returns instance of WifiQualityMonitor. */
getQnsMetrics()233     QnsMetrics getQnsMetrics() {
234         return mQnsMetrics;
235     }
236 
237     /** Returns context. */
getContext()238     Context getContext() {
239         return mContext;
240     }
241 
242     /** It closes all the components of QNS of given slotId. */
closeComponents(int slotId)243     synchronized void closeComponents(int slotId) {
244         if (!mSlotIds.contains(slotId)) return;
245         mIwlanNetworkStatusTracker.closeBySlotIndex(slotId);
246         if (mSlotIds.size() == 1) {
247             mIwlanNetworkStatusTracker.close();
248             mWifiQualityMonitor.close();
249             mQnsMetrics.close();
250             mIwlanNetworkStatusTracker = null;
251             mWifiQualityMonitor = null;
252             mQnsMetrics = null;
253         }
254 
255         WifiBackhaulMonitor wifiBackhaulMonitor = mWifiBackhaulMonitors.get(slotId);
256         if (wifiBackhaulMonitor != null) {
257             mWifiBackhaulMonitors.remove(slotId);
258             wifiBackhaulMonitor.close();
259         }
260         QnsCallStatusTracker qnsCallStatusTracker = mQnsCallStatusTracker.get(slotId);
261         if (qnsCallStatusTracker != null) {
262             mQnsCallStatusTracker.remove(slotId);
263             qnsCallStatusTracker.close();
264         }
265         if (mSlotIds.size() == 1) {
266             mQnsTimer.close();
267             mQnsTimer = null;
268         }
269         CellularQualityMonitor cellularQualityMonitor = mCellularQualityMonitors.get(slotId);
270         if (cellularQualityMonitor != null) {
271             mCellularQualityMonitors.remove(slotId);
272             cellularQualityMonitor.close();
273         }
274         QnsCarrierConfigManager qnsCarrierConfigManager = mQnsCarrierConfigManagers.get(slotId);
275         if (qnsCarrierConfigManager != null) {
276             mQnsCarrierConfigManagers.remove(slotId);
277             qnsCarrierConfigManager.close();
278         }
279         QnsEventDispatcher qnsEventDispatcher = mQnsEventDispatchers.get(slotId);
280         if (qnsEventDispatcher != null) {
281             mQnsEventDispatchers.remove(slotId);
282             qnsEventDispatcher.close();
283         }
284         QnsProvisioningListener qnsProvisioningListener = mQnsProvisioningListeners.get(slotId);
285         if (qnsProvisioningListener != null) {
286             mQnsProvisioningListeners.remove(slotId);
287             qnsProvisioningListener.close();
288         }
289         CellularNetworkStatusTracker cellularTracker = mCellularNetworkStatusTrackers.get(slotId);
290         if (cellularTracker != null) {
291             mCellularNetworkStatusTrackers.remove(slotId);
292             cellularTracker.close();
293         }
294         QnsImsManager qnsImsManager = mQnsImsManagers.get(slotId);
295         if (qnsImsManager != null) {
296             mQnsImsManagers.remove(slotId);
297             qnsImsManager.close();
298         }
299         QnsTelephonyListener qnsTelephonyListener = mQnsTelephonyListeners.get(slotId);
300         if (qnsTelephonyListener != null) {
301             mQnsTelephonyListeners.remove(slotId);
302             qnsTelephonyListener.close();
303         }
304 
305         mSlotIds.remove(Integer.valueOf(slotId));
306         Log.d(mLogTag, "QnsComponents closed for slot " + slotId);
307     }
308 
dump(PrintWriter pw)309     void dump(PrintWriter pw) {
310         if (mIwlanNetworkStatusTracker != null) {
311             mIwlanNetworkStatusTracker.dump(pw, "  ");
312         }
313         if (mIwlanNetworkStatusTracker != null) {
314             mWifiQualityMonitor.dump(pw, "  ");
315         }
316         if (mIwlanNetworkStatusTracker != null) {
317             mQnsTimer.dump(pw, " ");
318         }
319     }
320 }
321