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

Commit 3315e8fb authored by Calvin Pan's avatar Calvin Pan Committed by Automerger Merge Worker
Browse files

Merge "Using local timestamp instead of network when saving RCS capability"...

Merge "Using local timestamp instead of network when saving RCS capability" into sc-dev am: 23a0ea2e am: c2bccde5

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

Change-Id: Id9f486942615e55b14f8d0606f127f27f9f68a96
parents 3c9b8130 c2bccde5
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@ package com.android.ims.rcs.uce.eab;
import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_OPTIONS;
import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE;

import static com.android.ims.rcs.uce.eab.EabControllerImpl.getCapabilityCacheExpiration;

import android.app.AlarmManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -290,7 +288,7 @@ public final class EabBulkCapabilityUpdater {
                Log.d(TAG, "Can't find min timestamp in eab provider");
                return;
            }
            expiredTimestamp += getCapabilityCacheExpiration(mSubId);
            expiredTimestamp += mEabControllerImpl.getCapabilityCacheExpiration(mSubId);
            Log.d(TAG, "set time alert at " + expiredTimestamp);
            cancelTimeAlert(mContext);
            setTimeAlert(mContext, expiredTimestamp);
@@ -397,7 +395,7 @@ public final class EabBulkCapabilityUpdater {
    private List<Uri> getExpiredContactList() {
        List<Uri> refreshList = new ArrayList<>();
        long expiredTime = (System.currentTimeMillis() / 1000)
                + getCapabilityCacheExpiration(mSubId);
                + mEabControllerImpl.getCapabilityCacheExpiration(mSubId);
        String selection = "("
                + EabProvider.EabCommonColumns.MECHANISM + "=" + CAPABILITY_MECHANISM_PRESENCE
                + " AND " + EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP + "<"
+19 −15
Original line number Diff line number Diff line
@@ -41,9 +41,7 @@ import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsContactUceCapability.OptionsBuilder;
import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
import android.text.TextUtils;
import android.text.format.Time;
import android.util.Log;
import android.util.TimeFormatException;

import com.android.i18n.phonenumbers.NumberParseException;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
@@ -56,10 +54,8 @@ import java.time.Instant;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Objects;
import java.util.TimeZone;
import java.util.function.Predicate;

/**
@@ -84,12 +80,19 @@ public class EabControllerImpl implements EabController {
    private UceControllerCallback mUceControllerCallback;
    private volatile boolean mIsSetDestroyedFlag = false;

    private ExpirationTimeFactory mExpirationTimeFactory = () -> Instant.now().getEpochSecond();

    @VisibleForTesting
    public final Runnable mCapabilityCleanupRunnable = () -> {
        Log.d(TAG, "Cleanup Capabilities");
        cleanupExpiredCapabilities();
    };

    @VisibleForTesting
    public interface ExpirationTimeFactory {
        long getExpirationTime();
    }

    public EabControllerImpl(Context context, int subId, UceControllerCallback c, Looper looper) {
        mContext = context;
        mSubId = subId;
@@ -481,7 +484,7 @@ public class EabControllerImpl implements EabController {
        return value;
    }

    protected static int getCapabilityCacheExpiration(int subId) {
    protected int getCapabilityCacheExpiration(int subId) {
        int value = -1;
        try {
            ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId);
@@ -498,7 +501,7 @@ public class EabControllerImpl implements EabController {
        return value;
    }

    protected static long getAvailabilityCacheExpiration(int subId) {
    protected long getAvailabilityCacheExpiration(int subId) {
        long value = -1;
        try {
            ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId);
@@ -577,14 +580,6 @@ public class EabControllerImpl implements EabController {
                }
            }

            // Using the current timestamp if the timestamp doesn't populate
            Long timestamp;
            if (tuple.getTime() != null) {
                timestamp = tuple.getTime().getEpochSecond();
            } else {
                timestamp = Instant.now().getEpochSecond();
            }

            contentValues = new ContentValues();
            contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
            contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
@@ -593,7 +588,11 @@ public class EabControllerImpl implements EabController {
                    tuple.getServiceVersion());
            contentValues.put(EabProvider.PresenceTupleColumns.DESCRIPTION,
                    tuple.getServiceDescription());
            contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP, timestamp);

            // 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());
            contentValues.put(EabProvider.PresenceTupleColumns.CONTACT_URI,
                    tuple.getContactUri().toString());
            if (serviceCapabilities != null) {
@@ -790,4 +789,9 @@ public class EabControllerImpl implements EabController {
        }
        return number;
    }

    @VisibleForTesting
    public void setExpirationTimeFactory(ExpirationTimeFactory factory) {
        mExpirationTimeFactory = factory;
    }
}
+40 −0
Original line number Diff line number Diff line
@@ -74,6 +74,46 @@ public class EabUtil {
        return result.toString();
    }

    /**
     * Get the given EAB capability from the EAB database.
     *
     * Output format:
     * [PHONE_NUMBER], [RAW_PRESENCE_ID], [PRESENCE_TIMESTAMP], [RAW_OPTION_ID], [OPTION_TIMESTAMP]
     */
    public static String getCapabilityFromEab(Context context, String contact) {
        StringBuilder result = new StringBuilder();
        try (Cursor cursor = context.getContentResolver().query(
                EabProvider.ALL_DATA_URI,
                new String[]{ContactColumns.PHONE_NUMBER,
                        PresenceTupleColumns._ID,
                        PresenceTupleColumns.REQUEST_TIMESTAMP,
                        OptionsColumns._ID,
                        OptionsColumns.REQUEST_TIMESTAMP},
                ContactColumns.PHONE_NUMBER + "=?",
                new String[]{contact}, null)) {
            if (cursor != null && cursor.moveToFirst()) {
                result.append(cursor.getString(cursor.getColumnIndex(
                        ContactColumns.PHONE_NUMBER)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        PresenceTupleColumns._ID)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        PresenceTupleColumns.REQUEST_TIMESTAMP)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        OptionsColumns._ID)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        OptionsColumns.REQUEST_TIMESTAMP)));
            }
        } catch (Exception e) {
            Log.w(LOG_TAG, "getCapability exception " + e);
        }
        Log.d(LOG_TAG, "getCapabilityFromEab() result: " + result);
        return result.toString();
    }

    /**
     * Remove the given EAB contacts from the EAB database.
     */
