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

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

Merge "Remove RCS dependencies from ImsPhone"

parents b2fbbe16 a11ad5e0
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -235,13 +235,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
    public ImsSmsDispatcher(Phone phone, SmsDispatchersController smsDispatchersController) {
        super(phone, smsDispatchersController);

        mImsManagerConnector = new FeatureConnector<ImsManager>(mContext, mPhone.getPhoneId(),
        mImsManagerConnector = new FeatureConnector<>(mContext, mPhone.getPhoneId(),
                new FeatureConnector.Listener<ImsManager>() {
                    @Override
                    public boolean isSupported() {
                        return ImsManager.isImsSupportedOnDevice(mContext);
                    }

                    @Override
                    public ImsManager getFeatureManager() {
                        return ImsManager.getInstance(mContext, phone.getPhoneId());
+6 −177
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkStats;
import android.net.Uri;
import android.os.AsyncResult;
@@ -79,18 +78,15 @@ import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsSsData;
import android.telephony.ims.ImsSsInfo;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.stub.ImsUtImplBase;
import android.text.TextUtils;
import android.util.LocalLog;

import com.android.ims.FeatureConnector;
import com.android.ims.ImsEcbm;
import com.android.ims.ImsEcbmStateListener;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
import com.android.ims.ImsUtInterface;
import com.android.ims.RcsFeatureManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallForwardInfo;
@@ -212,13 +208,6 @@ public class ImsPhone extends ImsPhoneBase {
    @UnsupportedAppUsage
    private ServiceState mSS = new ServiceState();

    private RcsFeatureManager mRcsManager;
    @VisibleForTesting
    public FeatureConnector<RcsFeatureManager> mRcsManagerConnector;
    @VisibleForTesting
    public FeatureConnector.Listener<RcsFeatureManager> mRcsFeatureConnectorListener;
    public ImsRcsStatusListener mRcsStatusListener;

    // To redial silently through GSM or CDMA when dialing through IMS fails
    private String mLastDialString;

@@ -233,9 +222,8 @@ public class ImsPhone extends ImsPhoneBase {
    private final LocalLog mRegLocalLog = new LocalLog(100);
    private TelephonyMetrics mMetrics;

    // The helper class to receive and store the MmTel and RCS registration status updated.
    // The helper class to receive and store the MmTel registration status updated.
    private ImsRegistrationCallbackHelper mImsMmTelRegistrationHelper;
    private ImsRegistrationCallbackHelper mImsRcsRegistrationHelper;

    private boolean mRoaming = false;

@@ -337,7 +325,8 @@ public class ImsPhone extends ImsPhoneBase {

        mMetrics = TelephonyMetrics.getInstance();

        initImsRegistration();
        mImsMmTelRegistrationHelper = new ImsRegistrationCallbackHelper(mMmTelRegistrationUpdate,
                context.getMainExecutor());

        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG);
@@ -359,10 +348,6 @@ public class ImsPhone extends ImsPhoneBase {
        mDefaultPhone.registerForServiceStateChanged(this, EVENT_SERVICE_STATE_CHANGED, null);
        // Force initial roaming state update later, on EVENT_CARRIER_CONFIG_CHANGED.
        // Settings provider or CarrierConfig may not be loaded now.

        // Listen to the carrier config changed to initialize RcsFeatureManager
        IntentFilter filter = new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        mContext.registerReceiver(mCarrierConfigChangedReceiver, filter);
    }

    //todo: get rid of this function. It is not needed since parentPhone obj never changes
@@ -385,106 +370,6 @@ public class ImsPhone extends ImsPhoneBase {
            }
            mDefaultPhone.unregisterForServiceStateChanged(this);
        }

        mContext.unregisterReceiver(mCarrierConfigChangedReceiver);

        if (mRcsManagerConnector != null) {
            mRcsManagerConnector.disconnect();
            mRcsManagerConnector = null;
        }

        if (mRcsManager != null) {
            mRcsManager.release();
            mRcsManager = null;
        }
    }

    private BroadcastReceiver mCarrierConfigChangedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) {
                return;
            }
            if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
                Bundle bundle = intent.getExtras();
                if (bundle == null) {
                    return;
                }
                int phoneId = bundle.getInt(CarrierConfigManager.EXTRA_SLOT_INDEX);
                if (phoneId == mPhoneId) {
                    sendEmptyMessage(EVENT_CARRIER_CONFIG_CHANGED);
                }
            }
        }
    };

    /**
     * Create RcsManagerConnector to initialize RcsFeatureManager
     */
    @VisibleForTesting
    public void initRcsFeatureManager() {
        if (mRcsManagerConnector != null) {
            mRcsManagerConnector.disconnect();
            mRcsManagerConnector = null;
        }

        logd("initRcsFeatureManager");
        mRcsFeatureConnectorListener = new FeatureConnector.Listener<>() {
            @Override
            public boolean isSupported() {
                // Check if Telephony IMS is supported or not
                if (!ImsManager.isImsSupportedOnDevice(mContext)) {
                    return false;
                }
                return true;
            }

            @Override
            public RcsFeatureManager getFeatureManager() {
                logd("Create RcsFeatureManager instance");
                return new RcsFeatureManager(mContext, mPhoneId);
            }

            @Override
            public void connectionReady(RcsFeatureManager manager) throws ImsException {
                logi("RcsFeatureManager is ready");
                mRcsManager = manager;

                // Listen to the IMS RCS registration status changed
                mRcsManager.registerImsRegistrationCallback(
                        mImsRcsRegistrationHelper.getCallbackBinder());

                if (mRcsStatusListener != null) {
                    mRcsStatusListener.onRcsConnected(getPhoneId(), mRcsManager);
                }
            }

            @Override
            public void connectionUnavailable() {
                logi("RcsFeatureManager is unavailable");
                resetImsRegistrationState(ImsFeature.FEATURE_RCS);
                if (mRcsManager != null) {
                    mRcsManager.release();
                }
                mRcsManager = null;

                if (mRcsStatusListener != null) {
                    mRcsStatusListener.onRcsDisconnected(getPhoneId());
                }
            }
        };

        mRcsManagerConnector = new FeatureConnector<>(mContext, mPhoneId,
                mRcsFeatureConnectorListener, mContext.getMainExecutor(), LOG_TAG);
        mRcsManagerConnector.connect();
    }

    public RcsFeatureManager getRcsManager() {
        return mRcsManager;
    }

    public void setRcsStatusListener(ImsRcsStatusListener listener) {
        mRcsStatusListener = listener;
    }

    @UnsupportedAppUsage
@@ -1714,14 +1599,6 @@ public class ImsPhone extends ImsPhoneBase {
                    updateRoamingState(sst.mSS);
                }
                break;
            case EVENT_CARRIER_CONFIG_CHANGED:
                if (DBG) logd("EVENT_CARRIER_CONFIG_CHANGED");
                if (mRcsManager == null) {
                    initRcsFeatureManager();
                } else {
                    mRcsManager.updateCapabilities();
                }
                break;

            default:
                super.handleMessage(msg);
@@ -1897,25 +1774,11 @@ public class ImsPhone extends ImsPhoneBase {
        mCT.getImsRegistrationTech(callback);
    }

    /**
     * Get the IMS RCS registration technology for this Phone.
     */
    public void getImsRcsRegistrationTech(Consumer<Integer> callback) {
        mRcsManager.getImsRegistrationTech(callback);
    }

    @Override
    public void getImsRegistrationState(Consumer<Integer> callback) {
        callback.accept(mImsMmTelRegistrationHelper.getImsRegistrationState());
    }

    /**
     * Retrieve the current RCS registration state.
     */
    public void getImsRcsRegistrationState(Consumer<Integer> callback) {
        callback.accept(mImsRcsRegistrationHelper.getImsRegistrationState());
    }

    @Override
    public Phone getDefaultPhone() {
        return mDefaultPhone;
@@ -2204,18 +2067,9 @@ public class ImsPhone extends ImsPhoneBase {
    /**
     * Reset the IMS registration state.
     */
    public void resetImsRegistrationState(int featureType) {
        if (DBG) logd("resetImsRegistrationState: feature=" + featureType);
        if (featureType == ImsFeature.FEATURE_MMTEL) {
    public void resetImsRegistrationState() {
        if (DBG) logd("resetImsRegistrationState");
        mImsMmTelRegistrationHelper.reset();
        } else if (featureType == ImsFeature.FEATURE_RCS) {
            mImsRcsRegistrationHelper.reset();
        }
    }

    private void initImsRegistration() {
        mImsMmTelRegistrationHelper = new ImsRegistrationCallbackHelper(mMmTelRegistrationUpdate);
        mImsRcsRegistrationHelper = new ImsRegistrationCallbackHelper(mRcsRegistrationUpdate);
    }

    private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mMmTelRegistrationUpdate = new
@@ -2262,29 +2116,6 @@ public class ImsPhone extends ImsPhoneBase {
        }
    };

    private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mRcsRegistrationUpdate = new
            ImsRegistrationCallbackHelper.ImsRegistrationUpdate() {
        @Override
        public void handleImsRegistered(int imsRadioTech) {
            if (DBG) logd("handle RCS registered");
        }

        @Override
        public void handleImsRegistering(int imsRadioTech) {
            if (DBG) logd("handle RCS registering");
        }

        @Override
        public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) {
            if (DBG) logd("handle RCS unregistered");
        }

        @Override
        public void handleImsSubscriberAssociatedUriChanged(Uri[] uris) {
            if (DBG) logd("handle RCS SubscriberAssociatedUriChanged");
        }
    };

    public IccRecords getIccRecords() {
        return mDefaultPhone.getIccRecords();
    }
@@ -2307,8 +2138,6 @@ public class ImsPhone extends ImsPhoneBase {
        pw.println("  mSilentRedialRegistrants = " + mSilentRedialRegistrants);
        pw.println("  mImsMmTelRegistrationState = "
                + mImsMmTelRegistrationHelper.getImsRegistrationState());
        pw.println("  mImsRcsRegistrationState = "
                + mImsRcsRegistrationHelper.getImsRegistrationState());
        pw.println("  mRoaming = " + mRoaming);
        pw.println("  mSsnRegistrants = " + mSsnRegistrants);
        pw.println(" Registration Log:");
+2 −7
Original line number Diff line number Diff line
@@ -591,14 +591,9 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        mVtDataUsageUidSnapshot = new NetworkStats(currentTime, 1);

        // Allow the executor to be specified for testing.
        mImsManagerConnector = new FeatureConnector<ImsManager>(
        mImsManagerConnector = new FeatureConnector<>(
                phone.getContext(), phone.getPhoneId(),
                new FeatureConnector.Listener<ImsManager>() {
                    @Override
                    public boolean isSupported() {
                        return ImsManager.isImsSupportedOnDevice(phone.getContext());
                    }

                    @Override
                    public ImsManager getFeatureManager() {
                        return ImsManager.getInstance(phone.getContext(), phone.getPhoneId());
@@ -4253,7 +4248,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        boolean tmpIsVideoCallEnabled = isVideoCallEnabled();
        mMmTelCapabilities = new MmTelFeature.MmTelCapabilities();
        mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
        mPhone.resetImsRegistrationState(ImsFeature.FEATURE_MMTEL);
        mPhone.resetImsRegistrationState();
        mPhone.processDisconnectReason(new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN,
                ImsReasonInfo.CODE_UNSPECIFIED));
        boolean isVideoEnabled = isVideoCallEnabled();
+15 −18
Original line number Diff line number Diff line
@@ -16,22 +16,20 @@

package com.android.internal.telephony.imsphone;

import android.annotation.AnyThread;
import android.annotation.NonNull;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.aidl.IImsRegistrationCallback;
import android.util.Log;

import com.android.internal.telephony.util.HandlerExecutor;

import java.util.concurrent.Executor;

/**
 * A helper class to manager the ImsRegistrationCallback can notify the state changed to listener.
 */
@AnyThread
public class ImsRegistrationCallbackHelper {
    private static final String TAG = "ImsRegCallbackHelper";

@@ -63,6 +61,7 @@ public class ImsRegistrationCallbackHelper {

    private ImsRegistrationUpdate mImsRegistrationUpdate;
    private int mRegistrationState = RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED;
    private final Object mLock = new Object();

    private final RegistrationManager.RegistrationCallback mImsRegistrationCallback =
            new RegistrationManager.RegistrationCallback() {
@@ -90,8 +89,9 @@ public class ImsRegistrationCallbackHelper {
                }
            };

    public ImsRegistrationCallbackHelper(@NonNull ImsRegistrationUpdate registrationUpdate) {
        mImsRegistrationCallback.setExecutor(getThreadExecutor());
    public ImsRegistrationCallbackHelper(@NonNull ImsRegistrationUpdate registrationUpdate,
            Executor executor) {
        mImsRegistrationCallback.setExecutor(executor);
        mImsRegistrationUpdate = registrationUpdate;
    }

@@ -108,17 +108,21 @@ public class ImsRegistrationCallbackHelper {
     */
    public synchronized void updateRegistrationState(
            @RegistrationManager.ImsRegistrationState int newState) {
        synchronized (mLock) {
            Log.d(TAG, "updateRegistrationState: registration state from " + mRegistrationState
                    + " to " + newState);
            mRegistrationState = newState;
        }
    }

    public int getImsRegistrationState() {
        synchronized (mLock) {
            return mRegistrationState;
        }
    }

    public boolean isImsRegistered() {
        return mRegistrationState == RegistrationManager.REGISTRATION_STATE_REGISTERED;
        return getImsRegistrationState() == RegistrationManager.REGISTRATION_STATE_REGISTERED;
    }

    public RegistrationManager.RegistrationCallback getCallback() {
@@ -128,11 +132,4 @@ public class ImsRegistrationCallbackHelper {
    public IImsRegistrationCallback getCallbackBinder() {
        return mImsRegistrationCallback.getBinder();
    }

    private Executor getThreadExecutor() {
        if (Looper.myLooper() == null) {
            Looper.prepare();
        }
        return new HandlerExecutor(new Handler(Looper.myLooper()));
    }
}
+10 −3
Original line number Diff line number Diff line
@@ -19,11 +19,13 @@ package com.android.internal.telephony.ims;
import junit.framework.AssertionFailedError;

import static org.mockito.ArgumentMatchers.anyObject;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.pm.PackageManager;
import android.os.HandlerThread;
import android.os.Looper;
import android.telephony.ims.feature.ImsFeature;
@@ -70,7 +72,7 @@ public class FeatureConnectorTest extends TelephonyTest {
        mHandlerThread = new HandlerThread("ConnectorHandlerThread");
        mHandlerThread.start();

        mFeatureConnector = new FeatureConnector<ImsManager>(mContext, phoneId,
        mFeatureConnector = new FeatureConnector<>(mContext, phoneId,
            mListener, mExecutor, mHandlerThread.getLooper());
        mFeatureConnector.mListener = mListener;
    }
@@ -85,7 +87,7 @@ public class FeatureConnectorTest extends TelephonyTest {
    @SmallTest
    public void testConnect() {
        // ImsManager is supported on device
        when(mListener.isSupported()).thenReturn(true);
        setImsSupportedFeature(true);
        when(mListener.getFeatureManager()).thenReturn(mImsManager);

        mFeatureConnector.connect();
@@ -97,7 +99,7 @@ public class FeatureConnectorTest extends TelephonyTest {
        reset(mListener);

        // ImsManager is NOT supported on device
        when(mListener.isSupported()).thenReturn(false);
        setImsSupportedFeature(false);
        when(mListener.getFeatureManager()).thenReturn(mImsManager);

        mFeatureConnector.connect();
@@ -145,4 +147,9 @@ public class FeatureConnectorTest extends TelephonyTest {
        // Verify removeNotifyStatusChangedCallback will be called if ImsManager is not null.
        verify(mImsManager).removeNotifyStatusChangedCallback(anyObject());
    }

    private void setImsSupportedFeature(boolean isSupported) {
        doReturn(isSupported).when(mPackageManager).hasSystemFeature(
                PackageManager.FEATURE_TELEPHONY_IMS);
    }
}
Loading