Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37562ee0 authored by Brad Ebinger's avatar Brad Ebinger Committed by Gerrit Code Review
Browse files

Merge changes from topics "decouple_feature_stat_listener",...

Merge changes from topics "decouple_feature_stat_listener", "ims_sms_keepmanager", "rm_ims_manager_old"

* changes:
  Remove old state from ImsManager
  ImsSmsDispatcher should use the instance returned to it by the connector
  Decouple the creation of MmTelFeature from ImsFeature state listener
parents 3ec98d3f de722d3d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2796,7 +2796,7 @@ public class GsmCdmaPhone extends Phone {
                // updated when ImsPhoneCallTracker opens a connection.
                ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId);
                if (imsManager.isServiceAvailable()) {
                    imsManager.updateImsServiceConfig(true);
                    imsManager.updateImsServiceConfig();
                } else {
                    logd("ImsManager is not available to update CarrierConfig.");
                }
+24 −4
Original line number Diff line number Diff line
@@ -56,6 +56,11 @@ public class ImsSmsDispatcher extends SMSDispatcher {

    private static final String TAG = "ImsSmsDispatcher";

    public interface FeatureConnectorFactory {
        FeatureConnector<ImsManager> create(Context context, int phoneId,
                FeatureConnector.Listener<ImsManager> listener, String logPrefix);
    }

    @VisibleForTesting
    public Map<Integer, SmsTracker> mTrackers = new ConcurrentHashMap<>();
    @VisibleForTesting
@@ -67,6 +72,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
    private final FeatureConnector<ImsManager> mImsManagerConnector;
    /** Telephony metrics instance for logging metrics event */
    private TelephonyMetrics mMetrics = TelephonyMetrics.getInstance();
    private ImsManager mImsManager;
    private FeatureConnectorFactory mConnectorFactory;

    /**
     * Listen to the IMS service state change
@@ -234,10 +241,12 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        }
    };

    public ImsSmsDispatcher(Phone phone, SmsDispatchersController smsDispatchersController) {
    public ImsSmsDispatcher(Phone phone, SmsDispatchersController smsDispatchersController,
            FeatureConnectorFactory factory) {
        super(phone, smsDispatchersController);
        mConnectorFactory = factory;

        mImsManagerConnector = new FeatureConnector<>(mContext, mPhone.getPhoneId(),
        mImsManagerConnector = mConnectorFactory.create(mContext, mPhone.getPhoneId(),
                new FeatureConnector.Listener<ImsManager>() {
                    @Override
                    public ImsManager getFeatureManager() {
@@ -248,6 +257,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                    public void connectionReady(ImsManager manager) throws ImsException {
                        logd("ImsManager: connection ready.");
                        synchronized (mLock) {
                            mImsManager = manager;
                            setListeners();
                            mIsImsServiceUp = true;
                        }
@@ -257,6 +267,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                    public void connectionUnavailable() {
                        logd("ImsManager: connection unavailable.");
                        synchronized (mLock) {
                            mImsManager = null;
                            mIsImsServiceUp = false;
                        }
                    }
@@ -331,6 +342,9 @@ public class ImsSmsDispatcher extends SMSDispatcher {

    @Override
    protected String getFormat() {
        // This is called in the constructor before ImsSmsDispatcher has a chance to initialize
        // mLock. ImsManager will not be up anyway at this point, so report UNKNOWN.
        if (mLock == null) return SmsConstants.FORMAT_UNKNOWN;
        try {
            return getImsManager().getSmsFormat();
        } catch (ImsException e) {
@@ -415,8 +429,14 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        }
    }

    private ImsManager getImsManager() {
        return ImsManager.getInstance(mContext, mPhone.getPhoneId());
    private ImsManager getImsManager() throws ImsException {
        synchronized (mLock) {
            if (mImsManager == null) {
                throw new ImsException("ImsManager not up",
                        ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
            }
            return mImsManager;
        }
    }

    @VisibleForTesting
+2 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.telephony.ServiceState;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;

import com.android.ims.FeatureConnector;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.cdma.CdmaInboundSmsHandler;
import com.android.internal.telephony.cdma.CdmaSMSDispatcher;
@@ -139,7 +140,7 @@ public class SmsDispatchersController extends Handler {

        // Create dispatchers, inbound SMS handlers and
        // broadcast undelivered messages in raw table.
        mImsSmsDispatcher = new ImsSmsDispatcher(phone, this);
        mImsSmsDispatcher = new ImsSmsDispatcher(phone, this, FeatureConnector::new);
        mCdmaDispatcher = new CdmaSMSDispatcher(phone, this);
        mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
                storageMonitor, phone);
+44 −19
Original line number Diff line number Diff line
@@ -744,12 +744,9 @@ public class ImsServiceController {
            return;
        }
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
            ImsFeatureStatusCallback c = new ImsFeatureStatusCallback(featurePair.slotId,
                    featurePair.featureType);
            mFeatureStatusCallbacks.add(c);
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType,
                    c.getCallback());
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType);
            addImsFeatureBinder(featurePair.slotId, featurePair.featureType, f);
            addImsFeatureStatusCallback(featurePair.slotId, featurePair.featureType);
        } else {
            // Don't update ImsService for emergency MMTEL feature.
            Log.i(LOG_TAG, "supports emergency calling on slot " + featurePair.slotId);
@@ -770,17 +767,10 @@ public class ImsServiceController {
        // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
        mCallbacks.imsServiceFeatureRemoved(featurePair.slotId, featurePair.featureType, this);
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
            ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
                    c.mSlotId == featurePair.slotId && c.mFeatureType == featurePair.featureType)
                    .findFirst().orElse(null);
            // Remove status callbacks from list.
            if (callbackToRemove != null) {
                mFeatureStatusCallbacks.remove(callbackToRemove);
            }
            removeImsFeatureStatusCallback(featurePair.slotId, featurePair.featureType);
            removeImsFeatureBinder(featurePair.slotId, featurePair.featureType);
            try {
                removeImsFeature(featurePair.slotId, featurePair.featureType,
                        (callbackToRemove != null ? callbackToRemove.getCallback() : null));
                removeImsFeature(featurePair.slotId, featurePair.featureType);
            } catch (RemoteException e) {
                // The connection to this ImsService doesn't exist. This may happen if the service
                // has died and we are removing features.
@@ -801,24 +791,59 @@ public class ImsServiceController {

    // This method should only be called when already synchronized on mLock.
    // overridden by compat layer to create features
    protected IInterface createImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected IInterface createImsFeature(int slotId, int featureType)
            throws RemoteException {
        switch (featureType) {
            case ImsFeature.FEATURE_MMTEL: {
                return mIImsServiceController.createMmTelFeature(slotId, c);
                return mIImsServiceController.createMmTelFeature(slotId);
            }
            case ImsFeature.FEATURE_RCS: {
                return mIImsServiceController.createRcsFeature(slotId, c);
                return mIImsServiceController.createRcsFeature(slotId);
            }
            default:
                return null;
        }
    }

    // This method should only be called when already synchronized on mLock.
    private void addImsFeatureStatusCallback(int slotId, int featureType) throws RemoteException {
        ImsFeatureStatusCallback c = new ImsFeatureStatusCallback(slotId, featureType);
        mFeatureStatusCallbacks.add(c);
        registerImsFeatureStatusCallback(slotId, featureType, c.getCallback());
    }

    // This method should only be called when already synchronized on mLock.
    private void removeImsFeatureStatusCallback(int slotId, int featureType) {
        ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
                c.mSlotId == slotId && c.mFeatureType == featureType).findFirst().orElse(null);
        // Remove status callbacks from list.
        if (callbackToRemove != null) {
            mFeatureStatusCallbacks.remove(callbackToRemove);
            unregisterImsFeatureStatusCallback(slotId, featureType, callbackToRemove.getCallback());
        }
    }

    // overridden by compat layer to register feature status callbacks
    protected void registerImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) throws RemoteException {
        mIImsServiceController.addFeatureStatusCallback(slotId, featureType, c);
    }

    // overridden by compat layer to deregister feature status callbacks
    protected void unregisterImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) {
        try {
            mIImsServiceController.removeFeatureStatusCallback(slotId, featureType, c);
        } catch (RemoteException e) {
            mLocalLog.log("unregisterImsFeatureStatusCallback - couldn't remove " + c);
        }
    }


    // overridden by compat layer to remove features
    protected void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected void removeImsFeature(int slotId, int featureType)
            throws RemoteException {
        mIImsServiceController.removeImsFeature(slotId, featureType, c);
        mIImsServiceController.removeImsFeature(slotId, featureType);
    }

    // This method should only be called when synchronized on mLock
+27 −11
Original line number Diff line number Diff line
@@ -133,15 +133,15 @@ public class ImsServiceControllerCompat extends ImsServiceController {
    }

    @Override
    protected final IInterface createImsFeature(int slotId, int featureType,
            IImsFeatureStatusCallback c)
    protected final IInterface createImsFeature(int slotId, int featureType)
            throws RemoteException {
        switch (featureType) {
            case ImsFeature.MMTEL: {
                return createMMTelCompat(slotId, c);
                return createMMTelCompat(slotId);
            }
            case ImsFeature.RCS: {
                return createRcsFeature(slotId, c);

                return createRcsFeature(slotId);
            }
            default:
                return null;
@@ -149,7 +149,23 @@ public class ImsServiceControllerCompat extends ImsServiceController {
    }

    @Override
    protected final void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected void registerImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) throws RemoteException {
        mServiceController.addFeatureStatusCallback(slotId, featureType, c);
    }

    @Override
    protected void unregisterImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) {
        try {
            mServiceController.removeFeatureStatusCallback(slotId, featureType, c);
        } catch (RemoteException e) {
            Log.w(TAG, "compat - unregisterImsFeatureStatusCallback - couldn't remove " + c);
        }
    }

    @Override
    protected final void removeImsFeature(int slotId, int featureType)
            throws RemoteException {
        if (featureType == ImsFeature.MMTEL) {
            mMmTelCompatAdapters.remove(slotId);
@@ -157,7 +173,7 @@ public class ImsServiceControllerCompat extends ImsServiceController {
            mConfigCompatAdapters.remove(slotId);
        }
        if (mServiceController != null) {
            mServiceController.removeImsFeature(slotId, featureType, c);
            mServiceController.removeImsFeature(slotId, featureType);
        }
    }

@@ -171,9 +187,9 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return mServiceController != null;
    }

    private MmTelInterfaceAdapter getInterface(int slotId, IImsFeatureStatusCallback c)
    private MmTelInterfaceAdapter getInterface(int slotId)
            throws RemoteException {
        IImsMMTelFeature feature = mServiceController.createMMTelFeature(slotId, c);
        IImsMMTelFeature feature = mServiceController.createMMTelFeature(slotId);
        if (feature == null) {
            Log.w(TAG, "createMMTelCompat: createMMTelFeature returned null.");
            return null;
@@ -181,9 +197,9 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return new MmTelInterfaceAdapter(slotId, feature.asBinder());
    }

    private IImsMmTelFeature createMMTelCompat(int slotId, IImsFeatureStatusCallback c)
    private IImsMmTelFeature createMMTelCompat(int slotId)
            throws RemoteException {
        MmTelInterfaceAdapter interfaceAdapter = getInterface(slotId, c);
        MmTelInterfaceAdapter interfaceAdapter = getInterface(slotId);
        MmTelFeatureCompatAdapter mmTelAdapter = new MmTelFeatureCompatAdapter(mContext, slotId,
                interfaceAdapter);
        mMmTelCompatAdapters.put(slotId, mmTelAdapter);
@@ -195,7 +211,7 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return mmTelAdapter.getBinder();
    }

    private IImsRcsFeature createRcsFeature(int slotId, IImsFeatureStatusCallback c) {
    private IImsRcsFeature createRcsFeature(int slotId) {
        // Return non-null if there is a custom RCS implementation that needs a compatability layer.
        return null;
    }
Loading