diff options
author | Calvin Pan <calvinpan@google.com> | 2022-03-07 22:31:17 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-03-07 22:31:17 +0000 |
commit | 20c1798a636c09b04a67eaa4b3553ecd44807c5e (patch) | |
tree | c13476c49e7d5ccb2cd5f3ea027feab495749e27 | |
parent | 51cd405955e1d4db81b5e78bc4007ee4ac7d6bcd (diff) | |
parent | bdd893747aa376fcba3fc24a5c5d0292272e9aca (diff) | |
download | ims-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.java | 75 | ||||
-rw-r--r-- | tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java | 61 |
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); |