diff --git a/src/com/android/providers/telephony/RcsProvider.java b/src/com/android/providers/telephony/RcsProvider.java
index c0ca9e1..3235b27 100644
--- a/src/com/android/providers/telephony/RcsProvider.java
+++ b/src/com/android/providers/telephony/RcsProvider.java
@@ -15,6 +15,7 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_URI_PART;
 import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
 
 import static com.android.providers.telephony.RcsProviderUtil.buildUriWithRowIdAppended;
@@ -136,7 +137,7 @@
 
     static {
         // example URI: content://rcs/thread
-        URL_MATCHER.addURI(AUTHORITY, "thread", UNIFIED_RCS_THREAD);
+        URL_MATCHER.addURI(AUTHORITY, RCS_THREAD_URI_PART, UNIFIED_RCS_THREAD);
 
         // example URI: content://rcs/thread/4, where 4 is the thread id.
         URL_MATCHER.addURI(AUTHORITY, "thread/#", UNIFIED_RCS_THREAD_WITH_ID);
@@ -503,8 +504,10 @@
                                 + uri);
                 break;
             case P2P_THREAD_PARTICIPANT_WITH_ID:
-                return returnUriAsIsIfSuccessful(uri,
-                        mParticipantHelper.insertParticipantIntoP2pThread(uri));
+                Log.e(TAG,
+                        "Inserting participant into a thread via URI is not supported, uri: "
+                                + uri);
+                break;
             case GROUP_THREAD:
                 return buildUriWithRowIdAppended(GROUP_THREAD_URI_PREFIX,
                         mThreadHelper.insertGroupThread(values));
diff --git a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
index 57223c2..ab23d6d 100644
--- a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
@@ -267,38 +267,6 @@
         return rowId;
     }
 
