aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-09-01 00:18:57 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-09-01 00:18:57 +0000
commitc31b6bdf2afd2c967be2b5e90ca21c3c7a8d7fdd (patch)
treec453c84db4ad6173d359006761f9beddded5d97b
parent9f3d809a63c6a3c7c72889d85d02657dace90451 (diff)
parentcbaaf03b8515fb290528f5892a78f8a8c309f34e (diff)
downloadims-android12-mainline-art-release.tar.gz
Change-Id: Ie85720a31abb5cd48b19ffd7d6a1696b893c05e5
-rw-r--r--src/java/com/android/ims/ImsManager.java4
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java6
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java34
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabProvider.java47
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabUtil.java40
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java39
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java4
-rw-r--r--src/java/com/android/ims/rcs/uce/util/UceUtils.java3
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java103
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java6
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java22
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,