diff options
author | Hyunho <hhshin@google.com> | 2022-12-06 11:29:01 +0000 |
---|---|---|
committer | Hyunho <hhshin@google.com> | 2023-01-09 05:08:39 +0000 |
commit | 56127f65b0df21518a6d2ba836a53e1c6c402271 (patch) | |
tree | 4148f14d17638fb813a2095f887c71a4f813a4ca | |
parent | 53f510189d223e0f14cb88b3165134e731faf742 (diff) | |
download | ims-56127f65b0df21518a6d2ba836a53e1c6c402271.tar.gz |
If only RCS or MMTEL is unregistered, send a modify PUBLISH request
When RCS or MMTEL is unregistered, send a modify PUBLISH request message even if the associated URI has not changed.
When RCS or MMTEL change from Unregistered to Unregistered, the registration status does not change.
In this case, the modify PUBLISH request is sent depending on whether the associated URI has been changed.
Bug: b/235973951
Test: atest DeviceCapabilityListenerTest
Test: TMO Live network. The RCS and MMTEL are registered but the associated URI of RCS is not set. After that, RCS will be unregistered. Verified that the modify PUBLISH request has been sent to the netowrk.
Change-Id: I96b565c15f11ee1083b56db29971ddee930d7e64
Merged-In: I96b565c15f11ee1083b56db29971ddee930d7e64
3 files changed, 44 insertions, 10 deletions
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java index dc794331..f97ccf0a 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java @@ -168,13 +168,17 @@ public class DeviceCapabilityInfo { /** * Update the status that IMS MMTEL is unregistered. + * @return Mmtel registered status before change */ - public synchronized void updateImsMmtelUnregistered() { + public synchronized boolean updateImsMmtelUnregistered() { logi("IMS MMTEL unregistered: original state=" + mMmtelRegistered); + boolean changed = false; if (mMmtelRegistered) { mMmtelRegistered = false; + changed = true; } mMmtelNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; + return changed; } /** diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java index 0ec30403..8e940073 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java @@ -495,7 +495,7 @@ public class DeviceCapabilityListener { public void onSubscriberAssociatedUriChanged(Uri[] uris) { synchronized (mLock) { logi("onRcsSubscriberAssociatedUriChanged"); - handleRcsSubscriberAssociatedUriChanged(uris); + handleRcsSubscriberAssociatedUriChanged(uris, false); } } }; @@ -526,7 +526,7 @@ public class DeviceCapabilityListener { public void onSubscriberAssociatedUriChanged(Uri[] uris) { synchronized (mLock) { logi("onMmTelSubscriberAssociatedUriChanged"); - handleMmTelSubscriberAssociatedUriChanged(uris); + handleMmTelSubscriberAssociatedUriChanged(uris, false); } } }; @@ -614,9 +614,9 @@ public class DeviceCapabilityListener { * This method is called when the MMTEL is unregistered. */ private void handleImsMmtelUnregistered() { - mCapabilityInfo.updateImsMmtelUnregistered(); + boolean hasChanged = mCapabilityInfo.updateImsMmtelUnregistered(); // When the MMTEL is unregistered, the mmtel associated uri should be cleared. - handleMmTelSubscriberAssociatedUriChanged(null); + handleMmTelSubscriberAssociatedUriChanged(null, hasChanged); // If the RCS is already unregistered, it informs that the IMS is unregistered. if (mCapabilityInfo.isImsRegistered() == false) { @@ -627,12 +627,13 @@ public class DeviceCapabilityListener { /* * This method is called when the MMTEL associated uri has changed. */ - private void handleMmTelSubscriberAssociatedUriChanged(Uri[] uris) { + private void handleMmTelSubscriberAssociatedUriChanged(Uri[] uris, boolean regiChanged) { Uri originalUri = mCapabilityInfo.getMmtelAssociatedUri(); mCapabilityInfo.updateMmTelAssociatedUri(uris); Uri currentUri = mCapabilityInfo.getMmtelAssociatedUri(); - boolean hasChanged = !(Objects.equals(originalUri, currentUri)); + boolean hasChanged = regiChanged || !(Objects.equals(originalUri, currentUri)); + logi("handleMmTelSubscriberAssociatedUriChanged: hasChanged=" + hasChanged); // Send internal request to send a modification PUBLISH if the MMTEL or RCS is registered. @@ -666,7 +667,7 @@ public class DeviceCapabilityListener { private void handleImsRcsUnregistered() { boolean hasChanged = mCapabilityInfo.updateImsRcsUnregistered(); // When the RCS is unregistered, the rcs associated uri should be cleared. - handleRcsSubscriberAssociatedUriChanged(null); + handleRcsSubscriberAssociatedUriChanged(null, hasChanged); // If the MMTEL is already unregistered, it informs that the IMS is unregistered. if (mCapabilityInfo.isImsRegistered() == false) { mHandler.sendImsUnregisteredMessage(); @@ -676,12 +677,13 @@ public class DeviceCapabilityListener { /* * This method is called when the RCS associated uri has changed. */ - private void handleRcsSubscriberAssociatedUriChanged(Uri[] uris) { + private void handleRcsSubscriberAssociatedUriChanged(Uri[] uris, boolean regiChanged) { Uri originalUri = mCapabilityInfo.getRcsAssociatedUri(); mCapabilityInfo.updateRcsAssociatedUri(uris); Uri currentUri = mCapabilityInfo.getRcsAssociatedUri(); - boolean hasChanged = !(Objects.equals(originalUri, currentUri)); + boolean hasChanged = regiChanged || !(Objects.equals(originalUri, currentUri)); + logi("handleRcsSubscriberAssociatedUriChanged: hasChanged=" + hasChanged); // Send internal request to send a modification PUBLISH if the MMTEL or RCS is registered. diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java index 7bdeb11d..d96b87e6 100644 --- a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java +++ b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java @@ -297,6 +297,34 @@ public class DeviceCapabilityListenerTest extends ImsTestBase { verify(mCallback).updateImsUnregistered(); } + @Test + @SmallTest + public void testUnregisterRcsOnlyFromImsRegistration() throws Exception { + DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener(); + deviceCapListener.setImsCallbackRegistered(true); + Handler handler = deviceCapListener.getHandler(); + + // set the Ims is registered + doReturn(true).when(mDeviceCapability).isImsRegistered(); + ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, ""); + // RCS unregistered + RegistrationCallback rcsRegiCallback = deviceCapListener.mRcsRegistrationCallback; + + doReturn(true).when(mDeviceCapability).updateImsRcsUnregistered(); + // RCS is unregistered but MMTEL is registered. + doReturn(true).when(mDeviceCapability).isImsRegistered(); + rcsRegiCallback.onUnregistered(info); + + waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS); + + verify(mDeviceCapability).updateImsRcsUnregistered(); + // Only RCS unregistered. Verify the request of the modify publish is sent. + verify(mCallback).requestPublishFromInternal( + PublishController.PUBLISH_TRIGGER_RCS_URI_CHANGE); + + // Only RCS unregistered. Verify do not send ImsUnregistered. + verify(mCallback, never()).updateImsUnregistered(); + } private DeviceCapabilityListener createDeviceCapabilityListener() { DeviceCapabilityListener deviceCapListener = new DeviceCapabilityListener(mContext, |