summaryrefslogtreecommitdiff
path: root/services/QualifiedNetworksService/src/com/android
diff options
context:
space:
mode:
authorsangyun <sangyun@google.com>2022-10-11 16:39:22 +0900
committerManish Dungriyal <mdungriyal@google.com>2022-11-21 07:05:26 +0000
commit6684b363a0a4f32a473b7673b0c30bb596e3ff47 (patch)
tree52c336d8d4bcd1b808dfbaabdb94a36e8da12492 /services/QualifiedNetworksService/src/com/android
parentb12fd951e40a315fe43cd7b8fd5f4eebaf96f324 (diff)
downloadTelephony-6684b363a0a4f32a473b7673b0c30bb596e3ff47.tar.gz
[QNS] Remove circular reference to components
Remove dependencies - QnsEventDispatcher in QnsProvisioningListener. - QnsProvisioningListener in IwlanNetworkStatusTracker. - QnsEventDispatcher in QnsImsManager Bug: 252951517 Test: atest QualifiedNetworksServiceTests Change-Id: I619342ea970e5245847556d597230916d94213c3
Diffstat (limited to 'services/QualifiedNetworksService/src/com/android')
-rw-r--r--services/QualifiedNetworksService/src/com/android/telephony/qns/QnsImsManager.java188
-rw-r--r--services/QualifiedNetworksService/src/com/android/telephony/qns/QnsProvisioningListener.java44
2 files changed, 134 insertions, 98 deletions
diff --git a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsImsManager.java b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsImsManager.java
index 894d4c7..7e111c4 100644
--- a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsImsManager.java
+++ b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsImsManager.java
@@ -23,8 +23,6 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
import android.os.PersistableBundle;
import android.os.SystemProperties;
import android.telephony.AccessNetworkConstants;
@@ -45,8 +43,6 @@ import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.ArrayList;
-import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
@@ -95,10 +91,33 @@ class QnsImsManager {
private ImsMmTelManager mImsMmTelManager;
private QnsImsStateCallback mQnsImsStateCallback;
private final QnsRegistrantList mQnsImsStateListener;
- private final QnsImsManagerHandler mQnsImsManagerHandler;
+ private final Handler mHandler;
+ private final HandlerThread mHandlerThread;
private QnsImsRegistrationCallback mQnsImsRegistrationCallback;
private final QnsRegistrantList mImsRegistrationStatusListeners;
private ImsRegistrationState mLastImsRegistrationState;
+ private final SubscriptionManager mSubscriptionManager;
+ private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+ @VisibleForTesting
+ final SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionsChangeListener =
+ new SubscriptionManager.OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ int newSubId = QnsUtils.getSubId(mContext, mSlotId);
+ if (newSubId != mSubId) {
+ mSubId = newSubId;
+ if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ clearQnsImsManager();
+ } else {
+ clearQnsImsManager();
+ initQnsImsManager();
+ registerImsStateCallback();
+ registerImsRegistrationCallback();
+ }
+ }
+ }
+ };
/** QnsImsManager default constructor */
QnsImsManager(Context context, int slotId) {
@@ -107,50 +126,122 @@ class QnsImsManager {
mSlotId = slotId;
mExecutor = new QnsImsManagerExecutor();
- HandlerThread handlerThread = new HandlerThread(mLogTag);
- handlerThread.start();
- mQnsImsManagerHandler = new QnsImsManagerHandler(handlerThread.getLooper());
+ mHandlerThread = new HandlerThread(mLogTag);
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
mQnsImsStateListener = new QnsRegistrantList();
mImsRegistrationStatusListeners = new QnsRegistrantList();
- initQnsImsManager();
+ if (!mQnsImsManagerInitialized) {
+ initQnsImsManager();
+ }
+ if (mQnsImsStateCallback == null) {
+ registerImsStateCallback();
+ }
+ if (mQnsImsRegistrationCallback == null) {
+ registerImsRegistrationCallback();
+ }
+
+ mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
+ if (mSubscriptionManager != null) {
+ mSubscriptionManager.addOnSubscriptionsChangedListener(
+ new QnsUtils.QnsExecutor(mHandler), mSubscriptionsChangeListener);
+ }
}
@VisibleForTesting
protected synchronized void initQnsImsManager() {
+ if (mConfigManager == null) {
+ mConfigManager = mContext.getSystemService(CarrierConfigManager.class);
+ if (mConfigManager == null) {
+ loge("initQnsImsManager: couldn't initialize. failed to get CarrierConfigManager.");
+ clearQnsImsManager();
+ return;
+ }
+ }
+
+ if (mImsManager == null) {
+ mImsManager = mContext.getSystemService(ImsManager.class);
+ if (mImsManager == null) {
+ loge("initQnsImsManager: couldn't initialize. failed to get ImsManager.");
+ clearQnsImsManager();
+ return;
+ }
+ }
+
int subId = getSubId();
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
return;
}
- try {
- mConfigManager = mContext.getSystemService(CarrierConfigManager.class);
- ImsManager imsManager = mContext.getSystemService(ImsManager.class);
- if (imsManager == null) {
+
+ mImsMmTelManager = mImsManager.getImsMmTelManager(subId);
+ if (mImsMmTelManager == null) {
+ loge("initQnsImsManager: couldn't initialize. failed to get ImsMmTelManager.");
+ clearQnsImsManager();
+ return;
+ }
+
+ mQnsImsManagerInitialized = true;
+
+ log("initQnsImsManager: initialized.");
+ }
+
+ @VisibleForTesting
+ protected synchronized void registerImsStateCallback() {
+ if (!mQnsImsManagerInitialized) {
+ initQnsImsManager();
+ if (mImsMmTelManager == null) {
return;
}
- ImsMmTelManager mmTelManager = imsManager.getImsMmTelManager(subId);
+ }
+
+ if (mQnsImsStateCallback != null) {
+ loge("registerImsStateCallback: already registered");
+ return;
+ }
+
+ try {
QnsImsStateCallback stateCallback = new QnsImsStateCallback();
- QnsImsRegistrationCallback registrationCallback = new QnsImsRegistrationCallback();
- mmTelManager.registerImsStateCallback(mExecutor, stateCallback);
- mmTelManager.registerImsRegistrationCallback(mExecutor, registrationCallback);
- log("initQnsImsManager: initialized and registered capability callback");
- mImsManager = imsManager;
- mImsMmTelManager = mmTelManager;
+ mImsMmTelManager.registerImsStateCallback(mExecutor, stateCallback);
+ log("registerImsStateCallback: registered Ims State Callback.");
mQnsImsStateCallback = stateCallback;
+ } catch (ImsException e) {
+ loge("registerImsStateCallback: couldn't register callback, " + e);
+ }
+ }
+
+ @VisibleForTesting
+ protected synchronized void registerImsRegistrationCallback() {
+ if (!mQnsImsManagerInitialized) {
+ initQnsImsManager();
+ if (mImsMmTelManager == null) {
+ return;
+ }
+ }
+
+ if (mQnsImsRegistrationCallback != null) {
+ loge("registerImsRegistrationCallback: already registered");
+ return;
+ }
+
+ try {
+ QnsImsRegistrationCallback registrationCallback = new QnsImsRegistrationCallback();
+ mImsMmTelManager.registerImsRegistrationCallback(mExecutor, registrationCallback);
+ log("registerImsRegistrationCallback: registered Ims Registration Callback.");
mQnsImsRegistrationCallback = registrationCallback;
- mQnsImsManagerInitialized = true;
- } catch (IllegalArgumentException | ImsException | NullPointerException e) {
- loge("initQnsImsManager: couldn't initialize or register ims callbacks, " + e);
- clearQnsImsManager();
+ } catch (ImsException e) {
+ loge("registerImsRegistrationCallback: couldn't register callback, " + e);
}
}
@VisibleForTesting
protected synchronized void clearQnsImsManager() {
log("clearQnsImsManager");
- if (mImsMmTelManager != null) {
+ if (mImsMmTelManager != null && mQnsImsStateCallback != null) {
mImsMmTelManager.unregisterImsStateCallback(mQnsImsStateCallback);
+ }
+ if (mImsMmTelManager != null && mQnsImsRegistrationCallback != null) {
mImsMmTelManager.unregisterImsRegistrationCallback(mQnsImsRegistrationCallback);
}
mImsManager = null;
@@ -162,45 +253,30 @@ class QnsImsManager {
@VisibleForTesting
protected synchronized void dispose() {
+ if (mSubscriptionManager != null) {
+ mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionsChangeListener);
+ }
+ mHandlerThread.quitSafely();
clearQnsImsManager();
mImsRegistrationStatusListeners.removeAll();
- mQnsImsManagerHandler.dispose();
sQnsImsManagerSparseArray.remove(mSlotId);
}
- private class QnsImsManagerHandler extends Handler {
- QnsImsManagerHandler(Looper looper) {
- super(looper);
- List<Integer> events = new ArrayList<>();
- events.add(QnsEventDispatcher.QNS_EVENT_SIM_LOADED);
- events.add(QnsEventDispatcher.QNS_EVENT_SIM_ABSENT);
- QnsEventDispatcher.getInstance(mContext, mSlotId).registerEvent(events, this);
- }
-
- void dispose() {
- QnsEventDispatcher.getInstance(mContext, mSlotId).unregisterEvent(this);
- }
-
- @Override
- public void handleMessage(Message message) {
- log("handleMessage msg=" + message.what);
- switch (message.what) {
- case QnsEventDispatcher.QNS_EVENT_SIM_LOADED:
- case QnsEventDispatcher.QNS_EVENT_SIM_ABSENT:
- clearQnsImsManager();
- break;
- default:
- break;
- }
- }
- }
-
private synchronized ImsMmTelManager getImsMmTelManagerOrThrowExceptionIfNotReady()
throws ImsException {
if (!mQnsImsManagerInitialized) {
initQnsImsManager();
}
- if (mImsManager == null || mImsMmTelManager == null || mQnsImsStateCallback == null) {
+ if (mQnsImsStateCallback == null) {
+ registerImsStateCallback();
+ }
+ if (mQnsImsRegistrationCallback == null) {
+ registerImsRegistrationCallback();
+ }
+ if (mImsManager == null
+ || mImsMmTelManager == null
+ || mQnsImsStateCallback == null
+ || mQnsImsRegistrationCallback == null) {
throw new ImsException(
"IMS service is down.", ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
}
@@ -397,6 +473,10 @@ class QnsImsManager {
private void onImsStateChanged(boolean imsAvailable) {
log("onImsStateChanged " + imsAvailable);
+ if (imsAvailable && mQnsImsRegistrationCallback == null) {
+ registerImsRegistrationCallback();
+ }
+
ImsState imsState = new ImsState(imsAvailable);
notifyImsStateChanged(imsState);
}
diff --git a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsProvisioningListener.java b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsProvisioningListener.java
index 194f3a5..cc7a7db 100644
--- a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsProvisioningListener.java
+++ b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsProvisioningListener.java
@@ -29,8 +29,6 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -42,7 +40,6 @@ class QnsProvisioningListener {
private static final int REG_CALLBACK_RETRY = 10; // 10 times
private static final int EVENT_BASE = 11000;
private static final int EVENT_REGISTER_PROVISIONING_CALLBACK = EVENT_BASE + 1;
- private static final int EVENT_IWLAN_NETWORK_STATUS_CHANGED = EVENT_BASE + 2;
private static final int EVENT_CALLBACK_REGISTERED = EVENT_BASE + 3;
private static final int EVENT_NOTIFY_PROVISION_INFO_CHANGED = EVENT_BASE + 4;
private static final int EVENT_IMS_STATE_CHANGED = EVENT_BASE + 5;
@@ -50,13 +47,11 @@ class QnsProvisioningListener {
private final Context mContext;
private final int mSlotIndex;
private final QnsProvisioningInfo mProvisioningInfo;
- private final QnsEventDispatcher mQnsEventDispatcher;
private final QnsImsManager mQnsImsManager;
@VisibleForTesting QnsProvisioningHandler mQnsProvisioningHandler;
private final QnsProvisioningCallback mQnsProvisioningCallback;
private final QnsRegistrantList mRegistrantList;
- protected IwlanNetworkStatusTracker mIwlanNetworkStatusTracker;
private ProvisioningManager mProvisioningManager;
private boolean mIsProvisioningCallbackRegistered;
@@ -73,19 +68,9 @@ class QnsProvisioningListener {
HandlerThread handlerThread = new HandlerThread(mLogTag);
handlerThread.start();
mQnsProvisioningHandler = new QnsProvisioningHandler(handlerThread.getLooper());
- mQnsEventDispatcher = QnsEventDispatcher.getInstance(context, slotIndex);
- List<Integer> events = new ArrayList<>();
- events.add(QnsEventDispatcher.QNS_EVENT_CARRIER_CONFIG_CHANGED);
- events.add(QnsEventDispatcher.QNS_EVENT_SIM_ABSENT);
- events.add(QnsEventDispatcher.QNS_EVENT_SIM_LOADED);
- mQnsEventDispatcher.registerEvent(events, mQnsProvisioningHandler);
registerProvisioningCallback();
- mIwlanNetworkStatusTracker = IwlanNetworkStatusTracker.getInstance(context);
- mIwlanNetworkStatusTracker.registerIwlanNetworksChanged(
- mSlotIndex, mQnsProvisioningHandler, EVENT_IWLAN_NETWORK_STATUS_CHANGED);
-
mQnsImsManager = QnsImsManager.getInstance(mContext, mSlotIndex);
mQnsImsManager.registerImsStateChanged(mQnsProvisioningHandler, EVENT_IMS_STATE_CHANGED);
}
@@ -96,10 +81,7 @@ class QnsProvisioningListener {
}
void close() {
- mIwlanNetworkStatusTracker.unregisterIwlanNetworksChanged(
- mSlotIndex, mQnsProvisioningHandler);
mQnsImsManager.unregisterImsStateChanged(mQnsProvisioningHandler);
- mQnsEventDispatcher.unregisterEvent(mQnsProvisioningHandler);
mRegistrantList.removeAll();
mProvisioningInfo.clear();
unregisterProvisioningCallback();
@@ -452,32 +434,6 @@ class QnsProvisioningListener {
log("message what:" + message.what);
QnsAsyncResult ar = (QnsAsyncResult) message.obj;
switch (message.what) {
- case QnsEventDispatcher.QNS_EVENT_CARRIER_CONFIG_CHANGED:
- log("carrier config loaded.");
- resetRetryRegisterProvisioningCallbackCount();
- registerProvisioningCallback();
- break;
- case QnsEventDispatcher.QNS_EVENT_SIM_ABSENT:
- log("clear last Provisioning Info.");
- clearLastProvisioningInfo();
- break;
- case QnsEventDispatcher.QNS_EVENT_SIM_LOADED:
- log("re-register Provisioning Callback");
- unregisterProvisioningCallback();
- resetRetryRegisterProvisioningCallbackCount();
- registerProvisioningCallback();
- break;
- case EVENT_IWLAN_NETWORK_STATUS_CHANGED:
- log("iwlan network state changed.");
- if (ar != null) {
- IwlanNetworkStatusTracker.IwlanAvailabilityInfo info =
- (IwlanNetworkStatusTracker.IwlanAvailabilityInfo) ar.mResult;
- if (info.getIwlanAvailable()) {
- resetRetryRegisterProvisioningCallbackCount();
- registerProvisioningCallback();
- }
- }
- break;
case EVENT_IMS_STATE_CHANGED:
if (ar != null) {
QnsImsManager.ImsState state = (QnsImsManager.ImsState) ar.mResult;