Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f885fb8 authored by Calvin Pan's avatar Calvin Pan Committed by Automerger Merge Worker
Browse files

Fixing empty tuple capability always expired am: bdd89374 am: 20c1798a

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/2011982

Change-Id: Id2ab047b0338d967e624c294dce47dc25c093563
parents c92d27d0 20c1798a
Loading
Loading
Loading
Loading
+51 −24
Original line number Diff line number Diff line
@@ -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,6 +479,9 @@ public class EabControllerImpl implements EabController {
        serviceCapabilities = serviceCapabilitiesBuilder.build();

        // Create RcsContactPresenceTuple
        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) {
@@ -498,8 +503,10 @@ public class EabControllerImpl implements EabController {
                    Log.w(TAG, "Create presence tuple: parse timestamp failed");
                }
            }

            return rcsContactPresenceTupleBuilder.build();
        } else {
            return null;
        }
    }

    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());
+60 −1
Original line number Diff line number Diff line
@@ -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);