Snap for 7574095 from cbaaf03b8515fb290528f5892a78f8a8c309f34e to mainline-mediaprovider-release

Change-Id: Ifebbecbee277079385d32dfe8e9282a3120f9f1f
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 60283c2..da70349 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 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 @@
 
         static {
             CONTACT_UNIQUE_FIELDS.add(ContactColumns.PHONE_NUMBER);
-
-            COMMON_UNIQUE_FIELDS.add(EabCommonColumns.EAB_CONTACT_ID);
         }
 
         @VisibleForTesting
@@ -356,8 +354,7 @@
                 + 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 @@
                         + 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/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
index 5138445..96147b4 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
@@ -66,7 +66,8 @@
 @RunWith(AndroidJUnit4.class)
 public class EabControllerTest extends ImsTestBase {
     EabProviderTestable mEabProviderTestable = new EabProviderTestable();
-    EabControllerImpl mEabController;
+    EabControllerImpl mEabControllerSub1;
+    EabControllerImpl mEabControllerSub2;
     PersistableBundle mBundle;
     ExecutorService mExecutor = Executors.newSingleThreadExecutor();
 
@@ -74,6 +75,7 @@
     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";
@@ -94,9 +96,14 @@
         mockContentResolver.addProvider(EabProvider.AUTHORITY, mEabProviderTestable);
 
         insertContactInfoToDB();
-        mEabController = new EabControllerImpl(
+        mEabControllerSub1 = new EabControllerImpl(
                 mContext, TEST_SUB_ID, null, Looper.getMainLooper());
-        mEabController.setExpirationTimeFactory(mExpirationTimeFactory);
+        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();
@@ -113,9 +120,9 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         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());
@@ -127,14 +134,14 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         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
@@ -145,14 +152,14 @@
 
         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_CONTACT_EXPIRED_FAILURE,
-                mEabController.getCapabilities(contactUriList).get(0).getStatus());
+                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
     }
 
     @Test
@@ -164,16 +171,16 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         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
@@ -187,15 +194,15 @@
 
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         contactList.add(createPresenceNonRcsCapability());
-        mEabController.saveCapabilities(contactList);
+        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
@@ -209,7 +216,7 @@
         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
@@ -242,7 +249,7 @@
                 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
@@ -275,7 +282,7 @@
                 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
@@ -289,6 +296,23 @@
         }
     }
 
+    @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,
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 3c22e0e..6d09ebf 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 @@
 
     @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 @@
                 null,
                 null);
 
-        assertEquals(1, cursor.getCount());
+        assertEquals(2, cursor.getCount());
     }
 
     @Test