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

Commit 1d76ea20 authored by Brad Ebinger's avatar Brad Ebinger Committed by Automerger Merge Worker
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" am: 37562ee0 am: 61f7cf4a am: c6859172 am: e0f2e8c1

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1428096

Change-Id: I1e38515d2f0be0e75cb1ce3d1e8029d123fc0100
parents e18eb6e4 e0f2e8c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2800,7 +2800,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