If only RCS or MMTEL is unregistered, send a modify PUBLISH request am: e60edd7244 am: 53d93ed935 am: 8034df4acd

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/2215065

Change-Id: Icb632fd9afbb4c7e75887eb7011f7315cb242db7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
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 442cf7d..54e227d 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
@@ -162,6 +162,8 @@
 
         public void sendImsUnregisteredMessage() {
             logd("sendImsUnregisteredMessage");
+            // The IMS has been unregistered. Remove the existing message not processed.
+            removeMessages(EVENT_REQUEST_PUBLISH);
             // Remove the existing message and resend a new message.
             removeMessages(EVENT_IMS_UNREGISTERED);
             Message msg = obtainMessage(EVENT_IMS_UNREGISTERED);
@@ -492,7 +494,7 @@
                 public void onSubscriberAssociatedUriChanged(Uri[] uris) {
                     synchronized (mLock) {
                         logi("onRcsSubscriberAssociatedUriChanged");
-                        handleRcsSubscriberAssociatedUriChanged(uris, true);
+                        handleRcsSubscriberAssociatedUriChanged(uris);
                     }
                 }
     };
@@ -523,7 +525,7 @@
                 public void onSubscriberAssociatedUriChanged(Uri[] uris) {
                     synchronized (mLock) {
                         logi("onMmTelSubscriberAssociatedUriChanged");
-                        handleMmTelSubscriberAssociatedUriChanged(uris, true);
+                        handleMmTelSubscriberAssociatedUriChanged(uris);
                     }
                 }
             };
@@ -613,7 +615,7 @@
     private void handleImsMmtelUnregistered() {
         mCapabilityInfo.updateImsMmtelUnregistered();
         // When the MMTEL is unregistered, the mmtel associated uri should be cleared.
-        handleMmTelSubscriberAssociatedUriChanged(null, false);
+        handleMmTelSubscriberAssociatedUriChanged(null);
 
         // If the RCS is already unregistered, it informs that the IMS is unregistered.
         if (mCapabilityInfo.isImsRegistered() == false) {
@@ -624,16 +626,16 @@
     /*
      * This method is called when the MMTEL associated uri has changed.
      */
-    private void handleMmTelSubscriberAssociatedUriChanged(Uri[] uris, boolean triggerPublish) {
+    private void handleMmTelSubscriberAssociatedUriChanged(Uri[] uris) {
         Uri originalUri = mCapabilityInfo.getMmtelAssociatedUri();
         mCapabilityInfo.updateMmTelAssociatedUri(uris);
         Uri currentUri = mCapabilityInfo.getMmtelAssociatedUri();
 
         boolean hasChanged = !(Objects.equals(originalUri, currentUri));
-        logi("handleMmTelSubscriberAssociatedUriChanged: triggerPublish=" + triggerPublish +
-                ", hasChanged=" + hasChanged);
+        logi("handleMmTelSubscriberAssociatedUriChanged: hasChanged=" + hasChanged);
 
-        if (triggerPublish && hasChanged) {
+        // Send internal request to send a modification PUBLISH if the MMTEL or RCS is registered.
+        if (mCapabilityInfo.isImsRegistered() && hasChanged) {
             mHandler.sendTriggeringPublishMessage(
                     PublishController.PUBLISH_TRIGGER_MMTEL_URI_CHANGE);
         }
@@ -663,7 +665,7 @@
     private void handleImsRcsUnregistered() {
         boolean hasChanged = mCapabilityInfo.updateImsRcsUnregistered();
         // When the RCS is unregistered, the rcs associated uri should be cleared.
-        handleRcsSubscriberAssociatedUriChanged(null, false);
+        handleRcsSubscriberAssociatedUriChanged(null);
         // If the MMTEL is already unregistered, it informs that the IMS is unregistered.
         if (mCapabilityInfo.isImsRegistered() == false) {
             mHandler.sendImsUnregisteredMessage();
@@ -673,16 +675,16 @@
     /*
      * This method is called when the RCS associated uri has changed.
      */
-    private void handleRcsSubscriberAssociatedUriChanged(Uri[] uris, boolean triggerPublish) {
+    private void handleRcsSubscriberAssociatedUriChanged(Uri[] uris) {
         Uri originalUri = mCapabilityInfo.getRcsAssociatedUri();
         mCapabilityInfo.updateRcsAssociatedUri(uris);
         Uri currentUri = mCapabilityInfo.getRcsAssociatedUri();
 
         boolean hasChanged = !(Objects.equals(originalUri, currentUri));
-        logi("handleRcsSubscriberAssociatedUriChanged: triggerPublish=" + triggerPublish +
-                ", hasChanged=" + hasChanged);
+        logi("handleRcsSubscriberAssociatedUriChanged: hasChanged=" + hasChanged);
 
-        if (triggerPublish && hasChanged) {
+        // Send internal request to send a modification PUBLISH if the MMTEL or RCS is registered.
+        if (mCapabilityInfo.isImsRegistered() && hasChanged) {
             mHandler.sendTriggeringPublishMessage(PublishController.PUBLISH_TRIGGER_RCS_URI_CHANGE);
         }
     }
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 2d170ab..3f71688 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
@@ -266,6 +266,37 @@
         verify(mCallback).updateImsUnregistered();
     }
 
+    @Test
+    @SmallTest
+    public void testRcsAndMmtelUnregistration() throws Exception {
+        DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
+        deviceCapListener.setImsCallbackRegistered(true);
+
+        Handler handler = deviceCapListener.getHandler();
+        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);
+
+        // MMTEL unregistered
+        RegistrationCallback mmtelRegiCallback = deviceCapListener.mMmtelRegistrationCallback;
+        // set the Ims is unregistered
+        doReturn(false).when(mDeviceCapability).isImsRegistered();
+        mmtelRegiCallback.onUnregistered(info);
+
+        waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
+
+        // Do not send internal publish trigger
+        verify(mCallback, never()).requestPublishFromInternal(anyInt());
+        // IMS is unregistered. Verify send ImsUnregistered.
+        verify(mCallback).updateImsUnregistered();
+    }
+
+
     private DeviceCapabilityListener createDeviceCapabilityListener() {
         DeviceCapabilityListener deviceCapListener = new DeviceCapabilityListener(mContext,
                 mSubId, mDeviceCapability, mCallback, mUceStatsWriter);