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

Commit c2bccde5 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

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

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


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


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


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

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


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

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


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


    protected static long getAvailabilityCacheExpiration(int subId) {
    protected long getAvailabilityCacheExpiration(int subId) {
        long value = -1;
        long value = -1;
        try {
        try {
            ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId);
            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 = new ContentValues();
            contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
            contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
            contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
            contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
@@ -593,7 +588,11 @@ public class EabControllerImpl implements EabController {
                    tuple.getServiceVersion());
                    tuple.getServiceVersion());
            contentValues.put(EabProvider.PresenceTupleColumns.DESCRIPTION,
            contentValues.put(EabProvider.PresenceTupleColumns.DESCRIPTION,
                    tuple.getServiceDescription());
                    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,
            contentValues.put(EabProvider.PresenceTupleColumns.CONTACT_URI,
                    tuple.getContactUri().toString());
                    tuple.getContactUri().toString());
            if (serviceCapabilities != null) {
            if (serviceCapabilities != null) {
@@ -790,4 +789,9 @@ public class EabControllerImpl implements EabController {
        }
        }
        return number;
        return number;
    }
    }

    @VisibleForTesting
    public void setExpirationTimeFactory(ExpirationTimeFactory factory) {
        mExpirationTimeFactory = factory;
    }
}
}
+40 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,46 @@ public class EabUtil {
        return result.toString();
        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.
     * Remove the given EAB contacts from the EAB database.
     */
     */
+20 −23
Original line number Original line 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 com.android.ims.rcs.uce.eab.EabProvider.PRESENCE_URI;


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


import android.content.ContentValues;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.Cursor;
import android.net.Uri;
import android.net.Uri;
import android.os.Looper;
import android.os.Looper;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsContactUceCapability;
import android.test.mock.MockContentResolver;
import android.test.mock.MockContentResolver;
@@ -48,9 +50,10 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.Mock;


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


    @Mock
    EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory;

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


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


        mEabController.saveCapabilities(contactList);
        mEabController.saveCapabilities(contactList);


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


        mEabController.saveCapabilities(contactList);
        mEabController.saveCapabilities(contactList);


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

        contactList.add(createPresenceCapability());


        mEabController.saveCapabilities(contactList);
        mEabController.saveCapabilities(contactList);


@@ -150,13 +160,9 @@ public class EabControllerTest extends ImsTestBase {
    public void testNonRcsCapability() {
    public void testNonRcsCapability() {
        // Set non-rcs capabilities expiration to 121 days
        // Set non-rcs capabilities expiration to 121 days
        mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 121 * 24 * 60 * 60);
        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<>();
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability(Instant.now()));
        contactList.add(createPresenceNonRcsCapability());


        mEabController.saveCapabilities(contactList);
        mEabController.saveCapabilities(contactList);


@@ -176,10 +182,11 @@ public class EabControllerTest extends ImsTestBase {
        // Set non-rcs capabilities expiration to 119 days
        // Set non-rcs capabilities expiration to 119 days
        mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 119 * 24 * 60 * 60);
        mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 119 * 24 * 60 * 60);
        // Set timestamp to 120 days age
        // 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<>();
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability(timestamp));
        contactList.add(createPresenceNonRcsCapability());
        mEabController.saveCapabilities(contactList);
        mEabController.saveCapabilities(contactList);


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


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

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


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


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


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


        RcsContactUceCapability.PresenceBuilder builder =
        RcsContactUceCapability.PresenceBuilder builder =