Remove RcsProvider
This change removes RcsProvider - this is because it makes use of hidden
APIs and it is not launched
Test: Builds fine, passes presubmits
Change-Id: I03b81e5e6ffef4ac8fee3d20d6475b1a8f918d02
Merged-In: I03b81e5e6ffef4ac8fee3d20d6475b1a8f918d02
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ae9acf..dbd5436 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -120,12 +120,6 @@
android:singleUser="true"
android:multiprocess="false" />
- <provider android:name="RcsProvider"
- android:authorities="rcs"
- android:multiprocess="false"
- android:exported="false"
- android:singleUser="true" />
-
<service
android:name=".TelephonyBackupAgent$DeferredSmsMmsRestoreService"
android:exported="false" />
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index 1d39b49..887d94c 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -545,14 +545,6 @@
createMmsTables(db);
createSmsTables(db);
createCommonTables(db);
-
- if (IS_RCS_TABLE_SCHEMA_CODE_COMPLETE) {
- RcsProviderThreadHelper.createThreadTables(db);
- RcsProviderParticipantHelper.createParticipantTables(db);
- RcsProviderMessageHelper.createRcsMessageTables(db);
- RcsProviderEventHelper.createRcsEventTables(db);
- }
-
createCommonTriggers(db);
createMmsTriggers(db);
createWordsTables(db);
@@ -1658,15 +1650,6 @@
db.endTransaction();
}
// fall through
- case 67:
- if (currentVersion <= 67 || !IS_RCS_TABLE_SCHEMA_CODE_COMPLETE) {
- return;
- }
- RcsProviderThreadHelper.createThreadTables(db);
- RcsProviderParticipantHelper.createParticipantTables(db);
- RcsProviderMessageHelper.createRcsMessageTables(db);
- RcsProviderEventHelper.createRcsEventTables(db);
- return;
}
Log.e(TAG, "Destroying all old data.");
diff --git a/src/com/android/providers/telephony/RcsProvider.java b/src/com/android/providers/telephony/RcsProvider.java
deleted file mode 100644
index 3235b27..0000000
--- a/src/com/android/providers/telephony/RcsProvider.java
+++ /dev/null
@@ -1,804 +0,0 @@
-/*
- * Copyright (C) 2018 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.RcsThreadColumns.RCS_THREAD_URI_PART;
-import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
-
-import static com.android.providers.telephony.RcsProviderUtil.buildUriWithRowIdAppended;
-import static com.android.providers.telephony.RcsProviderUtil.returnUriAsIsIfSuccessful;
-
-import android.app.AppOpsManager;
-import android.content.ContentProvider;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.CancellationSignal;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * Content provider to handle RCS messages. The functionality here is similar to SmsProvider,
- * MmsProvider etc.
- *
- * The provider has constraints around inserting, updating and deleting - the user needs to know
- * whether they are inserting a message that is incoming/outgoing, or the thread they are inserting
- * is a group or p2p etc. This is in order to keep the implementation simple and avoid complex
- * queries.
- *
- * @hide
- */
-public class RcsProvider extends ContentProvider {
- static final String TAG = "RcsProvider";
- static final String AUTHORITY = "rcs";
- private static final String CONTENT_AUTHORITY = "content://" + AUTHORITY;
-
- private static final Uri PARTICIPANT_URI_PREFIX =
- Uri.parse(CONTENT_AUTHORITY + "/participant/");
- private static final Uri P2P_THREAD_URI_PREFIX = Uri.parse(CONTENT_AUTHORITY + "/p2p_thread/");
- private static final Uri FILE_TRANSFER_PREFIX = Uri.parse(
- CONTENT_AUTHORITY + "/file_transfer/");
- static final Uri GROUP_THREAD_URI_PREFIX = Uri.parse(CONTENT_AUTHORITY + "/group_thread/");
-
- // Rcs table names
- static final String RCS_THREAD_TABLE = "rcs_thread";
- static final String RCS_1_TO_1_THREAD_TABLE = "rcs_1_to_1_thread";
- static final String RCS_GROUP_THREAD_TABLE = "rcs_group_thread";
- static final String UNIFIED_RCS_THREAD_VIEW = "rcs_unified_rcs_thread_view";
- static final String RCS_PARTICIPANT_TABLE = "rcs_participant";
- static final String RCS_PARTICIPANT_THREAD_JUNCTION_TABLE = "rcs_thread_participant";
- static final String RCS_MESSAGE_TABLE = "rcs_message";
- static final String RCS_INCOMING_MESSAGE_TABLE = "rcs_incoming_message";
- static final String RCS_OUTGOING_MESSAGE_TABLE = "rcs_outgoing_message";
- static final String RCS_MESSAGE_DELIVERY_TABLE = "rcs_message_delivery";
- static final String UNIFIED_MESSAGE_VIEW = "rcs_unified_message_view";
- static final String RCS_FILE_TRANSFER_TABLE = "rcs_file_transfer";
- static final String RCS_THREAD_EVENT_TABLE = "rcs_thread_event";
- static final String RCS_PARTICIPANT_EVENT_TABLE = "rcs_participant_event";
- static final String RCS_UNIFIED_EVENT_VIEW = "rcs_unified_event_view";
-
- private static final UriMatcher URL_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
-
- private static final int UNIFIED_RCS_THREAD = 1;
- private static final int UNIFIED_RCS_THREAD_WITH_ID = 2;
- private static final int PARTICIPANT = 3;
- private static final int PARTICIPANT_WITH_ID = 4;
- private static final int PARTICIPANT_ALIAS_CHANGE_EVENT = 5;
- private static final int PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID = 6;
- private static final int P2P_THREAD = 7;
- private static final int P2P_THREAD_WITH_ID = 8;
- private static final int P2P_THREAD_PARTICIPANT = 9;
- private static final int P2P_THREAD_PARTICIPANT_WITH_ID = 10;
- private static final int GROUP_THREAD = 11;
- private static final int GROUP_THREAD_WITH_ID = 12;
- private static final int GROUP_THREAD_PARTICIPANT = 13;
- private static final int GROUP_THREAD_PARTICIPANT_WITH_ID = 14;
- private static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT = 15;
- private static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID = 16;
- private static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT = 17;
- private static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID = 18;
- private static final int GROUP_THREAD_NAME_CHANGE_EVENT = 19;
- private static final int GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID = 20;
- private static final int GROUP_THREAD_ICON_CHANGE_EVENT = 21;
- private static final int GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID = 22;
- private static final int UNIFIED_MESSAGE = 23;
- private static final int UNIFIED_MESSAGE_WITH_ID = 24;
- private static final int UNIFIED_MESSAGE_WITH_FILE_TRANSFER = 25;
- private static final int INCOMING_MESSAGE = 26;
- private static final int INCOMING_MESSAGE_WITH_ID = 27;
- private static final int OUTGOING_MESSAGE = 28;
- private static final int OUTGOING_MESSAGE_WITH_ID = 29;
- private static final int OUTGOING_MESSAGE_DELIVERY = 30;
- private static final int OUTGOING_MESSAGE_DELIVERY_WITH_ID = 31;
- private static final int UNIFIED_MESSAGE_ON_THREAD = 32;
- private static final int UNIFIED_MESSAGE_ON_THREAD_WITH_ID = 33;
- private static final int INCOMING_MESSAGE_ON_P2P_THREAD = 34;
- private static final int INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID = 35;
- private static final int OUTGOING_MESSAGE_ON_P2P_THREAD = 36;
- private static final int OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID = 37;
- private static final int INCOMING_MESSAGE_ON_GROUP_THREAD = 38;
- private static final int INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID = 39;
- private static final int OUTGOING_MESSAGE_ON_GROUP_THREAD = 40;
- private static final int OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID = 41;
- private static final int FILE_TRANSFER_WITH_ID = 42;
- private static final int EVENT = 43;
- private static final int CANONICAL_ADDRESS = 44;
-
- SQLiteOpenHelper mDbOpenHelper;
-
- @VisibleForTesting
- RcsProviderThreadHelper mThreadHelper;
- @VisibleForTesting
- RcsProviderParticipantHelper mParticipantHelper;
- @VisibleForTesting
- RcsProviderMessageHelper mMessageHelper;
- @VisibleForTesting
- RcsProviderEventHelper mEventHelper;
- @VisibleForTesting
- RcsProviderCanonicalAddressHelper mCanonicalAddressHelper;
-
- static {
- // example URI: content://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);
-
- // example URI: content://rcs/participant
- URL_MATCHER.addURI(AUTHORITY, "participant", PARTICIPANT);
-
- // example URI: content://rcs/participant/12, where 12 is the participant id
- URL_MATCHER.addURI(AUTHORITY, "participant/#", PARTICIPANT_WITH_ID);
-
- // example URI: content://rcs/participant/12/alias_change_event, where 12 is the participant
- // id.
- URL_MATCHER.addURI(AUTHORITY, "participant/#/alias_change_event",
- PARTICIPANT_ALIAS_CHANGE_EVENT);
-
- // example URI: content://rcs/participant/12/alias_change_event/4, where 12 is the
- // participant id, and 4 is the event id
- URL_MATCHER.addURI(AUTHORITY, "participant/#/alias_change_event/#",
- PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID);
-
- // example URI: content://rcs/p2p_thread
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread", P2P_THREAD);
-
- // example URI: content://rcs/p2p_thread/4, where 4 is the thread id
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#", P2P_THREAD_WITH_ID);
-
- // example URI: content://rcs/p2p_thread/4/participant, where 4 is the thread id
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/participant", P2P_THREAD_PARTICIPANT);
-
- // example URI: content://rcs/p2p_thread/9/participant/3", only supports a 1 time insert.
- // 9 is the thread ID, 3 is the participant ID.
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/participant/#", P2P_THREAD_PARTICIPANT_WITH_ID);
-
- // example URI: content://rcs/group_thread
- URL_MATCHER.addURI(AUTHORITY, "group_thread", GROUP_THREAD);
-
- // example URI: content://rcs/group_thread/13, where 13 is the _id in rcs_threads table.
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#", GROUP_THREAD_WITH_ID);
-
- // example URI: content://rcs/group_thread/13/participant_joined_event. Supports
- // queries and inserts
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_joined_event",
- GROUP_THREAD_PARTICIPANT_JOINED_EVENT);
-
- // example URI: content://rcs/group_thread/13/participant_joined_event/3. Supports deletes.
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_joined_event/#",
- GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID);
-
- // example URI: content://rcs/group_thread/13/participant_left_event. Supports queries
- // and inserts
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_left_event",
- GROUP_THREAD_PARTICIPANT_LEFT_EVENT);
-
- // example URI: content://rcs/group_thread/13/participant_left_event/5. Supports deletes
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_left_event/#",
- GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID);
-
- // example URI: content://rcs/group_thread/13/name_changed_event. Supports queries and
- // inserts
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/name_changed_event",
- GROUP_THREAD_NAME_CHANGE_EVENT);
-
- // example URI: content://rcs/group_thread/13/name_changed_event/7. Supports deletes
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/name_changed_event/#",
- GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID);
-
- // example URI: content://rcs/group_thread/13/icon_changed_event. Supports queries and
- // inserts
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/icon_changed_event",
- GROUP_THREAD_ICON_CHANGE_EVENT);
-
- // example URI: content://rcs/group_thread/13/icon_changed_event/9. Supports deletes
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/icon_changed_event/#",
- GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID);
-
- // example URI: content://rcs/group_thread/18/participant
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant",
- GROUP_THREAD_PARTICIPANT);
-
- // example URI: content://rcs/group_thread/21/participant/4, only supports inserts and
- // deletes
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant/#",
- GROUP_THREAD_PARTICIPANT_WITH_ID);
-
- // example URI: content://rcs/message
- URL_MATCHER.addURI(AUTHORITY, "message", UNIFIED_MESSAGE);
-
- // example URI: content://rcs/message/4, where 4 is the message id.
- URL_MATCHER.addURI(AUTHORITY, "message/#", UNIFIED_MESSAGE_WITH_ID);
-
- // example URI: content://rcs/message/4/file_transfer, only supports inserts
- URL_MATCHER.addURI(AUTHORITY, "message/#/file_transfer",
- UNIFIED_MESSAGE_WITH_FILE_TRANSFER);
-
- // example URI: content://rcs/incoming_message
- URL_MATCHER.addURI(AUTHORITY, "incoming_message", INCOMING_MESSAGE);
-
- // example URI: content://rcs/incoming_message/45
- URL_MATCHER.addURI(AUTHORITY, "incoming_message/#", INCOMING_MESSAGE_WITH_ID);
-
- // example URI: content://rcs/outgoing_message
- URL_MATCHER.addURI(AUTHORITY, "outgoing_message", OUTGOING_MESSAGE);
-
- // example URI: content://rcs/outgoing_message/54
- URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#", OUTGOING_MESSAGE_WITH_ID);
-
- // example URI: content://rcs/outgoing_message/54/delivery. Only supports queries
- URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#/delivery", OUTGOING_MESSAGE_DELIVERY);
-
- // example URI: content://rcs/outgoing_message/9/delivery/4. Does not support queries
- URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#/delivery/#",
- OUTGOING_MESSAGE_DELIVERY_WITH_ID);
-
- // example URI: content://rcs/thread/5/message, only supports querying.
- URL_MATCHER.addURI(AUTHORITY, "thread/#/message", UNIFIED_MESSAGE_ON_THREAD);
-
- // example URI: content://rcs/thread/5/message/40, only supports querying.
- URL_MATCHER.addURI(AUTHORITY, "thread/#/message/#", UNIFIED_MESSAGE_ON_THREAD_WITH_ID);
-
- // example URI: content://rcs/p2p_thread/3/incoming_message. Only available for inserting
- // incoming messages onto a 1 to 1 thread.
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/incoming_message",
- INCOMING_MESSAGE_ON_P2P_THREAD);
-
- // example URI: content://rcs/p2p_thread/11/incoming_message/45. Only supports querying
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/incoming_message/#",
- INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID);
-
- // example URI: content://rcs/p2p_thread/3/outgoing_message. Only available for inserting
- // outgoing messages onto a 1 to 1 thread.
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/outgoing_message",
- OUTGOING_MESSAGE_ON_P2P_THREAD);
-
- // example URI: content://rcs/p2p_thread/11/outgoing_message/46. Only supports querying
- URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/outgoing_message/#",
- OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID);
-
- // example URI: content://rcs/group_thread/3/incoming_message. Only available for inserting
- // incoming messages onto a group thread.
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/incoming_message",
- INCOMING_MESSAGE_ON_GROUP_THREAD);
-
- // example URI: content://rcs/group_thread/3/incoming_message/71. Only supports querying
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/incoming_message/#",
- INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID);
-
- // example URI: content://rcs/group_thread/3/outgoing_message. Only available for inserting
- // outgoing messages onto a group thread.
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/outgoing_message",
- OUTGOING_MESSAGE_ON_GROUP_THREAD);
-
- // example URI: content://rcs/group_thread/13/outgoing_message/72. Only supports querying
- URL_MATCHER.addURI(AUTHORITY, "group_thread/#/outgoing_message/#",
- OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID);
-
- // example URI: content://rcs/file_transfer/1. Does not support insertion
- URL_MATCHER.addURI(AUTHORITY, "file_transfer/#", FILE_TRANSFER_WITH_ID);
-
- // example URI: content://rcs/event
- URL_MATCHER.addURI(AUTHORITY, "event", EVENT);
-
- URL_MATCHER.addURI(AUTHORITY, "canonical-address", CANONICAL_ADDRESS);
- }
-
- @Override
- public boolean onCreate() {
- // Use the credential encrypted mmssms.db for RCS messages.
- mDbOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
- mParticipantHelper = new RcsProviderParticipantHelper(mDbOpenHelper);
- mThreadHelper = new RcsProviderThreadHelper(mDbOpenHelper);
- mMessageHelper = new RcsProviderMessageHelper(mDbOpenHelper);
- mEventHelper = new RcsProviderEventHelper(mDbOpenHelper);
- mCanonicalAddressHelper = new RcsProviderCanonicalAddressHelper(mDbOpenHelper);
- return true;
- }
-
- /**
- * ContentResolver has a weird bug that if both query methods are overridden, it will always
- * pick the bundle one to call, but will still require us to override this one as it is
- * abstract. Work around by putting parameters in a bundle.
- */
- @Override
- public synchronized Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- Bundle bundle = new Bundle();
- bundle.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selection);
- bundle.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, selectionArgs);
- bundle.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, sortOrder);
- return query(uri, projection, bundle, null);
- }
-
- @Override
- public synchronized Cursor query(Uri uri, String[] projection, Bundle queryArgs,
- CancellationSignal unused) {
- int match = URL_MATCHER.match(uri);
-
- String selection = null;
- String[] selectionArgs = null;
- String sortOrder = null;
-
- if (queryArgs != null) {
- selection = queryArgs.getString(ContentResolver.QUERY_ARG_SQL_SELECTION);
- selectionArgs = queryArgs.getStringArray(
- ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS);
- sortOrder = queryArgs.getString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER);
- }
-
- switch (match) {
- case UNIFIED_RCS_THREAD:
- return mThreadHelper.queryUnifiedThread(queryArgs);
- case UNIFIED_RCS_THREAD_WITH_ID:
- return mThreadHelper.queryUnifiedThreadUsingId(uri, projection);
- case PARTICIPANT:
- return mParticipantHelper.queryParticipant(queryArgs);
- case PARTICIPANT_WITH_ID:
- return mParticipantHelper.queryParticipantWithId(uri, projection);
- case PARTICIPANT_ALIAS_CHANGE_EVENT:
- Log.e(TAG, "Querying individual event types is not supported, uri: " + uri);
- break;
- case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Querying participant events with id's is not supported, uri: " + uri);
- break;
- case P2P_THREAD:
- return mThreadHelper.query1to1Thread(projection, selection,
- selectionArgs, sortOrder);
- case P2P_THREAD_WITH_ID:
- return mThreadHelper.query1To1ThreadUsingId(uri, projection);
- case P2P_THREAD_PARTICIPANT:
- return mParticipantHelper.queryParticipantIn1To1Thread(uri);
- case P2P_THREAD_PARTICIPANT_WITH_ID:
- Log.e(TAG,
- "Querying participants in 1 to 1 threads via id's is not supported, uri: "
- + uri);
- break;
- case GROUP_THREAD:
- return mThreadHelper.queryGroupThread(projection, selection,
- selectionArgs, sortOrder);
- case GROUP_THREAD_WITH_ID:
- return mThreadHelper.queryGroupThreadUsingId(uri, projection);
- case GROUP_THREAD_PARTICIPANT:
- return mParticipantHelper.queryParticipantsInGroupThread(uri);
- case GROUP_THREAD_PARTICIPANT_WITH_ID:
- return mParticipantHelper.queryParticipantInGroupThreadWithId(uri);
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
- case GROUP_THREAD_NAME_CHANGE_EVENT:
- case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
- case GROUP_THREAD_ICON_CHANGE_EVENT:
- case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Querying individual event types is not supported, uri: " + uri);
- break;
- case UNIFIED_MESSAGE:
- return mMessageHelper.queryMessages(queryArgs);
- case UNIFIED_MESSAGE_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithId(uri);
- case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
- Log.e(TAG,
- "Querying file transfers through messages is not supported, uri: " + uri);
- case INCOMING_MESSAGE:
- return mMessageHelper.queryIncomingMessageWithSelection(selection, selectionArgs);
- case INCOMING_MESSAGE_WITH_ID:
- return mMessageHelper.queryIncomingMessageWithId(uri);
- case OUTGOING_MESSAGE:
- return mMessageHelper.queryOutgoingMessageWithSelection(selection, selectionArgs);
- case OUTGOING_MESSAGE_WITH_ID:
- return mMessageHelper.queryOutgoingMessageWithId(uri);
- case OUTGOING_MESSAGE_DELIVERY:
- return mMessageHelper.queryOutgoingMessageDeliveries(uri);
- case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
- Log.e(TAG,
- "Querying deliveries with message and participant ids is not supported, "
- + "uri: "
- + uri);
- case UNIFIED_MESSAGE_ON_THREAD:
- return mMessageHelper.queryAllMessagesOnThread(uri, selection, selectionArgs);
- case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
- case INCOMING_MESSAGE_ON_P2P_THREAD:
- Log.e(TAG,
- "Querying incoming messages on P2P thread with selection is not "
- + "supported, uri: "
- + uri);
- break;
- case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
- case OUTGOING_MESSAGE_ON_P2P_THREAD:
- Log.e(TAG,
- "Querying outgoing messages on P2P thread with selection is not "
- + "supported, uri: "
- + uri);
- break;
- case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
- case INCOMING_MESSAGE_ON_GROUP_THREAD:
- Log.e(TAG,
- "Querying incoming messages on group thread with selection is not "
- + "supported, uri: "
- + uri);
- break;
- case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
- case OUTGOING_MESSAGE_ON_GROUP_THREAD:
- Log.e(TAG,
- "Querying outgoing messages on group thread with selection is not "
- + "supported, uri: "
- + uri);
- break;
- case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
- case FILE_TRANSFER_WITH_ID:
- return mMessageHelper.queryFileTransfer(uri);
- case EVENT:
- return mEventHelper.queryEvents(queryArgs);
- case CANONICAL_ADDRESS:
- String canonicalAddress = uri.getQueryParameter("address");
- return mCanonicalAddressHelper.getOrCreateCanonicalAddress(canonicalAddress);
- default:
- Log.e(TAG, "Invalid query: " + uri);
- }
-
- return null;
- }
-
- @Override
- public String getType(Uri uri) {
- return null;
- }
-
- @Override
- public synchronized Uri insert(Uri uri, ContentValues values) {
- int match = URL_MATCHER.match(uri);
- long rowId;
-
- switch (match) {
- case UNIFIED_RCS_THREAD:
- case UNIFIED_RCS_THREAD_WITH_ID:
- Log.e(TAG, "Inserting into unified thread view is not supported, uri: " + uri);
- break;
- case PARTICIPANT:
- return buildUriWithRowIdAppended(PARTICIPANT_URI_PREFIX,
- mParticipantHelper.insertParticipant(values));
- case PARTICIPANT_WITH_ID:
- Log.e(TAG, "Inserting participant with a specified ID is not supported, uri: "
- + uri);
- break;
- case PARTICIPANT_ALIAS_CHANGE_EVENT:
- return buildUriWithRowIdAppended(uri,
- mEventHelper.insertParticipantEvent(uri, values));
- case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Inserting participant events with id's is not supported, uri: " + uri);
- break;
- case P2P_THREAD:
- return buildUriWithRowIdAppended(P2P_THREAD_URI_PREFIX,
- mThreadHelper.insert1To1Thread(values));
- case P2P_THREAD_WITH_ID:
- Log.e(TAG, "Inserting a thread with a specified ID is not supported, uri: " + uri);
- break;
- case P2P_THREAD_PARTICIPANT:
- Log.e(TAG,
- "Inserting a participant into a thread via content values is not "
- + "supported, uri: "
- + uri);
- break;
- case P2P_THREAD_PARTICIPANT_WITH_ID:
- 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));
- case GROUP_THREAD_WITH_ID:
- Log.e(TAG, "Inserting a thread with a specified ID is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
- return buildUriWithRowIdAppended(uri,
- mEventHelper.insertParticipantJoinedEvent(uri, values));
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
- Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
- return buildUriWithRowIdAppended(uri,
- mEventHelper.insertParticipantLeftEvent(uri, values));
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
- Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_NAME_CHANGE_EVENT:
- return buildUriWithRowIdAppended(uri,
- mEventHelper.insertThreadNameChangeEvent(uri, values));
- case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_ICON_CHANGE_EVENT:
- return buildUriWithRowIdAppended(uri,
- mEventHelper.insertThreadIconChangeEvent(uri, values));
- case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_PARTICIPANT:
- rowId = mParticipantHelper.insertParticipantIntoGroupThread(values);
- if (rowId == TRANSACTION_FAILED) {
- return null;
- }
- return mParticipantHelper.getParticipantInThreadUri(values, rowId);
- case GROUP_THREAD_PARTICIPANT_WITH_ID:
- return returnUriAsIsIfSuccessful(uri,
- mParticipantHelper.insertParticipantIntoGroupThreadWithId(uri));
- case UNIFIED_MESSAGE:
- case UNIFIED_MESSAGE_WITH_ID:
- Log.e(TAG, "Inserting into unified message view is not supported, uri: " + uri);
- break;
- case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
- return buildUriWithRowIdAppended(FILE_TRANSFER_PREFIX,
- mMessageHelper.insertFileTransferToMessage(uri, values));
- case INCOMING_MESSAGE:
- case INCOMING_MESSAGE_WITH_ID:
- case OUTGOING_MESSAGE:
- case OUTGOING_MESSAGE_WITH_ID:
- Log.e(TAG, "Inserting a message without a thread is not supported, uri: "
- + uri);
- break;
- case OUTGOING_MESSAGE_DELIVERY:
- Log.e(TAG,
- "Inserting an outgoing message delivery without a participant is not "
- + "supported, uri: "
- + uri);
- break;
- case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
- return returnUriAsIsIfSuccessful(uri,
- mMessageHelper.insertMessageDelivery(uri, values));
- case UNIFIED_MESSAGE_ON_THREAD:
- case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
- Log.e(TAG,
- "Inserting a message on unified thread view is not supported, uri: " + uri);
- break;
- case INCOMING_MESSAGE_ON_P2P_THREAD:
- return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
- true, /* is1To1 */ true);
- case OUTGOING_MESSAGE_ON_P2P_THREAD:
- return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
- false, /* is1To1 */ true);
- case INCOMING_MESSAGE_ON_GROUP_THREAD:
- return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
- true, /* is1To1 */ false);
- case OUTGOING_MESSAGE_ON_GROUP_THREAD:
- return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
- false, /* is1To1 */ false);
- case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- Log.e(TAG, "Inserting a message with a specific id is not supported, uri: " + uri);
- break;
- case FILE_TRANSFER_WITH_ID:
- Log.e(TAG, "Inserting a file transfer without a message is not supported, uri: "
- + uri);
- break;
- case EVENT:
- Log.e(TAG,
- "Inserting event using unified event query is not supported, uri: " + uri);
- break;
- default:
- Log.e(TAG, "Invalid insert: " + uri);
- }
-
- return null;
- }
-
- @Override
- public synchronized int delete(Uri uri, String selection, String[] selectionArgs) {
- int match = URL_MATCHER.match(uri);
- int deletedCount = 0;
-
- switch (match) {
- case UNIFIED_RCS_THREAD:
- case UNIFIED_RCS_THREAD_WITH_ID:
- Log.e(TAG, "Deleting entries from unified view is not allowed: " + uri);
- break;
- case PARTICIPANT:
- Log.e(TAG, "Deleting participant with selection is not allowed: " + uri);
- break;
- case PARTICIPANT_WITH_ID:
- return mParticipantHelper.deleteParticipantWithId(uri);
- case PARTICIPANT_ALIAS_CHANGE_EVENT:
- Log.e(TAG, "Deleting participant events without id is not allowed: " + uri);
- break;
- case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
- return mEventHelper.deleteParticipantEvent(uri);
- case P2P_THREAD:
- return mThreadHelper.delete1To1Thread(selection, selectionArgs);
- case P2P_THREAD_WITH_ID:
- return mThreadHelper.delete1To1ThreadWithId(uri);
- case P2P_THREAD_PARTICIPANT:
- Log.e(TAG, "Removing participant from 1 to 1 thread is not allowed, uri: " + uri);
- break;
- case GROUP_THREAD:
- return mThreadHelper.deleteGroupThread(selection, selectionArgs);
- case GROUP_THREAD_WITH_ID:
- return mThreadHelper.deleteGroupThreadWithId(uri);
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
- return mEventHelper.deleteGroupThreadEvent(uri);
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
- return mEventHelper.deleteGroupThreadEvent(uri);
- case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
- return mEventHelper.deleteGroupThreadEvent(uri);
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
- case GROUP_THREAD_NAME_CHANGE_EVENT:
- case GROUP_THREAD_ICON_CHANGE_EVENT:
- Log.e(TAG, "Deleting thread events via selection is not allowed, uri: " + uri);
- break;
- case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
- return mEventHelper.deleteGroupThreadEvent(uri);
- case GROUP_THREAD_PARTICIPANT:
- Log.e(TAG,
- "Deleting a participant from group thread via selection is not allowed, "
- + "uri: "
- + uri);
- break;
- case GROUP_THREAD_PARTICIPANT_WITH_ID:
- return mParticipantHelper.deleteParticipantFromGroupThread(uri);
- case UNIFIED_MESSAGE:
- Log.e(TAG,
- "Deleting message from unified view with selection is not allowed: " + uri);
- break;
- case UNIFIED_MESSAGE_WITH_ID:
- Log.e(TAG, "Deleting message from unified view with id is not allowed: " + uri);
- break;
- case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
- Log.e(TAG, "Deleting file transfer using message uri is not allowed, uri: " + uri);
- break;
- case INCOMING_MESSAGE:
- return mMessageHelper.deleteIncomingMessageWithSelection(selection, selectionArgs);
- case INCOMING_MESSAGE_WITH_ID:
- return mMessageHelper.deleteIncomingMessageWithId(uri);
- case OUTGOING_MESSAGE:
- return mMessageHelper.deleteOutgoingMessageWithSelection(selection, selectionArgs);
- case OUTGOING_MESSAGE_WITH_ID:
- return mMessageHelper.deleteOutgoingMessageWithId(uri);
- case OUTGOING_MESSAGE_DELIVERY:
- case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
- Log.e(TAG, "Deleting message deliveries is not supported, uri: " + uri);
- break;
- case UNIFIED_MESSAGE_ON_THREAD:
- case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
- case INCOMING_MESSAGE_ON_P2P_THREAD:
- case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_P2P_THREAD:
- case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case INCOMING_MESSAGE_ON_GROUP_THREAD:
- case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_GROUP_THREAD:
- case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- Log.e(TAG, "Deleting messages using thread uris is not supported, uri: " + uri);
- break;
- case FILE_TRANSFER_WITH_ID:
- return mMessageHelper.deleteFileTransfer(uri);
- case EVENT:
- Log.e(TAG, "Deleting events using unified event uri is not supported, uri: " + uri);
- break;
- default:
- Log.e(TAG, "Invalid delete: " + uri);
- }
-
- return deletedCount;
- }
-
- @Override
- public synchronized int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- int match = URL_MATCHER.match(uri);
- int updatedCount = 0;
-
- switch (match) {
- case UNIFIED_RCS_THREAD:
- case UNIFIED_RCS_THREAD_WITH_ID:
- Log.e(TAG, "Updating unified thread view is not supported, uri: " + uri);
- break;
- case PARTICIPANT:
- Log.e(TAG, "Updating participants with selection is not supported, uri: " + uri);
- break;
- case PARTICIPANT_WITH_ID:
- return mParticipantHelper.updateParticipantWithId(values, uri);
- case PARTICIPANT_ALIAS_CHANGE_EVENT:
- case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Updating events is not supported, uri: " + uri);
- break;
- case P2P_THREAD:
- return mThreadHelper.update1To1Thread(values, selection, selectionArgs);
- case P2P_THREAD_WITH_ID:
- return mThreadHelper.update1To1ThreadWithId(values, uri);
- case P2P_THREAD_PARTICIPANT:
- Log.e(TAG, "Updating junction table entries is not supported, uri: " + uri);
- break;
- case GROUP_THREAD:
- return mThreadHelper.updateGroupThread(values, selection, selectionArgs);
- case GROUP_THREAD_WITH_ID:
- return mThreadHelper.updateGroupThreadWithId(values, uri);
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
- case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
- case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
- case GROUP_THREAD_NAME_CHANGE_EVENT:
- case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
- case GROUP_THREAD_ICON_CHANGE_EVENT:
- case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
- Log.e(TAG, "Updating thread events is not supported, uri: " + uri);
- break;
- case GROUP_THREAD_PARTICIPANT:
- case GROUP_THREAD_PARTICIPANT_WITH_ID:
- Log.e(TAG, "Updating junction table entries is not supported, uri: " + uri);
- break;
- case UNIFIED_MESSAGE:
- case UNIFIED_MESSAGE_WITH_ID:
- Log.e(TAG, "Updating unified message view is not supported, uri: " + uri);
- break;
- case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
- Log.e(TAG,
- "Updating file transfer using unified message uri is not supported, uri: "
- + uri);
- case INCOMING_MESSAGE:
- Log.e(TAG,
- "Updating an incoming message via selection is not supported, uri: " + uri);
- break;
- case INCOMING_MESSAGE_WITH_ID:
- return mMessageHelper.updateIncomingMessage(uri, values);
- case OUTGOING_MESSAGE:
- Log.e(TAG,
- "Updating an outgoing message via selection is not supported, uri: " + uri);
- break;
- case OUTGOING_MESSAGE_WITH_ID:
- return mMessageHelper.updateOutgoingMessage(uri, values);
- case OUTGOING_MESSAGE_DELIVERY:
- Log.e(TAG, "Updating message deliveries using message uris is not supported, uri: "
- + uri);
- break;
- case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
- return mMessageHelper.updateDelivery(uri, values);
- case UNIFIED_MESSAGE_ON_THREAD:
- case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
- case INCOMING_MESSAGE_ON_P2P_THREAD:
- case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_P2P_THREAD:
- case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
- case INCOMING_MESSAGE_ON_GROUP_THREAD:
- case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- case OUTGOING_MESSAGE_ON_GROUP_THREAD:
- case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
- Log.e(TAG, "Updating messages using threads uris is not supported, uri: " + uri);
- break;
- case FILE_TRANSFER_WITH_ID:
- return mMessageHelper.updateFileTransfer(uri, values);
- case EVENT:
- Log.e(TAG, "Updating events is not supported, uri: " + uri);
- break;
- default:
- Log.e(TAG, "Invalid update: " + uri);
- }
-
- return updatedCount;
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java b/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java
deleted file mode 100644
index 496b512..0000000
--- a/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.android.providers.telephony;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.provider.BaseColumns;
-import android.provider.Telephony;
-
-public class RcsProviderCanonicalAddressHelper {
- SQLiteOpenHelper mSQLiteOpenHelper;
-
- RcsProviderCanonicalAddressHelper(SQLiteOpenHelper sqLiteOpenHelper) {
- mSQLiteOpenHelper = sqLiteOpenHelper;
- }
-
- Cursor getOrCreateCanonicalAddress(String canonicalAddress) {
- SQLiteDatabase db = mSQLiteOpenHelper.getReadableDatabase();
-
- Cursor cursor = db.query(
- MmsSmsProvider.TABLE_CANONICAL_ADDRESSES,
- new String[]{BaseColumns._ID}, Telephony.CanonicalAddressesColumns.ADDRESS + "=?",
- new String[]{canonicalAddress}, null, null, null);
-
- if (cursor != null && cursor.getCount() > 0) {
- return cursor;
- }
-
- if (cursor != null) {
- cursor.close();
- }
-
- return insertCanonicalAddress(canonicalAddress);
- }
-
- private Cursor insertCanonicalAddress(String canonicalAddress) {
- ContentValues contentValues = new ContentValues();
- contentValues.put(Telephony.CanonicalAddressesColumns.ADDRESS, canonicalAddress);
-
- SQLiteDatabase db = mSQLiteOpenHelper.getWritableDatabase();
-
- long id = db.insert(MmsSmsProvider.TABLE_CANONICAL_ADDRESSES, null, contentValues);
-
- if (id == -1) {
- return null;
- }
-
- MatrixCursor matrixCursor = new MatrixCursor(new String[]{BaseColumns._ID}, 1);
- matrixCursor.addRow(new Object[]{id});
-
- return matrixCursor;
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderEventHelper.java b/src/com/android/providers/telephony/RcsProviderEventHelper.java
deleted file mode 100644
index c6a6fc6..0000000
--- a/src/com/android/providers/telephony/RcsProviderEventHelper.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * 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.RcsEventTypes.PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE;
-import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsEventTypes.ICON_CHANGED_EVENT_TYPE;
-import static android.provider.Telephony.RcsColumns.RcsEventTypes.NAME_CHANGED_EVENT_TYPE;
-import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
-import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_LEFT_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_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.EVENT_TYPE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_ICON_URI_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.SOURCE_PARTICIPANT_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.TIMESTAMP_COLUMN;
-import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
-import static android.telephony.ims.RcsEventQueryParams.ALL_EVENTS;
-import static android.telephony.ims.RcsEventQueryParams.ALL_GROUP_THREAD_EVENTS;
-import static android.telephony.ims.RcsEventQueryParams.EVENT_QUERY_PARAMETERS_KEY;
-
-import static android.telephony.ims.RcsQueryContinuationToken.EVENT_QUERY_CONTINUATION_TOKEN_TYPE;
-import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_EVENT_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_THREAD_EVENT_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_UNIFIED_EVENT_VIEW;
-import static com.android.providers.telephony.RcsProvider.TAG;
-import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
-import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.telephony.ims.RcsEventQueryParams;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * Constants and helpers related to events for {@link RcsProvider} to keep the code clean.
- *
- * @hide
- */
-class RcsProviderEventHelper {
- private static final int PARTICIPANT_INDEX_IN_EVENT_URI = 1;
- private static final int EVENT_INDEX_IN_EVENT_URI = 3;
-
- @VisibleForTesting
- public static void createRcsEventTables(SQLiteDatabase db) {
- Log.d(TAG, "Creating event tables");
-
- // Add the event tables
- db.execSQL("CREATE TABLE " + RCS_THREAD_EVENT_TABLE + "(" + EVENT_ID_COLUMN
- + " INTEGER PRIMARY KEY AUTOINCREMENT, " + RCS_THREAD_ID_COLUMN + " INTEGER, "
- + SOURCE_PARTICIPANT_ID_COLUMN + " INTEGER, " + EVENT_TYPE_COLUMN + " INTEGER, "
- + TIMESTAMP_COLUMN + " INTEGER, " + DESTINATION_PARTICIPANT_ID_COLUMN + " INTEGER, "
- + NEW_ICON_URI_COLUMN + " TEXT, " + NEW_NAME_COLUMN + " TEXT, " + " FOREIGN KEY ("
- + RCS_THREAD_ID_COLUMN + ") REFERENCES " + RCS_THREAD_TABLE + " ("
- + RCS_THREAD_ID_COLUMN + "), FOREIGN KEY (" + SOURCE_PARTICIPANT_ID_COLUMN
- + ") REFERENCES " + RCS_PARTICIPANT_TABLE + " (" + RCS_PARTICIPANT_ID_COLUMN
- + "))");
-
- db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_EVENT_TABLE + "(" + EVENT_ID_COLUMN
- + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SOURCE_PARTICIPANT_ID_COLUMN +
- " INTEGER, " + TIMESTAMP_COLUMN + " INTEGER, "
- + NEW_ALIAS_COLUMN + " TEXT," + " FOREIGN KEY (" + SOURCE_PARTICIPANT_ID_COLUMN
- + ") REFERENCES " + RCS_PARTICIPANT_TABLE + " (" + RCS_PARTICIPANT_ID_COLUMN
- + "))");
-
- // Add the views
-
- // The following is a unified event view that puts every entry in both tables into one query
- db.execSQL("CREATE VIEW " + RCS_UNIFIED_EVENT_VIEW + " AS "
- + "SELECT " + PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE + " AS " + EVENT_TYPE_COLUMN
- + ", " + EVENT_ID_COLUMN + ", " + SOURCE_PARTICIPANT_ID_COLUMN + ", "
- + TIMESTAMP_COLUMN + ", " + NEW_ALIAS_COLUMN + ", NULL as " + RCS_THREAD_ID_COLUMN
- + ", NULL as " + DESTINATION_PARTICIPANT_ID_COLUMN + ", NULL as "
- + NEW_ICON_URI_COLUMN + ", NULL as " + NEW_NAME_COLUMN + " "
- + "FROM " + RCS_PARTICIPANT_EVENT_TABLE + " "
- + "UNION "
- + "SELECT " + EVENT_TYPE_COLUMN + ", " + EVENT_ID_COLUMN + ", "
- + SOURCE_PARTICIPANT_ID_COLUMN + ", " + TIMESTAMP_COLUMN + ", "
- + "NULL as " + NEW_ALIAS_COLUMN + ", " + RCS_THREAD_ID_COLUMN + ", "
- + DESTINATION_PARTICIPANT_ID_COLUMN + ", " + NEW_ICON_URI_COLUMN + ", "
- + NEW_NAME_COLUMN + " "
- + "FROM " + RCS_THREAD_EVENT_TABLE);
- }
-
- private final SQLiteOpenHelper mSqLiteOpenHelper;
-
- Cursor queryEvents(Bundle bundle) {
- RcsEventQueryParams queryParameters = null;
- RcsQueryContinuationToken continuationToken = null;
-
- if (bundle != null) {
- queryParameters = bundle.getParcelable(EVENT_QUERY_PARAMETERS_KEY);
- continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
- }
-
- if (continuationToken != null) {
- return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
- continuationToken);
- }
-
- // if no query parameters were entered, build an empty query parameters object
- if (queryParameters == null) {
- queryParameters = new RcsEventQueryParams.Builder().build();
- }
-
- return performInitialQuery(queryParameters);
- }
-
- private Cursor performInitialQuery(RcsEventQueryParams queryParameters) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(RCS_UNIFIED_EVENT_VIEW);
-
- int eventType = queryParameters.getEventType();
- if (eventType != ALL_EVENTS) {
- rawQuery.append(" WHERE ").append(EVENT_TYPE_COLUMN);
- if (eventType == ALL_GROUP_THREAD_EVENTS) {
- rawQuery.append(" IN (").append(
- PARTICIPANT_JOINED_EVENT_TYPE).append(", ").append(
- PARTICIPANT_LEFT_EVENT_TYPE).append(", ").append(
- ICON_CHANGED_EVENT_TYPE).append(", ").append(
- NAME_CHANGED_EVENT_TYPE).append(
- ")");
- } else {
- rawQuery.append("=").append(eventType);
- }
- }
-
- rawQuery.append(" ORDER BY ");
-
- int sortingProperty = queryParameters.getSortingProperty();
- if (sortingProperty == RcsEventQueryParams.SORT_BY_TIMESTAMP) {
- rawQuery.append(TIMESTAMP_COLUMN);
- } else {
- rawQuery.append(EVENT_ID_COLUMN);
- }
-
- rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
-
- RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
- String rawQueryAsString = rawQuery.toString();
- Cursor cursor = db.rawQuery(rawQueryAsString, null);
-
- // if the query was paginated, build the next query
- int limit = queryParameters.getLimit();
- if (limit > 0) {
- RcsProviderUtil.createContinuationTokenBundle(cursor,
- new RcsQueryContinuationToken(EVENT_QUERY_CONTINUATION_TOKEN_TYPE,
- rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
- }
-
- return cursor;
- }
-
- RcsProviderEventHelper(SQLiteOpenHelper sqLiteOpenHelper) {
- mSqLiteOpenHelper = sqLiteOpenHelper;
- }
-
- long insertParticipantEvent(Uri uri, ContentValues values) {
- String participantId = getParticipantIdFromUri(uri);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- values.put(SOURCE_PARTICIPANT_ID_COLUMN, participantId);
- long rowId = db.insert(RCS_PARTICIPANT_EVENT_TABLE, SOURCE_PARTICIPANT_ID_COLUMN, values);
- values.remove(SOURCE_PARTICIPANT_ID_COLUMN);
-
- if (rowId == INSERTION_FAILED) {
- return TRANSACTION_FAILED;
- }
-
- return rowId;
- }
-
- long insertParticipantJoinedEvent(Uri uri, ContentValues values) {
- return insertGroupThreadEvent(uri, values, PARTICIPANT_JOINED_EVENT_TYPE);
- }
-
- long insertParticipantLeftEvent(Uri uri, ContentValues values) {
- return insertGroupThreadEvent(uri, values, PARTICIPANT_LEFT_EVENT_TYPE);
- }
-
- long insertThreadNameChangeEvent(Uri uri, ContentValues values) {
- return insertGroupThreadEvent(uri, values, NAME_CHANGED_EVENT_TYPE);
- }
-
- long insertThreadIconChangeEvent(Uri uri, ContentValues values) {
- return insertGroupThreadEvent(uri, values, ICON_CHANGED_EVENT_TYPE);
- }
-
- private long insertGroupThreadEvent(Uri uri, ContentValues valuesParameter,
- int eventType) {
- String threadId = getThreadIdFromUri(uri);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- ContentValues values = new ContentValues(valuesParameter);
- values.put(EVENT_TYPE_COLUMN, eventType);
- values.put(RCS_THREAD_ID_COLUMN, threadId);
- long rowId = db.insert(RCS_THREAD_EVENT_TABLE, EVENT_ID_COLUMN, values);
-
- if (rowId == INSERTION_FAILED) {
- return TRANSACTION_FAILED;
- }
-
- return rowId;
- }
-
- int deleteParticipantEvent(Uri uri) {
- String eventId = getEventIdFromEventUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- return db.delete(RCS_PARTICIPANT_EVENT_TABLE, EVENT_ID_COLUMN + "=?",
- new String[]{eventId});
- }
-
- int deleteGroupThreadEvent(Uri uri) {
- String eventId = getEventIdFromEventUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- return db.delete(RCS_THREAD_EVENT_TABLE, EVENT_ID_COLUMN + "=?", new String[]{eventId});
- }
-
- private String getEventIdFromEventUri(Uri uri) {
- return uri.getPathSegments().get(EVENT_INDEX_IN_EVENT_URI);
- }
-
- private String getParticipantIdFromUri(Uri uri) {
- return uri.getPathSegments().get(PARTICIPANT_INDEX_IN_EVENT_URI);
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderMessageHelper.java b/src/com/android/providers/telephony/RcsProviderMessageHelper.java
deleted file mode 100644
index 670c641..0000000
--- a/src/com/android/providers/telephony/RcsProviderMessageHelper.java
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
- * Copyright (C) 2018 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.CONTENT_AND_AUTHORITY;
-import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.RCS_1_TO_1_THREAD_URI_PART;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.CONTENT_TYPE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.CONTENT_URI_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_SIZE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_TRANSFER_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.HEIGHT_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.DURATION_MILLIS_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.PREVIEW_TYPE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.PREVIEW_URI_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SESSION_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SUCCESSFULLY_TRANSFERRED_BYTES;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.TRANSFER_STATUS_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.WIDTH_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.RCS_GROUP_THREAD_URI_PART;
-import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.ARRIVAL_TIMESTAMP_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.INCOMING_MESSAGE_URI_PART;
-import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.SENDER_PARTICIPANT_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.GLOBAL_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.LATITUDE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.LONGITUDE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_ID_COLUMN;
-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.RcsMessageColumns.SUB_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns.DELIVERED_TIMESTAMP_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsOutgoingMessageColumns.OUTGOING_MESSAGE_URI_PART;
-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.RcsUnifiedMessageColumns.MESSAGE_TYPE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_INCOMING;
-import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_OUTGOING;
-import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.UNIFIED_INCOMING_MESSAGE_VIEW;
-import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.UNIFIED_OUTGOING_MESSAGE_VIEW;
-import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
-import static android.telephony.ims.RcsMessageQueryParams.MESSAGE_QUERY_PARAMETERS_KEY;
-import static android.telephony.ims.RcsMessageQueryParams.THREAD_ID_NOT_SET;
-
-import static android.telephony.ims.RcsQueryContinuationToken.MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE;
-import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
-import static com.android.providers.telephony.RcsProvider.RCS_FILE_TRANSFER_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_INCOMING_MESSAGE_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_DELIVERY_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_OUTGOING_MESSAGE_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.TAG;
-import static com.android.providers.telephony.RcsProvider.UNIFIED_MESSAGE_VIEW;
-import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
-import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns;
-import android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns;
-import android.telephony.ims.RcsMessageQueryParams;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * Constants and helpers related to messages for {@link RcsProvider} to keep the code clean.
- *
- * @hide
- */
-public class RcsProviderMessageHelper {
- private static final int MESSAGE_ID_INDEX_IN_URI = 1;
- private static final int MESSAGE_ID_INDEX_IN_THREAD_URI = 3;
-
- private final SQLiteOpenHelper mSqLiteOpenHelper;
-
- @VisibleForTesting
- public static void createRcsMessageTables(SQLiteDatabase db) {
- Log.d(TAG, "Creating message tables");
-
- // Add the message tables
- db.execSQL("CREATE TABLE " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
- + " INTEGER PRIMARY KEY AUTOINCREMENT, " + RCS_THREAD_ID_COLUMN + " INTEGER, "
- + GLOBAL_ID_COLUMN + " TEXT, " + SUB_ID_COLUMN + " INTEGER, " + MESSAGE_TEXT_COLUMN
- + " TEXT," + LATITUDE_COLUMN + " REAL, " + LONGITUDE_COLUMN + " REAL, "
- + STATUS_COLUMN + " INTEGER, " + ORIGINATION_TIMESTAMP_COLUMN
- + " INTEGER, FOREIGN KEY(" + RCS_THREAD_ID_COLUMN + ") REFERENCES "
- + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "))");
-
- db.execSQL("CREATE TABLE " + RCS_INCOMING_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
- + " INTEGER PRIMARY KEY, " + SENDER_PARTICIPANT_ID_COLUMN + " INTEGER, "
- + ARRIVAL_TIMESTAMP_COLUMN + " INTEGER, "
- + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN + " INTEGER, FOREIGN KEY ("
- + MESSAGE_ID_COLUMN + ") REFERENCES " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
- + "))");
-
- db.execSQL("CREATE TABLE " + RCS_OUTGOING_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
- + " INTEGER PRIMARY KEY, FOREIGN KEY (" + MESSAGE_ID_COLUMN + ") REFERENCES "
- + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "))");
-
- db.execSQL("CREATE TABLE " + RCS_MESSAGE_DELIVERY_TABLE + "(" + MESSAGE_ID_COLUMN
- + " INTEGER, " + RCS_PARTICIPANT_ID_COLUMN + " INTEGER, "
- + DELIVERED_TIMESTAMP_COLUMN + " INTEGER, "
- + RcsMessageDeliveryColumns.SEEN_TIMESTAMP_COLUMN + " INTEGER, "
- + "CONSTRAINT message_delivery PRIMARY KEY (" + MESSAGE_ID_COLUMN + ", "
- + RCS_PARTICIPANT_ID_COLUMN + "), FOREIGN KEY (" + MESSAGE_ID_COLUMN
- + ") REFERENCES " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "), FOREIGN KEY ("
- + RCS_PARTICIPANT_ID_COLUMN + ") REFERENCES " + RCS_PARTICIPANT_TABLE + "("
- + RCS_PARTICIPANT_ID_COLUMN + "))");
-
- db.execSQL("CREATE TABLE " + RCS_FILE_TRANSFER_TABLE + " (" + FILE_TRANSFER_ID_COLUMN
- + " INTEGER PRIMARY KEY AUTOINCREMENT, " + MESSAGE_ID_COLUMN + " INTEGER, "
- + SESSION_ID_COLUMN + " TEXT, " + CONTENT_URI_COLUMN + " TEXT, "
- + CONTENT_TYPE_COLUMN + " TEXT, " + FILE_SIZE_COLUMN + " INTEGER, "
- + SUCCESSFULLY_TRANSFERRED_BYTES + " INTEGER, " + TRANSFER_STATUS_COLUMN +
- " INTEGER, " + WIDTH_COLUMN + " INTEGER, " + HEIGHT_COLUMN + " INTEGER, "
- + DURATION_MILLIS_COLUMN + " INTEGER, " + PREVIEW_URI_COLUMN + " TEXT, "
- + PREVIEW_TYPE_COLUMN + " TEXT, FOREIGN KEY (" + MESSAGE_ID_COLUMN + ") REFERENCES "
- + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "))");
-
- // Add the views
- //
- // The following view inner joins incoming messages with all messages, inner joins outgoing
- // messages with all messages, and unions them together, while also adding an is_incoming
- // column for easily telling where the record came from. This may have been achieved with
- // an outer join but SQLite doesn't support them.
- //
- // CREATE VIEW unified_message_view AS
- //
- // SELECT rcs_message.rcs_message_row_id,
- // rcs_message.rcs_thread_id,
- // rcs_message.rcs_message_global_id,
- // rcs_message.sub_id,
- // rcs_message.status,
- // rcs_message.origination_timestamp,
- // rcs_message.rcs_text,
- // rcs_message.latitude,
- // rcs_message.longitude,
- // 0 AS sender_participant,
- // 0 AS arrival_timestamp,
- // 0 AS seen_timestamp,
- // outgoing AS message_type
- //
- // FROM rcs_message INNER JOIN rcs_outgoing_message
- // ON rcs_message.rcs_message_row_id=rcs_outgoing_message.rcs_message_row_id
- //
- // UNION
- //
- // SELECT rcs_message.rcs_message_row_id,
- // rcs_message.rcs_thread_id,
- // rcs_message.rcs_message_global_id,
- // rcs_message.sub_id,
- // rcs_message.status,
- // rcs_message.origination_timestamp,
- // rcs_message.rcs_text,
- // rcs_message.latitude,
- // rcs_message.longitude,
- // rcs_incoming_message.sender_participant,
- // rcs_incoming_message.arrival_timestamp,
- // rcs_incoming_message.seen_timestamp,
- // incoming AS message_type
- //
- // FROM rcs_message INNER JOIN rcs_incoming_message
- // ON rcs_message.rcs_message_row_id=rcs_incoming_message.rcs_message_row_id
- //
- db.execSQL("CREATE VIEW " + UNIFIED_MESSAGE_VIEW + " AS SELECT "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
- + "0 AS " + SENDER_PARTICIPANT_ID_COLUMN + ", "
- + "0 AS " + ARRIVAL_TIMESTAMP_COLUMN + ", "
- + "0 AS " + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN + ", "
- + MESSAGE_TYPE_OUTGOING + " AS " + MESSAGE_TYPE_COLUMN
- + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_OUTGOING_MESSAGE_TABLE
- + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
- + RCS_OUTGOING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN
- + " UNION SELECT "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + SENDER_PARTICIPANT_ID_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + ARRIVAL_TIMESTAMP_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN
- + ", "
- + MESSAGE_TYPE_INCOMING + " AS " + MESSAGE_TYPE_COLUMN
- + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_INCOMING_MESSAGE_TABLE
- + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
- + RCS_INCOMING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
-
- // The following view inner joins incoming messages with all messages
- //
- // CREATE VIEW unified_incoming_message_view AS
- //
- // SELECT rcs_message.rcs_message_row_id,
- // rcs_message.rcs_thread_id,
- // rcs_message.rcs_message_global_id,
- // rcs_message.sub_id,
- // rcs_message.status,
- // rcs_message.origination_timestamp,
- // rcs_message.rcs_text,
- // rcs_message.latitude,
- // rcs_message.longitude,
- // rcs_incoming_message.sender_participant,
- // rcs_incoming_message.arrival_timestamp,
- // rcs_incoming_message.seen_timestamp,
- //
- // FROM rcs_message INNER JOIN rcs_incoming_message
- // ON rcs_message.rcs_message_row_id=rcs_incoming_message.rcs_message_row_id
-
- db.execSQL("CREATE VIEW " + UNIFIED_INCOMING_MESSAGE_VIEW + " AS SELECT "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + SENDER_PARTICIPANT_ID_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + ARRIVAL_TIMESTAMP_COLUMN + ", "
- + RCS_INCOMING_MESSAGE_TABLE + "." + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN
- + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_INCOMING_MESSAGE_TABLE
- + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
- + RCS_INCOMING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
-
- // The following view inner joins outgoing messages with all messages.
- //
- // CREATE VIEW unified_outgoing_message AS
- //
- // SELECT rcs_message.rcs_message_row_id,
- // rcs_message.rcs_thread_id,
- // rcs_message.rcs_message_global_id,
- // rcs_message.sub_id,
- // rcs_message.status,
- // rcs_message.origination_timestamp
- // rcs_message.rcs_text,
- // rcs_message.latitude,
- // rcs_message.longitude,
- //
- // FROM rcs_message INNER JOIN rcs_outgoing_message
- // ON rcs_message.rcs_message_row_id=rcs_outgoing_message.rcs_message_row_id
-
- db.execSQL("CREATE VIEW " + UNIFIED_OUTGOING_MESSAGE_VIEW + " AS SELECT "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
- + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN
- + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_OUTGOING_MESSAGE_TABLE
- + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
- + RCS_OUTGOING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
-
- // Add triggers
-
- // Delete the corresponding rcs_message row upon deleting a row in rcs_incoming_message
- //
- // CREATE TRIGGER delete_common_message_after_incoming
- // AFTER DELETE ON rcs_incoming_message
- // BEGIN
- // DELETE FROM rcs_message WHERE rcs_message.rcs_message_row_id=OLD.rcs_message_row_id;
- // END
- db.execSQL("CREATE TRIGGER deleteCommonMessageAfterIncoming AFTER DELETE ON "
- + RCS_INCOMING_MESSAGE_TABLE + " BEGIN DELETE FROM " + RCS_MESSAGE_TABLE
- + " WHERE " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "=OLD."
- + MESSAGE_ID_COLUMN + "; END");
-
- // Delete the corresponding rcs_message row upon deleting a row in rcs_outgoing_message
- //
- // CREATE TRIGGER delete_common_message_after_outgoing
- // AFTER DELETE ON rcs_outgoing_message
- // BEGIN
- // DELETE FROM rcs_message WHERE rcs_message.rcs_message_row_id=OLD.rcs_message_row_id;
- // END
- db.execSQL("CREATE TRIGGER deleteCommonMessageAfterOutgoing AFTER DELETE ON "
- + RCS_OUTGOING_MESSAGE_TABLE + " BEGIN DELETE FROM " + RCS_MESSAGE_TABLE
- + " WHERE " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "=OLD."
- + MESSAGE_ID_COLUMN + "; END");
- }
-
- RcsProviderMessageHelper(SQLiteOpenHelper sqLiteOpenHelper) {
- mSqLiteOpenHelper = sqLiteOpenHelper;
- }
-
- Cursor queryMessages(Bundle bundle) {
- RcsMessageQueryParams queryParameters = null;
- RcsQueryContinuationToken continuationToken = null;
-
- if (bundle != null) {
- queryParameters = bundle.getParcelable(MESSAGE_QUERY_PARAMETERS_KEY);
- continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
- }
-
- if (continuationToken != null) {
- return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
- continuationToken);
- }
-
- // if no parameters were entered, build an empty query parameters object
- if (queryParameters == null) {
- queryParameters = new RcsMessageQueryParams.Builder().build();
- }
-
- return performInitialQuery(queryParameters);
- }
-
- private Cursor performInitialQuery(RcsMessageQueryParams queryParameters) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
-
- StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(UNIFIED_MESSAGE_VIEW);
-
- int messageType = queryParameters.getMessageType();
- String messageLike = queryParameters.getMessageLike();
- int threadId = queryParameters.getThreadId();
-
- boolean isMessageLikePresent = !TextUtils.isEmpty(messageLike);
- boolean isMessageTypeFiltered = (messageType == MESSAGE_TYPE_INCOMING)
- || (messageType == MESSAGE_TYPE_OUTGOING);
- boolean isThreadFiltered = threadId != THREAD_ID_NOT_SET;
-
- if (isMessageLikePresent || isMessageTypeFiltered || isThreadFiltered) {
- rawQuery.append(" WHERE ");
- }
-
- if (messageType == MESSAGE_TYPE_INCOMING) {
- rawQuery.append(MESSAGE_TYPE_COLUMN).append("=").append(MESSAGE_TYPE_INCOMING);
- } else if (messageType == MESSAGE_TYPE_OUTGOING) {
- rawQuery.append(MESSAGE_TYPE_COLUMN).append("=").append(MESSAGE_TYPE_OUTGOING);
- }
-
- if (isMessageLikePresent) {
- if (isMessageTypeFiltered) {
- rawQuery.append(" AND ");
- }
- rawQuery.append(MESSAGE_TEXT_COLUMN).append(" LIKE \"").append(messageLike)
- .append("\"");
- }
-
- if (isThreadFiltered) {
- if (isMessageLikePresent || isMessageTypeFiltered) {
- rawQuery.append(" AND ");
- }
- rawQuery.append(RCS_THREAD_ID_COLUMN).append("=").append(threadId);
- }
-
- // TODO - figure out a way to see if this message has file transfer or not. Ideally we
- // should join the unified table with file transfer table, but using a trigger to change a
- // flag on rcs_message would also work
-
- rawQuery.append(" ORDER BY ");
-
- int sortingProperty = queryParameters.getSortingProperty();
- if (sortingProperty == RcsMessageQueryParams.SORT_BY_TIMESTAMP) {
- rawQuery.append(ORIGINATION_TIMESTAMP_COLUMN);
- } else {
- rawQuery.append(MESSAGE_ID_COLUMN);
- }
-
- rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
-
- RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
- String rawQueryAsString = rawQuery.toString();
- Cursor cursor = db.rawQuery(rawQueryAsString, null);
-
- // If the query was paginated, build the next query
- int limit = queryParameters.getLimit();
- if (limit > 0) {
- RcsProviderUtil.createContinuationTokenBundle(cursor,
- new RcsQueryContinuationToken(MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE,
- rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
- }
-
- return cursor;
- }
-
- Cursor queryUnifiedMessageWithId(Uri uri) {
- return queryUnifiedMessageWithSelection(getMessageIdSelection(uri), null);
- }
-
- Cursor queryUnifiedMessageWithIdInThread(Uri uri) {
- return queryUnifiedMessageWithSelection(getMessageIdSelectionInThreadUri(uri), null);
- }
-
- Cursor queryUnifiedMessageWithSelection(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(UNIFIED_MESSAGE_VIEW, null, selection, selectionArgs, null, null, null,
- null);
- }
-
- Cursor queryIncomingMessageWithId(Uri uri) {
- return queryIncomingMessageWithSelection(getMessageIdSelection(uri), null);
- }
-
- Cursor queryIncomingMessageWithSelection(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(UNIFIED_INCOMING_MESSAGE_VIEW, null, selection, selectionArgs, null, null,
- null, null);
- }
-
- Cursor queryOutgoingMessageWithId(Uri uri) {
- return queryOutgoingMessageWithSelection(getMessageIdSelection(uri), null);
- }
-
- Cursor queryOutgoingMessageWithSelection(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(UNIFIED_OUTGOING_MESSAGE_VIEW, null, selection, selectionArgs, null, null,
- null, null);
- }
-
- Cursor queryAllMessagesOnThread(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
-
- String appendedSelection = appendThreadIdToSelection(uri, selection);
- return db.query(UNIFIED_MESSAGE_VIEW, null, appendedSelection, null, null, null, null);
- }
-
- Uri insertMessageOnThread(Uri uri, ContentValues valuesParameter, boolean isIncoming,
- boolean is1To1) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- String threadId = RcsProviderThreadHelper.getThreadIdFromUri(uri);
- ContentValues values = new ContentValues(valuesParameter);
- values.put(RCS_THREAD_ID_COLUMN, Integer.parseInt(threadId));
-
- db.beginTransaction();
-
- ContentValues subMessageTableValues = new ContentValues();
- if (isIncoming) {
- subMessageTableValues = getIncomingMessageValues(values);
- }
-
- long rowId;
- try {
- rowId = db.insert(RCS_MESSAGE_TABLE, MESSAGE_ID_COLUMN, values);
- if (rowId == INSERTION_FAILED) {
- return null;
- }
-
- subMessageTableValues.put(MESSAGE_ID_COLUMN, rowId);
- long tempId = db.insert(
- isIncoming ? RCS_INCOMING_MESSAGE_TABLE : RCS_OUTGOING_MESSAGE_TABLE,
- MESSAGE_ID_COLUMN, subMessageTableValues);
- if (tempId == INSERTION_FAILED) {
- return null;
- }
-
- // if the thread is outgoing, insert message deliveries
- if (!isIncoming && !insertMessageDeliveriesForOutgoingMessageCreation(db, tempId,
- threadId)) {
- return null;
- }
-
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
-
- values.remove(RCS_THREAD_ID_COLUMN);
-
- String threadPart = is1To1 ? RCS_1_TO_1_THREAD_URI_PART : RCS_GROUP_THREAD_URI_PART;
- String messagePart = isIncoming ? INCOMING_MESSAGE_URI_PART : OUTGOING_MESSAGE_URI_PART;
-
- return CONTENT_AND_AUTHORITY.buildUpon().appendPath(threadPart).appendPath(threadId).
- appendPath(messagePart).appendPath(Long.toString(rowId)).build();
- }
-
- // Tries to insert deliveries for outgoing message, returns false if it fails.
- private boolean insertMessageDeliveriesForOutgoingMessageCreation(
- SQLiteDatabase dbInTransaction, long messageId, String threadId) {
- try (Cursor participantsInThreadCursor = dbInTransaction.query(
- RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null, RCS_THREAD_ID_COLUMN + "=?",
- new String[]{threadId}, null, null, null)) {
- if (participantsInThreadCursor == null) {
- return false;
- }
-
- while (participantsInThreadCursor.moveToNext()) {
- String participantId = participantsInThreadCursor.getString(
- participantsInThreadCursor.getColumnIndex(
- RCS_PARTICIPANT_ID_COLUMN));
-
- long insertionRow = insertMessageDelivery(Long.toString(messageId), participantId,
- new ContentValues());
-
- if (insertionRow == INSERTION_FAILED) {
- return false;
- }
- }
- }
- return true;
- }
-
- long insertMessageDelivery(Uri uri, ContentValues values) {
- String messageId = getMessageIdFromUri(uri);
- String participantId = getParticipantIdFromDeliveryUri(uri);
- return insertMessageDelivery(messageId, participantId, values);
- }
-
- private long insertMessageDelivery(String messageId, String participantId,
- ContentValues valuesParameter) {
- ContentValues values = new ContentValues(valuesParameter);
- values.put(MESSAGE_ID_COLUMN, messageId);
- values.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.insert(RCS_MESSAGE_DELIVERY_TABLE, MESSAGE_ID_COLUMN, values);
- }
-
- int updateDelivery(Uri uri, ContentValues contentValues) {
- String messageId = getMessageIdFromUri(uri);
- String participantId = getParticipantIdFromDeliveryUri(uri);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_MESSAGE_DELIVERY_TABLE, contentValues,
- MESSAGE_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
- new String[]{messageId, participantId});
- }
-
- int deleteIncomingMessageWithId(Uri uri) {
- return deleteIncomingMessageWithSelection(getMessageIdSelection(uri), null);
- }
-
- int deleteIncomingMessageWithSelection(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.delete(RCS_INCOMING_MESSAGE_TABLE, selection, selectionArgs);
- }
-
- int deleteOutgoingMessageWithId(Uri uri) {
- return deleteOutgoingMessageWithSelection(getMessageIdSelection(uri), null);
- }
-
- int deleteOutgoingMessageWithSelection(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.delete(RCS_OUTGOING_MESSAGE_TABLE, selection, selectionArgs);
- }
-
- int updateIncomingMessage(Uri uri, ContentValues values) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- ContentValues incomingMessageValues = getIncomingMessageValues(values);
-
- int updateCountInIncoming = 0;
- int updateCountInCommon = 0;
- db.beginTransaction();
- if (!incomingMessageValues.isEmpty()) {
- updateCountInIncoming = db.update(RCS_INCOMING_MESSAGE_TABLE, incomingMessageValues,
- getMessageIdSelection(uri), null);
- }
- if (!values.isEmpty()) {
- updateCountInCommon = db.update(RCS_MESSAGE_TABLE, values, getMessageIdSelection(uri),
- null);
- }
- db.setTransactionSuccessful();
- db.endTransaction();
-
- return Math.max(updateCountInIncoming, updateCountInCommon);
- }
-
- int updateOutgoingMessage(Uri uri, ContentValues values) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_MESSAGE_TABLE, values, getMessageIdSelection(uri), null);
- }
-
- Cursor queryOutgoingMessageDeliveries(Uri uri) {
- String messageId = getMessageIdFromUri(uri);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(RCS_MESSAGE_DELIVERY_TABLE, null, MESSAGE_ID_COLUMN + "=?",
- new String[]{messageId}, null, null, null);
- }
-
- Cursor queryFileTransfer(Uri uri) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(RCS_FILE_TRANSFER_TABLE, null, FILE_TRANSFER_ID_COLUMN + "=?",
- new String[]{getFileTransferIdFromUri(uri)}, null, null, null, null);
- }
-
- long insertFileTransferToMessage(Uri uri, ContentValues values) {
- String messageId = getMessageIdFromUri(uri);
- values.put(MESSAGE_ID_COLUMN, messageId);
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- long rowId = db.insert(RCS_FILE_TRANSFER_TABLE, MESSAGE_ID_COLUMN, values);
- values.remove(MESSAGE_ID_COLUMN);
-
- if (rowId == INSERTION_FAILED) {
- rowId = TRANSACTION_FAILED;
- }
-
- return rowId;
- }
-
- int deleteFileTransfer(Uri uri) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.delete(RCS_FILE_TRANSFER_TABLE, FILE_TRANSFER_ID_COLUMN + "=?",
- new String[]{getFileTransferIdFromUri(uri)});
- }
-
- int updateFileTransfer(Uri uri, ContentValues values) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_FILE_TRANSFER_TABLE, values,
- FILE_TRANSFER_ID_COLUMN + "=?", new String[]{getFileTransferIdFromUri(uri)});
- }
-
- /**
- * Removes the incoming message values out of all values and returns as a separate content
- * values object.
- */
- private ContentValues getIncomingMessageValues(ContentValues allValues) {
- ContentValues incomingMessageValues = new ContentValues();
-
- if (allValues.containsKey(SENDER_PARTICIPANT_ID_COLUMN)) {
- incomingMessageValues.put(SENDER_PARTICIPANT_ID_COLUMN,
- allValues.getAsInteger(SENDER_PARTICIPANT_ID_COLUMN));
- allValues.remove(SENDER_PARTICIPANT_ID_COLUMN);
- }
-
- if (allValues.containsKey(ARRIVAL_TIMESTAMP_COLUMN)) {
- incomingMessageValues.put(
- ARRIVAL_TIMESTAMP_COLUMN, allValues.getAsLong(ARRIVAL_TIMESTAMP_COLUMN));
- allValues.remove(ARRIVAL_TIMESTAMP_COLUMN);
- }
-
- if (allValues.containsKey(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN)) {
- incomingMessageValues.put(
- RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN,
- allValues.getAsLong(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN));
- allValues.remove(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN);
- }
-
- return incomingMessageValues;
- }
-
- private String appendThreadIdToSelection(Uri uri, String selection) {
- String threadIdSelection = RCS_THREAD_ID_COLUMN + "=" + getThreadIdFromUri(uri);
-
- if (TextUtils.isEmpty(selection)) {
- return threadIdSelection;
- }
-
- return "(" + selection + ") AND " + threadIdSelection;
- }
-
- private String getMessageIdSelection(Uri uri) {
- return MESSAGE_ID_COLUMN + "=" + getMessageIdFromUri(uri);
- }
-
- private String getMessageIdSelectionInThreadUri(Uri uri) {
- return MESSAGE_ID_COLUMN + "=" + getMessageIdFromThreadUri(uri);
- }
-
- private String getMessageIdFromUri(Uri uri) {
- return uri.getPathSegments().get(MESSAGE_ID_INDEX_IN_URI);
- }
-
- private String getFileTransferIdFromUri(Uri uri) {
- // this works because messages and file transfer uri's have the same indices.
- return getMessageIdFromUri(uri);
- }
-
- private String getParticipantIdFromDeliveryUri(Uri uri) {
- // this works because messages in threads and participants in deliveries have the same
- // indices.
- return getMessageIdFromThreadUri(uri);
- }
-
- private String getMessageIdFromThreadUri(Uri uri) {
- return uri.getPathSegments().get(MESSAGE_ID_INDEX_IN_THREAD_URI);
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
deleted file mode 100644
index ab23d6d..0000000
--- a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Copyright (C) 2018 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.CanonicalAddressesColumns.ADDRESS;
-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.RcsParticipantColumns.RCS_PARTICIPANT_URI_PART;
-import static android.provider.Telephony.RcsColumns.RcsParticipantHelpers.RCS_PARTICIPANT_WITH_ADDRESS_VIEW;
-import static android.provider.Telephony.RcsColumns.RcsParticipantHelpers.RCS_PARTICIPANT_WITH_THREAD_VIEW;
-import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
-import static android.telephony.ims.RcsParticipantQueryParams.PARTICIPANT_QUERY_PARAMETERS_KEY;
-
-import static android.telephony.ims.RcsQueryContinuationToken.PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE;
-import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
-import static com.android.providers.telephony.RcsProvider.GROUP_THREAD_URI_PREFIX;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.TAG;
-import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
-import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.telephony.ims.RcsParticipantQueryParams;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * Constants and helpers related to participants for {@link RcsProvider} to keep the code clean.
- *
- * @hide
- */
-class RcsProviderParticipantHelper {
- private static final int PARTICIPANT_ID_INDEX_IN_URI = 1;
- private static final int PARTICIPANT_ID_INDEX_IN_THREAD_URI = 3;
-
- @VisibleForTesting
- public static void createParticipantTables(SQLiteDatabase db) {
- Log.d(TAG, "Creating participant tables");
-
- // create participant tables
- db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_TABLE + " (" +
- RCS_PARTICIPANT_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
- CANONICAL_ADDRESS_ID_COLUMN + " INTEGER ," +
- RCS_ALIAS_COLUMN + " TEXT, " +
- "FOREIGN KEY(" + CANONICAL_ADDRESS_ID_COLUMN + ") "
- + "REFERENCES canonical_addresses(_id)" +
- ");");
-
- db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " (" +
- RCS_THREAD_ID_COLUMN + " INTEGER, " +
- RCS_PARTICIPANT_ID_COLUMN + " INTEGER, " +
- "CONSTRAINT thread_participant PRIMARY KEY("
- + RCS_THREAD_ID_COLUMN + ", " + RCS_PARTICIPANT_ID_COLUMN + "), " +
- "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
- + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "), " +
- "FOREIGN KEY(" + RCS_PARTICIPANT_ID_COLUMN
- + ") REFERENCES " + RCS_PARTICIPANT_TABLE + "(" + RCS_PARTICIPANT_ID_COLUMN + "))");
-
- // create views
-
- // The following view joins rcs_participant table with canonical_addresses table to add the
- // actual address of a participant in the result.
- db.execSQL("CREATE VIEW " + RCS_PARTICIPANT_WITH_ADDRESS_VIEW + " AS SELECT "
- + "rcs_participant.rcs_participant_id, rcs_participant.canonical_address_id, "
- + "rcs_participant.rcs_alias, canonical_addresses.address FROM rcs_participant "
- + "LEFT JOIN canonical_addresses ON "
- + "rcs_participant.canonical_address_id=canonical_addresses._id");
-
- // The following view is the rcs_participant_with_address_view above, plus the information
- // on which threads this participant contributes to, to enable getting participants of a
- // thread
- db.execSQL("CREATE VIEW " + RCS_PARTICIPANT_WITH_THREAD_VIEW + " AS SELECT "
- + "rcs_participant.rcs_participant_id, rcs_participant.canonical_address_id, "
- + "rcs_participant.rcs_alias, canonical_addresses.address, rcs_thread_participant"
- + ".rcs_thread_id FROM rcs_participant LEFT JOIN canonical_addresses ON "
- + "rcs_participant.canonical_address_id=canonical_addresses._id LEFT JOIN "
- + "rcs_thread_participant ON rcs_participant.rcs_participant_id="
- + "rcs_thread_participant.rcs_participant_id");
-
- // TODO - create indexes for faster querying
- }
-
- private final SQLiteOpenHelper mSqLiteOpenHelper;
-
- RcsProviderParticipantHelper(SQLiteOpenHelper sqLiteOpenHelper) {
- mSqLiteOpenHelper = sqLiteOpenHelper;
- }
-
- Cursor queryParticipant(Bundle bundle) {
- RcsParticipantQueryParams queryParameters = null;
- RcsQueryContinuationToken continuationToken = null;
-
- if (bundle != null) {
- queryParameters = bundle.getParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY);
- continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
- }
-
- if (continuationToken != null) {
- return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
- continuationToken);
- }
-
- if (queryParameters == null) {
- queryParameters = new RcsParticipantQueryParams.Builder().build();
- }
-
- return performInitialQuery(queryParameters);
- }
-
- private Cursor performInitialQuery(RcsParticipantQueryParams queryParameters) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- StringBuilder rawQuery = buildInitialRawQuery(queryParameters);
- RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
- String rawQueryAsString = rawQuery.toString();
- Cursor cursor = db.rawQuery(rawQueryAsString, null);
-
- // If the query was paginated, build the next query
- int limit = queryParameters.getLimit();
- if (limit > 0) {
- RcsProviderUtil.createContinuationTokenBundle(cursor,
- new RcsQueryContinuationToken(PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE,
- rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
- }
-
- return cursor;
- }
-
- private StringBuilder buildInitialRawQuery(RcsParticipantQueryParams queryParameters) {
- StringBuilder rawQuery = new StringBuilder("SELECT * FROM ");
-
- boolean isThreadFiltered = queryParameters.getThreadId() > 0;
-
- if (isThreadFiltered) {
- rawQuery.append(RCS_PARTICIPANT_WITH_THREAD_VIEW);
- } else {
- rawQuery.append(RCS_PARTICIPANT_WITH_ADDRESS_VIEW);
- }
-
- boolean isAliasFiltered = !TextUtils.isEmpty(queryParameters.getAliasLike());
- boolean isCanonicalAddressFiltered = !TextUtils.isEmpty(
- queryParameters.getCanonicalAddressLike());
-
- if (isAliasFiltered || isCanonicalAddressFiltered || isThreadFiltered) {
- rawQuery.append(" WHERE ");
- }
-
- if (isAliasFiltered) {
- rawQuery.append(RCS_ALIAS_COLUMN).append(" LIKE \"").append(
- queryParameters.getAliasLike()).append("\"");
- }
-
- if (isCanonicalAddressFiltered) {
- if (isAliasFiltered) {
- rawQuery.append(" AND ");
- }
- rawQuery.append(ADDRESS).append(" LIKE \"").append(
- queryParameters.getCanonicalAddressLike()).append("\"");
- }
-
- if (isThreadFiltered) {
- if (isAliasFiltered || isCanonicalAddressFiltered) {
- rawQuery.append(" AND ");
- }
- rawQuery.append(RCS_THREAD_ID_COLUMN).append("=").append(queryParameters.getThreadId());
- }
-
- rawQuery.append(" ORDER BY ");
-
- int sortingProperty = queryParameters.getSortingProperty();
- if (sortingProperty == RcsParticipantQueryParams.SORT_BY_ALIAS) {
- rawQuery.append(RCS_ALIAS_COLUMN);
- } else if (sortingProperty == RcsParticipantQueryParams.SORT_BY_CANONICAL_ADDRESS) {
- rawQuery.append(ADDRESS);
- } else {
- rawQuery.append(RCS_PARTICIPANT_ID_COLUMN);
- }
- rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
-
- return rawQuery;
- }
-
- Cursor queryParticipantWithId(Uri uri, String[] projection) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(RCS_PARTICIPANT_WITH_ADDRESS_VIEW, projection,
- getParticipantIdSelection(uri), null, null, null, null);
- }
-
- Cursor queryParticipantIn1To1Thread(Uri uri) {
- String threadId = getThreadIdFromUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
-
- return db.rawQuery(
- " SELECT * "
- + "FROM rcs_participant "
- + "WHERE rcs_participant.rcs_participant_id = ("
- + " SELECT rcs_thread_participant.rcs_participant_id "
- + " FROM rcs_thread_participant "
- + " WHERE rcs_thread_participant.rcs_thread_id=" + threadId + ")", null);
- }
-
- Cursor queryParticipantsInGroupThread(Uri uri) {
- String threadId = getThreadIdFromUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
-
- return db.rawQuery(" SELECT * "
- + "FROM rcs_participant "
- + "WHERE rcs_participant.rcs_participant_id = ("
- + " SELECT rcs_participant_id "
- + " FROM rcs_thread_participant "
- + " WHERE rcs_thread_id= " + threadId + ")", null);
- }
-
- Cursor queryParticipantInGroupThreadWithId(Uri uri) {
- String threadId = getThreadIdFromUri(uri);
- String participantId = getParticipantIdFromUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
-
- return db.rawQuery(" SELECT * "
- + "FROM rcs_participant "
- + "WHERE rcs_participant.rcs_participant_id = ("
- + " SELECT rcs_participant_id "
- + " FROM rcs_thread_participant "
- + " WHERE rcs_thread_id=? AND rcs_participant_id=?)",
- new String[]{threadId, participantId});
- }
-
- long insertParticipant(ContentValues contentValues) {
- if (!contentValues.containsKey(CANONICAL_ADDRESS_ID_COLUMN) || TextUtils.isEmpty(
- contentValues.getAsString(CANONICAL_ADDRESS_ID_COLUMN))) {
- Log.e(TAG,
- "RcsProviderParticipantHelper: Inserting participants without canonical "
- + "address is not supported");
- return TRANSACTION_FAILED;
- }
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- long rowId = db.insert(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
- Log.e(TAG, "Inserted participant with rowId=" + rowId);
- if (rowId < 0) {
- return TRANSACTION_FAILED;
- }
- return rowId;
- }
-
- /**
- * Inserts a participant into group thread. This function returns the participant ID instead of
- * the row id in the junction table
- */
- long insertParticipantIntoGroupThread(ContentValues values) {
- if (!values.containsKey(RCS_THREAD_ID_COLUMN) || !values.containsKey(
- RCS_PARTICIPANT_ID_COLUMN)) {
- Log.e(TAG, "RcsProviderParticipantHelper: Cannot insert participant into group.");
- return TRANSACTION_FAILED;
- }
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- long insertedRowId = db.insert(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
- RCS_PARTICIPANT_ID_COLUMN,
- values);
-
- if (insertedRowId == INSERTION_FAILED) {
- return TRANSACTION_FAILED;
- }
-
- return values.getAsLong(RCS_PARTICIPANT_ID_COLUMN);
- }
-
- /**
- * Inserts a participant into group thread. This function returns the participant ID instead of
- * the row id in the junction table
- */
- long insertParticipantIntoGroupThreadWithId(Uri uri) {
- String threadId = getThreadIdFromUri(uri);
- String participantId = getParticipantIdFromUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- ContentValues contentValues = new ContentValues(2);
- contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
- contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
-
- long insertedRowId = db.insert(
- RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
-
- if (insertedRowId == INSERTION_FAILED) {
- return TRANSACTION_FAILED;
- }
-
- return Long.parseLong(participantId);
- }
-
- int deleteParticipantWithId(Uri uri) {
- String participantId = uri.getPathSegments().get(PARTICIPANT_ID_INDEX_IN_URI);
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-
- // See if this participant is involved in any threads
- Cursor cursor = db.query(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null,
- RCS_PARTICIPANT_ID_COLUMN + "=?", new String[]{participantId}, null, null, null);
-
- int participatingThreadCount = 0;
- if (cursor != null) {
- participatingThreadCount = cursor.getCount();
- cursor.close();
- }
-
- if (participatingThreadCount > 0) {
- Log.e(TAG,
- "RcsProviderParticipantHelper: Can't delete participant while it is still in "
- + "RCS threads, uri:"
- + uri);
- return 0;
- }
-
- return db.delete(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN + "=?",
- new String[]{participantId});
- }
-
- int deleteParticipantFromGroupThread(Uri uri) {
- String threadId = getThreadIdFromUri(uri);
- String participantId = getParticipantIdFromUri(uri);
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- // TODO check to remove owner
- return db.delete(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
- RCS_THREAD_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
- new String[]{threadId, participantId});
- }
-
- int updateParticipant(ContentValues contentValues, String selection, String[] selectionArgs) {
- if (contentValues.containsKey(RCS_PARTICIPANT_ID_COLUMN)) {
- Log.e(TAG, "RcsProviderParticipantHelper: Updating participant id is not supported");
- return 0;
- }
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_PARTICIPANT_TABLE, contentValues, selection, selectionArgs);
- }
-
- int updateParticipantWithId(ContentValues contentValues, Uri uri) {
- return updateParticipant(contentValues, getParticipantIdSelection(uri), null);
- }
-
- private String getParticipantIdSelection(Uri uri) {
- return RCS_PARTICIPANT_ID_COLUMN + "=" + uri.getPathSegments().get(
- PARTICIPANT_ID_INDEX_IN_URI);
- }
-
- Uri getParticipantInThreadUri(ContentValues values, long rowId) {
- if (values == null) {
- return null;
- }
- Integer threadId = values.getAsInteger(RCS_THREAD_ID_COLUMN);
- if (threadId == null) {
- return null;
- }
-
- return GROUP_THREAD_URI_PREFIX.buildUpon().appendPath(
- Integer.toString(threadId)).appendPath(RCS_PARTICIPANT_URI_PART).appendPath(
- Long.toString(rowId)).build();
- }
-
- private String getParticipantIdFromUri(Uri uri) {
- return uri.getPathSegments().get(PARTICIPANT_ID_INDEX_IN_THREAD_URI);
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderThreadHelper.java b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
deleted file mode 100644
index c1a35ef..0000000
--- a/src/com/android/providers/telephony/RcsProviderThreadHelper.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- * Copyright (C) 2018 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.RcsGroupThreadColumns.CONFERENCE_URI_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_ICON_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.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;
-import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
-import static android.telephony.ims.RcsQueryContinuationToken.THREAD_QUERY_CONTINUATION_TOKEN_TYPE;
-import static android.telephony.ims.RcsThreadQueryParams.THREAD_QUERY_PARAMETERS_KEY;
-
-import static com.android.providers.telephony.RcsProvider.RCS_1_TO_1_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_GROUP_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
-import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
-import static com.android.providers.telephony.RcsProvider.TAG;
-import static com.android.providers.telephony.RcsProvider.UNIFIED_RCS_THREAD_VIEW;
-import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.BaseColumns;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.telephony.ims.RcsThreadQueryParams;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * Constants and helpers related to threads for {@link RcsProvider} to keep the code clean.
- *
- * @hide
- */
-class RcsProviderThreadHelper {
- private static final int THREAD_ID_INDEX_IN_URI = 1;
-
- @VisibleForTesting
- public static void createThreadTables(SQLiteDatabase db) {
- Log.d(TAG, "Creating thread tables");
-
- // Add the thread tables
- db.execSQL("CREATE TABLE " + RCS_THREAD_TABLE + " (" +
- RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT);");
-
- db.execSQL("CREATE TABLE " + RCS_1_TO_1_THREAD_TABLE + " (" +
- RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY, " +
- FALLBACK_THREAD_ID_COLUMN + " INTEGER, " +
- "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
- + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + ")," +
- "FOREIGN KEY(" + FALLBACK_THREAD_ID_COLUMN
- + ") REFERENCES threads( " + BaseColumns._ID + "))");
-
- db.execSQL("CREATE TABLE " + RCS_GROUP_THREAD_TABLE + " (" +
- RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY, " +
- OWNER_PARTICIPANT_COLUMN + " INTEGER, " +
- GROUP_NAME_COLUMN + " TEXT, " +
- GROUP_ICON_COLUMN + " TEXT, " +
- CONFERENCE_URI_COLUMN + " TEXT, " +
- "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
- + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "))");
-
- // Add the views
-
- // The following is a unified thread view. Since SQLite does not support right or full
- // joins, we are using a union with null values for unused variables for each thread type.
- // The thread_type column is an easy way to figure out whether the entry came from a 1 to 1
- // thread or a group thread. The last message in each thread is appended to the table
- // entries to figure out the latest threads and snippet text. We use COALESCE so that MAX()
- // can take null values into account in order to have threads with no messages still
- // represented here
- //
- // SELECT <1 to 1 thread and first message>
- // FROM (
- // SELECT *
- // FROM rcs_1_to_1_thread LEFT JOIN rcs_message
- // ON rcs_1_to_1_thread.rcs_thread_id=rcs_message.rcs_thread_id)
- // GROUP BY rcs_thread_id
- // HAVING MAX(COALESCE(origination_timestamp,1))
- //
- // UNION
- // SELECT <group thread and first message>
- // FROM (
- // SELECT *
- // FROM rcs_group_thread LEFT JOIN rcs_message
- // ON rcs_group_thread.rcs_thread_id=rcs_message.rcs_thread_id)
- // GROUP BY rcs_thread_id
- // HAVING MAX(COALESCE(origination_timestamp,1))
-
- db.execSQL("CREATE VIEW " + UNIFIED_RCS_THREAD_VIEW + " AS "
- + "SELECT "
- + RCS_THREAD_ID_COLUMN + ", "
- + FALLBACK_THREAD_ID_COLUMN + ", "
- + "null AS " + OWNER_PARTICIPANT_COLUMN + ", "
- + "null AS " + GROUP_NAME_COLUMN + ", "
- + "null AS " + GROUP_ICON_COLUMN + ", "
- + "null AS " + CONFERENCE_URI_COLUMN + ", "
- + "0 AS " + THREAD_TYPE_COLUMN + ", "
- + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + MESSAGE_TEXT_COLUMN + ", "
- + STATUS_COLUMN
- + " FROM (SELECT * FROM "
- + RCS_1_TO_1_THREAD_TABLE + " LEFT JOIN " + RCS_MESSAGE_TABLE
- + " ON "
- + RCS_1_TO_1_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "="
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ")"
- + " GROUP BY " + RCS_THREAD_ID_COLUMN
- + " HAVING MAX(COALESCE("
- + ORIGINATION_TIMESTAMP_COLUMN + ", 1))"
- + " UNION SELECT "
- + RCS_THREAD_ID_COLUMN + ", "
- + "null AS " + FALLBACK_THREAD_ID_COLUMN + ", "
- + OWNER_PARTICIPANT_COLUMN + ", "
- + GROUP_NAME_COLUMN + ", "
- + GROUP_ICON_COLUMN + ", "
- + CONFERENCE_URI_COLUMN + ", "
- + "1 AS " + THREAD_TYPE_COLUMN + ", "
- + ORIGINATION_TIMESTAMP_COLUMN + ", "
- + MESSAGE_TEXT_COLUMN + ", "
- + STATUS_COLUMN
- + " FROM (SELECT * FROM "
- + RCS_GROUP_THREAD_TABLE + " LEFT JOIN " + RCS_MESSAGE_TABLE
- + " ON "
- + RCS_GROUP_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "="
- + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ")"
- + " GROUP BY " + RCS_THREAD_ID_COLUMN
- + " HAVING MAX(COALESCE("
- + ORIGINATION_TIMESTAMP_COLUMN + ", 1))");
-
- // Add the triggers
-
- // Delete the corresponding rcs_thread row upon deleting a row in rcs_1_to_1_thread
- //
- // CREATE TRIGGER deleteRcsThreadAfter1to1
- // AFTER DELETE ON rcs_1_to_1_thread
- // BEGIN
- // DELETE FROM rcs_thread WHERE rcs_thread._id=OLD.rcs_thread_id;
- // END
- db.execSQL("CREATE TRIGGER deleteRcsThreadAfter1to1 AFTER DELETE ON "
- + RCS_1_TO_1_THREAD_TABLE + " BEGIN DELETE FROM " + RCS_THREAD_TABLE + " WHERE "
- + RCS_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD." + RCS_THREAD_ID_COLUMN
- + "; END");
-
- // Delete the corresponding rcs_thread row upon deleting a row in rcs_group_thread
- //
- // CREATE TRIGGER deleteRcsThreadAfter1to1
- // AFTER DELETE ON rcs_1_to_1_thread
- // BEGIN
- // DELETE FROM rcs_thread WHERE rcs_thread._id=OLD.rcs_thread_id;
- // END
- db.execSQL("CREATE TRIGGER deleteRcsThreadAfterGroup AFTER DELETE ON "
- + RCS_GROUP_THREAD_TABLE + " BEGIN DELETE FROM " + RCS_THREAD_TABLE + " WHERE "
- + RCS_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD." + RCS_THREAD_ID_COLUMN
- + "; END");
-
- // Delete the junction table entries upon deleting a 1 to 1 thread
- //
- // CREATE TRIGGER delete1To1JunctionEntries
- // AFTER
- // DELETE ON rcs_1_to_1_thread
- // BEGIN
- // DELETE FROM
- // rcs_thread_participant
- // WHERE
- // rcs_thread_participant.rcs_thread_id = OLD.rcs_thread_id;
- // END
- db.execSQL("CREATE TRIGGER delete1To1JunctionEntries AFTER DELETE ON "
- + RCS_1_TO_1_THREAD_TABLE + " BEGIN DELETE FROM "
- + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " WHERE "
- + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD."
- + RCS_THREAD_ID_COLUMN + "; END");
-
- // Delete the junction table entries upon deleting a group thread
- //
- // CREATE TRIGGER delete1To1JunctionEntries
- // AFTER
- // DELETE ON rcs_1_to_1_thread
- // BEGIN
- // DELETE FROM
- // rcs_thread_participant
- // WHERE
- // rcs_thread_participant.rcs_thread_id = OLD.rcs_thread_id;
- // END
- db.execSQL("CREATE TRIGGER deleteGroupJunctionEntries AFTER DELETE ON "
- + RCS_GROUP_THREAD_TABLE + " BEGIN DELETE FROM "
- + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " WHERE "
- + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD."
- +RCS_THREAD_ID_COLUMN + "; END");
-
- // TODO - delete all messages in a thread after deleting a thread
-
- // TODO - create indexes for faster querying
- }
-
- private final SQLiteOpenHelper mSqLiteOpenHelper;
-
- RcsProviderThreadHelper(SQLiteOpenHelper sqLiteOpenHelper) {
- mSqLiteOpenHelper = sqLiteOpenHelper;
- }
-
- Cursor queryUnifiedThread(Bundle bundle) {
- RcsThreadQueryParams queryParameters = null;
- RcsQueryContinuationToken continuationToken = null;
- if (bundle != null) {
- queryParameters = bundle.getParcelable(
- THREAD_QUERY_PARAMETERS_KEY);
- continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
- }
-
- if (continuationToken != null) {
- return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
- continuationToken);
- }
-
- if (queryParameters == null) {
- queryParameters = new RcsThreadQueryParams.Builder().build();
- }
-
- return performInitialQuery(queryParameters);
- }
-
- private Cursor performInitialQuery(RcsThreadQueryParams queryParameters) {
- if (queryParameters == null) {
- // return everything for test purposes
- queryParameters = new RcsThreadQueryParams.Builder().build();
- }
-
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(
- UNIFIED_RCS_THREAD_VIEW);
-
- if (queryParameters.getThreadType() == RcsThreadQueryParams.THREAD_TYPE_1_TO_1) {
- rawQuery.append(" WHERE ").append(THREAD_TYPE_COLUMN).append("=0");
- } else if (queryParameters.getThreadType() == RcsThreadQueryParams.THREAD_TYPE_GROUP) {
- rawQuery.append(" WHERE ").append(THREAD_TYPE_COLUMN).append("=1");
- }
-
- rawQuery.append(" ORDER BY ");
-
- if (queryParameters.getSortingProperty() == RcsThreadQueryParams.SORT_BY_TIMESTAMP) {
- rawQuery.append(ORIGINATION_TIMESTAMP_COLUMN);
- } else {
- rawQuery.append(RCS_THREAD_ID_COLUMN);
- }
-
- rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
- RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
-
- String rawQueryAsString = rawQuery.toString();
- Cursor cursor = db.rawQuery(rawQueryAsString, null);
-
- // If this is a paginated query, build the next query and return as a Cursor extra. Only do
- // this if the current query returned a result.
- int limit = queryParameters.getLimit();
- if (limit > 0) {
- RcsProviderUtil.createContinuationTokenBundle(cursor,
- new RcsQueryContinuationToken(THREAD_QUERY_CONTINUATION_TOKEN_TYPE,
- rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
- }
-
- return cursor;
- }
-
- Cursor queryUnifiedThreadUsingId(Uri uri, String[] projection) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- String threadId = getThreadIdFromUri(uri);
-
- return db.query(UNIFIED_RCS_THREAD_VIEW, projection, RCS_THREAD_ID_COLUMN + "=?",
- new String[]{threadId},
- null, null, null);
- }
-
- Cursor query1to1Thread(String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(RCS_1_TO_1_THREAD_TABLE, projection, selection, selectionArgs, null,
- null, sortOrder);
- }
-
- Cursor query1To1ThreadUsingId(Uri uri, String[] projection) {
- return query1to1Thread(projection, getThreadIdSelection(uri), null, null);
- }
-
- Cursor queryGroupThread(String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
- return db.query(RCS_GROUP_THREAD_TABLE, projection, selection, selectionArgs, null,
- null, sortOrder);
- }
-
- Cursor queryGroupThreadUsingId(Uri uri, String[] projection) {
- 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) {
- if (contentValues.containsKey(RCS_THREAD_ID_COLUMN)) {
- Log.e(RcsProvider.TAG,
- "RcsProviderThreadHelper: inserting threads with IDs is not supported");
- 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();
-
- if (hasExisting1To1ThreadForParticipant(db, participantId)) {
- return TRANSACTION_FAILED;
- }
-
- 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();
-
- return threadId;
- } finally {
- db.endTransaction();
- }
- }
-
- 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) {
- 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;
- }
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- try {
- db.beginTransaction();
-
- // Insert into the common rcs_threads table
- long rowId = insertIntoCommonRcsThreads(db);
- if (rowId == INSERTION_FAILED) {
- return returnValue;
- }
-
- // Add the rowId in rcs_threads table as a foreign key in rcs_group_table
- contentValues.put(RCS_THREAD_ID_COLUMN, rowId);
- db.insert(RCS_GROUP_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
- contentValues.remove(RCS_THREAD_ID_COLUMN);
-
- db.setTransactionSuccessful();
- returnValue = rowId;
- } finally {
- db.endTransaction();
- }
- return returnValue;
- }
-
- private long insertIntoCommonRcsThreads(SQLiteDatabase db) {
- return db.insert(RCS_THREAD_TABLE, RCS_THREAD_ID_COLUMN, new ContentValues());
- }
-
- int delete1To1Thread(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.delete(RCS_1_TO_1_THREAD_TABLE, selection, selectionArgs);
- }
-
- int delete1To1ThreadWithId(Uri uri) {
- return delete1To1Thread(getThreadIdSelection(uri), null);
- }
-
- int deleteGroupThread(String selection, String[] selectionArgs) {
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.delete(RCS_GROUP_THREAD_TABLE, selection, selectionArgs);
- }
-
- int deleteGroupThreadWithId(Uri uri) {
- return deleteGroupThread(getThreadIdSelection(uri), null);
- }
-
- int update1To1Thread(ContentValues values, String selection, String[] selectionArgs) {
- if (values.containsKey(RCS_THREAD_ID_COLUMN)) {
- Log.e(TAG,
- "RcsProviderThreadHelper: updating thread id for 1 to 1 threads is not "
- + "allowed");
- return 0;
- }
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_1_TO_1_THREAD_TABLE, values, selection, selectionArgs);
- }
-
- int update1To1ThreadWithId(ContentValues values, Uri uri) {
- return update1To1Thread(values, getThreadIdSelection(uri), null);
- }
-
- int updateGroupThread(ContentValues values, String selection, String[] selectionArgs) {
- if (values.containsKey(RCS_THREAD_ID_COLUMN)) {
- Log.e(TAG,
- "RcsProviderThreadHelper: updating thread id for group threads is not "
- + "allowed");
- return 0;
- }
-
- SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
- return db.update(RCS_GROUP_THREAD_TABLE, values, selection, selectionArgs);
- }
-
- int updateGroupThreadWithId(ContentValues values, Uri uri) {
- return updateGroupThread(values, getThreadIdSelection(uri), null);
- }
-
- private String getThreadIdSelection(Uri uri) {
- return RCS_THREAD_ID_COLUMN + "=" + getThreadIdFromUri(uri);
- }
-
- static String getThreadIdFromUri(Uri uri) {
- return uri.getPathSegments().get(THREAD_ID_INDEX_IN_URI);
- }
-}
diff --git a/src/com/android/providers/telephony/RcsProviderUtil.java b/src/com/android/providers/telephony/RcsProviderUtil.java
deleted file mode 100644
index 38f7be1..0000000
--- a/src/com/android/providers/telephony/RcsProviderUtil.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.TRANSACTION_FAILED;
-
-import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
-import static com.android.providers.telephony.RcsProvider.TAG;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.text.TextUtils;
-import android.util.Log;
-
-class RcsProviderUtil {
- /**
- * The value returned when database insertion fails,
- * @see SQLiteDatabase#insert(String, String, ContentValues)
- */
- static final int INSERTION_FAILED = -1;
-
- static void appendLimit(StringBuilder stringBuilder, int limit) {
- if (limit > 0) {
- stringBuilder.append(" LIMIT ").append(limit);
- }
- }
-
- static void createContinuationTokenBundle(Cursor cursor, Parcelable continuationToken,
- String tokenKey) {
- if (cursor.getCount() > 0) {
- Bundle bundle = new Bundle();
- bundle.putParcelable(tokenKey, continuationToken);
- cursor.setExtras(bundle);
- }
- }
-
- /**
- * This method gets a token with raw query, performs the query, increments the token's offset
- * and returns it as a cursor extra
- */
- static Cursor performContinuationQuery(SQLiteDatabase db,
- RcsQueryContinuationToken continuationToken) {
- String rawQuery = continuationToken.getRawQuery();
- int offset = continuationToken.getOffset();
-
- if (offset <= 0 || TextUtils.isEmpty(rawQuery)) {
- Log.e(TAG, "RcsProviderUtil: Invalid continuation token");
- return null;
- }
-
- String continuationQuery = rawQuery + " OFFSET " + offset;
-
- Cursor cursor = db.rawQuery(continuationQuery, null);
- if (cursor.getCount() > 0) {
- continuationToken.incrementOffset();
- Bundle bundle = new Bundle();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
- cursor.setExtras(bundle);
- }
-
- return cursor;
- }
-
- static Uri buildUriWithRowIdAppended(Uri prefix, long rowId) {
- if (rowId == TRANSACTION_FAILED) {
- return null;
- }
- return Uri.withAppendedPath(prefix, Long.toString(rowId));
- }
-
- static Uri returnUriAsIsIfSuccessful(Uri uri, long rowId) {
- if (rowId == TRANSACTION_FAILED) {
- return null;
- }
- return uri;
- }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
deleted file mode 100644
index c0cef0a..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (C) 2018 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.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;
-import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
-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.RcsProvider.RCS_MESSAGE_TABLE;
-import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.test.mock.MockContentResolver;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsProviderDeleteTest {
- private MockContentResolver mContentResolver;
- private RcsProviderTestable mRcsProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mRcsProvider = new RcsProviderTestable();
- RcsProviderTestable.MockContextWithProvider
- context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
- mContentResolver = context.getContentResolver();
-
- // insert a participant
- // first into the MmsSmsProvider
- mRcsProvider.getWritableDatabase().execSQL(
- "INSERT INTO canonical_addresses VALUES (1, \"+15551234567\")");
-
- // then into the RcsProvider
- ContentValues participantValues = new ContentValues();
- participantValues.put(RCS_ALIAS_COLUMN, "Bob");
- participantValues.put(CANONICAL_ADDRESS_ID_COLUMN, 1);
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/participant"),
- participantValues)).isEqualTo(Uri.parse("content://rcs/participant/1"));
-
- setup1To1Thread(mContentResolver);
-
- // insert one group thread
- ContentValues groupContentValues = new ContentValues();
- groupContentValues.put(OWNER_PARTICIPANT_COLUMN, 1);
- groupContentValues.put(GROUP_NAME_COLUMN, "name");
- Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
- assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2"));
-
- Uri addParticipantToGroupThread = Uri.parse("content://rcs/group_thread/2/participant/1");
- assertThat(mContentResolver.insert(addParticipantToGroupThread, null)).isEqualTo(
- addParticipantToGroupThread);
-
- // add incoming and outgoing messages to both threads
- ContentValues messageValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
-
- // add a file transfer to a message
- ContentValues fileTransferValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/3/file_transfer"),
- fileTransferValues)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
-
- // insert an alias change event
- ContentValues eventValues = new ContentValues();
- eventValues.put(NEW_ALIAS_COLUMN, "new alias");
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/participant/1/alias_change_event"),
- eventValues)).isEqualTo(Uri.parse(
- "content://rcs/participant/1/alias_change_event/1"));
-
- // create a group name change event
- eventValues.clear();
- eventValues.put(NEW_NAME_COLUMN, "new name");
- assertThat(mContentResolver.insert(
- Uri.parse("content://rcs/group_thread/2/name_changed_event"),
- eventValues)).isEqualTo(Uri.parse(
- "content://rcs/group_thread/2/name_changed_event/1"));
- }
-
- @After
- public void tearDown() {
- mRcsProvider.tearDown();
- }
-
- @Test
- public void testDelete1To1ThreadWithId() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1"), null,
- null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/p2p_thread/1");
- }
-
- @Test
- public void testDelete1To1ThreadWithSelection() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread"),
- "rcs_fallback_thread_id=1", null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/p2p_thread/1");
- }
-
- @Test
- public void testDeleteGroupThreadWithId() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2"), null,
- null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/group_thread/2");
- }
-
- @Test
- public void testDeleteGroupThreadWithSelection() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread"),
- "group_name=\"name\"", null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/group_thread/1");
- }
-
- @Test
- public void testDeleteParticipantWithIdWhileParticipatingInAThread() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
- null)).isEqualTo(0);
- }
-
- @Test
- public void testDeleteParticipantAfterLeavingThreads() {
- // leave the first thread
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant/1"),
- null, null)).isEqualTo(1);
-
- // try deleting the participant. It should fail
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
- null)).isEqualTo(0);
-
- // delete the p2p thread
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1"), null,
- null)).isEqualTo(1);
-
- // try deleting the participant. It should succeed
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
- null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/participant/1");
- }
-
- @Test
- public void testDeleteParticipantWithSelectionFails() {
- assertThat(
- mContentResolver.delete(Uri.parse("content://rcs/participant"), "rcs_alias=\"Bob\"",
- null)).isEqualTo(0);
- }
-
- @Test
- public void testDeleteParticipantFrom1To1ThreadFails() {
- assertThat(
- mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/participant/1"), null,
- null)).isEqualTo(0);
- }
-
- @Test
- public void testDeleteParticipantFromGroupThread() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant/1"),
- null, null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/group_thread/2/participant");
- }
-
- @Test
- public void testDeleteParticipantFromGroupThreadWithSelectionFails() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant"),
- "rcs_alias=?", new String[]{"Bob"})).isEqualTo(0);
- }
-
- @Test
- public void testDeleteMessagesUsingUnifiedMessageViewFails() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/message/1"), null,
- null)).isEqualTo(0);
- }
-
- @Test
- public void testDeleteMessagesUsingThreadUrisFails() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/message/1"), null,
- null)).isEqualTo(0);
- assertThat(
- mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"),
- null, null)).isEqualTo(0);
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testDeleteMessage() {
- // verify there exists 4 messages
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, null,
- null);
- assertThat(cursor.getCount()).isEqualTo(4);
- cursor.close();
-
- // delete 2 of them
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/incoming_message/1"), null,
- null)).isEqualTo(1);
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/outgoing_message/4"), null,
- null)).isEqualTo(1);
-
- // verify that only 2 messages are left
- cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, null, null);
- assertThat(cursor.getCount()).isEqualTo(2);
- cursor.close();
-
- // verify that entries in common table is deleted and only messages with id's 2 and 3 remain
- SQLiteDatabase db = mRcsProvider.getWritableDatabase();
- cursor = db.query(RCS_MESSAGE_TABLE, null, null, null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(2);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(2);
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(3);
- cursor.close();
- }
-
- @Test
- public void testDeleteFileTransfer() {
- assertThat(mContentResolver.delete(Uri.parse("content://rcs/file_transfer/1"), null,
- null)).isEqualTo(1);
- assertDeletionViaQuery("content://rcs/file_transfer/1");
- }
-
- @Test
- public void testDeleteParticipantEvent() {
- assertThat(mContentResolver.delete(Uri.parse(
- "content://rcs/participant/1/alias_change_event/1"), null, null)).isEqualTo(1);
-
- // try deleting again and verify nothing is deleted
- // TODO - convert to query once querying is in place
- assertThat(mContentResolver.delete(Uri.parse(
- "content://rcs/participant/1/alias_change_event/1"), null, null)).isEqualTo(0);
- }
-
- @Test
- public void testDeleteGroupThreadEvent() {
- assertThat(mContentResolver.delete(Uri.parse(
- "content://rcs/group_thread/2/name_changed_event/1"), null, null)).isEqualTo(1);
-
- // try deleting again and verify nothing is deleted
- // TODO - convert to query once querying is in place
- assertThat(mContentResolver.delete(Uri.parse(
- "content://rcs/group_thread/2/name_changed_event/1"), null, null)).isEqualTo(0);
- }
-
- private void assertDeletionViaQuery(String queryUri) {
- Cursor cursor = mContentResolver.query(Uri.parse(queryUri), null, null, null);
- assertThat(cursor.getCount()).isEqualTo(0);
- cursor.close();
- }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderHelper.java b/tests/src/com/android/providers/telephony/RcsProviderHelper.java
deleted file mode 100644
index 5a7f9a0..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 1a48a49..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2018 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.RcsGroupThreadColumns.CONFERENCE_URI_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_ICON_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.GLOBAL_ID_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.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;
-import android.database.Cursor;
-import android.net.Uri;
-import android.test.mock.MockContentResolver;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsProviderInsertTest {
- private MockContentResolver mContentResolver;
- private RcsProviderTestable mRcsProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mRcsProvider = new RcsProviderTestable();
- RcsProviderTestable.MockContextWithProvider
- context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
- mContentResolver = context.getContentResolver();
- }
-
- @After
- public void tearDown() {
- mRcsProvider.tearDown();
- }
-
- @Test
- public void testInsertUnifiedThreadFails() {
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread"), null)).isNull();
- }
-
- @Test
- public void testDuplicate1To1ThreadInsertion() {
- Uri uri = setup1To1Thread(mContentResolver);
-
- assertThat(mContentResolver.insert(uri, null)).isNull();
- }
-
- @Test
- public void testInsertGroupThread() {
- ContentValues contentValues = new ContentValues(3);
- contentValues.put(CONFERENCE_URI_COLUMN, "conference uri");
- contentValues.put(GROUP_NAME_COLUMN, "group name");
- contentValues.put(GROUP_ICON_COLUMN, "groupIcon");
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
- contentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/1"));
- }
-
- @Test
- public void testInsertParticipant() {
- ContentValues contentValues = new ContentValues();
- contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 6);
- contentValues.put(RCS_ALIAS_COLUMN, "Alias");
-
- Uri uri = mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
- assertThat(uri).isEqualTo(Uri.parse("content://rcs/participant/1"));
- }
-
- @Test
- public void testInsertParticipantIntoGroupThread() {
- // create a participant
- ContentValues contentValues = new ContentValues();
- contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 23);
- mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
-
- // create a thread
- ContentValues values = new ContentValues(1);
- values.put(GROUP_NAME_COLUMN, "Group");
- mContentResolver.insert(Uri.parse("content://rcs/group_thread"), values);
-
- // add participant to the thread
- Uri uri = Uri.parse("content://rcs/group_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 testInsertMessageFails() {
- ContentValues contentValues = new ContentValues();
- contentValues.put(GLOBAL_ID_COLUMN, "global RCS id");
-
- // try inserting messages without threads
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/message"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/6"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/incoming_message"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/incoming_message/12"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/18"),
- contentValues)).isNull();
-
- // try inserting into unified thread view
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread/5/incoming_message"),
- contentValues)).isNull();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread/5/outgoing_message"),
- contentValues)).isNull();
- }
-
- @Test
- @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/group_thread"),
- values)).isNotNull();
-
- // add messages to threads
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
- values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
- values)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
- values)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
-
- // assert that they are accessible in messages table
- Cursor messageCursor = mContentResolver.query(Uri.parse("content://rcs/message"), null,
- null, null, null);
- assertThat(messageCursor.getCount()).isEqualTo(4);
- }
-
- @Test
- public void testInsertMessageDelivery() {
- setup1To1Thread(mContentResolver);
-
- ContentValues values = new ContentValues();
-
- // add an outgoing message to the thread
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/1"));
-
- // add a delivery to the outgoing message
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/1/delivery/1"),
- values)).isEqualTo(Uri.parse("content://rcs/outgoing_message/1/delivery/1"));
- }
-
- @Test
- public void testInsertFileTransfer() {
- setup1To1Thread(mContentResolver);
-
- ContentValues values = new ContentValues();
-
- // add an outgoing message to the thread
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/1"));
-
- // add a file transfer to the message
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/1/file_transfer"),
- values)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
- }
-
- @Test
- public void testInsertParticipantEvent() {
- // create a participant
- ContentValues contentValues = new ContentValues();
- contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 23);
- mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
-
- // insert an alias change event
- ContentValues eventValues = new ContentValues();
- eventValues.put(NEW_ALIAS_COLUMN, "new alias");
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/participant/1/alias_change_event"),
- eventValues)).isEqualTo(Uri.parse(
- "content://rcs/participant/1/alias_change_event/1"));
- }
-
- @Test
- public void testInsertGroupThreadEvent() {
- // create a group thread
- ContentValues contentValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
- contentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/1"));
-
- // create a group name change event
- ContentValues eventValues = new ContentValues();
- eventValues.put(NEW_NAME_COLUMN, "new name");
- assertThat(mContentResolver.insert(
- Uri.parse("content://rcs/group_thread/1/name_changed_event"),
- eventValues)).isEqualTo(Uri.parse(
- "content://rcs/group_thread/1/name_changed_event/1"));
- }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
deleted file mode 100644
index f0579ea..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- * Copyright (C) 2018 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.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;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TEXT_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TYPE_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_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 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;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.SOURCE_PARTICIPANT_ID_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_COLUMN;
-import static android.telephony.ims.RcsEventQueryParams.EVENT_QUERY_PARAMETERS_KEY;
-import static android.telephony.ims.RcsEventQueryParams.GROUP_THREAD_NAME_CHANGED_EVENT;
-import static android.telephony.ims.RcsMessageQueryParams.MESSAGE_QUERY_PARAMETERS_KEY;
-import static android.telephony.ims.RcsParticipantQueryParams.PARTICIPANT_QUERY_PARAMETERS_KEY;
-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;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.telephony.ims.RcsEventQueryParams;
-import android.telephony.ims.RcsGroupThread;
-import android.telephony.ims.RcsMessageQueryParams;
-import android.telephony.ims.RcsParticipantQueryParams;
-import android.telephony.ims.RcsQueryContinuationToken;
-import android.telephony.ims.RcsThreadQueryParams;
-import android.test.mock.MockContentResolver;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.providers.telephony.RcsProviderTestable.MockContextWithProvider;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsProviderQueryTest {
- private MockContentResolver mContentResolver;
- private RcsProviderTestable mRcsProvider;
-
- private static final String GROUP_NAME = "group name";
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mRcsProvider = new RcsProviderTestable();
- MockContextWithProvider context = new MockContextWithProvider(mRcsProvider);
- mContentResolver = context.getContentResolver();
-
- // insert two participants
- Uri participantUri = Uri.parse("content://rcs/participant");
- ContentValues contentValues = new ContentValues();
- contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 99);
- contentValues.put(RCS_ALIAS_COLUMN, "Some alias");
- mContentResolver.insert(participantUri, contentValues);
-
- contentValues.clear();
- contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 100);
- contentValues.put(RCS_ALIAS_COLUMN, "Some other alias");
- mContentResolver.insert(participantUri, contentValues);
-
- // insert two 1 to 1 threads
- setup1To1Thread(mContentResolver, 1, 1);
- setup1To1Thread(mContentResolver, 2, 2);
-
- // insert one group thread
- ContentValues groupContentValues = new ContentValues(1);
- groupContentValues.put(GROUP_NAME_COLUMN, GROUP_NAME);
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
- groupContentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/3"));
-
- // put participants into the group
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/participant/1"), null);
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/participant/2"), null);
-
- // insert two messages into first thread, leave the second one empty, insert one into group
- // thread
- ContentValues messageValues = new ContentValues();
-
- messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 300);
- messageValues.put(MESSAGE_TEXT_COLUMN, "Old message");
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
-
- messageValues.clear();
- messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 400);
- messageValues.put(MESSAGE_TEXT_COLUMN, "New message");
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
-
- messageValues.clear();
- messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 200);
- messageValues.put(MESSAGE_TEXT_COLUMN, "Group message");
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/3/incoming_message/3"));
-
- // Add two events to the group thread
- ContentValues eventValues = new ContentValues();
- eventValues.put(NEW_NAME_COLUMN, "New group name");
- assertThat(mContentResolver.insert(
- Uri.parse("content://rcs/group_thread/3/name_changed_event"),
- eventValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/3/name_changed_event/1"));
-
- eventValues.clear();
- eventValues.put(SOURCE_PARTICIPANT_ID_COLUMN, 1);
- eventValues.put(DESTINATION_PARTICIPANT_ID_COLUMN, 2);
- assertThat(mContentResolver.insert(
- Uri.parse("content://rcs/group_thread/3/participant_joined_event"),
- eventValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/3/participant_joined_event/2"));
- }
-
- @After
- public void tearDown() {
- mRcsProvider.tearDown();
- }
-
- @Test
- public void testCanQueryUnifiedThreads() {
- RcsThreadQueryParams queryParameters = new RcsThreadQueryParams.Builder().build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"),
- null, bundle, null);
- assertThat(cursor.getCount()).isEqualTo(3);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(1);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(
- GROUP_NAME);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 200);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "Group message");
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 400);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "New message");
- }
-
- @Test
- public void testCanQueryUnifiedThreadsWithLimitAndSorting() {
- RcsThreadQueryParams queryParameters = new RcsThreadQueryParams.Builder()
- .setThreadType(RcsThreadQueryParams.THREAD_TYPE_1_TO_1).setResultLimit(1)
- .setSortProperty(RcsThreadQueryParams.SORT_BY_TIMESTAMP).setSortDirection(true)
- .build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"),
- null, bundle, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
- }
-
- @Test
- public void testCanContinueThreadQuery() {
- // Limit results to 1.
- RcsThreadQueryParams queryParameters =
- new RcsThreadQueryParams.Builder().setResultLimit(1).build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
-
- // Perform an initial query, verify first thread is returned
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(1);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(
- GROUP_NAME);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 200);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "Group message");
-
- // Put the continuation token in the bundle to do a follow up query
- RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
- QUERY_CONTINUATION_TOKEN);
- bundle.clear();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
- cursor.close();
-
- cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
- cursor.close();
-
- // Put the continuation token in the bundle to do a follow up query again, verify third
- // thread is returned
- continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
- bundle.clear();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
- cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
- assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 400);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "New message");
- cursor.close();
- }
-
- @Test
- public void testQuery1To1Threads() {
- // verify two threads are returned in the query
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/p2p_thread"),
- new String[]{RCS_THREAD_ID_COLUMN}, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(2);
- }
-
- @Test
- public void testQueryGroupThreads() {
- // verify one thread is returned in the query
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/group_thread"),
- new String[]{GROUP_NAME_COLUMN}, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getString(0)).isEqualTo(GROUP_NAME);
- }
-
- @Test
- public void testQueryParticipant() {
- RcsParticipantQueryParams queryParameters = new RcsParticipantQueryParams.Builder()
- .build();
-
- Bundle bundle = new Bundle();
- bundle.putParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/participant"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(2);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(2);
- assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(
- 100);
- assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
- "Some other alias");
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
- assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
- "Some alias");
- }
-
- @Test
- public void testQueryParticipantWithContinuation() {
- Uri participantUri = Uri.parse("content://rcs/participant");
-
- // Perform the initial query
- RcsParticipantQueryParams queryParameters =
- new RcsParticipantQueryParams.Builder().setAliasLike("%ali%").setSortProperty(
- RcsParticipantQueryParams.SORT_BY_ALIAS).setSortDirection(true)
- .setResultLimit(1).build();
-
- Bundle bundle = new Bundle();
- bundle.putParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(participantUri, null, bundle, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(1);
- assertThat(cursor.getInt(1)).isEqualTo(99);
- assertThat(cursor.getString(2)).isEqualTo("Some alias");
-
- // Perform the continuation query
- RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
- QUERY_CONTINUATION_TOKEN);
- bundle.clear();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
-
- cursor = mContentResolver.query(participantUri, null, bundle, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(2);
- assertThat(cursor.getInt(1)).isEqualTo(100);
- assertThat(cursor.getString(2)).isEqualTo("Some other alias");
-
- // Perform the continuation query to verify no entries left
- continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
- bundle.clear();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
-
- cursor = mContentResolver.query(participantUri, null, bundle, null);
- assertThat(cursor.getCount()).isEqualTo(0);
- continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
- assertThat(continuationToken).isNull();
- }
-
- @Test
- public void testQueryGroupParticipants() {
- // TODO - implement
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryEvents() {
- RcsEventQueryParams queryParameters = new RcsEventQueryParams.Builder().build();
-
- Bundle bundle = new Bundle();
- bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(2);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
- PARTICIPANT_JOINED_EVENT_TYPE);
- assertThat(cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN))).isEqualTo(
- 1);
- assertThat(cursor.getInt(cursor.getColumnIndex(DESTINATION_PARTICIPANT_ID_COLUMN))).isEqualTo(
- 2);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
- GROUP_THREAD_NAME_CHANGED_EVENT);
- assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
- "New group name");
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryEventsWithContinuation() {
- RcsEventQueryParams queryParameters =
- new RcsEventQueryParams.Builder().setResultLimit(1).setSortDirection(true)
- .build();
-
- Bundle bundle = new Bundle();
- bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
- GROUP_THREAD_NAME_CHANGED_EVENT);
- assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
- "New group name");
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryEventsWithTypeLimitation() {
- RcsEventQueryParams queryParameters =
- new RcsEventQueryParams.Builder().setEventType(
- GROUP_THREAD_NAME_CHANGED_EVENT).build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
- GROUP_THREAD_NAME_CHANGED_EVENT);
- assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
- "New group name");
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryMessages() {
- RcsMessageQueryParams queryParameters = new RcsMessageQueryParams.Builder().build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
-
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
- null);
-
- assertThat(cursor.getCount()).isEqualTo(3);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(2);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryMessagesWithContinuation() {
- RcsMessageQueryParams queryParameters =
- new RcsMessageQueryParams.Builder().setMessageLike("%o%message").setResultLimit(
- 1).setSortProperty(RcsMessageQueryParams.SORT_BY_TIMESTAMP)
- .setSortDirection(true).build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
-
- // Perform the initial query
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
- null);
-
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 200);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TYPE_COLUMN))).isEqualTo(
- "Group message");
-
- // Perform the continuation query
- RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
- QUERY_CONTINUATION_TOKEN);
- assertThat(continuationToken).isNotNull();
- bundle.clear();
- bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
-
- cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle, null);
-
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 300);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "Old message");
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testQueryMessagesWithThreadFilter() {
- RcsMessageQueryParams queryParameters =
- new RcsMessageQueryParams.Builder().setThread(new RcsGroupThread(null, 3))
- .build();
- Bundle bundle = new Bundle();
- bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
-
- // Perform the initial query
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
- null);
-
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
- assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
- 200);
- assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
- "Group message");
-
- }
-
- @Test
- public void testQueryParticipantOf1To1Thread() {
- // query the participant back
- Uri queryUri = Uri.parse("content://rcs/p2p_thread/1/participant");
- Cursor cursor = mContentResolver.query(queryUri, null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
-
- assertThat(cursor.getInt(1)).isEqualTo(99);
- assertThat(cursor.getString(2)).isEqualTo("Some alias");
- }
-
- @Test
- public void testQueryParticipantOfGroupThread() {
- // query all the participants in this thread
- Uri queryUri = Uri.parse("content://rcs/group_thread/3/participant");
- Cursor cursor = mContentResolver.query(queryUri, null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
-
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
- assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
- "Some alias");
- }
-
- @Test
- public void testQueryParticipantOfGroupThreadWithId() {
- Cursor cursor = mContentResolver.query(
- Uri.parse("content://rcs/group_thread/3/participant/1"), null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
-
- assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
- assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
- "Some alias");
- }
-
- @Test
- public void testQueryFileTransfer() {
- ContentValues values = new ContentValues();
- // add an incoming message to the thread 2
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/2/incoming_message"),
- values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/2/incoming_message/4"));
-
- // add a file transfer
- values.put(SESSION_ID_COLUMN, "session_id");
- values.put(FILE_SIZE_COLUMN, 1234567890);
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/message/4/file_transfer"),
- values)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
-
- // query the file transfer back
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/file_transfer/1"), null,
- null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(1);
- assertThat(cursor.getInt(1)).isEqualTo(4);
- assertThat(cursor.getString(2)).isEqualTo("session_id");
- assertThat(cursor.getLong(5)).isEqualTo(1234567890);
- }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderTestable.java b/tests/src/com/android/providers/telephony/RcsProviderTestable.java
deleted file mode 100644
index 569fcdb..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderTestable.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.ProviderInfo;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.telephony.TelephonyManager;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-
-import org.mockito.Mockito;
-
-/**
- * A subclass of RcsProvider used for testing on an in-memory database
- */
-public class RcsProviderTestable extends RcsProvider {
- private MockContextWithProvider mockContextWithProvider;
-
- @Override
- public boolean onCreate() {
- mockContextWithProvider = new MockContextWithProvider(this);
- mDbOpenHelper = new InMemoryRcsDatabase();
- mParticipantHelper = new RcsProviderParticipantHelper(mDbOpenHelper);
- mThreadHelper = new RcsProviderThreadHelper(mDbOpenHelper);
- mMessageHelper = new RcsProviderMessageHelper(mDbOpenHelper);
- mEventHelper = new RcsProviderEventHelper(mDbOpenHelper);
- return true;
- }
-
- protected void tearDown() {
- mDbOpenHelper.close();
- }
-
- public SQLiteDatabase getWritableDatabase() {
- return mDbOpenHelper.getWritableDatabase();
- }
-
- class InMemoryRcsDatabase extends SQLiteOpenHelper {
- InMemoryRcsDatabase() {
- super(null, // no context is needed for in-memory db
- null, // db file name is null for in-memory db
- null, // CursorFactory is null by default
- 1); // db version is no-op for tests
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- MmsSmsDatabaseHelper mmsSmsDatabaseHelper = new MmsSmsDatabaseHelper(
- mockContextWithProvider, null);
- mmsSmsDatabaseHelper.createMmsTables(db);
- mmsSmsDatabaseHelper.createSmsTables(db);
- mmsSmsDatabaseHelper.createCommonTables(db);
-
- RcsProviderThreadHelper.createThreadTables(db);
- RcsProviderParticipantHelper.createParticipantTables(db);
- RcsProviderMessageHelper.createRcsMessageTables(db);
- RcsProviderEventHelper.createRcsEventTables(db);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // no-op
- }
- }
-
- static class MockContextWithProvider extends MockContext {
- private final MockContentResolver mResolver;
-
- MockContextWithProvider(RcsProvider rcsProvider) {
- mResolver = new MockContentResolver();
-
- // Add authority="rcs" to given smsProvider
- ProviderInfo providerInfo = new ProviderInfo();
- providerInfo.authority = RcsProvider.AUTHORITY;
- rcsProvider.attachInfoForTesting(this, providerInfo);
- mResolver.addProvider(RcsProvider.AUTHORITY, rcsProvider);
- }
-
- @Override
- public MockContentResolver getContentResolver() {
- return mResolver;
- }
-
- @Override
- public PackageManager getPackageManager() {
- return Mockito.mock(PackageManager.class);
- }
-
- @Override
- public Object getSystemService(String name) {
- switch (name) {
- case Context.APP_OPS_SERVICE:
- return Mockito.mock(AppOpsManager.class);
- case Context.TELEPHONY_SERVICE:
- return Mockito.mock(TelephonyManager.class);
- default:
- return null;
- }
- }
-
- @Override
- public boolean isCredentialProtectedStorage() {
- return false;
- }
- }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
deleted file mode 100644
index 4ba7c1c..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2018 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.RcsFileTransferColumns.HEIGHT_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.WIDTH_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.RcsIncomingMessageColumns.ARRIVAL_TIMESTAMP_COLUMN;
-import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
-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 com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns;
-import android.test.mock.MockContentResolver;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsProviderUpdateTest {
- private MockContentResolver mContentResolver;
- private RcsProviderTestable mRcsProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mRcsProvider = new RcsProviderTestable();
- RcsProviderTestable.MockContextWithProvider
- context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
- mContentResolver = context.getContentResolver();
-
- // insert a participant
- // first into the MmsSmsProvider
- mRcsProvider.getWritableDatabase().execSQL(
- "INSERT INTO canonical_addresses VALUES (1, \"+15551234567\")");
-
- // then into the RcsProvider
- ContentValues participantValues = new ContentValues();
- participantValues.put(RCS_ALIAS_COLUMN, "Bob");
- participantValues.put(CANONICAL_ADDRESS_ID_COLUMN, 1);
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/participant"),
- participantValues)).isEqualTo(Uri.parse("content://rcs/participant/1"));
-
- // insert fallback threads
- mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (1)");
- mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (2)");
-
- setup1To1Thread(mContentResolver);
-
- // insert one group thread
- ContentValues groupContentValues = new ContentValues();
- groupContentValues.put(OWNER_PARTICIPANT_COLUMN, 1);
- groupContentValues.put(GROUP_NAME_COLUMN, "Name");
- Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
- assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2"));
-
- Uri groupInsertionUri = Uri.parse("content://rcs/group_thread/2/participant/1");
- assertThat(mContentResolver.insert(groupInsertionUri, null)).isEqualTo(groupInsertionUri);
-
- // add incoming and outgoing messages to both threads
- ContentValues messageValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
- assertThat(
- mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
- messageValues)).isEqualTo(
- Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
-
- // add message delivery to the outgoing messages
- ContentValues deliveryValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/2/delivery/1"),
- deliveryValues)).isEqualTo(
- Uri.parse("content://rcs/outgoing_message/2/delivery/1"));
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/4/delivery/1"),
- deliveryValues)).isEqualTo(
- Uri.parse("content://rcs/outgoing_message/4/delivery/1"));
-
- // add a file transfer to an incoming message
- ContentValues fileTransferValues = new ContentValues();
- assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/3/file_transfer"),
- fileTransferValues)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
- }
-
- @After
- public void tearDown() {
- mRcsProvider.tearDown();
- }
-
- @Test
- public void testUpdate1To1ThreadWithSelection() {
- // update the fallback thread id
- ContentValues contentValues = new ContentValues(1);
- contentValues.put(FALLBACK_THREAD_ID_COLUMN, 2);
- Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
-
- assertThat(mContentResolver.update(p2pThreadUri, contentValues, "rcs_fallback_thread_id=1",
- null)).isEqualTo(1);
-
- // verify the thread is actually updated
- Cursor cursor = mContentResolver.query(p2pThreadUri,
- new String[]{FALLBACK_THREAD_ID_COLUMN}, "rcs_fallback_thread_id=2", null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(2);
- }
-
- @Test
- public void testUpdate1To1ThreadWithId() {
- // update the fallback thread id
- ContentValues contentValues = new ContentValues(1);
- contentValues.put(FALLBACK_THREAD_ID_COLUMN, 2);
- Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread/1");
- assertThat(mContentResolver.update(p2pThreadUri, contentValues, null, null)).isEqualTo(1);
-
- // verify the thread is actually updated
- Cursor cursor = mContentResolver.query(p2pThreadUri,
- new String[]{FALLBACK_THREAD_ID_COLUMN}, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(2);
- }
-
- @Test
- public void testUpdateGroupThreadWithSelection() {
- // update the group name
- ContentValues contentValues = new ContentValues(1);
- contentValues.put(GROUP_NAME_COLUMN, "New name");
- Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
- assertThat(mContentResolver.update(groupThreadUri, contentValues, "group_name=\"Name\"",
- null)).isEqualTo(1);
-
- // verify the thread is actually updated
- Cursor cursor = mContentResolver.query(groupThreadUri, new String[]{GROUP_NAME_COLUMN},
- "group_name=\"New name\"", null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getString(0)).isEqualTo("New name");
- }
-
- @Test
- public void testUpdateGroupThreadWithId() {
- // update the group name
- ContentValues contentValues = new ContentValues(1);
- contentValues.put(GROUP_NAME_COLUMN, "New name");
- Uri groupThreadUri = Uri.parse("content://rcs/group_thread/2");
- assertThat(mContentResolver.update(groupThreadUri, contentValues, null, null)).isEqualTo(1);
-
- // verify the thread is actually updated
- Cursor cursor = mContentResolver.query(groupThreadUri, new String[]{GROUP_NAME_COLUMN},
- null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getString(0)).isEqualTo("New name");
- }
-
- @Test
- public void testUpdateParticipantWithId() {
- // change the participant name from Bob to Bobby
- ContentValues contentValues = new ContentValues(1);
- contentValues.put(RCS_ALIAS_COLUMN, "Bobby");
-
- Uri participantUri = Uri.parse("content://rcs/participant/1");
-
- assertThat(mContentResolver.update(participantUri, contentValues, null, null)).isEqualTo(1);
-
- // verify participant is actually updated
- Cursor cursor = mContentResolver.query(participantUri, new String[]{RCS_ALIAS_COLUMN}, null,
- null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getString(0)).isEqualTo("Bobby");
- }
-
- @Test
- public void testUpdate1To1ThreadParticipantFails() {
- assertThat(
- mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/participant/1"), null,
- null, null)).isEqualTo(0);
- }
-
- @Test
- public void testUpdateGroupParticipantFails() {
- assertThat(mContentResolver.update(Uri.parse("content://rcs/group_thread/2/participant/1"),
- null, null, null)).isEqualTo(0);
- }
-
- @Test
- public void testUpdateUnifiedMessageViewFails() {
- ContentValues updateValues = new ContentValues();
- updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
-
- assertThat(mContentResolver.update(Uri.parse("content://rcs/message"), updateValues, null,
- null)).isEqualTo(0);
- assertThat(mContentResolver.update(Uri.parse("content://rcs/message/1"), updateValues, null,
- null)).isEqualTo(0);
- }
-
- @Test
- public void testUpdateMessageOnThreadFails() {
- ContentValues updateValues = new ContentValues();
- updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
-
- assertThat(mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
- updateValues, null, null)).isEqualTo(0);
- assertThat(
- mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"),
- updateValues, null, null)).isEqualTo(0);
- assertThat(
- mContentResolver.update(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
- updateValues, null, null)).isEqualTo(0);
- assertThat(mContentResolver.update(
- Uri.parse("content://rcs/groupp_thread/2/outgoing_message/1"), updateValues, null,
- null)).isEqualTo(0);
- }
-
- @Test
- public void testUpdateMessage() {
- // update the message
- ContentValues updateValues = new ContentValues(1);
- updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
- assertThat(
- mContentResolver.update(Uri.parse("content://rcs/outgoing_message/2"), updateValues,
- null, null)).isEqualTo(1);
-
- // verify the value is actually updated
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/outgoing_message/2"), null,
- null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getLong(5)).isEqualTo(1234567890);
- cursor.close();
- }
-
- @Test
- @Ignore // TODO: fix and un-ignore
- public void testUpdateIncomingMessageSpecificColumn() {
- // update the message
- ContentValues updateValues = new ContentValues(1);
- updateValues.put(ARRIVAL_TIMESTAMP_COLUMN, 987654321);
- assertThat(
- mContentResolver.update(Uri.parse("content://rcs/incoming_message/3"), updateValues,
- null, null)).isEqualTo(1);
-
- // verify the value is actually updated
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/incoming_message/3"), null,
- null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getLong(7)).isEqualTo(987654321);
- cursor.close();
- }
-
- @Test
- public void testUpdateMessageDelivery() {
- ContentValues updateValues = new ContentValues();
- updateValues.put(DELIVERED_TIMESTAMP_COLUMN, 12345);
- updateValues.put(RcsMessageDeliveryColumns.SEEN_TIMESTAMP_COLUMN, 54321);
-
- assertThat(mContentResolver.update(Uri.parse("content://rcs/outgoing_message/2/delivery/1"),
- updateValues, null, null)).isEqualTo(1);
-
- // verify the value is actually updated
- Cursor cursor = mContentResolver.query(
- Uri.parse("content://rcs/outgoing_message/2/delivery"), null, null, null, null,
- null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(0)).isEqualTo(2);
- assertThat(cursor.getInt(1)).isEqualTo(1);
- assertThat(cursor.getLong(2)).isEqualTo(12345);
- assertThat(cursor.getLong(3)).isEqualTo(54321);
- }
-
- @Test
- public void testUpdateFileTransfer() {
- ContentValues updateValues = new ContentValues();
- updateValues.put(WIDTH_COLUMN, 640);
- updateValues.put(HEIGHT_COLUMN, 480);
-
- assertThat(mContentResolver.update(Uri.parse("content://rcs/file_transfer/1"), updateValues,
- null, null)).isEqualTo(1);
-
- // verify that the values are actually updated
- Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/file_transfer/1"), null,
- null, null, null, null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.moveToNext();
- assertThat(cursor.getInt(8)).isEqualTo(640);
- assertThat(cursor.getInt(9)).isEqualTo(480);
- }
-}