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

Commit 598ac4ac authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Remove RCS dependencies from ImsPhone" am: b4217510 am: 74642a98

Change-Id: I48b86ca91a20d8aeb3df0bac70df44e4a1bb4123
parents f5c40fc1 74642a98
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