+20 −23
Original line number Diff line number Diff line
@@ -28,12 +28,14 @@ import static com.android.ims.rcs.uce.eab.EabProvider.OPTIONS_URI;
import static com.android.ims.rcs.uce.eab.EabProvider.PRESENCE_URI;

import static org.junit.Assert.fail;
import static org.mockito.Mockito.doReturn;

import android.content.ContentValues;
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;
@@ -48,9 +50,10 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.time.temporal.ChronoUnit;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
@@ -67,6 +70,9 @@ public class EabControllerTest extends ImsTestBase {
    PersistableBundle mBundle;
    ExecutorService mExecutor = Executors.newSingleThreadExecutor();

    @Mock
    EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory;

    private static final int TEST_SUB_ID = 1;
    private static final String TEST_PHONE_NUMBER = "16661234567";
    private static final String TEST_SERVICE_STATUS = "status";
@@ -90,6 +96,8 @@ public class EabControllerTest extends ImsTestBase {
        insertContactInfoToDB();
        mEabController = new EabControllerImpl(
                mContext, TEST_SUB_ID, null, Looper.getMainLooper());
        mEabController.setExpirationTimeFactory(mExpirationTimeFactory);
        doReturn(Instant.now().getEpochSecond()).when(mExpirationTimeFactory).getExpirationTime();

        mBundle = mContextFixture.getTestCarrierConfigBundle();
    }
@@ -103,7 +111,7 @@ public class EabControllerTest extends ImsTestBase {
    @SmallTest
    public void testGetAvailability() {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability(false));
        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);

@@ -117,7 +125,7 @@ public class EabControllerTest extends ImsTestBase {
    @SmallTest
    public void testGetCapability() {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability(false));
        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);

@@ -133,7 +141,9 @@ public class EabControllerTest extends ImsTestBase {
    @SmallTest
    public void testGetExpiredCapability() {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability(true));
        doReturn(0L).when(mExpirationTimeFactory).getExpirationTime();

        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);

@@ -150,13 +160,9 @@ public class EabControllerTest extends ImsTestBase {
    public void testNonRcsCapability() {
        // Set non-rcs capabilities expiration to 121 days
        mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 121 * 24 * 60 * 60);
        // Set timestamp to 120 days age
        GregorianCalendar date = new GregorianCalendar();
        date.setTimeZone(TimeZone.getTimeZone("UTC"));
        date.add(Calendar.DATE, -120);

        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability(Instant.now()));
        contactList.add(createPresenceNonRcsCapability());

        mEabController.saveCapabilities(contactList);

@@ -176,10 +182,11 @@ public class EabControllerTest extends ImsTestBase {
        // Set non-rcs capabilities expiration to 119 days
        mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 119 * 24 * 60 * 60);
        // Set timestamp to 120 days age
        Instant timestamp = Instant.now().minus(120, ChronoUnit.DAYS);
        long timestamp = Instant.now().minus(120, ChronoUnit.DAYS).getEpochSecond();
        doReturn(timestamp).when(mExpirationTimeFactory).getExpirationTime();

        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability(timestamp));
        contactList.add(createPresenceNonRcsCapability());
        mEabController.saveCapabilities(contactList);

        // Verify result is expired
