aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCalvin Pan <calvinpan@google.com>2022-03-07 22:31:17 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-03-07 22:31:17 +0000
commit20c1798a636c09b04a67eaa4b3553ecd44807c5e (patch)
treec13476c49e7d5ccb2cd5f3ea027feab495749e27
parent51cd405955e1d4db81b5e78bc4007ee4ac7d6bcd (diff)
parentbdd893747aa376fcba3fc24a5c5d0292272e9aca (diff)
downloadims-sam_222710654.tar.gz
Fixing empty tuple capability always expired am: bdd893747asam_222710654
Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/2011982 Change-Id: I4802449adeae1c8fcebe8bd56f135fdfc11572e5
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java75
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java61
2 files changed, 111 insertions, 25 deletions
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
index 24407f45..3ca675a2 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
@@ -410,8 +410,10 @@ public class EabControllerImpl implements EabController {
if (mechanism == CAPABILITY_MECHANISM_PRESENCE) {
PresenceBuilder builder = new PresenceBuilder(
contactUri, SOURCE_TYPE_CACHED, result);
- builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
-
+ RcsContactPresenceTuple tuple = createPresenceTuple(contactUri, cursor);
+ if (tuple != null) {
+ builder.addCapabilityTuple(tuple);
+ }
String entityUri = getStringValue(cursor, EabProvider.EabCommonColumns.ENTITY_URI);
if (!TextUtils.isEmpty(entityUri)) {
builder.setEntityUri(Uri.parse(entityUri));
@@ -477,29 +479,34 @@ public class EabControllerImpl implements EabController {
serviceCapabilities = serviceCapabilitiesBuilder.build();
// Create RcsContactPresenceTuple
- RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
- new RcsContactPresenceTuple.Builder(status, serviceId, version);
- if (description != null) {
- rcsContactPresenceTupleBuilder.setServiceDescription(description);
- }
- if (contactUri != null) {
- rcsContactPresenceTupleBuilder.setContactUri(contactUri);
- }
- if (serviceCapabilities != null) {
- rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
- }
- if (timeStamp != null) {
- try {
- Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
- rcsContactPresenceTupleBuilder.setTime(instant);
- } catch (NumberFormatException ex) {
- Log.w(TAG, "Create presence tuple: NumberFormatException");
- } catch (DateTimeParseException e) {
- Log.w(TAG, "Create presence tuple: parse timestamp failed");
+ boolean isTupleEmpty = TextUtils.isEmpty(status) && TextUtils.isEmpty(serviceId)
+ && TextUtils.isEmpty(version);
+ if (!isTupleEmpty) {
+ RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
+ new RcsContactPresenceTuple.Builder(status, serviceId, version);
+ if (description != null) {
+ rcsContactPresenceTupleBuilder.setServiceDescription(description);
}
+ if (contactUri != null) {
+ rcsContactPresenceTupleBuilder.setContactUri(contactUri);
+ }
+ if (serviceCapabilities != null) {
+ rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
+ }
+ if (timeStamp != null) {
+ try {
+ Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
+ rcsContactPresenceTupleBuilder.setTime(instant);
+ } catch (NumberFormatException ex) {
+ Log.w(TAG, "Create presence tuple: NumberFormatException");
+ } catch (DateTimeParseException e) {
+ Log.w(TAG, "Create presence tuple: parse timestamp failed");
+ }
+ }
+ return rcsContactPresenceTupleBuilder.build();
+ } else {
+ return null;
}
-
- return rcsContactPresenceTupleBuilder.build();
}
private boolean isCapabilityExpired(Cursor cursor) {
@@ -657,8 +664,28 @@ public class EabControllerImpl implements EabController {
int commonId = Integer.parseInt(result.getLastPathSegment());
Log.d(TAG, "Insert into common table. Id: " + commonId);
+ if (capability.getCapabilityTuples().size() == 0) {
+ insertEmptyTuple(commonId);
+ } else {
+ insertAllTuples(commonId, capability);
+ }
+ }
+
+ private void insertEmptyTuple(int commonId) {
+ Log.d(TAG, "Insert empty tuple into presence table.");
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
+ // Using current timestamp instead of network timestamp since there is not use cases for
+ // network timestamp and the network timestamp may cause capability expire immediately.
+ contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP,
+ mExpirationTimeFactory.getExpirationTime());
+ mContext.getContentResolver().insert(EabProvider.PRESENCE_URI, contentValues);
+ }
+
+ private void insertAllTuples(int commonId, RcsContactUceCapability capability) {
ContentValues[] presenceContent =
new ContentValues[capability.getCapabilityTuples().size()];
+
for (int i = 0; i < presenceContent.length; i++) {
RcsContactPresenceTuple tuple = capability.getCapabilityTuples().get(i);
@@ -679,7 +706,7 @@ public class EabControllerImpl implements EabController {
}
}
- contentValues = new ContentValues();
+ ContentValues contentValues = new ContentValues();
contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
contentValues.put(EabProvider.PresenceTupleColumns.SERVICE_ID, tuple.getServiceId());
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
index 63a097ba..f855d061 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
@@ -35,7 +35,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Looper;
import android.os.PersistableBundle;
-import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactUceCapability;
import android.test.mock.MockContentResolver;
@@ -317,6 +316,59 @@ public class EabControllerTest extends ImsTestBase {
mEabControllerSub2.getCapabilities(contactUriList).size());
}
+ @Test
+ @SmallTest
+ public void testSaveCapabilityWithEmptyTuple() {
+ List<RcsContactUceCapability> contactList = new ArrayList<>();
+ contactList.add(createEmptyTuplePresenceCapability());
+
+ mEabControllerSub1.saveCapabilities(contactList);
+
+ List<Uri> contactUriList = new ArrayList<>();
+ contactUriList.add(TEST_CONTACT_URI);
+ List<EabCapabilityResult> capabilityResults =
+ mEabControllerSub1.getCapabilities(contactUriList);
+ Assert.assertEquals(1, capabilityResults.size());
+ Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
+ capabilityResults.get(0).getStatus());
+ Assert.assertEquals(0,
+ capabilityResults.get(0).getContactCapabilities().getCapabilityTuples().size());
+ }
+
+ @Test
+ @SmallTest
+ public void testGetCapabilityWithEmptyTuple() {
+ List<RcsContactUceCapability> contactList = new ArrayList<>();
+ contactList.add(createEmptyTuplePresenceCapability());
+
+ mEabControllerSub1.saveCapabilities(contactList);
+
+ List<Uri> contactUriList = new ArrayList<>();
+ contactUriList.add(TEST_CONTACT_URI);
+ Assert.assertEquals(1,
+ mEabControllerSub1.getCapabilities(contactUriList).size());
+ Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
+ mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testGetExpiredCapabilityWithEmptyTuple() {
+ List<RcsContactUceCapability> contactList = new ArrayList<>();
+ doReturn(0L).when(mExpirationTimeFactory).getExpirationTime();
+
+ contactList.add(createEmptyTuplePresenceCapability());
+
+ mEabControllerSub1.saveCapabilities(contactList);
+
+ List<Uri> contactUriList = new ArrayList<>();
+ contactUriList.add(TEST_CONTACT_URI);
+ Assert.assertEquals(1,
+ mEabControllerSub1.getCapabilities(contactUriList).size());
+ Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
+ mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
+ }
+
private RcsContactUceCapability createPresenceCapability() {
RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
@@ -363,6 +415,13 @@ public class EabControllerTest extends ImsTestBase {
return builder.build();
}
+ private RcsContactUceCapability createEmptyTuplePresenceCapability() {
+ RcsContactUceCapability.PresenceBuilder builder =
+ new RcsContactUceCapability.PresenceBuilder(
+ TEST_CONTACT_URI, SOURCE_TYPE_NETWORK, REQUEST_RESULT_FOUND);
+ return builder.build();
+ }
+
private void insertContactInfoToDB() {
ContentValues data = new ContentValues();
data.put(EabProvider.ContactColumns.PHONE_NUMBER, TEST_PHONE_NUMBER);