Loading src/java/com/android/internal/telephony/CommandsInterface.java +7 −4 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import android.telephony.data.DataProfile; import android.telephony.data.NetworkSliceInfo; import android.telephony.data.TrafficDescriptor; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.RegistrationManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; import com.android.internal.telephony.emergency.EmergencyConstants; Loading Loading @@ -2900,13 +2902,14 @@ public interface CommandsInterface { * Updates the IMS registration information to the radio. * * @param state The current IMS registration state. * @param accessNetworkType The type of underlying radio access network used. * @param suggestedAction The expected action that modem should perform. * @param imsRadioTech The type of underlying radio access network used. * @param suggestedAction The suggested action for the radio to perform. * @param capabilities IMS capabilities such as VOICE, VIDEO and SMS. */ default void updateImsRegistrationInfo(int state, @AccessNetworkConstants.RadioAccessNetworkType int accessNetworkType, int suggestedAction, int capabilities, Message result) {} @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction, int capabilities, Message result) {} /** * Notifies the NAS and RRC layers of the radio the type of upcoming IMS traffic. Loading src/java/com/android/internal/telephony/RIL.java +11 −5 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ import android.telephony.data.DataProfile; import android.telephony.data.NetworkSliceInfo; import android.telephony.data.TrafficDescriptor; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.RegistrationManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.SparseArray; Loading Loading @@ -5257,8 +5259,11 @@ public class RIL extends BaseCommands implements CommandsInterface { } @Override public void updateImsRegistrationInfo(int state, int accessNetworkType, int suggestedAction, int capabilities, Message result) { public void updateImsRegistrationInfo( @RegistrationManager.ImsRegistrationState int state, @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction, int capabilities, Message result) { RadioImsProxy imsProxy = getRadioServiceProxy(RadioImsProxy.class, result); if (imsProxy.isEmpty()) return; if (mHalVersion.get(HAL_SERVICE_IMS).greaterOrEqual(RADIO_HAL_VERSION_2_0)) { Loading @@ -5266,14 +5271,15 @@ public class RIL extends BaseCommands implements CommandsInterface { mRILDefaultWorkSource); if (RILJ_LOGD) { // Do not log function arg for privacy riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)); riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest) + " state=" + state + ", radioTech=" + imsRadioTech + ", suggested=" + suggestedAction + ", cap=" + capabilities); } android.hardware.radio.ims.ImsRegistration registrationInfo = new android.hardware.radio.ims.ImsRegistration(); registrationInfo.regState = RILUtils.convertImsRegistrationState(state); registrationInfo.accessNetworkType = accessNetworkType; registrationInfo.accessNetworkType = RILUtils.convertImsRegistrationTech(imsRadioTech); registrationInfo.suggestedAction = suggestedAction; registrationInfo.capabilities = RILUtils.convertImsCapability(capabilities); Loading src/java/com/android/internal/telephony/RILUtils.java +35 −2 Original line number Diff line number Diff line Loading @@ -5616,7 +5616,12 @@ public class RILUtils { } } /** Convert IMS registration state */ /** * Converts IMS registration state. * * @param state The IMS registration state. * @return The converted HAL IMS registration state. */ public static int convertImsRegistrationState(int state) { switch (state) { case RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED: Loading @@ -5628,7 +5633,35 @@ public class RILUtils { } } /** Convert IMS capability */ /** * Converts IMS service radio technology. * * @param imsRadioTech The IMS service radio technology. * @return The converted HAL access network type. */ public static int convertImsRegistrationTech( @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) { switch (imsRadioTech) { case ImsRegistrationImplBase.REGISTRATION_TECH_LTE: return android.hardware.radio.AccessNetwork.EUTRAN; case ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN: return android.hardware.radio.AccessNetwork.IWLAN; case ImsRegistrationImplBase.REGISTRATION_TECH_NR: return android.hardware.radio.AccessNetwork.NGRAN; case ImsRegistrationImplBase.REGISTRATION_TECH_3G: return android.hardware.radio.AccessNetwork.UTRAN; default: return android.hardware.radio.AccessNetwork.UNKNOWN; } } /** * Converts IMS capabilities. * * @param capabilities The IMS capabilities. * @return The converted HAL IMS capabilities. */ public static int convertImsCapability(int capabilities) { int halCapabilities = android.hardware.radio.ims.ImsRegistration.IMS_MMTEL_CAPABILITY_NONE; if ((capabilities & CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE) > 0) { Loading src/java/com/android/internal/telephony/imsphone/ImsPhone.java +107 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,12 @@ package com.android.internal.telephony.imsphone; import static android.provider.Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS; import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE; import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_TITLE; import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED; import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_REGISTERED; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_NONE; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT; import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_NONE; import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAIC; import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAICr; Loading @@ -42,6 +48,7 @@ import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDI import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_NONE; import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; import android.annotation.NonNull; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; Loading Loading @@ -79,6 +86,7 @@ import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsCallForwardInfo; import android.telephony.ims.ImsCallProfile; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsRegistrationAttributes; import android.telephony.ims.ImsSsData; import android.telephony.ims.ImsSsInfo; import android.telephony.ims.RegistrationManager; Loading Loading @@ -290,6 +298,14 @@ public class ImsPhone extends ImsPhoneBase { private ImsStats mImsStats; private int mImsRegistrationState; // The access network type where IMS is registered private @ImsRegistrationImplBase.ImsRegistrationTech int mImsRegistrationTech = REGISTRATION_TECH_NONE; private @RegistrationManager.SuggestedAction int mImsRegistrationSuggestedAction; private int mImsRegistrationCapabilities; private boolean mNotifiedRegisteredState; // A runnable which is used to automatically exit from Ecm after a period of time. private Runnable mExitEcmRunnable = new Runnable() { @Override Loading Loading @@ -2454,12 +2470,18 @@ public class ImsPhone extends ImsPhoneBase { public void resetImsRegistrationState() { if (DBG) logd("resetImsRegistrationState"); mImsMmTelRegistrationHelper.reset(); int subId = getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED, REGISTRATION_TECH_NONE, SUGGESTED_ACTION_NONE); } } private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mMmTelRegistrationUpdate = new ImsRegistrationCallbackHelper.ImsRegistrationUpdate() { @Override public void handleImsRegistered(int imsRadioTech) { public void handleImsRegistered(@NonNull ImsRegistrationAttributes attributes) { int imsRadioTech = attributes.getTransportType(); if (DBG) { logd("handleImsRegistered: onImsMmTelConnected imsRadioTech=" + AccessNetworkConstants.transportTypeToString(imsRadioTech)); Loading @@ -2470,6 +2492,8 @@ public class ImsPhone extends ImsPhoneBase { getDefaultPhone().setImsRegistrationState(true); mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.CONNECTED, null); mImsStats.onImsRegistered(imsRadioTech); updateImsRegistrationInfo(REGISTRATION_STATE_REGISTERED, attributes.getRegistrationTechnology(), SUGGESTED_ACTION_NONE); } @Override Loading @@ -2488,10 +2512,11 @@ public class ImsPhone extends ImsPhoneBase { } @Override public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) { public void handleImsUnregistered(ImsReasonInfo imsReasonInfo, @RegistrationManager.SuggestedAction int suggestedAction) { if (DBG) { logd("handleImsUnregistered: onImsMmTelDisconnected imsReasonInfo=" + imsReasonInfo); + imsReasonInfo + ", suggestedAction=" + suggestedAction); } mRegLocalLog.log("handleImsUnregistered: onImsMmTelDisconnected imsRadioTech=" + imsReasonInfo); Loading @@ -2501,6 +2526,16 @@ public class ImsPhone extends ImsPhoneBase { mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.DISCONNECTED, imsReasonInfo); mImsStats.onImsUnregistered(imsReasonInfo); mImsRegistrationTech = REGISTRATION_TECH_NONE; int suggestedModemAction = SUGGESTED_ACTION_NONE; if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_REGISTRATION_ERROR) { if ((suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK) || (suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT)) { suggestedModemAction = suggestedAction; } } updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED, REGISTRATION_TECH_NONE, suggestedModemAction); } @Override Loading Loading @@ -2633,6 +2668,75 @@ public class ImsPhone extends ImsPhoneBase { return mLastKnownRoamingState; } /** * Update IMS registration information to modem. * * @param capabilities indicate MMTEL capability such as VOICE, VIDEO and SMS. */ public void updateImsRegistrationInfo(int capabilities) { if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) { if (mNotifiedRegisteredState && (capabilities == mImsRegistrationCapabilities)) { // Duplicated notification, no change in capabilities. return; } mImsRegistrationCapabilities = capabilities; if (capabilities == 0) { // Ignore this as this usually happens just before onUnregistered callback. // We can notify modem when onUnregistered() flow occurs. return; } mDefaultPhone.mCi.updateImsRegistrationInfo(mImsRegistrationState, mImsRegistrationTech, 0, capabilities, null); mNotifiedRegisteredState = true; } } /** * Update IMS registration info * * @param regState indicates IMS registration state. * @param imsRadioTech indicates the type of the radio access network where IMS is registered. * @param suggestedAction indicates the suggested action for the radio to perform. */ private void updateImsRegistrationInfo( @RegistrationManager.ImsRegistrationState int regState, @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction) { if (regState == mImsRegistrationState) { if ((regState == REGISTRATION_STATE_REGISTERED && imsRadioTech == mImsRegistrationTech) || (regState == REGISTRATION_STATE_NOT_REGISTERED && suggestedAction == mImsRegistrationSuggestedAction)) { // Filter duplicate notification. return; } } if (regState == REGISTRATION_STATE_NOT_REGISTERED) { mDefaultPhone.mCi.updateImsRegistrationInfo(regState, imsRadioTech, suggestedAction, 0, null); } else if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) { // This happens when radio tech is changed while in REGISTERED state. if (mImsRegistrationCapabilities > 0) { // Capability has been updated. Notify REGISTRATION_STATE_REGISTERED. mDefaultPhone.mCi.updateImsRegistrationInfo(regState, imsRadioTech, 0, mImsRegistrationCapabilities, null); mImsRegistrationTech = imsRadioTech; mNotifiedRegisteredState = true; return; } } mImsRegistrationState = regState; mImsRegistrationTech = imsRadioTech; mImsRegistrationSuggestedAction = suggestedAction; mImsRegistrationCapabilities = 0; // REGISTRATION_STATE_REGISTERED will be notified when the capability is updated. mNotifiedRegisteredState = false; } @Override public void setTerminalBasedCallWaitingStatus(int state) { mCT.setTerminalBasedCallWaitingStatus(state); Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import static android.telephony.ims.ImsService.CAPABILITY_TERMINAL_BASED_CALL_WA import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_ACTIVATED; import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_NOT_SUPPORTED; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_SMS; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VIDEO; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE; import static com.android.internal.telephony.Phone.CS_FALLBACK; import android.Manifest; Loading Loading @@ -4551,6 +4554,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { try { ImsFeature.Capabilities capabilities = (ImsFeature.Capabilities) args.arg1; handleFeatureCapabilityChanged(capabilities); updateImsRegistrationInfo(); } finally { args.recycle(); } Loading Loading @@ -5747,4 +5751,23 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { loge("triggerImsDeregistration: exception " + e); } } private void updateImsRegistrationInfo() { int capabilities = 0; if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)) { capabilities |= IMS_MMTEL_CAPABILITY_VOICE; } if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO)) { capabilities |= IMS_MMTEL_CAPABILITY_VIDEO; } if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS)) { capabilities |= IMS_MMTEL_CAPABILITY_SMS; } mPhone.updateImsRegistrationInfo(capabilities); } } Loading
src/java/com/android/internal/telephony/CommandsInterface.java +7 −4 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import android.telephony.data.DataProfile; import android.telephony.data.NetworkSliceInfo; import android.telephony.data.TrafficDescriptor; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.RegistrationManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; import com.android.internal.telephony.emergency.EmergencyConstants; Loading Loading @@ -2900,13 +2902,14 @@ public interface CommandsInterface { * Updates the IMS registration information to the radio. * * @param state The current IMS registration state. * @param accessNetworkType The type of underlying radio access network used. * @param suggestedAction The expected action that modem should perform. * @param imsRadioTech The type of underlying radio access network used. * @param suggestedAction The suggested action for the radio to perform. * @param capabilities IMS capabilities such as VOICE, VIDEO and SMS. */ default void updateImsRegistrationInfo(int state, @AccessNetworkConstants.RadioAccessNetworkType int accessNetworkType, int suggestedAction, int capabilities, Message result) {} @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction, int capabilities, Message result) {} /** * Notifies the NAS and RRC layers of the radio the type of upcoming IMS traffic. Loading
src/java/com/android/internal/telephony/RIL.java +11 −5 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ import android.telephony.data.DataProfile; import android.telephony.data.NetworkSliceInfo; import android.telephony.data.TrafficDescriptor; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.RegistrationManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.SparseArray; Loading Loading @@ -5257,8 +5259,11 @@ public class RIL extends BaseCommands implements CommandsInterface { } @Override public void updateImsRegistrationInfo(int state, int accessNetworkType, int suggestedAction, int capabilities, Message result) { public void updateImsRegistrationInfo( @RegistrationManager.ImsRegistrationState int state, @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction, int capabilities, Message result) { RadioImsProxy imsProxy = getRadioServiceProxy(RadioImsProxy.class, result); if (imsProxy.isEmpty()) return; if (mHalVersion.get(HAL_SERVICE_IMS).greaterOrEqual(RADIO_HAL_VERSION_2_0)) { Loading @@ -5266,14 +5271,15 @@ public class RIL extends BaseCommands implements CommandsInterface { mRILDefaultWorkSource); if (RILJ_LOGD) { // Do not log function arg for privacy riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)); riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest) + " state=" + state + ", radioTech=" + imsRadioTech + ", suggested=" + suggestedAction + ", cap=" + capabilities); } android.hardware.radio.ims.ImsRegistration registrationInfo = new android.hardware.radio.ims.ImsRegistration(); registrationInfo.regState = RILUtils.convertImsRegistrationState(state); registrationInfo.accessNetworkType = accessNetworkType; registrationInfo.accessNetworkType = RILUtils.convertImsRegistrationTech(imsRadioTech); registrationInfo.suggestedAction = suggestedAction; registrationInfo.capabilities = RILUtils.convertImsCapability(capabilities); Loading
src/java/com/android/internal/telephony/RILUtils.java +35 −2 Original line number Diff line number Diff line Loading @@ -5616,7 +5616,12 @@ public class RILUtils { } } /** Convert IMS registration state */ /** * Converts IMS registration state. * * @param state The IMS registration state. * @return The converted HAL IMS registration state. */ public static int convertImsRegistrationState(int state) { switch (state) { case RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED: Loading @@ -5628,7 +5633,35 @@ public class RILUtils { } } /** Convert IMS capability */ /** * Converts IMS service radio technology. * * @param imsRadioTech The IMS service radio technology. * @return The converted HAL access network type. */ public static int convertImsRegistrationTech( @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) { switch (imsRadioTech) { case ImsRegistrationImplBase.REGISTRATION_TECH_LTE: return android.hardware.radio.AccessNetwork.EUTRAN; case ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN: return android.hardware.radio.AccessNetwork.IWLAN; case ImsRegistrationImplBase.REGISTRATION_TECH_NR: return android.hardware.radio.AccessNetwork.NGRAN; case ImsRegistrationImplBase.REGISTRATION_TECH_3G: return android.hardware.radio.AccessNetwork.UTRAN; default: return android.hardware.radio.AccessNetwork.UNKNOWN; } } /** * Converts IMS capabilities. * * @param capabilities The IMS capabilities. * @return The converted HAL IMS capabilities. */ public static int convertImsCapability(int capabilities) { int halCapabilities = android.hardware.radio.ims.ImsRegistration.IMS_MMTEL_CAPABILITY_NONE; if ((capabilities & CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE) > 0) { Loading
src/java/com/android/internal/telephony/imsphone/ImsPhone.java +107 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,12 @@ package com.android.internal.telephony.imsphone; import static android.provider.Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS; import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE; import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_TITLE; import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED; import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_REGISTERED; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_NONE; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK; import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT; import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_NONE; import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAIC; import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAICr; Loading @@ -42,6 +48,7 @@ import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDI import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_NONE; import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; import android.annotation.NonNull; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; Loading Loading @@ -79,6 +86,7 @@ import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsCallForwardInfo; import android.telephony.ims.ImsCallProfile; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsRegistrationAttributes; import android.telephony.ims.ImsSsData; import android.telephony.ims.ImsSsInfo; import android.telephony.ims.RegistrationManager; Loading Loading @@ -290,6 +298,14 @@ public class ImsPhone extends ImsPhoneBase { private ImsStats mImsStats; private int mImsRegistrationState; // The access network type where IMS is registered private @ImsRegistrationImplBase.ImsRegistrationTech int mImsRegistrationTech = REGISTRATION_TECH_NONE; private @RegistrationManager.SuggestedAction int mImsRegistrationSuggestedAction; private int mImsRegistrationCapabilities; private boolean mNotifiedRegisteredState; // A runnable which is used to automatically exit from Ecm after a period of time. private Runnable mExitEcmRunnable = new Runnable() { @Override Loading Loading @@ -2454,12 +2470,18 @@ public class ImsPhone extends ImsPhoneBase { public void resetImsRegistrationState() { if (DBG) logd("resetImsRegistrationState"); mImsMmTelRegistrationHelper.reset(); int subId = getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED, REGISTRATION_TECH_NONE, SUGGESTED_ACTION_NONE); } } private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mMmTelRegistrationUpdate = new ImsRegistrationCallbackHelper.ImsRegistrationUpdate() { @Override public void handleImsRegistered(int imsRadioTech) { public void handleImsRegistered(@NonNull ImsRegistrationAttributes attributes) { int imsRadioTech = attributes.getTransportType(); if (DBG) { logd("handleImsRegistered: onImsMmTelConnected imsRadioTech=" + AccessNetworkConstants.transportTypeToString(imsRadioTech)); Loading @@ -2470,6 +2492,8 @@ public class ImsPhone extends ImsPhoneBase { getDefaultPhone().setImsRegistrationState(true); mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.CONNECTED, null); mImsStats.onImsRegistered(imsRadioTech); updateImsRegistrationInfo(REGISTRATION_STATE_REGISTERED, attributes.getRegistrationTechnology(), SUGGESTED_ACTION_NONE); } @Override Loading @@ -2488,10 +2512,11 @@ public class ImsPhone extends ImsPhoneBase { } @Override public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) { public void handleImsUnregistered(ImsReasonInfo imsReasonInfo, @RegistrationManager.SuggestedAction int suggestedAction) { if (DBG) { logd("handleImsUnregistered: onImsMmTelDisconnected imsReasonInfo=" + imsReasonInfo); + imsReasonInfo + ", suggestedAction=" + suggestedAction); } mRegLocalLog.log("handleImsUnregistered: onImsMmTelDisconnected imsRadioTech=" + imsReasonInfo); Loading @@ -2501,6 +2526,16 @@ public class ImsPhone extends ImsPhoneBase { mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.DISCONNECTED, imsReasonInfo); mImsStats.onImsUnregistered(imsReasonInfo); mImsRegistrationTech = REGISTRATION_TECH_NONE; int suggestedModemAction = SUGGESTED_ACTION_NONE; if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_REGISTRATION_ERROR) { if ((suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK) || (suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT)) { suggestedModemAction = suggestedAction; } } updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED, REGISTRATION_TECH_NONE, suggestedModemAction); } @Override Loading Loading @@ -2633,6 +2668,75 @@ public class ImsPhone extends ImsPhoneBase { return mLastKnownRoamingState; } /** * Update IMS registration information to modem. * * @param capabilities indicate MMTEL capability such as VOICE, VIDEO and SMS. */ public void updateImsRegistrationInfo(int capabilities) { if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) { if (mNotifiedRegisteredState && (capabilities == mImsRegistrationCapabilities)) { // Duplicated notification, no change in capabilities. return; } mImsRegistrationCapabilities = capabilities; if (capabilities == 0) { // Ignore this as this usually happens just before onUnregistered callback. // We can notify modem when onUnregistered() flow occurs. return; } mDefaultPhone.mCi.updateImsRegistrationInfo(mImsRegistrationState, mImsRegistrationTech, 0, capabilities, null); mNotifiedRegisteredState = true; } } /** * Update IMS registration info * * @param regState indicates IMS registration state. * @param imsRadioTech indicates the type of the radio access network where IMS is registered. * @param suggestedAction indicates the suggested action for the radio to perform. */ private void updateImsRegistrationInfo( @RegistrationManager.ImsRegistrationState int regState, @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech, @RegistrationManager.SuggestedAction int suggestedAction) { if (regState == mImsRegistrationState) { if ((regState == REGISTRATION_STATE_REGISTERED && imsRadioTech == mImsRegistrationTech) || (regState == REGISTRATION_STATE_NOT_REGISTERED && suggestedAction == mImsRegistrationSuggestedAction)) { // Filter duplicate notification. return; } } if (regState == REGISTRATION_STATE_NOT_REGISTERED) { mDefaultPhone.mCi.updateImsRegistrationInfo(regState, imsRadioTech, suggestedAction, 0, null); } else if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) { // This happens when radio tech is changed while in REGISTERED state. if (mImsRegistrationCapabilities > 0) { // Capability has been updated. Notify REGISTRATION_STATE_REGISTERED. mDefaultPhone.mCi.updateImsRegistrationInfo(regState, imsRadioTech, 0, mImsRegistrationCapabilities, null); mImsRegistrationTech = imsRadioTech; mNotifiedRegisteredState = true; return; } } mImsRegistrationState = regState; mImsRegistrationTech = imsRadioTech; mImsRegistrationSuggestedAction = suggestedAction; mImsRegistrationCapabilities = 0; // REGISTRATION_STATE_REGISTERED will be notified when the capability is updated. mNotifiedRegisteredState = false; } @Override public void setTerminalBasedCallWaitingStatus(int state) { mCT.setTerminalBasedCallWaitingStatus(state); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import static android.telephony.ims.ImsService.CAPABILITY_TERMINAL_BASED_CALL_WA import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_ACTIVATED; import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_NOT_SUPPORTED; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_SMS; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VIDEO; import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE; import static com.android.internal.telephony.Phone.CS_FALLBACK; import android.Manifest; Loading Loading @@ -4551,6 +4554,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { try { ImsFeature.Capabilities capabilities = (ImsFeature.Capabilities) args.arg1; handleFeatureCapabilityChanged(capabilities); updateImsRegistrationInfo(); } finally { args.recycle(); } Loading Loading @@ -5747,4 +5751,23 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { loge("triggerImsDeregistration: exception " + e); } } private void updateImsRegistrationInfo() { int capabilities = 0; if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)) { capabilities |= IMS_MMTEL_CAPABILITY_VOICE; } if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO)) { capabilities |= IMS_MMTEL_CAPABILITY_VIDEO; } if (mMmTelCapabilities.isCapable( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS)) { capabilities |= IMS_MMTEL_CAPABILITY_SMS; } mPhone.updateImsRegistrationInfo(capabilities); } }