diff options
author | Hyunho Shin <hhshin@google.com> | 2022-02-17 01:56:52 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-02-17 01:56:52 +0000 |
commit | fc8df0431f027c10c83e0785915a0cd743716113 (patch) | |
tree | 5fecdfe94bf2540e095f85d9a0d8e7a0f42f2bcf /src/java/com/android/ims | |
parent | 0c31ace7e9099710c4353b7d3203013f21c2ee6f (diff) | |
parent | 08151870e5579a2e56eb4dcfbc48326393fbeacb (diff) | |
download | ims-fc8df0431f027c10c83e0785915a0cd743716113.tar.gz |
Merge "Add a new api that does not send PUBLISH request with duplicated presence capabilities"
Diffstat (limited to 'src/java/com/android/ims')
-rw-r--r-- | src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java | 58 | ||||
-rw-r--r-- | src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java | 21 |
2 files changed, 76 insertions, 3 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 7fcb1ff7..8de8b01f 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 @@ -38,6 +38,7 @@ import android.util.Log; import com.android.ims.rcs.uce.util.FeatureTags; import com.android.ims.rcs.uce.util.UceUtils; +import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; import java.util.Arrays; @@ -104,6 +105,11 @@ public class DeviceCapabilityInfo { private boolean mMobileData; private boolean mVtSetting; + // The service description associated with the last publication update. + private Set<ServiceDescription> mLastSuccessfulCapabilities = new ArraySet<>(); + // The service description to temporarily store the presence capability being sent. + private Set<ServiceDescription> mPendingPublishCapabilities; + public DeviceCapabilityInfo(int subId, String[] capToRegistrationMap) { mSubId = subId; mServiceCapRegTracker = PublishServiceDescTracker.fromCarrierConfig(capToRegistrationMap); @@ -126,6 +132,8 @@ public class DeviceCapabilityInfo { mMmTelCapabilities = new MmTelCapabilities(); mMmtelAssociatedUris = Collections.EMPTY_LIST; mRcsAssociatedUris = Collections.EMPTY_LIST; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; } /** @@ -173,6 +181,8 @@ public class DeviceCapabilityInfo { if (mMmtelRegistered) { mMmtelRegistered = false; } + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; mMmtelNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; } @@ -242,6 +252,8 @@ public class DeviceCapabilityInfo { changed = true; } mRcsNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; return changed; } @@ -430,6 +442,52 @@ public class DeviceCapabilityInfo { return mPresenceCapable; } + // Get the device's capabilities with the PRESENCE mechanism. + public RcsContactUceCapability getChangedPresenceCapability(Context context) { + if (context == null) { + return null; + } + Set<ServiceDescription> capableFromReg = + mServiceCapRegTracker.copyRegistrationCapabilities(); + if (isPresenceCapabilityChanged(capableFromReg)) { + RcsContactUceCapability rcsContactUceCapability = getPresenceCapabilities(context); + if (rcsContactUceCapability != null) { + mPendingPublishCapabilities = mServiceCapRegTracker.copyRegistrationCapabilities(); + } + return rcsContactUceCapability; + } + return null; + } + + public void setPresencePublishResult(boolean isSuccess) { + if (isSuccess) { + mLastSuccessfulCapabilities = mPendingPublishCapabilities; + } + mPendingPublishCapabilities = null; + } + + public void resetPresenceCapability() { + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; + } + + @VisibleForTesting + public void addLastSuccessfulServiceDescription(ServiceDescription capability) { + mLastSuccessfulCapabilities.add(capability); + } + + @VisibleForTesting + public boolean isPresenceCapabilityChanged(Set<ServiceDescription> capableFromReg) { + if (mLastSuccessfulCapabilities.isEmpty()) { + return true; + } + + if (capableFromReg.equals(mLastSuccessfulCapabilities)) { + return false; + } + return true; + } + private boolean isVolteAvailable(int networkRegType, MmTelCapabilities capabilities) { return (networkRegType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) && capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE); diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java index d8531a70..0df3b17e 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java @@ -112,6 +112,8 @@ public class PublishProcessor { logi("onRcsDisconnected"); mRcsFeatureManager = null; mProcessorState.onRcsDisconnected(); + // reset the publish capabilities. + mDeviceCapabilities.resetPresenceCapability(); } /** @@ -152,10 +154,15 @@ public class PublishProcessor { } // Get the latest device's capabilities. - RcsContactUceCapability deviceCapability = - mDeviceCapabilities.getDeviceCapabilities(CAPABILITY_MECHANISM_PRESENCE, mContext); + RcsContactUceCapability deviceCapability; + if (triggerType == PublishController.PUBLISH_TRIGGER_SERVICE) { + deviceCapability = mDeviceCapabilities.getDeviceCapabilities( + CAPABILITY_MECHANISM_PRESENCE, mContext); + } else { + deviceCapability = mDeviceCapabilities.getChangedPresenceCapability(mContext); + } if (deviceCapability == null) { - logw("doPublishInternal: device capability is null"); + logi("doPublishInternal: device capability hasn't changed or is null"); return false; } @@ -349,6 +356,8 @@ public class PublishProcessor { // Increase the retry count mProcessorState.increaseRetryCount(); + // reset the last capabilities because of the request is failed + mDeviceCapabilities.setPresencePublishResult(false); // Reset the pending flag because it is going to resend a request. clearPendingRequest(); @@ -373,10 +382,14 @@ public class PublishProcessor { Instant responseTime = response.getResponseTimestamp(); // Record the time when the request is successful and reset the retry count. + boolean publishSuccess = false; if (response.isRequestSuccess()) { mProcessorState.setLastPublishedTime(responseTime); mProcessorState.resetRetryCount(); + publishSuccess = true; } + // set the last capabilities according to the result of request. + mDeviceCapabilities.setPresencePublishResult(publishSuccess); // Update the publish state after the request has finished. int publishState = response.getPublishState(); @@ -492,6 +505,8 @@ public class PublishProcessor { */ public void resetState() { mProcessorState.resetState(); + // reset the publish capabilities. + mDeviceCapabilities.resetPresenceCapability(); } /** |