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