@@ -282,14 +289,7 @@ public class EabControllerTest extends ImsTestBase {
        }
    }

    private RcsContactUceCapability createPresenceCapability(boolean isExpired) {
        Instant timestamp;
        if (isExpired) {
            timestamp = Instant.now().minus(120, ChronoUnit.DAYS);
        } else {
            timestamp = Instant.now().plus(120, ChronoUnit.DAYS);
        }

    private RcsContactUceCapability createPresenceCapability() {
        RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
                        TEST_VIDEO_CAPABLE);
@@ -299,7 +299,6 @@ public class EabControllerTest extends ImsTestBase {
                        .setServiceDescription(TEST_SERVICE_DESCRIPTION)
                        .setContactUri(TEST_CONTACT_URI)
                        .setServiceCapabilities(serviceCapabilitiesBuilder.build())
                        .setTime(timestamp)
                        .build();

        RcsContactPresenceTuple tupleWithEmptyServiceCapabilities =
@@ -307,7 +306,6 @@ public class EabControllerTest extends ImsTestBase {
                        TEST_SERVICE_VERSION)
                        .setServiceDescription(TEST_SERVICE_DESCRIPTION)
                        .setContactUri(TEST_CONTACT_URI)
                        .setTime(timestamp)
                        .build();

        RcsContactUceCapability.PresenceBuilder builder =
@@ -318,7 +316,7 @@ public class EabControllerTest extends ImsTestBase {
        return builder.build();
    }

    private RcsContactUceCapability createPresenceNonRcsCapability(Instant timestamp) {
    private RcsContactUceCapability createPresenceNonRcsCapability() {
        RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                new RcsContactPresenceTuple.ServiceCapabilities.Builder(false, false);
        RcsContactPresenceTuple tupleWithServiceCapabilities =
@@ -327,7 +325,6 @@ public class EabControllerTest extends ImsTestBase {
                        .setServiceDescription(TEST_SERVICE_DESCRIPTION)
                        .setContactUri(TEST_CONTACT_URI)
                        .setServiceCapabilities(serviceCapabilitiesBuilder.build())
                        .setTime(timestamp)
                        .build();

        RcsContactUceCapability.PresenceBuilder builder =