-    long insertParticipantIntoP2pThread(Uri uri) {
-        String threadId = getThreadIdFromUri(uri);
-        String participantId = getParticipantIdFromUri(uri);
-        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
-        Cursor cursor = db.query(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null,
-                RCS_THREAD_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
-                new String[]{threadId, participantId}, null, null, null);
-
-        int existingEntryCount = 0;
-        if (cursor != null) {
-            existingEntryCount = cursor.getCount();
-            cursor.close();
-        }
-
-        // if this 1 to 1 thread already has a participant, fail the transaction.
-        if (existingEntryCount > 0) {
-            return TRANSACTION_FAILED;
-        }
-
-        ContentValues contentValues = new ContentValues(2);
-        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
-        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
-        long rowId = db.insert(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN,
-                contentValues);
-
-        if (rowId == INSERTION_FAILED) {
-            return TRANSACTION_FAILED;
-        }
-        return Long.parseLong(participantId);
-    }
-
     /**
      * Inserts a participant into group thread. This function returns the participant ID instead of
      * the row id in the junction table
diff --git a/src/com/android/providers/telephony/RcsProviderThreadHelper.java b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
index a60d1e9..c1a35ef 100644
--- a/src/com/android/providers/telephony/RcsProviderThreadHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
@@ -23,6 +23,7 @@
 import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TEXT_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsMessageColumns.STATUS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_COLUMN;
 import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
@@ -317,32 +318,94 @@
         return queryGroupThread(projection, getThreadIdSelection(uri), null, null);
     }
 
+    /**
+     * @param contentValues should contain the participant ID of the other participant under key
+     *                      {@link RCS_PARTICIPANT_ID_COLUMN}
+     */
     long insert1To1Thread(ContentValues contentValues) {
-        long returnValue = TRANSACTION_FAILED;
         if (contentValues.containsKey(RCS_THREAD_ID_COLUMN)) {
             Log.e(RcsProvider.TAG,
                     "RcsProviderThreadHelper: inserting threads with IDs is not supported");
-            return returnValue;
+            return TRANSACTION_FAILED;
+        }
+
+        Long participantId = contentValues.getAsLong(RCS_PARTICIPANT_ID_COLUMN);
+        if (participantId == null) {
+            Log.e(RcsProvider.TAG,
+                    "inserting threads without participant IDs is not supported");
+            return TRANSACTION_FAILED;
         }
 
         SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
         try {
             db.beginTransaction();
 
-            // Insert into the common rcs_threads table
-            long rowId = insertIntoCommonRcsThreads(db);
+            if (hasExisting1To1ThreadForParticipant(db, participantId)) {
+                return TRANSACTION_FAILED;
+            }
 
-            // Add the rowId in rcs_threads table as a foreign key in rcs_1_to_1_table
-            contentValues.put(RCS_THREAD_ID_COLUMN, rowId);
-            db.insert(RCS_1_TO_1_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
-            contentValues.remove(RCS_THREAD_ID_COLUMN);
+            long threadId = insertIntoCommonRcsThreads(db);
+            if (threadId == -1) {
+                return TRANSACTION_FAILED;
+            }
+
+            if (insertP2pThread(db, threadId) == -1) {
+                return TRANSACTION_FAILED;
+            }
+
+            if (insertParticipantIntoP2pThread(db, threadId, participantId) == -1) {
+                return TRANSACTION_FAILED;
+            }
 
             db.setTransactionSuccessful();
-            returnValue = rowId;
+
+            return threadId;
         } finally {
             db.endTransaction();
         }
-        return returnValue;
+    }
+
+    private long insertP2pThread(SQLiteDatabase db, long threadId) {
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+
+        return db.insert(RCS_1_TO_1_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
+    }
+
+    private long insertParticipantIntoP2pThread(
+            SQLiteDatabase db, long threadId, long participantId) {
+        ContentValues contentValues = new ContentValues(2);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        return db.insert(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+    }
+
+    private boolean hasExisting1To1ThreadForParticipant(SQLiteDatabase db, long participantId) {
+        String table = joinOnColumn(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
+                RCS_1_TO_1_THREAD_TABLE,
+                RCS_THREAD_ID_COLUMN);
+
+        try (Cursor cursor = db.query(
+                table,
+                null,
+                RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{Long.toString(participantId)},
+                null,
+                null,
+                null)) {
+            if (cursor == null || cursor.getCount() == 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private String joinOnColumn(String t1, String t2, String col) {
+        return t1 + " JOIN " + t2 + " ON (" + t1 + "." + col + "=" + t2 + "." + col + ")";
     }
 
     long insertGroupThread(ContentValues contentValues) {
diff --git a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
index 61e9713..77a5a70 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
@@ -15,7 +15,6 @@
  */
 package com.android.providers.telephony;
 
-import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.OWNER_PARTICIPANT_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
@@ -24,6 +23,7 @@
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
 
 import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -66,12 +66,7 @@
         assertThat(mContentResolver.insert(Uri.parse("content://rcs/participant"),
                 participantValues)).isEqualTo(Uri.parse("content://rcs/participant/1"));
 
-        // insert one 1 to 1 thread
-        ContentValues p2pContentValues = new ContentValues();
-        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
-        p2pContentValues.put(FALLBACK_THREAD_ID_COLUMN, 1);
-        assertThat(mContentResolver.insert(p2pThreadUri, p2pContentValues)).isEqualTo(
-                Uri.parse("content://rcs/p2p_thread/1"));
+        setup1To1Thread(mContentResolver);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues();
@@ -81,11 +76,6 @@
         assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
                 Uri.parse("content://rcs/group_thread/2"));
 
-        // add the participant into both threads
-        Uri addParticipantTo1To1Thread = Uri.parse("content://rcs/p2p_thread/1/participant/1");
-        assertThat(mContentResolver.insert(addParticipantTo1To1Thread, null)).isEqualTo(
-                addParticipantTo1To1Thread);
-
         Uri addParticipantToGroupThread = Uri.parse("content://rcs/group_thread/2/participant/1");
         assertThat(mContentResolver.insert(addParticipantToGroupThread, null)).isEqualTo(
                 addParticipantToGroupThread);
diff --git a/tests/src/com/android/providers/telephony/RcsProviderHelper.java b/tests/src/com/android/providers/telephony/RcsProviderHelper.java
new file mode 100644
index 0000000..5a7f9a0
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderHelper.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.net.Uri;
+
+class RcsProviderHelper {
+    /**
+     * Sets up a 1-to-1 thread with a participant ID of 1 and a fallback thread ID of 1.
+     *
+     * @return the {@link Uri} of the newly inserted row
+     */
+    static Uri setup1To1Thread(ContentResolver contentResolver) {
+        return setup1To1Thread(contentResolver, 1, 1);
+    }
+
+    static Uri setup1To1Thread(
+            ContentResolver contentResolver, int participantId, int fallbackThreadId) {
+        ContentValues insertValues = new ContentValues();
+        Uri insertionUri = Uri.parse("content://rcs/p2p_thread");
+        insertValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        Uri rowUri = contentResolver.insert(insertionUri, insertValues);
+        assertThat(rowUri).isNotNull();
+
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(FALLBACK_THREAD_ID_COLUMN, fallbackThreadId);
+        assertThat(contentResolver.update(rowUri, updateValues, null, null))
+                .isEqualTo(1);
+
+        return rowUri;
+    }
+
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
index b893341..7e63d7f 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
@@ -15,7 +15,6 @@
  */
 package com.android.providers.telephony;
 
-import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.CONFERENCE_URI_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_ICON_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
@@ -25,6 +24,8 @@
 import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
 
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ContentValues;
@@ -65,12 +66,10 @@
     }
 
     @Test
-    public void testInsert1To1Thread() {
-        ContentValues values = new ContentValues(1);
-        values.put(FALLBACK_THREAD_ID_COLUMN, 445);
-        assertThat(
-                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isEqualTo(
-                Uri.parse("content://rcs/p2p_thread/1"));
+    public void testDuplicate1To1ThreadInsertion() {
+        Uri uri = setup1To1Thread(mContentResolver);
+
+        assertThat(mContentResolver.insert(uri, null)).isNull();
     }
 
     @Test
@@ -94,27 +93,6 @@
     }
 
     @Test
-    public void testInsertParticipantInto1To1Thread() {
-        // create a participant
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 15);
-        contentValues.put(RCS_ALIAS_COLUMN, "Alias");
-        mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
-
-        // create a thread
-        ContentValues values = new ContentValues(1);
-        values.put(FALLBACK_THREAD_ID_COLUMN, 699);
-        mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values);
-
-        // add participant to the thread
-        Uri uri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
-        assertThat(mContentResolver.insert(uri, null)).isEqualTo(uri);
-
-        // assert that adding again fails
-        assertThat(mContentResolver.insert(uri, null)).isNull();
-    }
-
-    @Test
     public void testInsertParticipantIntoGroupThread() {
         // create a participant
         ContentValues contentValues = new ContentValues();
@@ -164,9 +142,8 @@
     @Ignore // TODO: fix and un-ignore
     public void testInsertMessageIntoThread() {
         // create two threads
+        setup1To1Thread(mContentResolver);
         ContentValues values = new ContentValues();
-        assertThat(
-                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
         assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
                 values)).isNotNull();
 
@@ -192,10 +169,9 @@
 
     @Test
     public void testInsertMessageDelivery() {
-        // create a thread
+        setup1To1Thread(mContentResolver);
+
         ContentValues values = new ContentValues();
-        assertThat(
-                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
 
         // add an outgoing message to the thread
         assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
@@ -208,10 +184,9 @@
 
     @Test
     public void testInsertFileTransfer() {
-        // create a thread
+        setup1To1Thread(mContentResolver);
+
         ContentValues values = new ContentValues();
-        assertThat(
-                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
 
         // add an outgoing message to the thread
         assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
diff --git a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
index e1ae982..7b0ed62 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
 import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_SIZE_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SESSION_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
@@ -25,7 +26,6 @@
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
 import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.DESTINATION_PARTICIPANT_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.EVENT_TYPE_COLUMN;
@@ -39,6 +39,8 @@
 import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
 import static android.telephony.ims.RcsThreadQueryParams.THREAD_QUERY_PARAMETERS_KEY;
 
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ContentValues;
@@ -90,12 +92,8 @@
         mContentResolver.insert(participantUri, contentValues);
 
         // insert two 1 to 1 threads
-        ContentValues p2pContentValues = new ContentValues(0);
-        Uri threadsUri = Uri.parse("content://rcs/p2p_thread");
-        assertThat(mContentResolver.insert(threadsUri, p2pContentValues)).isEqualTo(
-                Uri.parse("content://rcs/p2p_thread/1"));
-        assertThat(mContentResolver.insert(threadsUri, p2pContentValues)).isEqualTo(
-                Uri.parse("content://rcs/p2p_thread/2"));
+        setup1To1Thread(mContentResolver, 1, 1);
+        setup1To1Thread(mContentResolver, 2, 2);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues(1);
@@ -519,10 +517,6 @@
 
     @Test
     public void testQueryParticipantOf1To1Thread() {
-        // insert the participant into a 1 to 1 thread
-        Uri insertUri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
-        assertThat(mContentResolver.insert(insertUri, null)).isNotNull();
-
         // query the participant back
         Uri queryUri = Uri.parse("content://rcs/p2p_thread/1/participant");
         Cursor cursor = mContentResolver.query(queryUri, null, null, null, null);
diff --git a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
index 28954c9..45ab0ca 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
@@ -25,6 +25,9 @@
 import static android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns.DELIVERED_TIMESTAMP_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -71,12 +74,7 @@
         mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (1)");
         mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (2)");
 
-        // insert one 1 to 1 thread
-        ContentValues p2pContentValues = new ContentValues();
-        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
-        p2pContentValues.put(FALLBACK_THREAD_ID_COLUMN, 1);
-        assertThat(mContentResolver.insert(p2pThreadUri, p2pContentValues)).isEqualTo(
-                Uri.parse("content://rcs/p2p_thread/1"));
+        setup1To1Thread(mContentResolver);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues();
@@ -86,10 +84,6 @@
         assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
                 Uri.parse("content://rcs/group_thread/2"));
 
-        // Add participant to both threads
-        Uri p2pInsertionUri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
-        assertThat(mContentResolver.insert(p2pInsertionUri, null)).isEqualTo(p2pInsertionUri);
-
         Uri groupInsertionUri = Uri.parse("content://rcs/group_thread/2/participant/1");
         assertThat(mContentResolver.insert(groupInsertionUri, null)).isEqualTo(groupInsertionUri);
 
