Loading src/java/com/android/internal/telephony/imsphone/ImsPhone.java +83 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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); Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhone.java +83 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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); Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading