diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-01 00:18:57 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-01 00:18:57 +0000 |
commit | c31b6bdf2afd2c967be2b5e90ca21c3c7a8d7fdd (patch) | |
tree | c453c84db4ad6173d359006761f9beddded5d97b | |
parent | 9f3d809a63c6a3c7c72889d85d02657dace90451 (diff) | |
parent | cbaaf03b8515fb290528f5892a78f8a8c309f34e (diff) | |
download | ims-android12-mainline-art-release.tar.gz |
Snap for 7692221 from cbaaf03b8515fb290528f5892a78f8a8c309f34e to mainline-art-releaseandroid-mainline-12.0.0_r98android-mainline-12.0.0_r69android-mainline-12.0.0_r5android-mainline-12.0.0_r42android-mainline-12.0.0_r22android-mainline-12.0.0_r115android12-mainline-art-release
Change-Id: Ie85720a31abb5cd48b19ffd7d6a1696b893c05e5
11 files changed, 215 insertions, 93 deletions
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java index 76c98b09..345cbc51 100644 --- a/src/java/com/android/ims/ImsManager.java +++ b/src/java/com/android/ims/ImsManager.java @@ -2618,8 +2618,10 @@ public class ImsManager implements FeatureUpdates { CapabilityChangeRequest request = new CapabilityChangeRequest(); updateVoiceCellFeatureValue(request, isNonTtyOrTtyOnVolteEnabled); updateVideoCallFeatureValue(request, isNonTtyOrTtyOnVolteEnabled); + // update MMTEL caps for the new configuration. + changeMmTelCapability(request); if (isImsNeeded(request)) { - changeMmTelCapability(request); + // Only turn on IMS if voice/video is enabled now in the new configuration. turnOnIms(); } } diff --git a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java index 5f2a5653..6d3eabf3 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java @@ -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 + "<" 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 f59171f3..cc1011fc 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java @@ -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; + } } diff --git a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java index 60283c22..da70349a 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java @@ -81,7 +81,7 @@ public class EabProvider extends ContentProvider { public static final String AUTHORITY = "eab"; private static final String TAG = "EabProvider"; - private static final int DATABASE_VERSION = 2; + private static final int DATABASE_VERSION = 3; public static final String EAB_CONTACT_TABLE_NAME = "eab_contact"; public static final String EAB_COMMON_TABLE_NAME = "eab_common"; @@ -332,8 +332,6 @@ public class EabProvider extends ContentProvider { static { CONTACT_UNIQUE_FIELDS.add(ContactColumns.PHONE_NUMBER); - - COMMON_UNIQUE_FIELDS.add(EabCommonColumns.EAB_CONTACT_ID); } @VisibleForTesting @@ -356,8 +354,7 @@ public class EabProvider extends ContentProvider { + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, " + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, " + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, " - + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1, " - + "UNIQUE (" + TextUtils.join(", ", COMMON_UNIQUE_FIELDS) + ")" + + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 " + ");"; @VisibleForTesting @@ -410,6 +407,46 @@ public class EabProvider extends ContentProvider { + ContactColumns.CONTACT_ID + " INTEGER DEFAULT -1;"); oldVersion = 2; } + + if (oldVersion < 3) { + // Drop UNIQUE constraint in EAB_COMMON_TABLE, SQLite didn't support DROP + // constraint, so drop the old one and migrate data to new one + + // Create temp table + final String createTempTableCommand = "CREATE TABLE temp" + + " (" + + EabCommonColumns._ID + " INTEGER PRIMARY KEY, " + + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, " + + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, " + + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, " + + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 " + + ");"; + sqLiteDatabase.execSQL(createTempTableCommand); + + // Migrate data to temp table + sqLiteDatabase.execSQL("INSERT INTO temp (" + + EabCommonColumns._ID + ", " + + EabCommonColumns.EAB_CONTACT_ID + ", " + + EabCommonColumns.MECHANISM + ", " + + EabCommonColumns.REQUEST_RESULT + ", " + + EabCommonColumns.SUBSCRIPTION_ID + ") " + + " SELECT " + + EabCommonColumns._ID + ", " + + EabCommonColumns.EAB_CONTACT_ID + ", " + + EabCommonColumns.MECHANISM + ", " + + EabCommonColumns.REQUEST_RESULT + ", " + + EabCommonColumns.SUBSCRIPTION_ID + " " + + " FROM " + + EAB_COMMON_TABLE_NAME + +";"); + + // Drop old one + sqLiteDatabase.execSQL("DROP TABLE " + EAB_COMMON_TABLE_NAME + ";"); + + // Rename temp to eab_common + sqLiteDatabase.execSQL("ALTER TABLE temp RENAME TO " + EAB_COMMON_TABLE_NAME + ";"); + oldVersion = 3; + } } } diff --git a/src/java/com/android/ims/rcs/uce/eab/EabUtil.java b/src/java/com/android/ims/rcs/uce/eab/EabUtil.java index de738067..e2c21cdb 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabUtil.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabUtil.java @@ -75,6 +75,46 @@ public class EabUtil { } /** + * 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. */ public static int removeContactFromEab(int subId, String contacts, Context context) { diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java index 2660f1d9..dc2dc045 100644 --- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java +++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java @@ -36,14 +36,13 @@ import com.android.ims.rcs.uce.presence.pidfparser.pidf.PidfConstant; import com.android.ims.rcs.uce.presence.pidfparser.pidf.Presence; import com.android.ims.rcs.uce.presence.pidfparser.pidf.Tuple; import com.android.ims.rcs.uce.util.UceUtils; +import com.android.internal.annotations.VisibleForTesting; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -63,6 +62,29 @@ public class PidfParser { private static final Pattern PIDF_PATTERN = Pattern.compile("\t|\r|\n"); /** + * Testing interface used to get the timestamp. + */ + @VisibleForTesting + public interface TimestampProxy { + Instant getTimestamp(); + } + + // The timestamp proxy to create the local timestamp. + private static final TimestampProxy sLocalTimestampProxy = () -> Instant.now(); + + // Override timestamp proxy for testing only. + private static TimestampProxy sOverrideTimestampProxy; + + @VisibleForTesting + public static void setTimestampProxy(TimestampProxy proxy) { + sOverrideTimestampProxy = proxy; + } + + private static TimestampProxy getTimestampProxy() { + return (sOverrideTimestampProxy != null) ? sOverrideTimestampProxy : sLocalTimestampProxy; + } + + /** * Convert the RcsContactUceCapability to the string of pidf. */ public static String convertToPidf(RcsContactUceCapability capabilities) { @@ -214,17 +236,8 @@ public class PidfParser { builder.setContactUri(Uri.parse(contact)); } - // Timestamp - String timestamp = PidfParserUtils.getTupleTimestamp(tuple); - if (!TextUtils.isEmpty(timestamp)) { - try { - Instant instant = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse( - timestamp, Instant::from); - builder.setTime(instant); - } catch (DateTimeParseException e) { - Log.w(LOG_TAG, "getRcsContactPresenceTuple: Parse timestamp failed " + e); - } - } + // Use local time instead to prevent we receive the incorrect timestamp from the network. + builder.setTime(getTimestampProxy().getTimestamp()); // Set service description if (!TextUtils.isEmpty(serviceDescription)) { diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java index f0db7d96..aa08f3a6 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java @@ -134,14 +134,14 @@ public class ServiceDescription { public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION = new ServiceDescription( - RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE, + RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(), "1.0" /*version*/, null /*description*/ ); public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V2 = new ServiceDescription( - RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE, + RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(), "2.0" /*version*/, null /*description*/ ); diff --git a/src/java/com/android/ims/rcs/uce/util/UceUtils.java b/src/java/com/android/ims/rcs/uce/util/UceUtils.java index e5ba6a96..c88de0b3 100644 --- a/src/java/com/android/ims/rcs/uce/util/UceUtils.java +++ b/src/java/com/android/ims/rcs/uce/util/UceUtils.java @@ -49,7 +49,8 @@ public class UceUtils { private static final long DEFAULT_REQUEST_RETRY_INTERVAL_MS = TimeUnit.MINUTES.toMillis(20); private static final long DEFAULT_MINIMUM_REQUEST_RETRY_AFTER_MS = TimeUnit.SECONDS.toMillis(3); - private static final long DEFAULT_CAP_REQUEST_TIMEOUT_AFTER_MS = TimeUnit.MINUTES.toMillis(1); + // The default of the capabilities request timeout. + private static final long DEFAULT_CAP_REQUEST_TIMEOUT_AFTER_MS = TimeUnit.MINUTES.toMillis(3); private static Optional<Long> OVERRIDE_CAP_REQUEST_TIMEOUT_AFTER_MS = Optional.empty(); // The task ID of the UCE request 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 af52217d..96147b43 100644 --- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java +++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java @@ -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; @@ -63,11 +66,16 @@ import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) public class EabControllerTest extends ImsTestBase { EabProviderTestable mEabProviderTestable = new EabProviderTestable(); - EabControllerImpl mEabController; + EabControllerImpl mEabControllerSub1; + EabControllerImpl mEabControllerSub2; PersistableBundle mBundle; ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + @Mock + EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory; + private static final int TEST_SUB_ID = 1; + private static final int TEST_SECOND_SUB_ID = 2; private static final String TEST_PHONE_NUMBER = "16661234567"; private static final String TEST_SERVICE_STATUS = "status"; private static final String TEST_SERVICE_SERVICE_ID = "serviceId"; @@ -88,8 +96,15 @@ public class EabControllerTest extends ImsTestBase { mockContentResolver.addProvider(EabProvider.AUTHORITY, mEabProviderTestable); insertContactInfoToDB(); - mEabController = new EabControllerImpl( + mEabControllerSub1 = new EabControllerImpl( mContext, TEST_SUB_ID, null, Looper.getMainLooper()); + mEabControllerSub1.setExpirationTimeFactory(mExpirationTimeFactory); + + mEabControllerSub2 = new EabControllerImpl( + mContext, TEST_SECOND_SUB_ID, null, Looper.getMainLooper()); + mEabControllerSub2.setExpirationTimeFactory(mExpirationTimeFactory); + + doReturn(Instant.now().getEpochSecond()).when(mExpirationTimeFactory).getExpirationTime(); mBundle = mContextFixture.getTestCarrierConfigBundle(); } @@ -103,11 +118,11 @@ public class EabControllerTest extends ImsTestBase { @SmallTest public void testGetAvailability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(false)); + contactList.add(createPresenceCapability()); - mEabController.saveCapabilities(contactList); + mEabControllerSub1.saveCapabilities(contactList); - EabCapabilityResult result = mEabController.getAvailability(TEST_CONTACT_URI); + EabCapabilityResult result = mEabControllerSub1.getAvailability(TEST_CONTACT_URI); Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, result.getStatus()); Assert.assertEquals(TEST_CONTACT_URI, result.getContactCapabilities().getContactUri()); @@ -117,32 +132,34 @@ public class EabControllerTest extends ImsTestBase { @SmallTest public void testGetCapability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(false)); + contactList.add(createPresenceCapability()); - mEabController.saveCapabilities(contactList); + mEabControllerSub1.saveCapabilities(contactList); List<Uri> contactUriList = new ArrayList<>(); contactUriList.add(TEST_CONTACT_URI); Assert.assertEquals(1, - mEabController.getCapabilities(contactUriList).size()); + mEabControllerSub1.getCapabilities(contactUriList).size()); Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, - mEabController.getCapabilities(contactUriList).get(0).getStatus()); + mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus()); } @Test @SmallTest public void testGetExpiredCapability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(true)); + doReturn(0L).when(mExpirationTimeFactory).getExpirationTime(); - mEabController.saveCapabilities(contactList); + contactList.add(createPresenceCapability()); + + mEabControllerSub1.saveCapabilities(contactList); List<Uri> contactUriList = new ArrayList<>(); contactUriList.add(TEST_CONTACT_URI); Assert.assertEquals(1, - mEabController.getCapabilities(contactUriList).size()); + mEabControllerSub1.getCapabilities(contactUriList).size()); Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE, - mEabController.getCapabilities(contactUriList).get(0).getStatus()); + mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus()); } @Test @@ -150,24 +167,20 @@ 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); + mEabControllerSub1.saveCapabilities(contactList); List<Uri> contactUriList = new ArrayList<>(); contactUriList.add(TEST_CONTACT_URI); // Verify result is not expired Assert.assertEquals(1, - mEabController.getCapabilities(contactUriList).size()); + mEabControllerSub1.getCapabilities(contactUriList).size()); Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, - mEabController.getCapabilities(contactUriList).get(0).getStatus()); + mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus()); } @Test @@ -176,19 +189,20 @@ 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)); - mEabController.saveCapabilities(contactList); + contactList.add(createPresenceNonRcsCapability()); + mEabControllerSub1.saveCapabilities(contactList); // Verify result is expired List<Uri> contactUriList = new ArrayList<>(); contactUriList.add(TEST_CONTACT_URI); Assert.assertEquals(1, - mEabController.getCapabilities(contactUriList).size()); + mEabControllerSub1.getCapabilities(contactUriList).size()); Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE, - mEabController.getCapabilities(contactUriList).get(0).getStatus()); + mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus()); } @Test @@ -202,7 +216,7 @@ public class EabControllerTest extends ImsTestBase { data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1); mContext.getContentResolver().insert(COMMON_URI, data); - mExecutor.execute(mEabController.mCapabilityCleanupRunnable); + mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable); mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS); // Verify the entry that cannot map to presence/option table has been removed @@ -235,7 +249,7 @@ public class EabControllerTest extends ImsTestBase { expiredDate.getTime().getTime() / 1000); mContext.getContentResolver().insert(PRESENCE_URI, data); - mExecutor.execute(mEabController.mCapabilityCleanupRunnable); + mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable); mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS); // Verify the invalid data has been removed after save capabilities @@ -268,7 +282,7 @@ public class EabControllerTest extends ImsTestBase { expiredDate.getTime().getTime() / 1000); mContext.getContentResolver().insert(OPTIONS_URI, data); - mExecutor.execute(mEabController.mCapabilityCleanupRunnable); + mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable); mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS); // Verify the invalid data has been removed after save capabilities @@ -282,14 +296,24 @@ 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); - } + @Test + @SmallTest + public void testSaveCapabilityForDifferentSubId() { + List<RcsContactUceCapability> contactList = new ArrayList<>(); + contactList.add(createPresenceCapability()); + + mEabControllerSub1.saveCapabilities(contactList); + mEabControllerSub2.saveCapabilities(contactList); + + List<Uri> contactUriList = new ArrayList<>(); + contactUriList.add(TEST_CONTACT_URI); + Assert.assertEquals(1, + mEabControllerSub1.getCapabilities(contactUriList).size()); + Assert.assertEquals(1, + mEabControllerSub2.getCapabilities(contactUriList).size()); + } + private RcsContactUceCapability createPresenceCapability() { RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder = new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE, TEST_VIDEO_CAPABLE); @@ -299,7 +323,6 @@ public class EabControllerTest extends ImsTestBase { .setServiceDescription(TEST_SERVICE_DESCRIPTION) .setContactUri(TEST_CONTACT_URI) .setServiceCapabilities(serviceCapabilitiesBuilder.build()) - .setTime(timestamp) .build(); RcsContactPresenceTuple tupleWithEmptyServiceCapabilities = @@ -307,7 +330,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 +340,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 +349,6 @@ public class EabControllerTest extends ImsTestBase { .setServiceDescription(TEST_SERVICE_DESCRIPTION) .setContactUri(TEST_CONTACT_URI) .setServiceCapabilities(serviceCapabilitiesBuilder.build()) - .setTime(timestamp) .build(); RcsContactUceCapability.PresenceBuilder builder = diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java index 3c22e0ed..6d09ebf8 100644 --- a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java +++ b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java @@ -117,17 +117,19 @@ public class EabProviderTest extends ImsTestBase { @Test @SmallTest - public void testCommonIsUnique() { + public void testCommonIsNotUnique() { ContentValues data = new ContentValues(); data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1); data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE); data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND); + data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 1); mContext.getContentResolver().insert(COMMON_URI, data); data = new ContentValues(); data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1); data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE); data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND); + data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 2); mContext.getContentResolver().insert(COMMON_URI, data); Cursor cursor = mContext.getContentResolver().query(COMMON_URI, @@ -136,7 +138,7 @@ public class EabProviderTest extends ImsTestBase { null, null); - assertEquals(1, cursor.getCount()); + assertEquals(2, cursor.getCount()); } @Test diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java index f8038be1..be92ce36 100644 --- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java +++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java @@ -47,14 +47,19 @@ import org.mockito.Mock; @RunWith(AndroidJUnit4.class) public class PidfParserTest extends ImsTestBase { + // The timestamp of the PIDF + private final Instant mPidfTimestamp = Instant.now().plusMillis(1); + @Before public void setUp() throws Exception { super.setUp(); + PidfParser.setTimestampProxy(() -> mPidfTimestamp); } @After public void tearDown() throws Exception { super.tearDown(); + PidfParser.setTimestampProxy(null); } @Test @@ -104,7 +109,7 @@ public class PidfParserTest extends ImsTestBase { assertEquals("1.0", presenceTuple1.getServiceVersion()); assertEquals(serviceDescription, presenceTuple1.getServiceDescription()); assertEquals(Uri.parse(contact), presenceTuple1.getContactUri()); - assertEquals("2001-01-01T01:00:00Z", presenceTuple1.getTime().toString()); + assertEquals(mPidfTimestamp.toString(), presenceTuple1.getTime().toString()); assertTrue(presenceTuple1.getServiceCapabilities().isAudioCapable()); assertFalse(presenceTuple1.getServiceCapabilities().isVideoCapable()); } @@ -184,7 +189,7 @@ public class PidfParserTest extends ImsTestBase { assertEquals(expectedTuple.getStatus(), tuple.getStatus()); assertEquals(expectedTuple.getServiceVersion(), tuple.getServiceVersion()); assertEquals(expectedTuple.getServiceDescription(), tuple.getServiceDescription()); - assertEquals(expectedTuple.getTime(), tuple.getTime()); + assertEquals(mPidfTimestamp, tuple.getTime()); assertEquals(expectedTuple.getContactUri(), tuple.getContactUri()); ServiceCapabilities expectedCap = expectedTuple.getServiceCapabilities(); @@ -243,7 +248,7 @@ public class PidfParserTest extends ImsTestBase { assertEquals("1.0", presenceTuple1.getServiceVersion()); assertEquals(serviceDescription1, presenceTuple1.getServiceDescription()); assertEquals(Uri.parse(contact), presenceTuple1.getContactUri()); - assertEquals("2001-01-01T01:00:00Z", presenceTuple1.getTime().toString()); + assertEquals(mPidfTimestamp.toString(), presenceTuple1.getTime().toString()); assertNull(presenceTuple1.getServiceCapabilities()); // Verify the second tuple information @@ -254,7 +259,7 @@ public class PidfParserTest extends ImsTestBase { assertFalse(presenceTuple2.getServiceCapabilities().isVideoCapable()); assertEquals(serviceDescription2, presenceTuple2.getServiceDescription()); assertEquals(Uri.parse(contact), presenceTuple2.getContactUri()); - assertEquals("2001-02-02T01:00:00Z", presenceTuple2.getTime().toString()); + assertEquals(mPidfTimestamp.toString(), presenceTuple2.getTime().toString()); assertNotNull(presenceTuple2.getServiceCapabilities()); assertEquals(isAudioSupported, presenceTuple2.getServiceCapabilities().isAudioCapable()); assertEquals(isVideoSupported, presenceTuple2.getServiceCapabilities().isVideoCapable()); @@ -341,7 +346,7 @@ public class PidfParserTest extends ImsTestBase { .append("<caps:video>").append(isVideoSupported).append("</caps:video>") .append("</caps:servcaps>") .append("<contact>").append(contact).append("</contact>") - .append("<timestamp>2001-01-01T01:00:00.00Z</timestamp>") + .append("<timestamp>").append(mPidfTimestamp.toString()).append("</timestamp>") .append("</tuple></presence>"); return pidfBuilder.toString(); } @@ -444,7 +449,7 @@ public class PidfParserTest extends ImsTestBase { + "<op:description>" + serviceDescription1 + "</op:description>" + "</op:service-description>" + "<contact>" + contact + "</contact>" - + "<timestamp>2001-01-01T01:00:00.00Z</timestamp>" + + "<timestamp>" + mPidfTimestamp.toString() + "</timestamp>" + "</tuple>" // tuple 2 + "<tuple id=\"a1\">" @@ -462,7 +467,7 @@ public class PidfParserTest extends ImsTestBase { + "<caps:video>" + videoSupported + "</caps:video>" + "</caps:servcaps>" + "<contact>" + contact + "</contact>" - + "<timestamp>2001-02-02T01:00:00.00Z</timestamp>" + + "<timestamp>" + mPidfTimestamp.toString() + "</timestamp>" + "</tuple>" + "</presence>"; } @@ -475,7 +480,6 @@ public class PidfParserTest extends ImsTestBase { final String basicStatus = RcsContactPresenceTuple.TUPLE_BASIC_STATUS_OPEN; final String version = "1.0"; final String description = "description test"; - final Instant nowTime = Instant.now(); // init the capabilities ServiceCapabilities.Builder servCapsBuilder = @@ -487,7 +491,7 @@ public class PidfParserTest extends ImsTestBase { basicStatus, RcsContactPresenceTuple.SERVICE_ID_MMTEL, version); tupleBuilder.setContactUri(contact) .setServiceDescription(description) - .setTime(nowTime) + .setTime(mPidfTimestamp) .setServiceCapabilities(servCapsBuilder.build()); PresenceBuilder presenceBuilder = new PresenceBuilder(contact, |