blob: fcd69fad2152eadbe682646d6812ca7f5c445ab3 [file] [log] [blame]
/*
* 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.internal.telephony.ims;
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_ALIAS_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.RcsGroupThreadColumns.RCS_GROUP_THREAD_URI;
import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_URI;
import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.ALIAS_CHANGE_EVENT_URI_PART;
import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_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.ICON_CHANGED_URI_PART;
import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NAME_CHANGED_URI_PART;
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.PARTICIPANT_JOINED_URI_PART;
import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.PARTICIPANT_LEFT_URI_PART;
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.RcsUnifiedEventHelper.RCS_EVENT_QUERY_URI;
import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.telephony.Rlog;
import android.telephony.ims.RcsEventDescriptor;
import android.telephony.ims.RcsEventQueryResultDescriptor;
import android.telephony.ims.RcsGroupThreadIconChangedEventDescriptor;
import android.telephony.ims.RcsGroupThreadNameChangedEventDescriptor;
import android.telephony.ims.RcsGroupThreadParticipantJoinedEventDescriptor;
import android.telephony.ims.RcsGroupThreadParticipantLeftEventDescriptor;
import android.telephony.ims.RcsParticipantAliasChangedEventDescriptor;
import android.telephony.ims.RcsQueryContinuationToken;
import java.util.ArrayList;
import java.util.List;
class RcsEventQueryHelper {
private final ContentResolver mContentResolver;
RcsEventQueryHelper(ContentResolver contentResolver) {
mContentResolver = contentResolver;
}
Uri getParticipantEventInsertionUri(int participantId) {
return RCS_PARTICIPANT_URI.buildUpon().appendPath(Integer.toString(participantId))
.appendPath(ALIAS_CHANGE_EVENT_URI_PART).build();
}
RcsEventQueryResultDescriptor performEventQuery(Bundle bundle) throws RemoteException {
RcsQueryContinuationToken continuationToken = null;
List<RcsEventDescriptor> eventList = new ArrayList<>();
try (Cursor cursor = mContentResolver.query(RCS_EVENT_QUERY_URI, null, bundle, null)) {
if (cursor == null) {
throw new RemoteException("Event query failed, bundle: " + bundle);
}
while (cursor.moveToNext()) {
int eventType = cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN));
switch (eventType) {
case PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE:
eventList.add(createNewParticipantAliasChangedEvent(cursor));
break;
case PARTICIPANT_JOINED_EVENT_TYPE:
eventList.add(createNewParticipantJoinedEvent(cursor));
break;
case PARTICIPANT_LEFT_EVENT_TYPE:
eventList.add(createNewParticipantLeftEvent(cursor));
break;
case NAME_CHANGED_EVENT_TYPE:
eventList.add(createNewGroupNameChangedEvent(cursor));
break;
case ICON_CHANGED_EVENT_TYPE:
eventList.add(createNewGroupIconChangedEvent(cursor));
break;
default:
Rlog.e(RcsMessageStoreController.TAG,
"RcsEventQueryHelper: invalid event type: " + eventType);
}
}
Bundle cursorExtras = cursor.getExtras();
if (cursorExtras != null) {
continuationToken = cursorExtras.getParcelable(QUERY_CONTINUATION_TOKEN);
}
}
return new RcsEventQueryResultDescriptor(continuationToken, eventList);
}
int createGroupThreadEvent(int eventType, long timestamp, int threadId,
int originationParticipantId, ContentValues eventSpecificValues)
throws RemoteException {
ContentValues values = new ContentValues(eventSpecificValues);
values.put(EVENT_TYPE_COLUMN, eventType);
values.put(TIMESTAMP_COLUMN, timestamp);
values.put(SOURCE_PARTICIPANT_ID_COLUMN, originationParticipantId);
Uri eventUri = RCS_GROUP_THREAD_URI.buildUpon().appendPath(
Integer.toString(threadId)).appendPath(getPathForEventType(eventType)).build();
Uri insertionUri = mContentResolver.insert(eventUri, values);
int eventId = 0;
if (insertionUri != null) {
eventId = Integer.parseInt(insertionUri.getLastPathSegment());
}
if (eventId <= 0) {
throw new RemoteException(
"Could not create event with type: " + eventType + " on thread: " + threadId);
}
return eventId;
}
private String getPathForEventType(int eventType) throws RemoteException {
switch (eventType) {
case PARTICIPANT_JOINED_EVENT_TYPE:
return PARTICIPANT_JOINED_URI_PART;
case PARTICIPANT_LEFT_EVENT_TYPE:
return PARTICIPANT_LEFT_URI_PART;
case NAME_CHANGED_EVENT_TYPE:
return NAME_CHANGED_URI_PART;
case ICON_CHANGED_EVENT_TYPE:
return ICON_CHANGED_URI_PART;
default:
throw new RemoteException("Event type unrecognized: " + eventType);
}
}
private RcsGroupThreadIconChangedEventDescriptor createNewGroupIconChangedEvent(Cursor cursor) {
String newIcon = cursor.getString(cursor.getColumnIndex(NEW_ICON_URI_COLUMN));
return new RcsGroupThreadIconChangedEventDescriptor(
cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
newIcon == null ? null : Uri.parse(newIcon));
}
private RcsGroupThreadNameChangedEventDescriptor createNewGroupNameChangedEvent(Cursor cursor) {
return new RcsGroupThreadNameChangedEventDescriptor(
cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN)));
}
private RcsGroupThreadParticipantLeftEventDescriptor
createNewParticipantLeftEvent(Cursor cursor) {
return new RcsGroupThreadParticipantLeftEventDescriptor(
cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(DESTINATION_PARTICIPANT_ID_COLUMN)));
}
private RcsGroupThreadParticipantJoinedEventDescriptor
createNewParticipantJoinedEvent(Cursor cursor) {
return new RcsGroupThreadParticipantJoinedEventDescriptor(
cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
cursor.getInt(cursor.getColumnIndex(DESTINATION_PARTICIPANT_ID_COLUMN)));
}
private RcsParticipantAliasChangedEventDescriptor
createNewParticipantAliasChangedEvent(Cursor cursor) {
return new RcsParticipantAliasChangedEventDescriptor(
cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
cursor.getString(cursor.getColumnIndex(NEW_ALIAS_COLUMN)));
}
}