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

Commit 95e10d99 authored by James Lin's avatar James Lin Committed by android-build-merger
Browse files

Merge "[RCS] Rcs feature cannot be initialized in framework" am: 8da9fd5c

am: 03935dd8

Change-Id: I62defbbaaf494525c38d7c262c0cd74d3eeb43e2
parents e27a8d04 03935dd8
Loading
Loading
Loading
Loading
+83 −30
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.app.PendingIntent;
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;
@@ -204,7 +205,10 @@ public class ImsPhone extends ImsPhoneBase {
    private ServiceState mSS = new ServiceState();

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

    // To redial silently through GSM or CDMA when dialing through IMS fails
    private String mLastDialString;
@@ -331,34 +335,9 @@ public class ImsPhone extends ImsPhoneBase {
        // Force initial roaming state update later, on EVENT_CARRIER_CONFIG_CHANGED.
        // Settings provider or CarrierConfig may not be loaded now.

        mRcsManagerConnector = new FeatureConnector<RcsFeatureManager>(mContext, mPhoneId,
                new FeatureConnector.Listener<RcsFeatureManager>() {
                    @Override
                    public boolean isSupported() {
                        if (!ImsManager.isImsSupportedOnDevice(mContext)) {
                            return false;
                        }
                        if (!RcsFeatureManager.isRcsUceSupportedByCarrier(mContext, mPhoneId)) {
                            return false;
                        }
                        return true;
                    }

                    @Override
                    public RcsFeatureManager getFeatureManager() {
                        return new RcsFeatureManager(mContext, mPhoneId);
                    }

                    @Override
                    public void connectionReady(RcsFeatureManager manager) throws ImsException {
                        mRcsManager = manager;
                    }

                    @Override
                    public void connectionUnavailable() {
                    }
                }, mContext.getMainExecutor(), "ImsPhone");
        mRcsManagerConnector.connect();
        // 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
@@ -382,7 +361,75 @@ public class ImsPhone extends ImsPhoneBase {
            mDefaultPhone.unregisterForServiceStateChanged(this);
        }

        mContext.unregisterReceiver(mCarrierConfigChangedReceiver);

        if (mRcsManagerConnector != null) {
            mRcsManagerConnector.disconnect();
            mRcsManagerConnector = 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() {
                return new RcsFeatureManager(mContext, mPhoneId);
            }

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

            @Override
            public void connectionUnavailable() {
                logd("RcsFeatureManager is unavailable");
                mRcsManager = null;
            }
        };

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

    @UnsupportedAppUsage
@@ -1591,6 +1638,12 @@ 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();
                }
                break;

            default:
                super.handleMessage(msg);
+16 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
@@ -63,9 +64,11 @@ import android.testing.TestableLooper;

import androidx.test.filters.FlakyTest;

import com.android.ims.FeatureConnector;
import com.android.ims.ImsEcbmStateListener;
import com.android.ims.ImsManager;
import com.android.ims.ImsUtInterface;
import com.android.ims.RcsFeatureManager;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.CommandsInterface;
@@ -832,6 +835,19 @@ public class ImsPhoneTest extends TelephonyTest {
        assertNotNull(mImsPhoneUT.getServiceStateTracker());
    }

    @Test
    @SmallTest
    public void testRcsFeatureManagerInitialization() throws Exception {
        FeatureConnector<RcsFeatureManager> mockRcsManagerConnector =
                (FeatureConnector<RcsFeatureManager>) mock(FeatureConnector.class);
        mImsPhoneUT.mRcsManagerConnector = mockRcsManagerConnector;

        mImsPhoneUT.initRcsFeatureManager();

        verify(mockRcsManagerConnector).disconnect();
        assertNotNull(mImsPhoneUT.mRcsManagerConnector);
    }

    private ServiceState getServiceStateDataAndVoice(int rat, int regState, boolean isRoaming) {
        ServiceState ss = new ServiceState();
        ss.setStateOutOfService();