diff options
author | sangyun <sangyun@google.com> | 2022-10-11 16:39:22 +0900 |
---|---|---|
committer | Manish Dungriyal <mdungriyal@google.com> | 2022-11-21 07:05:26 +0000 |
commit | 6684b363a0a4f32a473b7673b0c30bb596e3ff47 (patch) | |
tree | 52c336d8d4bcd1b808dfbaabdb94a36e8da12492 /services/QualifiedNetworksService/src/com/android | |
parent | b12fd951e40a315fe43cd7b8fd5f4eebaf96f324 (diff) | |
download | Telephony-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')
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; |