diff options
Diffstat (limited to 'src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java')
-rw-r--r-- | src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java | 105 |
1 files changed, 88 insertions, 17 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..49291484 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 @@ -39,10 +39,13 @@ 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.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Set; @@ -101,10 +104,14 @@ public class DeviceCapabilityInfo { // Whether the settings are changed or not private int mTtyPreferredMode; - private boolean mAirplaneMode; private boolean mMobileData; private boolean mVtSetting; + // The service description associated with the last publication update. + private final 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); @@ -121,12 +128,13 @@ public class DeviceCapabilityInfo { mRcsRegistered = false; mRcsNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; mTtyPreferredMode = TelecomManager.TTY_MODE_OFF; - mAirplaneMode = false; mMobileData = true; mVtSetting = true; mMmTelCapabilities = new MmTelCapabilities(); mMmtelAssociatedUris = Collections.EMPTY_LIST; mRcsAssociatedUris = Collections.EMPTY_LIST; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; } /** @@ -169,12 +177,17 @@ public class DeviceCapabilityInfo { /** * Update the status that IMS MMTEL is unregistered. */ - 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; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; + return changed; } /** @@ -242,7 +255,12 @@ public class DeviceCapabilityInfo { mRcsRegistered = false; changed = true; } + + mLastRegistrationFeatureTags = Collections.emptySet(); + updateRegistration(mLastRegistrationFeatureTags); mRcsNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; return changed; } @@ -373,19 +391,6 @@ public class DeviceCapabilityInfo { } /** - * Update airplane mode state. - * @return {@code true} if the airplane mode is changed, {@code false} otherwise. - */ - public synchronized boolean updateAirplaneMode(boolean state) { - if (mAirplaneMode != state) { - logd("Airplane mode changes from " + mAirplaneMode + " to " + state); - mAirplaneMode = state; - return true; - } - return false; - } - - /** * Update mobile data setting. * @return {@code true} if the mobile data setting is changed, {@code false} otherwise. */ @@ -454,6 +459,67 @@ 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.clear(); + if (mPendingPublishCapabilities != null) { + mLastSuccessfulCapabilities.addAll(mPendingPublishCapabilities); + } + } + mPendingPublishCapabilities = null; + } + + public void resetPresenceCapability() { + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; + } + + public List<RcsContactPresenceTuple> getLastSuccessfulPresenceTuplesWithoutContactUri() { + List<RcsContactPresenceTuple> presenceTuples = new ArrayList<>(); + if (mLastSuccessfulCapabilities.isEmpty()) { + return presenceTuples; + } + + for (ServiceDescription capability : mLastSuccessfulCapabilities) { + presenceTuples.add(capability.getTupleBuilder().build()); + } + return presenceTuples; + } + + @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); @@ -486,7 +552,12 @@ public class DeviceCapabilityInfo { @CapabilityMechanism int mechanism, Context context) { switch (mechanism) { case RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE: - return getPresenceCapabilities(context); + RcsContactUceCapability rcsContactUceCapability = getPresenceCapabilities(context); + if (rcsContactUceCapability != null) { + mPendingPublishCapabilities = + mServiceCapRegTracker.copyRegistrationCapabilities(); + } + return rcsContactUceCapability; case RcsContactUceCapability.CAPABILITY_MECHANISM_OPTIONS: return getOptionsCapabilities(context); default: |