aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java
diff options
context:
space:
mode:
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.java105
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: