Merge "Implementation of RcsMessageStore APIs [base]"
am: c4ed10103a
Change-Id: I13a89859cd1aba68a339f3f2e8c026cedbfcbea5
This commit is contained in:
@@ -2053,6 +2053,608 @@ public final class Telephony {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Columns for the "rcs_*" tables used by {@link android.telephony.ims.RcsMessageStore} classes.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public interface RcsColumns {
|
||||||
|
/**
|
||||||
|
* The authority for the content provider
|
||||||
|
*/
|
||||||
|
String AUTHORITY = "rcs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to start building upon to use {@link com.android.providers.telephony.RcsProvider}
|
||||||
|
*/
|
||||||
|
Uri CONTENT_AND_AUTHORITY = Uri.parse("content://" + AUTHORITY);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value to be used whenever a transaction that expects an integer to be returned
|
||||||
|
* failed.
|
||||||
|
*/
|
||||||
|
int TRANSACTION_FAILED = Integer.MIN_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value that denotes a timestamp was not set before (e.g. a message that is not
|
||||||
|
* delivered yet will not have a DELIVERED_TIMESTAMP)
|
||||||
|
*/
|
||||||
|
long TIMESTAMP_NOT_SET = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsThread} gets persisted to
|
||||||
|
*/
|
||||||
|
interface RcsThreadColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsThread}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String RCS_THREAD_URI_PART = "thread";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.RcsThread} via the content
|
||||||
|
* provider.
|
||||||
|
*/
|
||||||
|
Uri RCS_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, RCS_THREAD_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique identifier of an {@link android.telephony.ims.RcsThread}
|
||||||
|
*/
|
||||||
|
String RCS_THREAD_ID_COLUMN = "rcs_thread_id";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.Rcs1To1Thread} gets persisted to
|
||||||
|
*/
|
||||||
|
interface Rcs1To1ThreadColumns extends RcsThreadColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.Rcs1To1Thread}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String RCS_1_TO_1_THREAD_URI_PART = "p2p_thread";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.Rcs1To1Thread}s via the
|
||||||
|
* content provider
|
||||||
|
*/
|
||||||
|
Uri RCS_1_TO_1_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
RCS_1_TO_1_THREAD_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SMS/MMS thread to fallback to in case of an RCS outage
|
||||||
|
*/
|
||||||
|
String FALLBACK_THREAD_ID_COLUMN = "rcs_fallback_thread_id";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsGroupThread} gets persisted to
|
||||||
|
*/
|
||||||
|
interface RcsGroupThreadColumns extends RcsThreadColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsGroupThread}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String RCS_GROUP_THREAD_URI_PART = "group_thread";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.RcsGroupThread}s via the
|
||||||
|
* content provider
|
||||||
|
*/
|
||||||
|
Uri RCS_GROUP_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
RCS_GROUP_THREAD_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The owner/admin of the {@link android.telephony.ims.RcsGroupThread}
|
||||||
|
*/
|
||||||
|
String OWNER_PARTICIPANT_COLUMN = "owner_participant";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user visible name of the group
|
||||||
|
*/
|
||||||
|
String GROUP_NAME_COLUMN = "group_name";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user visible icon of the group
|
||||||
|
*/
|
||||||
|
String GROUP_ICON_COLUMN = "group_icon";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RCS conference URI for this group
|
||||||
|
*/
|
||||||
|
String CONFERENCE_URI_COLUMN = "conference_uri";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The view that enables polling from all types of RCS threads at once
|
||||||
|
*/
|
||||||
|
interface RcsUnifiedThreadColumns extends RcsThreadColumns, Rcs1To1ThreadColumns,
|
||||||
|
RcsGroupThreadColumns {
|
||||||
|
/**
|
||||||
|
* The type of this {@link android.telephony.ims.RcsThread}
|
||||||
|
*/
|
||||||
|
String THREAD_TYPE_COLUMN = "thread_type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer returned as a result from a database query that denotes the thread is 1 to 1
|
||||||
|
*/
|
||||||
|
int THREAD_TYPE_1_TO_1 = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer returned as a result from a database query that denotes the thread is 1 to 1
|
||||||
|
*/
|
||||||
|
int THREAD_TYPE_GROUP = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsParticipant} gets persisted to
|
||||||
|
*/
|
||||||
|
interface RcsParticipantColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsParticipant}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String RCS_PARTICIPANT_URI_PART = "participant";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.RcsParticipant}s via the
|
||||||
|
* content provider
|
||||||
|
*/
|
||||||
|
Uri RCS_PARTICIPANT_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
RCS_PARTICIPANT_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique identifier of the entry in the database
|
||||||
|
*/
|
||||||
|
String RCS_PARTICIPANT_ID_COLUMN = "rcs_participant_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A foreign key on canonical_address table, also used by SMS/MMS
|
||||||
|
*/
|
||||||
|
String CANONICAL_ADDRESS_ID_COLUMN = "canonical_address_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user visible RCS alias for this participant.
|
||||||
|
*/
|
||||||
|
String RCS_ALIAS_COLUMN = "rcs_alias";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Additional constants to enable access to {@link android.telephony.ims.RcsParticipant}
|
||||||
|
* related data
|
||||||
|
*/
|
||||||
|
interface RcsParticipantHelpers extends RcsParticipantColumns {
|
||||||
|
/**
|
||||||
|
* The view that unifies "rcs_participant" and "canonical_addresses" tables for easy
|
||||||
|
* access to participant address.
|
||||||
|
*/
|
||||||
|
String RCS_PARTICIPANT_WITH_ADDRESS_VIEW = "rcs_participant_with_address_view";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The view that unifies "rcs_participant", "canonical_addresses" and
|
||||||
|
* "rcs_thread_participant" junction table to get full information on participants that
|
||||||
|
* contribute to threads.
|
||||||
|
*/
|
||||||
|
String RCS_PARTICIPANT_WITH_THREAD_VIEW = "rcs_participant_with_thread_view";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsMessage} gets persisted to
|
||||||
|
*/
|
||||||
|
interface RcsMessageColumns {
|
||||||
|
/**
|
||||||
|
* Denotes the type of this message (i.e.
|
||||||
|
* {@link android.telephony.ims.RcsIncomingMessage} or
|
||||||
|
* {@link android.telephony.ims.RcsOutgoingMessage}
|
||||||
|
*/
|
||||||
|
String MESSAGE_TYPE_COLUMN = "rcs_message_type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique identifier for the message in the database - i.e. the primary key.
|
||||||
|
*/
|
||||||
|
String MESSAGE_ID_COLUMN = "rcs_message_row_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The globally unique RCS identifier for the message. Please see 4.4.5.2 - GSMA
|
||||||
|
* RCC.53 (RCS Device API 1.6 Specification)
|
||||||
|
*/
|
||||||
|
String GLOBAL_ID_COLUMN = "rcs_message_global_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The subscription where this message was sent from/to.
|
||||||
|
*/
|
||||||
|
String SUB_ID_COLUMN = "sub_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The sending status of the message.
|
||||||
|
* @see android.telephony.ims.RcsMessage.RcsMessageStatus
|
||||||
|
*/
|
||||||
|
String STATUS_COLUMN = "status";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The creation timestamp of the message.
|
||||||
|
*/
|
||||||
|
String ORIGINATION_TIMESTAMP_COLUMN = "origination_timestamp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The text content of the message.
|
||||||
|
*/
|
||||||
|
String MESSAGE_TEXT_COLUMN = "rcs_text";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The latitude content of the message, if it contains a location.
|
||||||
|
*/
|
||||||
|
String LATITUDE_COLUMN = "latitude";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The longitude content of the message, if it contains a location.
|
||||||
|
*/
|
||||||
|
String LONGITUDE_COLUMN = "longitude";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that additional information of {@link android.telephony.ims.RcsIncomingMessage}
|
||||||
|
* gets persisted to.
|
||||||
|
*/
|
||||||
|
interface RcsIncomingMessageColumns extends RcsMessageColumns {
|
||||||
|
/**
|
||||||
|
The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsIncomingMessage}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String INCOMING_MESSAGE_URI_PART = "incoming_message";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query incoming messages through
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider}
|
||||||
|
*/
|
||||||
|
Uri INCOMING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
INCOMING_MESSAGE_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ID of the {@link android.telephony.ims.RcsParticipant} that sent this message
|
||||||
|
*/
|
||||||
|
String SENDER_PARTICIPANT_ID_COLUMN = "sender_participant";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp of arrival for this message.
|
||||||
|
*/
|
||||||
|
String ARRIVAL_TIMESTAMP_COLUMN = "arrival_timestamp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time when the recipient has read this message.
|
||||||
|
*/
|
||||||
|
String SEEN_TIMESTAMP_COLUMN = "seen_timestamp";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that additional information of {@link android.telephony.ims.RcsOutgoingMessage}
|
||||||
|
* gets persisted to.
|
||||||
|
*/
|
||||||
|
interface RcsOutgoingMessageColumns extends RcsMessageColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsOutgoingMessage}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String OUTGOING_MESSAGE_URI_PART = "outgoing_message";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.RcsOutgoingMessage}s via the
|
||||||
|
* content provider
|
||||||
|
*/
|
||||||
|
Uri OUTGOING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
OUTGOING_MESSAGE_URI_PART);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The delivery information of an {@link android.telephony.ims.RcsOutgoingMessage}
|
||||||
|
*/
|
||||||
|
interface RcsMessageDeliveryColumns extends RcsOutgoingMessageColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsOutgoingMessageDelivery}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String DELIVERY_URI_PART = "delivery";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp of delivery of this message.
|
||||||
|
*/
|
||||||
|
String DELIVERED_TIMESTAMP_COLUMN = "delivered_timestamp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time when the recipient has read this message.
|
||||||
|
*/
|
||||||
|
String SEEN_TIMESTAMP_COLUMN = "seen_timestamp";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The views that allow querying {@link android.telephony.ims.RcsIncomingMessage} and
|
||||||
|
* {@link android.telephony.ims.RcsOutgoingMessage} at the same time.
|
||||||
|
*/
|
||||||
|
interface RcsUnifiedMessageColumns extends RcsIncomingMessageColumns,
|
||||||
|
RcsOutgoingMessageColumns {
|
||||||
|
/**
|
||||||
|
* The path that is used to query all {@link android.telephony.ims.RcsMessage} in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String UNIFIED_MESSAGE_URI_PART = "message";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query all types of {@link android.telephony.ims.RcsMessage}s
|
||||||
|
*/
|
||||||
|
Uri UNIFIED_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
UNIFIED_MESSAGE_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the view that unites rcs_message and rcs_incoming_message tables.
|
||||||
|
*/
|
||||||
|
String UNIFIED_INCOMING_MESSAGE_VIEW = "unified_incoming_message_view";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the view that unites rcs_message and rcs_outgoing_message tables.
|
||||||
|
*/
|
||||||
|
String UNIFIED_OUTGOING_MESSAGE_VIEW = "unified_outgoing_message_view";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column that shows from which table the message entry came from.
|
||||||
|
*/
|
||||||
|
String MESSAGE_TYPE_COLUMN = "message_type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer returned as a result from a database query that denotes that the message is
|
||||||
|
* an incoming message
|
||||||
|
*/
|
||||||
|
int MESSAGE_TYPE_INCOMING = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer returned as a result from a database query that denotes that the message is
|
||||||
|
* an outgoing message
|
||||||
|
*/
|
||||||
|
int MESSAGE_TYPE_OUTGOING = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsFileTransferPart} gets persisted to.
|
||||||
|
*/
|
||||||
|
interface RcsFileTransferColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsFileTransferPart}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String FILE_TRANSFER_URI_PART = "file_transfer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query or modify {@link android.telephony.ims.RcsFileTransferPart}s via the
|
||||||
|
* content provider
|
||||||
|
*/
|
||||||
|
Uri FILE_TRANSFER_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
FILE_TRANSFER_URI_PART);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The globally unique file transfer ID for this RCS file transfer.
|
||||||
|
*/
|
||||||
|
String FILE_TRANSFER_ID_COLUMN = "rcs_file_transfer_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RCS session ID for this file transfer. The ID is implementation dependent but
|
||||||
|
* should be unique.
|
||||||
|
*/
|
||||||
|
String SESSION_ID_COLUMN = "session_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI that points to the content of this file transfer
|
||||||
|
*/
|
||||||
|
String CONTENT_URI_COLUMN = "content_uri";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The file type of this file transfer in bytes. The validity of types is not enforced
|
||||||
|
* in {@link android.telephony.ims.RcsMessageStore} APIs.
|
||||||
|
*/
|
||||||
|
String CONTENT_TYPE_COLUMN = "content_type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The size of the file transfer in bytes.
|
||||||
|
*/
|
||||||
|
String FILE_SIZE_COLUMN = "file_size";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of bytes that was successfully transmitted for this file transfer
|
||||||
|
*/
|
||||||
|
String SUCCESSFULLY_TRANSFERRED_BYTES = "transfer_offset";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status of this file transfer
|
||||||
|
* @see android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus
|
||||||
|
*/
|
||||||
|
String TRANSFER_STATUS_COLUMN = "transfer_status";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The on-screen width of the file transfer, if it contains multi-media
|
||||||
|
*/
|
||||||
|
String WIDTH_COLUMN = "width";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The on-screen height of the file transfer, if it contains multi-media
|
||||||
|
*/
|
||||||
|
String HEIGHT_COLUMN = "height";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The duration of the content in milliseconds if this file transfer contains
|
||||||
|
* multi-media
|
||||||
|
*/
|
||||||
|
String DURATION_MILLIS_COLUMN = "duration";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to the preview of the content of this file transfer
|
||||||
|
*/
|
||||||
|
String PREVIEW_URI_COLUMN = "preview_uri";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of the preview of the content of this file transfer. The validity of types
|
||||||
|
* is not enforced in {@link android.telephony.ims.RcsMessageStore} APIs.
|
||||||
|
*/
|
||||||
|
String PREVIEW_TYPE_COLUMN = "preview_type";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that holds the information for
|
||||||
|
* {@link android.telephony.ims.RcsGroupThreadEvent} and its subclasses.
|
||||||
|
*/
|
||||||
|
interface RcsThreadEventColumns {
|
||||||
|
/**
|
||||||
|
* The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
|
||||||
|
* refer to participant joined events (example URI:
|
||||||
|
* {@code content://rcs/group_thread/3/participant_joined_event})
|
||||||
|
*/
|
||||||
|
String PARTICIPANT_JOINED_URI_PART = "participant_joined_event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
|
||||||
|
* refer to participant left events. (example URI:
|
||||||
|
* {@code content://rcs/group_thread/3/participant_left_event/4})
|
||||||
|
*/
|
||||||
|
String PARTICIPANT_LEFT_URI_PART = "participant_left_event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
|
||||||
|
* refer to name changed events. (example URI:
|
||||||
|
* {@code content://rcs/group_thread/3/name_changed_event})
|
||||||
|
*/
|
||||||
|
String NAME_CHANGED_URI_PART = "name_changed_event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
|
||||||
|
* refer to icon changed events. (example URI:
|
||||||
|
* {@code content://rcs/group_thread/3/icon_changed_event})
|
||||||
|
*/
|
||||||
|
String ICON_CHANGED_URI_PART = "icon_changed_event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique ID of this event in the database, i.e. the primary key
|
||||||
|
*/
|
||||||
|
String EVENT_ID_COLUMN = "event_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of this event
|
||||||
|
*
|
||||||
|
* @see RcsEventTypes
|
||||||
|
*/
|
||||||
|
String EVENT_TYPE_COLUMN = "event_type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp in milliseconds of when this event happened
|
||||||
|
*/
|
||||||
|
String TIMESTAMP_COLUMN = "origination_timestamp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The participant that generated this event
|
||||||
|
*/
|
||||||
|
String SOURCE_PARTICIPANT_ID_COLUMN = "source_participant";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The receiving participant of this event if this was an
|
||||||
|
* {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent} or
|
||||||
|
* {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent}
|
||||||
|
*/
|
||||||
|
String DESTINATION_PARTICIPANT_ID_COLUMN = "destination_participant";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI for the new icon of the group thread if this was an
|
||||||
|
* {@link android.telephony.ims.RcsGroupThreadIconChangedEvent}
|
||||||
|
*/
|
||||||
|
String NEW_ICON_URI_COLUMN = "new_icon_uri";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI for the new name of the group thread if this was an
|
||||||
|
* {@link android.telephony.ims.RcsGroupThreadNameChangedEvent}
|
||||||
|
*/
|
||||||
|
String NEW_NAME_COLUMN = "new_name";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table that {@link android.telephony.ims.RcsParticipantAliasChangedEvent} gets
|
||||||
|
* persisted to
|
||||||
|
*/
|
||||||
|
interface RcsParticipantEventColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsParticipantAliasChangedEvent}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String ALIAS_CHANGE_EVENT_URI_PART = "alias_change_event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The new alias of the participant
|
||||||
|
*/
|
||||||
|
String NEW_ALIAS_COLUMN = "new_alias";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These values are used in {@link com.android.providers.telephony.RcsProvider} to determine
|
||||||
|
* what kind of event is present in the storage.
|
||||||
|
*/
|
||||||
|
interface RcsEventTypes {
|
||||||
|
/**
|
||||||
|
* Integer constant that is stored in the
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} database that denotes the event
|
||||||
|
* is of type {@link android.telephony.ims.RcsParticipantAliasChangedEvent}
|
||||||
|
*/
|
||||||
|
int PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer constant that is stored in the
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} database that denotes the event
|
||||||
|
* is of type {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent}
|
||||||
|
*/
|
||||||
|
int PARTICIPANT_JOINED_EVENT_TYPE = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer constant that is stored in the
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} database that denotes the event
|
||||||
|
* is of type {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent}
|
||||||
|
*/
|
||||||
|
int PARTICIPANT_LEFT_EVENT_TYPE = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer constant that is stored in the
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} database that denotes the event
|
||||||
|
* is of type {@link android.telephony.ims.RcsGroupThreadIconChangedEvent}
|
||||||
|
*/
|
||||||
|
int ICON_CHANGED_EVENT_TYPE = 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer constant that is stored in the
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} database that denotes the event
|
||||||
|
* is of type {@link android.telephony.ims.RcsGroupThreadNameChangedEvent}
|
||||||
|
*/
|
||||||
|
int NAME_CHANGED_EVENT_TYPE = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The view that allows unified querying across all events
|
||||||
|
*/
|
||||||
|
interface RcsUnifiedEventHelper extends RcsParticipantEventColumns, RcsThreadEventColumns {
|
||||||
|
/**
|
||||||
|
* The path that should be used for referring to
|
||||||
|
* {@link android.telephony.ims.RcsEvent}s in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider} URIs.
|
||||||
|
*/
|
||||||
|
String RCS_EVENT_QUERY_URI_PATH = "event";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URI to query {@link android.telephony.ims.RcsEvent}s via the content provider.
|
||||||
|
*/
|
||||||
|
Uri RCS_EVENT_QUERY_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
|
||||||
|
RCS_EVENT_QUERY_URI_PATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains all MMS messages.
|
* Contains all MMS messages.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -15,42 +15,72 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rcs1To1Thread represents a single RCS conversation thread with a total of two
|
* Rcs1To1Thread represents a single RCS conversation thread with a total of two
|
||||||
* {@link RcsParticipant}s.
|
* {@link RcsParticipant}s. Please see Section 5 (1-to-1 Messaging) - GSMA RCC.71 (RCS Universal
|
||||||
* @hide - TODO(sahinc) make this public
|
* Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class Rcs1To1Thread extends RcsThread {
|
public class Rcs1To1Thread extends RcsThread {
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public constructor only for RcsMessageStoreController to initialize new threads.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
public Rcs1To1Thread(int threadId) {
|
public Rcs1To1Thread(int threadId) {
|
||||||
super(threadId);
|
super(threadId);
|
||||||
|
mThreadId = threadId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<Rcs1To1Thread> CREATOR = new Creator<Rcs1To1Thread>() {
|
/**
|
||||||
@Override
|
* @return Returns {@code false} as this is always a 1 to 1 thread.
|
||||||
public Rcs1To1Thread createFromParcel(Parcel in) {
|
*/
|
||||||
return new Rcs1To1Thread(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Rcs1To1Thread[] newArray(int size) {
|
|
||||||
return new Rcs1To1Thread[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected Rcs1To1Thread(Parcel in) {
|
|
||||||
super(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public boolean isGroup() {
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
* {@link Rcs1To1Thread}s can fall back to SMS as a back-up protocol. This function returns the
|
||||||
dest.writeInt(RCS_1_TO_1_TYPE);
|
* thread id to be used to query {@code content://mms-sms/conversation/#} to get the fallback
|
||||||
super.writeToParcel(dest, flags);
|
* thread.
|
||||||
|
*
|
||||||
|
* @return The thread id to be used to query the mms-sms authority
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getFallbackThreadId() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.get1To1ThreadFallbackThreadId(mThreadId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the RCS client allows falling back to SMS, it needs to create an MMS-SMS thread in the
|
||||||
|
* SMS/MMS Provider( see {@link android.provider.Telephony.MmsSms#CONTENT_CONVERSATIONS_URI}.
|
||||||
|
* Use this function to link the {@link Rcs1To1Thread} to the MMS-SMS thread. This function
|
||||||
|
* also updates the storage.
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setFallbackThreadId(long fallbackThreadId) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.set1To1ThreadFallbackThreadId(mThreadId, fallbackThreadId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsParticipant} that receives the messages sent in this thread.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
@WorkerThread
|
||||||
|
public RcsParticipant getRecipient() throws RcsMessageStoreException {
|
||||||
|
return new RcsParticipant(
|
||||||
|
RcsControllerCall.call(iRcs -> iRcs.get1To1ThreadOtherParticipantId(mThreadId)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
64
telephony/java/android/telephony/ims/RcsControllerCall.java
Normal file
64
telephony/java/android/telephony/ims/RcsControllerCall.java
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.telephony.ims.aidl.IRcs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wrapper class around RPC calls that {@link RcsMessageStore} APIs to minimize boilerplate code.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
class RcsControllerCall {
|
||||||
|
static <R> R call(RcsServiceCall<R> serviceCall) throws RcsMessageStoreException {
|
||||||
|
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_RCS_SERVICE));
|
||||||
|
if (iRcs == null) {
|
||||||
|
throw new RcsMessageStoreException("Could not connect to RCS storage service");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return serviceCall.methodOnIRcs(iRcs);
|
||||||
|
} catch (RemoteException exception) {
|
||||||
|
throw new RcsMessageStoreException(exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void callWithNoReturn(RcsServiceCallWithNoReturn serviceCall)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_RCS_SERVICE));
|
||||||
|
if (iRcs == null) {
|
||||||
|
throw new RcsMessageStoreException("Could not connect to RCS storage service");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
serviceCall.methodOnIRcs(iRcs);
|
||||||
|
} catch (RemoteException exception) {
|
||||||
|
throw new RcsMessageStoreException(exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RcsServiceCall<R> {
|
||||||
|
R methodOnIRcs(IRcs iRcs) throws RemoteException;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RcsServiceCallWithNoReturn {
|
||||||
|
void methodOnIRcs(IRcs iRcs) throws RemoteException;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsPart;
|
parcelable RcsEvent;
|
||||||
@@ -13,40 +13,48 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A continuation token to provide for {@link RcsMessageStore#getRcsThreads}. Use this token to
|
* The base class for events that can happen on {@link RcsParticipant}s and {@link RcsThread}s.
|
||||||
* break large queries into manageable chunks
|
* @hide - TODO(109759350) make this public
|
||||||
* @hide - TODO make this public
|
|
||||||
*/
|
*/
|
||||||
public class RcsThreadQueryContinuationToken implements Parcelable {
|
public abstract class RcsEvent implements Parcelable {
|
||||||
protected RcsThreadQueryContinuationToken(Parcel in) {
|
protected long mTimestamp;
|
||||||
|
|
||||||
|
protected RcsEvent(long timestamp) {
|
||||||
|
mTimestamp = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<RcsThreadQueryContinuationToken> CREATOR =
|
/**
|
||||||
new Creator<RcsThreadQueryContinuationToken>() {
|
* @return Returns the time of when this event happened. The timestamp is defined as
|
||||||
@Override
|
* milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
public RcsThreadQueryContinuationToken createFromParcel(Parcel in) {
|
*/
|
||||||
return new RcsThreadQueryContinuationToken(in);
|
public long getTimestamp() {
|
||||||
}
|
return mTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public RcsThreadQueryContinuationToken[] newArray(int size) {
|
* Persists the event to the data store
|
||||||
return new RcsThreadQueryContinuationToken[size];
|
*
|
||||||
}
|
* @hide
|
||||||
};
|
*/
|
||||||
|
abstract void persist() throws RcsMessageStoreException;
|
||||||
|
|
||||||
|
RcsEvent(Parcel in) {
|
||||||
|
mTimestamp = in.readLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeLong(mTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsIncomingMessage;
|
parcelable RcsEventQueryParameters;
|
||||||
@@ -0,0 +1,322 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.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 android.annotation.CheckResult;
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.IntRange;
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parameters to pass into
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} in order to select a
|
||||||
|
* subset of {@link RcsEvent}s present in the message store.
|
||||||
|
*
|
||||||
|
* @hide TODO - make the Builder and builder() public. The rest should stay internal only.
|
||||||
|
*/
|
||||||
|
public class RcsEventQueryParameters implements Parcelable {
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return all types of
|
||||||
|
* {@link RcsEvent}s
|
||||||
|
*/
|
||||||
|
public static final int ALL_EVENTS = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return sub-types of
|
||||||
|
* {@link RcsGroupThreadEvent}s
|
||||||
|
*/
|
||||||
|
public static final int ALL_GROUP_THREAD_EVENTS = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return only
|
||||||
|
* {@link RcsParticipantAliasChangedEvent}s
|
||||||
|
*/
|
||||||
|
public static final int PARTICIPANT_ALIAS_CHANGED_EVENT =
|
||||||
|
PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return only
|
||||||
|
* {@link RcsGroupThreadParticipantJoinedEvent}s
|
||||||
|
*/
|
||||||
|
public static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT =
|
||||||
|
PARTICIPANT_JOINED_EVENT_TYPE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return only
|
||||||
|
* {@link RcsGroupThreadParticipantLeftEvent}s
|
||||||
|
*/
|
||||||
|
public static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT =
|
||||||
|
PARTICIPANT_LEFT_EVENT_TYPE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return only
|
||||||
|
* {@link RcsGroupThreadNameChangedEvent}s
|
||||||
|
*/
|
||||||
|
public static final int GROUP_THREAD_NAME_CHANGED_EVENT = NAME_CHANGED_EVENT_TYPE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setEventType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)} return only
|
||||||
|
* {@link RcsGroupThreadIconChangedEvent}s
|
||||||
|
*/
|
||||||
|
public static final int GROUP_THREAD_ICON_CHANGED_EVENT = ICON_CHANGED_EVENT_TYPE;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({ALL_EVENTS, ALL_GROUP_THREAD_EVENTS, PARTICIPANT_ALIAS_CHANGED_EVENT,
|
||||||
|
GROUP_THREAD_PARTICIPANT_JOINED_EVENT, GROUP_THREAD_PARTICIPANT_LEFT_EVENT,
|
||||||
|
GROUP_THREAD_NAME_CHANGED_EVENT, GROUP_THREAD_ICON_CHANGED_EVENT})
|
||||||
|
public @interface EventType {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setSortProperty(int)} that makes the result set sorted
|
||||||
|
* in the order of creation for faster query results.
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_CREATION_ORDER = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setSortProperty(int)} that makes the result set sorted
|
||||||
|
* with respect to {@link RcsEvent#getTimestamp()}
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_TIMESTAMP = 1;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({SORT_BY_CREATION_ORDER, SORT_BY_TIMESTAMP})
|
||||||
|
public @interface SortingProperty {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The key to pass into a Bundle, for usage in RcsProvider.query(Bundle)
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public static final String EVENT_QUERY_PARAMETERS_KEY = "event_query_parameters";
|
||||||
|
|
||||||
|
// Which types of events the results should be limited to
|
||||||
|
private @EventType int mEventType;
|
||||||
|
// The property which the results should be sorted against
|
||||||
|
private int mSortingProperty;
|
||||||
|
// Whether the results should be sorted in ascending order
|
||||||
|
private boolean mIsAscending;
|
||||||
|
// The number of results that should be returned with this query
|
||||||
|
private int mLimit;
|
||||||
|
// The thread that the results are limited to
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
RcsEventQueryParameters(@EventType int eventType, int threadId,
|
||||||
|
@SortingProperty int sortingProperty, boolean isAscending, int limit) {
|
||||||
|
mEventType = eventType;
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
mLimit = limit;
|
||||||
|
mThreadId = threadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the type of {@link RcsEvent}s that this {@link RcsEventQueryParameters} is
|
||||||
|
* set to query for.
|
||||||
|
*/
|
||||||
|
public @EventType int getEventType() {
|
||||||
|
return mEventType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the type of {@link RcsEvent}s that this {@link RcsEventQueryParameters} is
|
||||||
|
* set to query for.
|
||||||
|
*/
|
||||||
|
public int getLimit() {
|
||||||
|
return mLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the property where the results should be sorted against.
|
||||||
|
* @see SortingProperty
|
||||||
|
*/
|
||||||
|
public int getSortingProperty() {
|
||||||
|
return mSortingProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} if the result set will be sorted in ascending order,
|
||||||
|
* {@code false} if it will be sorted in descending order.
|
||||||
|
*/
|
||||||
|
public boolean getSortDirection() {
|
||||||
|
return mIsAscending;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the ID of the {@link RcsGroupThread} that the results are limited to. As this
|
||||||
|
* API exposes an ID, it should stay hidden.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getThreadId() {
|
||||||
|
return mThreadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class to build the {@link RcsEventQueryParameters}.
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
private @EventType int mEventType;
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
|
private boolean mIsAscending;
|
||||||
|
private int mLimit = 100;
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new builder for {@link RcsEventQueryParameters} to be used in
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)}
|
||||||
|
*/
|
||||||
|
public Builder() {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desired number of events to be returned from the query. Passing in 0 will return all
|
||||||
|
* existing events at once. The limit defaults to 100.
|
||||||
|
*
|
||||||
|
* @param limit The number to limit the query result to.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @throws InvalidParameterException If the given limit is negative.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setResultLimit(@IntRange(from = 0) int limit)
|
||||||
|
throws InvalidParameterException {
|
||||||
|
if (limit < 0) {
|
||||||
|
throw new InvalidParameterException("The query limit must be non-negative");
|
||||||
|
}
|
||||||
|
|
||||||
|
mLimit = limit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the type of events to be returned from the query.
|
||||||
|
*
|
||||||
|
* @param eventType The type of event to be returned.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setEventType(@EventType int eventType) {
|
||||||
|
mEventType = eventType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the property where the results should be sorted against. Defaults to
|
||||||
|
* {@link RcsEventQueryParameters.SortingProperty#SORT_BY_CREATION_ORDER}
|
||||||
|
*
|
||||||
|
* @param sortingProperty against which property the results should be sorted
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortProperty(@SortingProperty int sortingProperty) {
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the results should be sorted ascending or descending
|
||||||
|
*
|
||||||
|
* @param isAscending whether the results should be sorted ascending
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortDirection(boolean isAscending) {
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limits the results to the given {@link RcsGroupThread}. Setting this value prevents
|
||||||
|
* returning any instances of {@link RcsParticipantAliasChangedEvent}.
|
||||||
|
*
|
||||||
|
* @param groupThread The thread to limit the results to.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setGroupThread(@NonNull RcsGroupThread groupThread) {
|
||||||
|
mThreadId = groupThread.getThreadId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the {@link RcsEventQueryParameters} to use in
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)}
|
||||||
|
*
|
||||||
|
* @return An instance of {@link RcsEventQueryParameters} to use with the event query.
|
||||||
|
*/
|
||||||
|
public RcsEventQueryParameters build() {
|
||||||
|
return new RcsEventQueryParameters(mEventType, mThreadId, mSortingProperty,
|
||||||
|
mIsAscending, mLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsEventQueryParameters(Parcel in) {
|
||||||
|
mEventType = in.readInt();
|
||||||
|
mThreadId = in.readInt();
|
||||||
|
mSortingProperty = in.readInt();
|
||||||
|
mIsAscending = in.readBoolean();
|
||||||
|
mLimit = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsEventQueryParameters> CREATOR =
|
||||||
|
new Creator<RcsEventQueryParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsEventQueryParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsEventQueryParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsEventQueryParameters[] newArray(int size) {
|
||||||
|
return new RcsEventQueryParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(mEventType);
|
||||||
|
dest.writeInt(mThreadId);
|
||||||
|
dest.writeInt(mSortingProperty);
|
||||||
|
dest.writeBoolean(mIsAscending);
|
||||||
|
dest.writeInt(mLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsFileTransferPart;
|
parcelable RcsEventQueryResult;
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The result of a {@link RcsMessageStore#getRcsEvents(RcsEventQueryParameters)}
|
||||||
|
* call. This class allows getting the token for querying the next batch of events in order to
|
||||||
|
* prevent handling large amounts of data at once.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class RcsEventQueryResult implements Parcelable {
|
||||||
|
private RcsQueryContinuationToken mContinuationToken;
|
||||||
|
private List<RcsEvent> mEvents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
||||||
|
* to create query results
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsEventQueryResult(
|
||||||
|
RcsQueryContinuationToken continuationToken,
|
||||||
|
List<RcsEvent> events) {
|
||||||
|
mContinuationToken = continuationToken;
|
||||||
|
mEvents = events;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a token to call
|
||||||
|
* {@link RcsMessageStore#getRcsEvents(RcsQueryContinuationToken)}
|
||||||
|
* to get the next batch of {@link RcsEvent}s.
|
||||||
|
*/
|
||||||
|
public RcsQueryContinuationToken getContinuationToken() {
|
||||||
|
return mContinuationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all the {@link RcsEvent}s in the current query result. Call {@link
|
||||||
|
* RcsMessageStore#getRcsEvents(RcsQueryContinuationToken)} to get the next batch
|
||||||
|
* of {@link RcsEvent}s.
|
||||||
|
*/
|
||||||
|
public List<RcsEvent> getEvents() {
|
||||||
|
return mEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsEventQueryResult(Parcel in) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsEventQueryResult> CREATOR = new Creator<RcsEventQueryResult>() {
|
||||||
|
@Override
|
||||||
|
public RcsEventQueryResult createFromParcel(Parcel in) {
|
||||||
|
return new RcsEventQueryResult(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsEventQueryResult[] newArray(int size) {
|
||||||
|
return new RcsEventQueryResult[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeParcelable(mContinuationToken, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsFileTransferCreationParameters;
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.CheckResult;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pass an instance of this class to
|
||||||
|
* {@link RcsMessage#insertFileTransfer(RcsFileTransferCreationParameters)} create an
|
||||||
|
* {@link RcsFileTransferPart} and save it into storage.
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsFileTransferCreationParameters implements Parcelable {
|
||||||
|
private String mRcsFileTransferSessionId;
|
||||||
|
private Uri mContentUri;
|
||||||
|
private String mContentMimeType;
|
||||||
|
private long mFileSize;
|
||||||
|
private long mTransferOffset;
|
||||||
|
private int mWidth;
|
||||||
|
private int mHeight;
|
||||||
|
private long mMediaDuration;
|
||||||
|
private Uri mPreviewUri;
|
||||||
|
private String mPreviewMimeType;
|
||||||
|
private @RcsFileTransferPart.RcsFileTransferStatus int mFileTransferStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the globally unique RCS file transfer session ID for the
|
||||||
|
* {@link RcsFileTransferPart} to be created
|
||||||
|
*/
|
||||||
|
public String getRcsFileTransferSessionId() {
|
||||||
|
return mRcsFileTransferSessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the URI for the content of the {@link RcsFileTransferPart} to be created
|
||||||
|
*/
|
||||||
|
public Uri getContentUri() {
|
||||||
|
return mContentUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the MIME type for the content of the {@link RcsFileTransferPart} to be
|
||||||
|
* created
|
||||||
|
*/
|
||||||
|
public String getContentMimeType() {
|
||||||
|
return mContentMimeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the file size in bytes for the {@link RcsFileTransferPart} to be created
|
||||||
|
*/
|
||||||
|
public long getFileSize() {
|
||||||
|
return mFileSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the transfer offset for the {@link RcsFileTransferPart} to be created. The
|
||||||
|
* file transfer offset is defined as how many bytes have been successfully transferred to the
|
||||||
|
* receiver of this file transfer.
|
||||||
|
*/
|
||||||
|
public long getTransferOffset() {
|
||||||
|
return mTransferOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the width of the {@link RcsFileTransferPart} to be created. The value is in
|
||||||
|
* pixels.
|
||||||
|
*/
|
||||||
|
public int getWidth() {
|
||||||
|
return mWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the height of the {@link RcsFileTransferPart} to be created. The value is in
|
||||||
|
* pixels.
|
||||||
|
*/
|
||||||
|
public int getHeight() {
|
||||||
|
return mHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the duration of the {@link RcsFileTransferPart} to be created.
|
||||||
|
*/
|
||||||
|
public long getMediaDuration() {
|
||||||
|
return mMediaDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the URI of the preview of the content of the {@link RcsFileTransferPart} to
|
||||||
|
* be created. This should only be used for multi-media files.
|
||||||
|
*/
|
||||||
|
public Uri getPreviewUri() {
|
||||||
|
return mPreviewUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the MIME type of the preview of the content of the
|
||||||
|
* {@link RcsFileTransferPart} to be created. This should only be used for multi-media files.
|
||||||
|
*/
|
||||||
|
public String getPreviewMimeType() {
|
||||||
|
return mPreviewMimeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status of the {@link RcsFileTransferPart} to be created.
|
||||||
|
*/
|
||||||
|
public @RcsFileTransferPart.RcsFileTransferStatus int getFileTransferStatus() {
|
||||||
|
return mFileTransferStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
RcsFileTransferCreationParameters(Builder builder) {
|
||||||
|
mRcsFileTransferSessionId = builder.mRcsFileTransferSessionId;
|
||||||
|
mContentUri = builder.mContentUri;
|
||||||
|
mContentMimeType = builder.mContentMimeType;
|
||||||
|
mFileSize = builder.mFileSize;
|
||||||
|
mTransferOffset = builder.mTransferOffset;
|
||||||
|
mWidth = builder.mWidth;
|
||||||
|
mHeight = builder.mHeight;
|
||||||
|
mMediaDuration = builder.mLength;
|
||||||
|
mPreviewUri = builder.mPreviewUri;
|
||||||
|
mPreviewMimeType = builder.mPreviewMimeType;
|
||||||
|
mFileTransferStatus = builder.mFileTransferStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A builder to create instances of {@link RcsFileTransferCreationParameters}
|
||||||
|
*/
|
||||||
|
public class Builder {
|
||||||
|
private String mRcsFileTransferSessionId;
|
||||||
|
private Uri mContentUri;
|
||||||
|
private String mContentMimeType;
|
||||||
|
private long mFileSize;
|
||||||
|
private long mTransferOffset;
|
||||||
|
private int mWidth;
|
||||||
|
private int mHeight;
|
||||||
|
private long mLength;
|
||||||
|
private Uri mPreviewUri;
|
||||||
|
private String mPreviewMimeType;
|
||||||
|
private @RcsFileTransferPart.RcsFileTransferStatus int mFileTransferStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the globally unique RCS file transfer session ID for the {@link RcsFileTransferPart}
|
||||||
|
* to be created
|
||||||
|
*
|
||||||
|
* @param sessionId The RCS file transfer session ID
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setFileTransferSessionId(String sessionId) {
|
||||||
|
mRcsFileTransferSessionId = sessionId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the URI for the content of the {@link RcsFileTransferPart} to be created
|
||||||
|
*
|
||||||
|
* @param contentUri The URI for the file
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setContentUri(Uri contentUri) {
|
||||||
|
mContentUri = contentUri;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the MIME type for the content of the {@link RcsFileTransferPart} to be created
|
||||||
|
*
|
||||||
|
* @param contentType The MIME type of the file
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setContentMimeType(String contentType) {
|
||||||
|
mContentMimeType = contentType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the file size for the {@link RcsFileTransferPart} to be created
|
||||||
|
*
|
||||||
|
* @param size The size of the file in bytes
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setFileSize(long size) {
|
||||||
|
mFileSize = size;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the transfer offset for the {@link RcsFileTransferPart} to be created. The file
|
||||||
|
* transfer offset is defined as how many bytes have been successfully transferred to the
|
||||||
|
* receiver of this file transfer.
|
||||||
|
*
|
||||||
|
* @param offset The transfer offset in bytes
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setTransferOffset(long offset) {
|
||||||
|
mTransferOffset = offset;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the width of the {@link RcsFileTransferPart} to be created. This should only be used
|
||||||
|
* for multi-media files.
|
||||||
|
*
|
||||||
|
* @param width The width of the multi-media file in pixels.
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setWidth(int width) {
|
||||||
|
mWidth = width;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the height of the {@link RcsFileTransferPart} to be created. This should only be
|
||||||
|
* used for multi-media files.
|
||||||
|
*
|
||||||
|
* @param height The height of the multi-media file in pixels.
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setHeight(int height) {
|
||||||
|
mHeight = height;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the length of the {@link RcsFileTransferPart} to be created. This should only be
|
||||||
|
* used for multi-media files such as audio or video.
|
||||||
|
*
|
||||||
|
* @param length The length of the multi-media file in milliseconds
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setMediaDuration(long length) {
|
||||||
|
mLength = length;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the URI of the preview of the content of the {@link RcsFileTransferPart} to be
|
||||||
|
* created. This should only be used for multi-media files.
|
||||||
|
*
|
||||||
|
* @param previewUri The URI of the preview of the file transfer
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setPreviewUri(Uri previewUri) {
|
||||||
|
mPreviewUri = previewUri;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the MIME type of the preview of the content of the {@link RcsFileTransferPart} to
|
||||||
|
* be created. This should only be used for multi-media files.
|
||||||
|
*
|
||||||
|
* @param previewType The MIME type of the preview of the file transfer
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setPreviewMimeType(String previewType) {
|
||||||
|
mPreviewMimeType = previewType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of the {@link RcsFileTransferPart} to be created.
|
||||||
|
*
|
||||||
|
* @param status The status of the file transfer
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setFileTransferStatus(
|
||||||
|
@RcsFileTransferPart.RcsFileTransferStatus int status) {
|
||||||
|
mFileTransferStatus = status;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of {@link RcsFileTransferCreationParameters} with the given
|
||||||
|
* parameters.
|
||||||
|
*
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#insertFileTransfer(RcsFileTransferCreationParameters)
|
||||||
|
*/
|
||||||
|
public RcsFileTransferCreationParameters build() {
|
||||||
|
return new RcsFileTransferCreationParameters(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsFileTransferCreationParameters(Parcel in) {
|
||||||
|
mRcsFileTransferSessionId = in.readString();
|
||||||
|
mContentUri = in.readParcelable(Uri.class.getClassLoader());
|
||||||
|
mContentMimeType = in.readString();
|
||||||
|
mFileSize = in.readLong();
|
||||||
|
mTransferOffset = in.readLong();
|
||||||
|
mWidth = in.readInt();
|
||||||
|
mHeight = in.readInt();
|
||||||
|
mMediaDuration = in.readLong();
|
||||||
|
mPreviewUri = in.readParcelable(Uri.class.getClassLoader());
|
||||||
|
mPreviewMimeType = in.readString();
|
||||||
|
mFileTransferStatus = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsFileTransferCreationParameters> CREATOR =
|
||||||
|
new Creator<RcsFileTransferCreationParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsFileTransferCreationParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsFileTransferCreationParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsFileTransferCreationParameters[] newArray(int size) {
|
||||||
|
return new RcsFileTransferCreationParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeString(mRcsFileTransferSessionId);
|
||||||
|
dest.writeParcelable(mContentUri, flags);
|
||||||
|
dest.writeString(mContentMimeType);
|
||||||
|
dest.writeLong(mFileSize);
|
||||||
|
dest.writeLong(mTransferOffset);
|
||||||
|
dest.writeInt(mWidth);
|
||||||
|
dest.writeInt(mHeight);
|
||||||
|
dest.writeLong(mMediaDuration);
|
||||||
|
dest.writeParcelable(mPreviewUri, flags);
|
||||||
|
dest.writeString(mPreviewMimeType);
|
||||||
|
dest.writeInt(mFileTransferStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,34 +15,346 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A part of a composite {@link RcsMessage} that holds a file transfer.
|
* A part of a composite {@link RcsMessage} that holds a file transfer. Please see Section 7
|
||||||
* @hide - TODO(sahinc) make this public
|
* (File Transfer) - GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsFileTransferPart extends RcsPart {
|
public class RcsFileTransferPart {
|
||||||
public static final Creator<RcsFileTransferPart> CREATOR = new Creator<RcsFileTransferPart>() {
|
/**
|
||||||
@Override
|
* The status to indicate that this {@link RcsFileTransferPart} is not set yet.
|
||||||
public RcsFileTransferPart createFromParcel(Parcel in) {
|
*/
|
||||||
return new RcsFileTransferPart(in);
|
public static final int NOT_SET = 0;
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public RcsFileTransferPart[] newArray(int size) {
|
* The status to indicate that this {@link RcsFileTransferPart} is a draft and is not in the
|
||||||
return new RcsFileTransferPart[size];
|
* process of sending yet.
|
||||||
}
|
*/
|
||||||
};
|
public static final int DRAFT = 1;
|
||||||
|
|
||||||
protected RcsFileTransferPart(Parcel in) {
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} is actively being sent right
|
||||||
|
* now.
|
||||||
|
*/
|
||||||
|
public static final int SENDING = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} was being sent, but the user has
|
||||||
|
* paused the sending process.
|
||||||
|
*/
|
||||||
|
public static final int SENDING_PAUSED = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} was attempted, but failed to
|
||||||
|
* send.
|
||||||
|
*/
|
||||||
|
public static final int SENDING_FAILED = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} is permanently cancelled to
|
||||||
|
* send.
|
||||||
|
*/
|
||||||
|
public static final int SENDING_CANCELLED = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} is actively being downloaded
|
||||||
|
* right now.
|
||||||
|
*/
|
||||||
|
public static final int DOWNLOADING = 6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} was being downloaded, but the
|
||||||
|
* user paused the downloading process.
|
||||||
|
*/
|
||||||
|
public static final int DOWNLOADING_PAUSED = 7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} was attempted, but failed to
|
||||||
|
* download.
|
||||||
|
*/
|
||||||
|
public static final int DOWNLOADING_FAILED = 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} is permanently cancelled to
|
||||||
|
* download.
|
||||||
|
*/
|
||||||
|
public static final int DOWNLOADING_CANCELLED = 9;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsFileTransferPart} was successfully sent or
|
||||||
|
* received.
|
||||||
|
*/
|
||||||
|
public static final int SUCCEEDED = 10;
|
||||||
|
|
||||||
|
@IntDef({
|
||||||
|
DRAFT, SENDING, SENDING_PAUSED, SENDING_FAILED, SENDING_CANCELLED, DOWNLOADING,
|
||||||
|
DOWNLOADING_PAUSED, DOWNLOADING_FAILED, DOWNLOADING_CANCELLED, SUCCEEDED
|
||||||
|
})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface RcsFileTransferStatus {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private int mId;
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
RcsFileTransferPart(int id) {
|
||||||
|
mId = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
* @hide
|
||||||
|
*/
|
||||||
|
public void setId(int id) {
|
||||||
|
mId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getId() {
|
||||||
|
return mId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the RCS file transfer session ID for this file transfer and persists into storage.
|
||||||
|
*
|
||||||
|
* @param sessionId The session ID to be used for this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setFileTransferSessionId(String sessionId) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferSessionId(mId, sessionId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the file transfer session ID.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public String getFileTransferSessionId() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferSessionId(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the content URI for this file transfer and persists into storage. The file transfer
|
||||||
|
* should be reachable using this URI.
|
||||||
|
*
|
||||||
|
* @param contentUri The URI for this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setContentUri(Uri contentUri) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferContentUri(mId, contentUri));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the URI for this file transfer
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public Uri getContentUri() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferContentUri(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the MIME type of this file transfer and persists into storage. Whether this type
|
||||||
|
* actually matches any known or supported types is not checked.
|
||||||
|
*
|
||||||
|
* @param contentMimeType The type of this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setContentMimeType(String contentMimeType) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setFileTransferContentType(mId, contentMimeType));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the content type of this file transfer
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@Nullable
|
||||||
|
public String getContentMimeType() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferContentType(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the content length (i.e. file size) for this file transfer and persists into storage.
|
||||||
|
*
|
||||||
|
* @param contentLength The content length of this file transfer
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setFileSize(long contentLength) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setFileTransferFileSize(mId, contentLength));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the content length (i.e. file size) for this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getFileSize() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferFileSize(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the transfer offset for this file transfer and persists into storage. The file transfer
|
||||||
|
* offset is defined as how many bytes have been successfully transferred to the receiver of
|
||||||
|
* this file transfer.
|
||||||
|
*
|
||||||
|
* @param transferOffset The transfer offset for this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setTransferOffset(long transferOffset) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setFileTransferTransferOffset(mId, transferOffset));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the number of bytes that have successfully transferred.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getTransferOffset() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferTransferOffset(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status for this file transfer and persists into storage.
|
||||||
|
*
|
||||||
|
* @param status The status of this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setFileTransferStatus(@RcsFileTransferStatus int status)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferStatus(mId, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status of this file transfer.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public @RcsFileTransferStatus int getFileTransferStatus() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferStatus(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the width of this multi-media message part in pixels.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public int getWidth() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferWidth(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the width of this RCS multi-media message part and persists into storage.
|
||||||
|
*
|
||||||
|
* @param width The width value in pixels
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setWidth(int width) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferWidth(mId, width));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the height of this multi-media message part in pixels.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public int getHeight() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferHeight(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the height of this RCS multi-media message part and persists into storage.
|
||||||
|
*
|
||||||
|
* @param height The height value in pixels
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setHeight(int height) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferHeight(mId, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the length of this multi-media file (e.g. video or audio) in milliseconds.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getLength() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferLength(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the length of this multi-media file (e.g. video or audio) and persists into storage.
|
||||||
|
*
|
||||||
|
* @param length The length of the file in milliseconds.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setLength(long length) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferLength(mId, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the URI for the preview of this multi-media file (e.g. an image thumbnail for
|
||||||
|
* a video)
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public Uri getPreviewUri() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferPreviewUri(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the URI for the preview of this multi-media file and persists into storage.
|
||||||
|
*
|
||||||
|
* @param previewUri The URI to access to the preview file.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setPreviewUri(Uri previewUri) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setFileTransferPreviewUri(mId, previewUri));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the MIME type of this multi-media file's preview.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public String getPreviewMimeType() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getFileTransferPreviewType(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the MIME type for this multi-media file's preview and persists into storage.
|
||||||
|
*
|
||||||
|
* @param previewMimeType The MIME type for the preview
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setPreviewMimeType(String previewMimeType) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setFileTransferPreviewType(mId, previewMimeType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,38 +15,191 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RcsGroupThread represents a single RCS conversation thread where {@link RcsParticipant}s can join
|
* RcsGroupThread represents a single RCS conversation thread where {@link RcsParticipant}s can join
|
||||||
* or leave.
|
* or leave. Please see Section 6 (Group Chat) - GSMA RCC.71 (RCS Universal Profile Service
|
||||||
|
* Definition Document)
|
||||||
|
*
|
||||||
* @hide - TODO(sahinc) make this public
|
* @hide - TODO(sahinc) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsGroupThread extends RcsThread {
|
public class RcsGroupThread extends RcsThread {
|
||||||
public static final Creator<RcsGroupThread> CREATOR = new Creator<RcsGroupThread>() {
|
/**
|
||||||
@Override
|
* Public constructor only for RcsMessageStoreController to initialize new threads.
|
||||||
public RcsGroupThread createFromParcel(Parcel in) {
|
*
|
||||||
return new RcsGroupThread(in);
|
* @hide
|
||||||
}
|
*/
|
||||||
|
public RcsGroupThread(int threadId) {
|
||||||
@Override
|
super(threadId);
|
||||||
public RcsGroupThread[] newArray(int size) {
|
|
||||||
return new RcsGroupThread[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsGroupThread(Parcel in) {
|
|
||||||
super(in);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} as this is always a group thread
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public boolean isGroup() {
|
||||||
return 0;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
* @return Returns the given name of this {@link RcsGroupThread}. Please see US6-2 - GSMA RCC.71
|
||||||
dest.writeInt(RCS_GROUP_TYPE);
|
* (RCS Universal Profile Service Definition Document)
|
||||||
super.writeToParcel(dest, flags);
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public String getGroupName() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getGroupThreadName(mThreadId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the name of this {@link RcsGroupThread} and saves it into storage. Please see US6-2 -
|
||||||
|
* GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setGroupName(String groupName) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setGroupThreadName(mThreadId, groupName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns a URI that points to the group's icon {@link RcsGroupThread}. Please see
|
||||||
|
* US6-2 - GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public Uri getGroupIcon() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getGroupThreadIcon(mThreadId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the icon for this {@link RcsGroupThread} and saves it into storage. Please see US6-2 -
|
||||||
|
* GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setGroupIcon(@Nullable Uri groupIcon) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setGroupThreadIcon(mThreadId, groupIcon));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the owner of this thread or {@code null} if there doesn't exist an owner
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public RcsParticipant getOwner() throws RcsMessageStoreException {
|
||||||
|
return new RcsParticipant(RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getGroupThreadOwner(mThreadId)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the owner of this {@link RcsGroupThread} and saves it into storage. This is intended to
|
||||||
|
* be used for selecting a new owner for a group thread if the owner leaves the thread. The
|
||||||
|
* owner needs to be in the list of existing participants.
|
||||||
|
*
|
||||||
|
* @param participant The new owner of the thread. {@code null} values are allowed.
|
||||||
|
* @throws RcsMessageStoreException if the operation could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setOwner(@Nullable RcsParticipant participant) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setGroupThreadOwner(mThreadId, participant.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new {@link RcsParticipant} to this group thread and persists into storage. If the user
|
||||||
|
* is actively participating in this {@link RcsGroupThread}, an {@link RcsParticipant} on behalf
|
||||||
|
* of them should be added.
|
||||||
|
*
|
||||||
|
* @param participant The new participant to be added to the thread.
|
||||||
|
* @throws RcsMessageStoreException if the operation could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void addParticipant(@NonNull RcsParticipant participant)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
if (participant == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.addParticipantToGroupThread(mThreadId, participant.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an {@link RcsParticipant} from this group thread and persists into storage. If the
|
||||||
|
* removed participant was the owner of this group, the owner will become null.
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the operation could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void removeParticipant(@NonNull RcsParticipant participant)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
if (participant == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.removeParticipantFromGroupThread(mThreadId, participant.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the set of {@link RcsParticipant}s that contribute to this group thread. The
|
||||||
|
* returned set does not support modifications, please use
|
||||||
|
* {@link RcsGroupThread#addParticipant(RcsParticipant)}
|
||||||
|
* and {@link RcsGroupThread#removeParticipant(RcsParticipant)} instead.
|
||||||
|
*
|
||||||
|
* @return the immutable set of {@link RcsParticipant} in this group thread.
|
||||||
|
* @throws RcsMessageStoreException if the values could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public Set<RcsParticipant> getParticipants() throws RcsMessageStoreException {
|
||||||
|
RcsParticipantQueryParameters queryParameters =
|
||||||
|
new RcsParticipantQueryParameters.Builder().setThread(this).build();
|
||||||
|
|
||||||
|
RcsParticipantQueryResult queryResult = RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getParticipants(queryParameters));
|
||||||
|
|
||||||
|
List<RcsParticipant> participantList = queryResult.getParticipants();
|
||||||
|
Set<RcsParticipant> participantSet = new LinkedHashSet<>(participantList);
|
||||||
|
return Collections.unmodifiableSet(participantSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the conference URI for this {@link RcsGroupThread}. Please see 4.4.5.2 - GSMA RCC.53
|
||||||
|
* (RCS Device API 1.6 Specification
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public Uri getConferenceUri() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getGroupThreadConferenceUri(mThreadId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the conference URI for this {@link RcsGroupThread} and persists into storage. Please see
|
||||||
|
* 4.4.5.2 - GSMA RCC.53 (RCS Device API 1.6 Specification
|
||||||
|
*
|
||||||
|
* @param conferenceUri The URI as String to be used as the conference URI.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public void setConferenceUri(Uri conferenceUri) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setGroupThreadConferenceUri(mThreadId, conferenceUri));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
*
|
|
||||||
* Copyright 2019, The Android Open Source Project
|
* Copyright 2019, The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -17,4 +16,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsLocationPart;
|
parcelable RcsGroupThreadEvent;
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An event that happened on an {@link RcsGroupThread}.
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public abstract class RcsGroupThreadEvent extends RcsEvent {
|
||||||
|
private final int mRcsGroupThreadId;
|
||||||
|
private final int mOriginatingParticipantId;
|
||||||
|
|
||||||
|
RcsGroupThreadEvent(long timestamp, int rcsGroupThreadId,
|
||||||
|
int originatingParticipantId) {
|
||||||
|
super(timestamp);
|
||||||
|
mRcsGroupThreadId = rcsGroupThreadId;
|
||||||
|
mOriginatingParticipantId = originatingParticipantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsGroupThread} that this event happened on.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsGroupThread getRcsGroupThread() {
|
||||||
|
return new RcsGroupThread(mRcsGroupThreadId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsParticipant} that performed the event.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipant getOriginatingParticipant() {
|
||||||
|
return new RcsParticipant(mOriginatingParticipantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
RcsGroupThreadEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mRcsGroupThreadId = in.readInt();
|
||||||
|
mOriginatingParticipantId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeInt(mRcsGroupThreadId);
|
||||||
|
dest.writeInt(mOriginatingParticipantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsGroupThreadIconChangedEvent;
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An event that indicates an {@link RcsGroupThread}'s icon was changed. Please see R6-2-5 - GSMA
|
||||||
|
* RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsGroupThreadIconChangedEvent extends RcsGroupThreadEvent {
|
||||||
|
private final Uri mNewIcon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link RcsGroupThreadIconChangedEvent}. This event is not persisted into
|
||||||
|
* storage until {@link RcsMessageStore#persistRcsEvent(RcsEvent)} is called.
|
||||||
|
*
|
||||||
|
* @param timestamp The timestamp of when this event happened, in milliseconds passed after
|
||||||
|
* midnight, January 1st, 1970 UTC
|
||||||
|
* @param rcsGroupThread The {@link RcsGroupThread} that this event happened on
|
||||||
|
* @param originatingParticipant The {@link RcsParticipant} that changed the
|
||||||
|
* {@link RcsGroupThread}'s icon.
|
||||||
|
* @param newIcon {@link Uri} to the new icon of this {@link RcsGroupThread}
|
||||||
|
* @see RcsMessageStore#persistRcsEvent(RcsEvent)
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadIconChangedEvent(long timestamp, @NonNull RcsGroupThread rcsGroupThread,
|
||||||
|
@NonNull RcsParticipant originatingParticipant, @Nullable Uri newIcon) {
|
||||||
|
super(timestamp, rcsGroupThread.getThreadId(), originatingParticipant.getId());
|
||||||
|
mNewIcon = newIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - internal constructor for queries
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadIconChangedEvent(long timestamp, int rcsGroupThreadId,
|
||||||
|
int originatingParticipantId, @Nullable Uri newIcon) {
|
||||||
|
super(timestamp, rcsGroupThreadId, originatingParticipantId);
|
||||||
|
mNewIcon = newIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link Uri} to the icon of the {@link RcsGroupThread} after this
|
||||||
|
* {@link RcsGroupThreadIconChangedEvent} occured.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public Uri getNewIcon() {
|
||||||
|
return mNewIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persists the event to the data store.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void persist() throws RcsMessageStoreException {
|
||||||
|
// TODO ensure failure throws
|
||||||
|
RcsControllerCall.call(iRcs -> iRcs.createGroupThreadIconChangedEvent(
|
||||||
|
getTimestamp(), getRcsGroupThread().getThreadId(),
|
||||||
|
getOriginatingParticipant().getId(), mNewIcon));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsGroupThreadIconChangedEvent> CREATOR =
|
||||||
|
new Creator<RcsGroupThreadIconChangedEvent>() {
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadIconChangedEvent createFromParcel(Parcel in) {
|
||||||
|
return new RcsGroupThreadIconChangedEvent(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadIconChangedEvent[] newArray(int size) {
|
||||||
|
return new RcsGroupThreadIconChangedEvent[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected RcsGroupThreadIconChangedEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mNewIcon = in.readParcelable(Uri.class.getClassLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeParcelable(mNewIcon, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsGroupThreadNameChangedEvent;
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An event that indicates an {@link RcsGroupThread}'s name was changed. Please see R6-2-5 - GSMA
|
||||||
|
* RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsGroupThreadNameChangedEvent extends RcsGroupThreadEvent {
|
||||||
|
private String mNewName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link RcsGroupThreadNameChangedEvent}. This event is not persisted into
|
||||||
|
* storage until {@link RcsMessageStore#persistRcsEvent(RcsEvent)} is called.
|
||||||
|
*
|
||||||
|
* @param timestamp The timestamp of when this event happened, in milliseconds passed after
|
||||||
|
* midnight, January 1st, 1970 UTC
|
||||||
|
* @param rcsGroupThread The {@link RcsGroupThread} that this event happened on
|
||||||
|
* @param originatingParticipant The {@link RcsParticipant} that changed the
|
||||||
|
* {@link RcsGroupThread}'s icon.
|
||||||
|
* @param newName The new name of the {@link RcsGroupThread}
|
||||||
|
* @see RcsMessageStore#persistRcsEvent(RcsEvent)
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadNameChangedEvent(long timestamp, @NonNull RcsGroupThread rcsGroupThread,
|
||||||
|
@NonNull RcsParticipant originatingParticipant, @Nullable String newName) {
|
||||||
|
super(timestamp, rcsGroupThread.getThreadId(), originatingParticipant.getId());
|
||||||
|
mNewName = newName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - internal constructor for queries
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadNameChangedEvent(long timestamp, int rcsGroupThreadId,
|
||||||
|
int originatingParticipantId, @Nullable String newName) {
|
||||||
|
super(timestamp, rcsGroupThreadId, originatingParticipantId);
|
||||||
|
mNewName = newName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the name of this {@link RcsGroupThread} after this
|
||||||
|
* {@link RcsGroupThreadNameChangedEvent} happened.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getNewName() {
|
||||||
|
return mNewName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persists the event to the data store.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void persist() throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.call(iRcs -> iRcs.createGroupThreadNameChangedEvent(
|
||||||
|
getTimestamp(), getRcsGroupThread().getThreadId(),
|
||||||
|
getOriginatingParticipant().getId(), mNewName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsGroupThreadNameChangedEvent> CREATOR =
|
||||||
|
new Creator<RcsGroupThreadNameChangedEvent>() {
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadNameChangedEvent createFromParcel(Parcel in) {
|
||||||
|
return new RcsGroupThreadNameChangedEvent(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadNameChangedEvent[] newArray(int size) {
|
||||||
|
return new RcsGroupThreadNameChangedEvent[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected RcsGroupThreadNameChangedEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mNewName = in.readString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeString(mNewName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsGroupThreadParticipantJoinedEvent;
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An event that indicates an RCS participant has joined an {@link RcsThread}. Please see US6-3 -
|
||||||
|
* GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsGroupThreadParticipantJoinedEvent extends RcsGroupThreadEvent {
|
||||||
|
private int mJoinedParticipantId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link RcsGroupThreadParticipantJoinedEvent}. This event is not persisted into
|
||||||
|
* storage until {@link RcsMessageStore#persistRcsEvent(RcsEvent)} is called.
|
||||||
|
*
|
||||||
|
* @param timestamp The timestamp of when this event happened, in milliseconds passed after
|
||||||
|
* midnight, January 1st, 1970 UTC
|
||||||
|
* @param rcsGroupThread The {@link RcsGroupThread} that this event happened on
|
||||||
|
* @param originatingParticipant The {@link RcsParticipant} that added or invited the new
|
||||||
|
* {@link RcsParticipant} into the {@link RcsGroupThread}
|
||||||
|
* @param joinedParticipant The new {@link RcsParticipant} that joined the
|
||||||
|
* {@link RcsGroupThread}
|
||||||
|
* @see RcsMessageStore#persistRcsEvent(RcsEvent)
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadParticipantJoinedEvent(long timestamp,
|
||||||
|
@NonNull RcsGroupThread rcsGroupThread, @NonNull RcsParticipant originatingParticipant,
|
||||||
|
@NonNull RcsParticipant joinedParticipant) {
|
||||||
|
super(timestamp, rcsGroupThread.getThreadId(), originatingParticipant.getId());
|
||||||
|
mJoinedParticipantId = joinedParticipant.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - internal constructor for queries
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadParticipantJoinedEvent(long timestamp, int rcsGroupThreadId,
|
||||||
|
int originatingParticipantId, int joinedParticipantId) {
|
||||||
|
super(timestamp, rcsGroupThreadId, originatingParticipantId);
|
||||||
|
mJoinedParticipantId = joinedParticipantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsParticipant} that joined the associated {@link RcsGroupThread}
|
||||||
|
*/
|
||||||
|
public RcsParticipant getJoinedParticipant() {
|
||||||
|
return new RcsParticipant(mJoinedParticipantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persists the event to the data store.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void persist() throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.createGroupThreadParticipantJoinedEvent(getTimestamp(),
|
||||||
|
getRcsGroupThread().getThreadId(), getOriginatingParticipant().getId(),
|
||||||
|
getJoinedParticipant().getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsGroupThreadParticipantJoinedEvent> CREATOR =
|
||||||
|
new Creator<RcsGroupThreadParticipantJoinedEvent>() {
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadParticipantJoinedEvent createFromParcel(Parcel in) {
|
||||||
|
return new RcsGroupThreadParticipantJoinedEvent(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadParticipantJoinedEvent[] newArray(int size) {
|
||||||
|
return new RcsGroupThreadParticipantJoinedEvent[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected RcsGroupThreadParticipantJoinedEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mJoinedParticipantId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeInt(mJoinedParticipantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsMessage;
|
parcelable RcsGroupThreadParticipantLeftEvent;
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An event that indicates an RCS participant has left an {@link RcsThread}. Please see US6-23 -
|
||||||
|
* GSMA RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsGroupThreadParticipantLeftEvent extends RcsGroupThreadEvent {
|
||||||
|
private int mLeavingParticipantId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link RcsGroupThreadParticipantLeftEvent}. his event is not persisted into
|
||||||
|
* storage until {@link RcsMessageStore#persistRcsEvent(RcsEvent)} is called.
|
||||||
|
*
|
||||||
|
* @param timestamp The timestamp of when this event happened, in milliseconds passed after
|
||||||
|
* midnight, January 1st, 1970 UTC
|
||||||
|
* @param rcsGroupThread The {@link RcsGroupThread} that this event happened on
|
||||||
|
* @param originatingParticipant The {@link RcsParticipant} that removed the
|
||||||
|
* {@link RcsParticipant} from the {@link RcsGroupThread}. It is
|
||||||
|
* possible that originatingParticipant and leavingParticipant are
|
||||||
|
* the same (i.e. {@link RcsParticipant} left the group
|
||||||
|
* themselves)
|
||||||
|
* @param leavingParticipant The {@link RcsParticipant} that left the {@link RcsGroupThread}
|
||||||
|
* @see RcsMessageStore#persistRcsEvent(RcsEvent)
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadParticipantLeftEvent(long timestamp,
|
||||||
|
@NonNull RcsGroupThread rcsGroupThread, @NonNull RcsParticipant originatingParticipant,
|
||||||
|
@NonNull RcsParticipant leavingParticipant) {
|
||||||
|
super(timestamp, rcsGroupThread.getThreadId(), originatingParticipant.getId());
|
||||||
|
mLeavingParticipantId = leavingParticipant.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - internal constructor for queries
|
||||||
|
*/
|
||||||
|
public RcsGroupThreadParticipantLeftEvent(long timestamp, int rcsGroupThreadId,
|
||||||
|
int originatingParticipantId, int leavingParticipantId) {
|
||||||
|
super(timestamp, rcsGroupThreadId, originatingParticipantId);
|
||||||
|
mLeavingParticipantId = leavingParticipantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsParticipant} that left the associated {@link RcsGroupThread}
|
||||||
|
* after this {@link RcsGroupThreadParticipantLeftEvent} happened.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipant getLeavingParticipantId() {
|
||||||
|
return new RcsParticipant(mLeavingParticipantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void persist() throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.createGroupThreadParticipantJoinedEvent(getTimestamp(),
|
||||||
|
getRcsGroupThread().getThreadId(), getOriginatingParticipant().getId(),
|
||||||
|
getLeavingParticipantId().getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsGroupThreadParticipantLeftEvent> CREATOR =
|
||||||
|
new Creator<RcsGroupThreadParticipantLeftEvent>() {
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadParticipantLeftEvent createFromParcel(Parcel in) {
|
||||||
|
return new RcsGroupThreadParticipantLeftEvent(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsGroupThreadParticipantLeftEvent[] newArray(int size) {
|
||||||
|
return new RcsGroupThreadParticipantLeftEvent[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected RcsGroupThreadParticipantLeftEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mLeavingParticipantId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeInt(mLeavingParticipantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,34 +15,82 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a single instance of a message received over RCS.
|
* This is a single instance of a message received over RCS.
|
||||||
* @hide - TODO(sahinc) make this public
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsIncomingMessage extends RcsMessage {
|
public class RcsIncomingMessage extends RcsMessage {
|
||||||
public static final Creator<RcsIncomingMessage> CREATOR = new Creator<RcsIncomingMessage>() {
|
/**
|
||||||
@Override
|
* @hide
|
||||||
public RcsIncomingMessage createFromParcel(Parcel in) {
|
*/
|
||||||
return new RcsIncomingMessage(in);
|
RcsIncomingMessage(int id) {
|
||||||
}
|
super(id);
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsIncomingMessage[] newArray(int size) {
|
|
||||||
return new RcsIncomingMessage[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsIncomingMessage(Parcel in) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public int describeContents() {
|
* Sets the timestamp of arrival for this message and persists into storage. The timestamp is
|
||||||
return 0;
|
* defined as milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
*
|
||||||
|
* @param arrivalTimestamp The timestamp to set to.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setArrivalTimestamp(long arrivalTimestamp) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setMessageArrivalTimestamp(mId, true, arrivalTimestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the timestamp of arrival for this message. The timestamp is defined as
|
||||||
|
* milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getArrivalTimestamp() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessageArrivalTimestamp(mId, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the timestamp of when the user saw this message and persists into storage. The timestamp
|
||||||
|
* is defined as milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
*
|
||||||
|
* @param notifiedTimestamp The timestamp to set to.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setSeenTimestamp(long notifiedTimestamp) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setMessageSeenTimestamp(mId, true, notifiedTimestamp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the timestamp of when the user saw this message. The timestamp is defined as
|
||||||
|
* milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getSeenTimestamp() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessageSeenTimestamp(mId, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the sender of this incoming message.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public RcsParticipant getSenderParticipant() throws RcsMessageStoreException {
|
||||||
|
return new RcsParticipant(
|
||||||
|
RcsControllerCall.call(iRcs -> iRcs.getSenderParticipant(mId)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} as this is an incoming message
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public boolean isIncoming() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsIncomingMessageCreationParameters;
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.CheckResult;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link RcsIncomingMessageCreationParameters} is a collection of parameters that should be passed
|
||||||
|
* into {@link RcsThread#addIncomingMessage(RcsIncomingMessageCreationParameters)} to generate an
|
||||||
|
* {@link RcsIncomingMessage} on that {@link RcsThread}
|
||||||
|
*
|
||||||
|
* @hide TODO:make public
|
||||||
|
*/
|
||||||
|
public class RcsIncomingMessageCreationParameters extends RcsMessageCreationParameters implements
|
||||||
|
Parcelable {
|
||||||
|
// The arrival timestamp for the RcsIncomingMessage to be created
|
||||||
|
private final long mArrivalTimestamp;
|
||||||
|
// The seen timestamp for the RcsIncomingMessage to be created
|
||||||
|
private final long mSeenTimestamp;
|
||||||
|
// The participant that sent this incoming message
|
||||||
|
private final int mSenderParticipantId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder to help create an {@link RcsIncomingMessageCreationParameters}
|
||||||
|
*
|
||||||
|
* @see RcsThread#addIncomingMessage(RcsIncomingMessageCreationParameters)
|
||||||
|
*/
|
||||||
|
public static class Builder extends RcsMessageCreationParameters.Builder {
|
||||||
|
private RcsParticipant mSenderParticipant;
|
||||||
|
private long mArrivalTimestamp;
|
||||||
|
private long mSeenTimestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link Builder} to create an instance of
|
||||||
|
* {@link RcsIncomingMessageCreationParameters}
|
||||||
|
*
|
||||||
|
* @param originationTimestamp The timestamp of {@link RcsMessage} creation. The origination
|
||||||
|
* timestamp value in milliseconds passed after midnight,
|
||||||
|
* January 1, 1970 UTC
|
||||||
|
* @param arrivalTimestamp The timestamp of arrival, defined as milliseconds passed after
|
||||||
|
* midnight, January 1, 1970 UTC
|
||||||
|
* @param subscriptionId The subscription ID that was used to send or receive this
|
||||||
|
* {@link RcsMessage}
|
||||||
|
*/
|
||||||
|
public Builder(long originationTimestamp, long arrivalTimestamp, int subscriptionId) {
|
||||||
|
super(originationTimestamp, subscriptionId);
|
||||||
|
mArrivalTimestamp = arrivalTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link RcsParticipant} that send this {@link RcsIncomingMessage}
|
||||||
|
*
|
||||||
|
* @param senderParticipant The {@link RcsParticipant} that sent this
|
||||||
|
* {@link RcsIncomingMessage}
|
||||||
|
* @return The same instance of {@link Builder} to chain methods.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSenderParticipant(RcsParticipant senderParticipant) {
|
||||||
|
mSenderParticipant = senderParticipant;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the time of the arrival of this {@link RcsIncomingMessage}
|
||||||
|
|
||||||
|
* @return The same instance of {@link Builder} to chain methods.
|
||||||
|
* @see RcsIncomingMessage#setArrivalTimestamp(long)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setArrivalTimestamp(long arrivalTimestamp) {
|
||||||
|
mArrivalTimestamp = arrivalTimestamp;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the time of the when this user saw the {@link RcsIncomingMessage}
|
||||||
|
* @param seenTimestamp The seen timestamp , defined as milliseconds passed after midnight,
|
||||||
|
* January 1, 1970 UTC
|
||||||
|
* @return The same instance of {@link Builder} to chain methods.
|
||||||
|
* @see RcsIncomingMessage#setSeenTimestamp(long)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSeenTimestamp(long seenTimestamp) {
|
||||||
|
mSeenTimestamp = seenTimestamp;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates parameters for creating a new incoming message.
|
||||||
|
* @return A new instance of {@link RcsIncomingMessageCreationParameters} to create a new
|
||||||
|
* {@link RcsIncomingMessage}
|
||||||
|
*/
|
||||||
|
public RcsIncomingMessageCreationParameters build() {
|
||||||
|
return new RcsIncomingMessageCreationParameters(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private RcsIncomingMessageCreationParameters(Builder builder) {
|
||||||
|
super(builder);
|
||||||
|
mArrivalTimestamp = builder.mArrivalTimestamp;
|
||||||
|
mSeenTimestamp = builder.mSeenTimestamp;
|
||||||
|
mSenderParticipantId = builder.mSenderParticipant.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsIncomingMessageCreationParameters(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mArrivalTimestamp = in.readLong();
|
||||||
|
mSeenTimestamp = in.readLong();
|
||||||
|
mSenderParticipantId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the arrival timestamp for the {@link RcsIncomingMessage} to be created.
|
||||||
|
* Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
*/
|
||||||
|
public long getArrivalTimestamp() {
|
||||||
|
return mArrivalTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the seen timestamp for the {@link RcsIncomingMessage} to be created.
|
||||||
|
* Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC
|
||||||
|
*/
|
||||||
|
public long getSeenTimestamp() {
|
||||||
|
return mSeenTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper getter for {@link com.android.internal.telephony.ims.RcsMessageStoreController} to
|
||||||
|
* create {@link RcsIncomingMessage}s
|
||||||
|
*
|
||||||
|
* Since the API doesn't expose any ID's to API users, this should be hidden.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getSenderParticipantId() {
|
||||||
|
return mSenderParticipantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsIncomingMessageCreationParameters> CREATOR =
|
||||||
|
new Creator<RcsIncomingMessageCreationParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsIncomingMessageCreationParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsIncomingMessageCreationParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsIncomingMessageCreationParameters[] newArray(int size) {
|
||||||
|
return new RcsIncomingMessageCreationParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeLong(mArrivalTimestamp);
|
||||||
|
dest.writeLong(mSeenTimestamp);
|
||||||
|
dest.writeInt(mSenderParticipantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A part of a composite {@link RcsMessage} that holds a location
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsLocationPart extends RcsPart {
|
|
||||||
public static final Creator<RcsLocationPart> CREATOR = new Creator<RcsLocationPart>() {
|
|
||||||
@Override
|
|
||||||
public RcsLocationPart createFromParcel(Parcel in) {
|
|
||||||
return new RcsLocationPart(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsLocationPart[] newArray(int size) {
|
|
||||||
return new RcsLocationPart[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsLocationPart(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsManager;
|
|
||||||
@@ -28,7 +28,7 @@ public class RcsManager {
|
|||||||
private static final RcsMessageStore sRcsMessageStoreInstance = new RcsMessageStore();
|
private static final RcsMessageStore sRcsMessageStoreInstance = new RcsMessageStore();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an instance of RcsMessageStore.
|
* Returns an instance of {@link RcsMessageStore}
|
||||||
*/
|
*/
|
||||||
public RcsMessageStore getRcsMessageStore() {
|
public RcsMessageStore getRcsMessageStore() {
|
||||||
return sRcsMessageStoreInstance;
|
return sRcsMessageStoreInstance;
|
||||||
|
|||||||
@@ -15,11 +15,314 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcelable;
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a single instance of a message sent or received over RCS.
|
* This is a single instance of a message sent or received over RCS.
|
||||||
* @hide - TODO(sahinc) make this public
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public abstract class RcsMessage implements Parcelable {
|
public abstract class RcsMessage {
|
||||||
|
/**
|
||||||
|
* The value to indicate that this {@link RcsMessage} does not have any location information.
|
||||||
|
*/
|
||||||
|
public static final double LOCATION_NOT_SET = Double.MIN_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage}s status is not set yet.
|
||||||
|
*/
|
||||||
|
public static final int NOT_SET = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} is a draft and is not in the process of
|
||||||
|
* sending yet.
|
||||||
|
*/
|
||||||
|
public static final int DRAFT = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} was successfully sent.
|
||||||
|
*/
|
||||||
|
public static final int QUEUED = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} is actively being sent.
|
||||||
|
*/
|
||||||
|
public static final int SENDING = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} was successfully sent.
|
||||||
|
*/
|
||||||
|
public static final int SENT = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} failed to send in an attempt before, and
|
||||||
|
* now being retried.
|
||||||
|
*/
|
||||||
|
public static final int RETRYING = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} has permanently failed to send.
|
||||||
|
*/
|
||||||
|
public static final int FAILED = 6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} was successfully received.
|
||||||
|
*/
|
||||||
|
public static final int RECEIVED = 7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status to indicate that this {@link RcsMessage} was seen.
|
||||||
|
*/
|
||||||
|
public static final int SEEN = 9;
|
||||||
|
|
||||||
|
protected int mId;
|
||||||
|
|
||||||
|
@IntDef({
|
||||||
|
DRAFT, QUEUED, SENDING, SENT, RETRYING, FAILED, RECEIVED, SEEN
|
||||||
|
})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface RcsMessageStatus {
|
||||||
|
}
|
||||||
|
|
||||||
|
RcsMessage(int id) {
|
||||||
|
mId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the row Id from the common message.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getId() {
|
||||||
|
return mId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the subscription ID that this {@link RcsMessage} was sent from, or delivered
|
||||||
|
* to.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
* @see android.telephony.SubscriptionInfo#getSubscriptionId
|
||||||
|
*/
|
||||||
|
public int getSubscriptionId() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessageSubId(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the subscription ID that this {@link RcsMessage} was sent from, or delivered to and
|
||||||
|
* persists it into storage.
|
||||||
|
*
|
||||||
|
* @param subId The subscription ID to persists into storage.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
* @see android.telephony.SubscriptionInfo#getSubscriptionId
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setSubscriptionId(int subId) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setMessageSubId(mId, isIncoming(), subId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of this message and persists it into storage. Please see
|
||||||
|
* {@link RcsFileTransferPart#setFileTransferStatus(int)} to set statuses around file transfers.
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setStatus(@RcsMessageStatus int rcsMessageStatus) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setMessageStatus(mId, isIncoming(), rcsMessageStatus));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status of this message. Please see
|
||||||
|
* {@link RcsFileTransferPart#setFileTransferStatus(int)} to set statuses around file transfers.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public @RcsMessageStatus int getStatus() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessageStatus(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the origination timestamp of this message and persists it into storage. Origination is
|
||||||
|
* defined as when the sender tapped the send button.
|
||||||
|
*
|
||||||
|
* @param timestamp The origination timestamp value in milliseconds passed after midnight,
|
||||||
|
* January 1, 1970 UTC
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setOriginationTimestamp(long timestamp) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setMessageOriginationTimestamp(mId, isIncoming(), timestamp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the origination timestamp of this message in milliseconds passed after
|
||||||
|
* midnight, January 1, 1970 UTC. Origination is defined as when the sender tapped the send
|
||||||
|
* button.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getOriginationTimestamp() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getMessageOriginationTimestamp(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the globally unique RCS message identifier for this message and persists it into
|
||||||
|
* storage. This function does not confirm that this message id is unique. Please see 4.4.5.2
|
||||||
|
* - GSMA RCC.53 (RCS Device API 1.6 Specification
|
||||||
|
*
|
||||||
|
* @param rcsMessageGlobalId The globally RCS message identifier
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setRcsMessageId(String rcsMessageGlobalId) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setGlobalMessageIdForMessage(mId, isIncoming(), rcsMessageGlobalId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the globally unique RCS message identifier for this message. Please see
|
||||||
|
* 4.4.5.2 - GSMA RCC.53 (RCS Device API 1.6 Specification
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public String getRcsMessageId() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getGlobalMessageIdForMessage(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the user visible text included in this message.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public String getText() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getTextForMessage(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the user visible text for this message and persists in storage.
|
||||||
|
*
|
||||||
|
* @param text The text this message now has
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setText(String text) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setTextForMessage(mId, isIncoming(), text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the associated latitude for this message, or
|
||||||
|
* {@link RcsMessage#LOCATION_NOT_SET} if it does not contain a location.
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public double getLatitude() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getLatitudeForMessage(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the latitude for this message and persists in storage.
|
||||||
|
*
|
||||||
|
* @param latitude The latitude for this location message.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setLatitude(double latitude) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setLatitudeForMessage(mId, isIncoming(), latitude));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the associated longitude for this message, or
|
||||||
|
* {@link RcsMessage#LOCATION_NOT_SET} if it does not contain a location.
|
||||||
|
*
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public double getLongitude() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getLongitudeForMessage(mId, isIncoming()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the longitude for this message and persists in storage.
|
||||||
|
*
|
||||||
|
* @param longitude The longitude for this location message.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setLongitude(double longitude) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.setLongitudeForMessage(mId, isIncoming(), longitude));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches an {@link RcsFileTransferPart} to this message and persists into storage.
|
||||||
|
*
|
||||||
|
* @param fileTransferCreationParameters The parameters to be used to create the
|
||||||
|
* {@link RcsFileTransferPart}
|
||||||
|
* @return A new instance of {@link RcsFileTransferPart}
|
||||||
|
* @throws RcsMessageStoreException if the file transfer could not be persisted into storage.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
@WorkerThread
|
||||||
|
public RcsFileTransferPart insertFileTransfer(
|
||||||
|
RcsFileTransferCreationParameters fileTransferCreationParameters)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
return new RcsFileTransferPart(RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.storeFileTransfer(mId, isIncoming(), fileTransferCreationParameters)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns all the {@link RcsFileTransferPart}s associated with this message in an
|
||||||
|
* unmodifiable set.
|
||||||
|
* @throws RcsMessageStoreException if the file transfers could not be read from the storage
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
@WorkerThread
|
||||||
|
public Set<RcsFileTransferPart> getFileTransferParts() throws RcsMessageStoreException {
|
||||||
|
Set<RcsFileTransferPart> fileTransferParts = new HashSet<>();
|
||||||
|
|
||||||
|
int[] fileTransferIds = RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getFileTransfersAttachedToMessage(mId, isIncoming()));
|
||||||
|
|
||||||
|
for (int fileTransfer : fileTransferIds) {
|
||||||
|
fileTransferParts.add(new RcsFileTransferPart(fileTransfer));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.unmodifiableSet(fileTransferParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link RcsFileTransferPart} from this message, and deletes it in storage.
|
||||||
|
*
|
||||||
|
* @param fileTransferPart The part to delete.
|
||||||
|
* @throws RcsMessageStoreException if the file transfer could not be removed from storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void removeFileTransferPart(@NonNull RcsFileTransferPart fileTransferPart)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
if (fileTransferPart == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.deleteFileTransfer(fileTransferPart.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} if this message was received on this device, {@code false} if it
|
||||||
|
* was sent.
|
||||||
|
*/
|
||||||
|
public abstract boolean isIncoming();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsMessageCreationParameters;
|
||||||
@@ -0,0 +1,265 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import static android.telephony.ims.RcsMessage.LOCATION_NOT_SET;
|
||||||
|
|
||||||
|
import android.annotation.CheckResult;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.telephony.SubscriptionInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The collection of parameters to be passed into
|
||||||
|
* {@link RcsThread#addIncomingMessage(RcsIncomingMessageCreationParameters)} and
|
||||||
|
* {@link RcsThread#addOutgoingMessage(RcsMessageCreationParameters)} to create and persist
|
||||||
|
* {@link RcsMessage}s on an {@link RcsThread}
|
||||||
|
*
|
||||||
|
* @hide TODO - make public
|
||||||
|
*/
|
||||||
|
public class RcsMessageCreationParameters implements Parcelable {
|
||||||
|
// The globally unique id of the RcsMessage to be created.
|
||||||
|
private final String mRcsMessageGlobalId;
|
||||||
|
|
||||||
|
// The subscription that this message was/will be received/sent from.
|
||||||
|
private final int mSubId;
|
||||||
|
// The sending/receiving status of the message
|
||||||
|
private final @RcsMessage.RcsMessageStatus int mMessageStatus;
|
||||||
|
// The timestamp of message creation
|
||||||
|
private final long mOriginationTimestamp;
|
||||||
|
// The user visible content of the message
|
||||||
|
private final String mText;
|
||||||
|
// The latitude of the message if this is a location message
|
||||||
|
private final double mLatitude;
|
||||||
|
// The longitude of the message if this is a location message
|
||||||
|
private final double mLongitude;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the globally unique RCS Message ID for the {@link RcsMessage} to be created.
|
||||||
|
* Please see 4.4.5.2 - GSMA RCC.53 (RCS Device API 1.6 Specification
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getRcsMessageGlobalId() {
|
||||||
|
return mRcsMessageGlobalId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the subscription ID that was used to send or receive the {@link RcsMessage}
|
||||||
|
* to be created.
|
||||||
|
*/
|
||||||
|
public int getSubId() {
|
||||||
|
return mSubId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status for the {@link RcsMessage} to be created.
|
||||||
|
* @see RcsMessage.RcsMessageStatus
|
||||||
|
*/
|
||||||
|
public int getMessageStatus() {
|
||||||
|
return mMessageStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the origination timestamp of the {@link RcsMessage} to be created in
|
||||||
|
* milliseconds passed after midnight, January 1, 1970 UTC. Origination is defined as when
|
||||||
|
* the sender tapped the send button.
|
||||||
|
*/
|
||||||
|
public long getOriginationTimestamp() {
|
||||||
|
return mOriginationTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the user visible text contained in the {@link RcsMessage} to be created
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getText() {
|
||||||
|
return mText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the latitude of the {@link RcsMessage} to be created, or
|
||||||
|
* {@link RcsMessage#LOCATION_NOT_SET} if the message does not contain a location.
|
||||||
|
*/
|
||||||
|
public double getLatitude() {
|
||||||
|
return mLatitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the longitude of the {@link RcsMessage} to be created, or
|
||||||
|
* {@link RcsMessage#LOCATION_NOT_SET} if the message does not contain a location.
|
||||||
|
*/
|
||||||
|
public double getLongitude() {
|
||||||
|
return mLongitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base builder for creating {@link RcsMessage}s on {@link RcsThread}s.
|
||||||
|
*
|
||||||
|
* @see RcsIncomingMessageCreationParameters
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
private String mRcsMessageGlobalId;
|
||||||
|
private int mSubId;
|
||||||
|
private @RcsMessage.RcsMessageStatus int mMessageStatus;
|
||||||
|
private long mOriginationTimestamp;
|
||||||
|
private String mText;
|
||||||
|
private double mLatitude = LOCATION_NOT_SET;
|
||||||
|
private double mLongitude = LOCATION_NOT_SET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Builder} to create an instance of
|
||||||
|
* {@link RcsMessageCreationParameters}.
|
||||||
|
*
|
||||||
|
* @param originationTimestamp The timestamp of {@link RcsMessage} creation. The origination
|
||||||
|
* timestamp value in milliseconds passed after midnight,
|
||||||
|
* January 1, 1970 UTC
|
||||||
|
* @param subscriptionId The subscription ID that was used to send or receive this
|
||||||
|
* {@link RcsMessage}
|
||||||
|
* @see SubscriptionInfo#getSubscriptionId()
|
||||||
|
*/
|
||||||
|
public Builder(long originationTimestamp, int subscriptionId) {
|
||||||
|
mOriginationTimestamp = originationTimestamp;
|
||||||
|
mSubId = subscriptionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of the {@link RcsMessage} to be built.
|
||||||
|
*
|
||||||
|
* @param rcsMessageStatus The status to be set
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#setStatus(int)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setStatus(@RcsMessage.RcsMessageStatus int rcsMessageStatus) {
|
||||||
|
mMessageStatus = rcsMessageStatus;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the globally unique RCS message identifier for the {@link RcsMessage} to be built.
|
||||||
|
* This function does not confirm that this message id is unique. Please see 4.4.5.2 - GSMA
|
||||||
|
* RCC.53 (RCS Device API 1.6 Specification)
|
||||||
|
*
|
||||||
|
* @param rcsMessageId The ID to be set
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#setRcsMessageId(String)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setRcsMessageId(String rcsMessageId) {
|
||||||
|
mRcsMessageGlobalId = rcsMessageId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text of the {@link RcsMessage} to be built.
|
||||||
|
*
|
||||||
|
* @param text The user visible text of the message
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#setText(String)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setText(String text) {
|
||||||
|
mText = text;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the latitude of the {@link RcsMessage} to be built. Please see US5-24 - GSMA RCC.71
|
||||||
|
* (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @param latitude The latitude of the location information associated with this message.
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#setLatitude(double)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setLatitude(double latitude) {
|
||||||
|
mLatitude = latitude;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the longitude of the {@link RcsMessage} to be built. Please see US5-24 - GSMA RCC.71
|
||||||
|
* (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @param longitude The longitude of the location information associated with this message.
|
||||||
|
* @return The same instance of {@link Builder} to chain methods
|
||||||
|
* @see RcsMessage#setLongitude(double)
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setLongitude(double longitude) {
|
||||||
|
mLongitude = longitude;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsMessageCreationParameters build() {
|
||||||
|
return new RcsMessageCreationParameters(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsMessageCreationParameters(Builder builder) {
|
||||||
|
mRcsMessageGlobalId = builder.mRcsMessageGlobalId;
|
||||||
|
mSubId = builder.mSubId;
|
||||||
|
mMessageStatus = builder.mMessageStatus;
|
||||||
|
mOriginationTimestamp = builder.mOriginationTimestamp;
|
||||||
|
mText = builder.mText;
|
||||||
|
mLatitude = builder.mLatitude;
|
||||||
|
mLongitude = builder.mLongitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsMessageCreationParameters(Parcel in) {
|
||||||
|
mRcsMessageGlobalId = in.readString();
|
||||||
|
mSubId = in.readInt();
|
||||||
|
mMessageStatus = in.readInt();
|
||||||
|
mOriginationTimestamp = in.readLong();
|
||||||
|
mText = in.readString();
|
||||||
|
mLatitude = in.readDouble();
|
||||||
|
mLongitude = in.readDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsMessageCreationParameters> CREATOR =
|
||||||
|
new Creator<RcsMessageCreationParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsMessageCreationParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsMessageCreationParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsMessageCreationParameters[] newArray(int size) {
|
||||||
|
return new RcsMessageCreationParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeString(mRcsMessageGlobalId);
|
||||||
|
dest.writeInt(mSubId);
|
||||||
|
dest.writeInt(mMessageStatus);
|
||||||
|
dest.writeLong(mOriginationTimestamp);
|
||||||
|
dest.writeString(mText);
|
||||||
|
dest.writeDouble(mLatitude);
|
||||||
|
dest.writeDouble(mLongitude);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsMessageQueryParameters;
|
||||||
@@ -0,0 +1,361 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.CheckResult;
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.IntRange;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parameters to pass into
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)} in order to select a
|
||||||
|
* subset of {@link RcsMessage}s present in the message store.
|
||||||
|
*
|
||||||
|
* @hide TODO - make the Builder and builder() public. The rest should stay internal only.
|
||||||
|
*/
|
||||||
|
public class RcsMessageQueryParameters implements Parcelable {
|
||||||
|
/**
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public static final int THREAD_ID_NOT_SET = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setSortProperty(int)} to denote that the results should
|
||||||
|
* be sorted in the same order of {@link RcsMessage}s that got persisted into storage for faster
|
||||||
|
* results.
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_CREATION_ORDER = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setSortProperty(int)} to denote that the results should
|
||||||
|
* be sorted according to the timestamp of {@link RcsMessage#getOriginationTimestamp()}
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_TIMESTAMP = 1;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({SORT_BY_CREATION_ORDER, SORT_BY_TIMESTAMP})
|
||||||
|
public @interface SortingProperty {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask flag to be used with {@link Builder#setMessageType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)} return
|
||||||
|
* {@link RcsIncomingMessage}s.
|
||||||
|
*/
|
||||||
|
public static final int MESSAGE_TYPE_INCOMING = 0x0001;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask flag to be used with {@link Builder#setMessageType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)} return
|
||||||
|
* {@link RcsOutgoingMessage}s.
|
||||||
|
*/
|
||||||
|
public static final int MESSAGE_TYPE_OUTGOING = 0x0002;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask flag to be used with {@link Builder#setFileTransferPresence(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)} return {@link RcsMessage}s
|
||||||
|
* that have an {@link RcsFileTransferPart} attached.
|
||||||
|
*/
|
||||||
|
public static final int MESSAGES_WITH_FILE_TRANSFERS = 0x0004;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask flag to be used with {@link Builder#setFileTransferPresence(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)} return {@link RcsMessage}s
|
||||||
|
* that don't have an {@link RcsFileTransferPart} attached.
|
||||||
|
*/
|
||||||
|
public static final int MESSAGES_WITHOUT_FILE_TRANSFERS = 0x0008;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public static final String MESSAGE_QUERY_PARAMETERS_KEY = "message_query_parameters";
|
||||||
|
|
||||||
|
// Whether the result should be filtered against incoming or outgoing messages
|
||||||
|
private int mMessageType;
|
||||||
|
// Whether the result should have file transfer messages attached or not
|
||||||
|
private int mFileTransferPresence;
|
||||||
|
// The SQL "Like" clause to filter messages
|
||||||
|
private String mMessageLike;
|
||||||
|
// The property the messages should be sorted against
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
|
// Whether the messages should be sorted in ascending order
|
||||||
|
private boolean mIsAscending;
|
||||||
|
// The number of results that should be returned with this query
|
||||||
|
private int mLimit;
|
||||||
|
// The thread that the results should be limited to
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
RcsMessageQueryParameters(int messageType, int fileTransferPresence, String messageLike,
|
||||||
|
int threadId, @SortingProperty int sortingProperty, boolean isAscending, int limit) {
|
||||||
|
mMessageType = messageType;
|
||||||
|
mFileTransferPresence = fileTransferPresence;
|
||||||
|
mMessageLike = messageLike;
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
mLimit = limit;
|
||||||
|
mThreadId = threadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the type of {@link RcsMessage}s that this {@link RcsMessageQueryParameters}
|
||||||
|
* is set to query for.
|
||||||
|
*/
|
||||||
|
public int getMessageType() {
|
||||||
|
return mMessageType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns whether the result query should return {@link RcsMessage}s with
|
||||||
|
* {@link RcsFileTransferPart}s or not
|
||||||
|
*/
|
||||||
|
public int getFileTransferPresence() {
|
||||||
|
return mFileTransferPresence;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the SQL-inspired "LIKE" clause that will be used to match {@link RcsMessage}s
|
||||||
|
*/
|
||||||
|
public String getMessageLike() {
|
||||||
|
return mMessageLike;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the number of {@link RcsThread}s to be returned from the query. A value of
|
||||||
|
* 0 means there is no set limit.
|
||||||
|
*/
|
||||||
|
public int getLimit() {
|
||||||
|
return mLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the property that will be used to sort the result against.
|
||||||
|
* @see SortingProperty
|
||||||
|
*/
|
||||||
|
public @SortingProperty int getSortingProperty() {
|
||||||
|
return mSortingProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} if the result set will be sorted in ascending order,
|
||||||
|
* {@code false} if it will be sorted in descending order.
|
||||||
|
*/
|
||||||
|
public boolean getSortDirection() {
|
||||||
|
return mIsAscending;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
||||||
|
* the thread that the result query should be limited to.
|
||||||
|
*
|
||||||
|
* As we do not expose any sort of integer ID's to public usage, this should be hidden.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public int getThreadId() {
|
||||||
|
return mThreadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class to build the {@link RcsMessageQueryParameters}.
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
|
private int mMessageType;
|
||||||
|
private int mFileTransferPresence;
|
||||||
|
private String mMessageLike;
|
||||||
|
private boolean mIsAscending;
|
||||||
|
private int mLimit = 100;
|
||||||
|
private int mThreadId = THREAD_ID_NOT_SET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new builder for {@link RcsMessageQueryParameters} to be used in
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)}
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Builder() {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desired number of threads to be returned from the query. Passing in 0 will return all
|
||||||
|
* existing threads at once. The limit defaults to 100.
|
||||||
|
*
|
||||||
|
* @param limit The number to limit the query result to.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @throws InvalidParameterException If the given limit is negative.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setResultLimit(@IntRange(from = 0) int limit)
|
||||||
|
throws InvalidParameterException {
|
||||||
|
if (limit < 0) {
|
||||||
|
throw new InvalidParameterException("The query limit must be non-negative");
|
||||||
|
}
|
||||||
|
|
||||||
|
mLimit = limit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the type of messages to be returned from the query.
|
||||||
|
*
|
||||||
|
* @param messageType The type of message to be returned.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @see RcsMessageQueryParameters#MESSAGE_TYPE_INCOMING
|
||||||
|
* @see RcsMessageQueryParameters#MESSAGE_TYPE_OUTGOING
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setMessageType(int messageType) {
|
||||||
|
mMessageType = messageType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether file transfer messages should be included in the query result or not.
|
||||||
|
*
|
||||||
|
* @param fileTransferPresence Whether file transfers should be included in the result
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @see RcsMessageQueryParameters#MESSAGES_WITH_FILE_TRANSFERS
|
||||||
|
* @see RcsMessageQueryParameters#MESSAGES_WITHOUT_FILE_TRANSFERS
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setFileTransferPresence(int fileTransferPresence) {
|
||||||
|
mFileTransferPresence = fileTransferPresence;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an SQL-inspired "like" clause to match with messages. Using a percent sign ('%')
|
||||||
|
* wildcard matches any sequence of zero or more characters. Using an underscore ('_')
|
||||||
|
* wildcard matches any single character. Not using any wildcards would only perform a
|
||||||
|
* string match. The input string is case-insensitive.
|
||||||
|
*
|
||||||
|
* The input "Wh%" would match messages "who", "where" and "what", while the input "Wh_"
|
||||||
|
* would only match "who"
|
||||||
|
*
|
||||||
|
* @param messageLike The "like" clause for matching {@link RcsMessage}s.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setMessageLike(String messageLike) {
|
||||||
|
mMessageLike = messageLike;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the property where the results should be sorted against. Defaults to
|
||||||
|
* {@link RcsMessageQueryParameters.SortingProperty#SORT_BY_CREATION_ORDER}
|
||||||
|
*
|
||||||
|
* @param sortingProperty against which property the results should be sorted
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortProperty(@SortingProperty int sortingProperty) {
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the results should be sorted ascending or descending
|
||||||
|
*
|
||||||
|
* @param isAscending whether the results should be sorted ascending
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortDirection(boolean isAscending) {
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limits the results to the given thread.
|
||||||
|
*
|
||||||
|
* @param thread the {@link RcsThread} that results should be limited to. If set to
|
||||||
|
* {@code null}, messages on all threads will be queried
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setThread(@Nullable RcsThread thread) {
|
||||||
|
if (thread == null) {
|
||||||
|
mThreadId = THREAD_ID_NOT_SET;
|
||||||
|
} else {
|
||||||
|
mThreadId = thread.getThreadId();
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the {@link RcsMessageQueryParameters} to use in
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)}
|
||||||
|
*
|
||||||
|
* @return An instance of {@link RcsMessageQueryParameters} to use with the message
|
||||||
|
* query.
|
||||||
|
*/
|
||||||
|
public RcsMessageQueryParameters build() {
|
||||||
|
return new RcsMessageQueryParameters(mMessageType, mFileTransferPresence, mMessageLike,
|
||||||
|
mThreadId, mSortingProperty, mIsAscending, mLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parcelable boilerplate below.
|
||||||
|
*/
|
||||||
|
protected RcsMessageQueryParameters(Parcel in) {
|
||||||
|
mMessageType = in.readInt();
|
||||||
|
mFileTransferPresence = in.readInt();
|
||||||
|
mMessageLike = in.readString();
|
||||||
|
mSortingProperty = in.readInt();
|
||||||
|
mIsAscending = in.readBoolean();
|
||||||
|
mLimit = in.readInt();
|
||||||
|
mThreadId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsMessageQueryParameters> CREATOR =
|
||||||
|
new Creator<RcsMessageQueryParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsMessageQueryParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsMessageQueryParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsMessageQueryParameters[] newArray(int size) {
|
||||||
|
return new RcsMessageQueryParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(mMessageType);
|
||||||
|
dest.writeInt(mFileTransferPresence);
|
||||||
|
dest.writeString(mMessageLike);
|
||||||
|
dest.writeInt(mSortingProperty);
|
||||||
|
dest.writeBoolean(mIsAscending);
|
||||||
|
dest.writeInt(mLimit);
|
||||||
|
dest.writeInt(mThreadId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable RcsGroupThread;
|
parcelable RcsMessageQueryResult;
|
||||||
115
telephony/java/android/telephony/ims/RcsMessageQueryResult.java
Normal file
115
telephony/java/android/telephony/ims/RcsMessageQueryResult.java
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_INCOMING;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import com.android.ims.RcsTypeIdPair;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The result of a {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)}
|
||||||
|
* call. This class allows getting the token for querying the next batch of messages in order to
|
||||||
|
* prevent handling large amounts of data at once.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class RcsMessageQueryResult implements Parcelable {
|
||||||
|
// The token to continue the query to get the next batch of results
|
||||||
|
private RcsQueryContinuationToken mContinuationToken;
|
||||||
|
// The message type and message ID pairs for all the messages in this query result
|
||||||
|
private List<RcsTypeIdPair> mMessageTypeIdPairs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
||||||
|
* to create query results
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsMessageQueryResult(
|
||||||
|
RcsQueryContinuationToken continuationToken,
|
||||||
|
List<RcsTypeIdPair> messageTypeIdPairs) {
|
||||||
|
mContinuationToken = continuationToken;
|
||||||
|
mMessageTypeIdPairs = messageTypeIdPairs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a token to call
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsQueryContinuationToken)}
|
||||||
|
* to get the next batch of {@link RcsMessage}s.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public RcsQueryContinuationToken getContinuationToken() {
|
||||||
|
return mContinuationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all the {@link RcsMessage}s in the current query result. Call {@link
|
||||||
|
* RcsMessageStore#getRcsMessages(RcsQueryContinuationToken)} to get the next batch
|
||||||
|
* of {@link RcsMessage}s.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public List<RcsMessage> getMessages() {
|
||||||
|
List<RcsMessage> messages = new ArrayList<>();
|
||||||
|
for (RcsTypeIdPair typeIdPair : mMessageTypeIdPairs) {
|
||||||
|
if (typeIdPair.getType() == MESSAGE_TYPE_INCOMING) {
|
||||||
|
messages.add(new RcsIncomingMessage(typeIdPair.getId()));
|
||||||
|
} else {
|
||||||
|
messages.add(new RcsOutgoingMessage(typeIdPair.getId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsMessageQueryResult(Parcel in) {
|
||||||
|
mContinuationToken = in.readParcelable(
|
||||||
|
RcsQueryContinuationToken.class.getClassLoader());
|
||||||
|
in.readTypedList(mMessageTypeIdPairs, RcsTypeIdPair.CREATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsMessageQueryResult> CREATOR =
|
||||||
|
new Creator<RcsMessageQueryResult>() {
|
||||||
|
@Override
|
||||||
|
public RcsMessageQueryResult createFromParcel(Parcel in) {
|
||||||
|
return new RcsMessageQueryResult(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsMessageQueryResult[] newArray(int size) {
|
||||||
|
return new RcsMessageQueryResult[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeParcelable(mContinuationToken, flags);
|
||||||
|
dest.writeTypedList(mMessageTypeIdPairs);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
parcelable Rcs1To1Thread;
|
parcelable RcsMessageSnippet;
|
||||||
98
telephony/java/android/telephony/ims/RcsMessageSnippet.java
Normal file
98
telephony/java/android/telephony/ims/RcsMessageSnippet.java
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.telephony.ims.RcsMessage.RcsMessageStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An immutable summary of the latest {@link RcsMessage} on an {@link RcsThread}
|
||||||
|
*
|
||||||
|
* @hide TODO: make public
|
||||||
|
*/
|
||||||
|
public class RcsMessageSnippet implements Parcelable {
|
||||||
|
private final String mText;
|
||||||
|
private final @RcsMessageStatus int mStatus;
|
||||||
|
private final long mTimestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsMessageSnippet(String text, @RcsMessageStatus int status, long timestamp) {
|
||||||
|
mText = text;
|
||||||
|
mStatus = status;
|
||||||
|
mTimestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the text of the {@link RcsMessage} with highest origination timestamp value
|
||||||
|
* (i.e. latest) in this thread
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getSnippetText() {
|
||||||
|
return mText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status of the {@link RcsMessage} with highest origination timestamp value
|
||||||
|
* (i.e. latest) in this thread
|
||||||
|
*/
|
||||||
|
public @RcsMessageStatus int getSnippetStatus() {
|
||||||
|
return mStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the timestamp of the {@link RcsMessage} with highest origination timestamp
|
||||||
|
* value (i.e. latest) in this thread
|
||||||
|
*/
|
||||||
|
public long getSnippetTimestamp() {
|
||||||
|
return mTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsMessageSnippet(Parcel in) {
|
||||||
|
mText = in.readString();
|
||||||
|
mStatus = in.readInt();
|
||||||
|
mTimestamp = in.readLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsMessageSnippet> CREATOR =
|
||||||
|
new Creator<RcsMessageSnippet>() {
|
||||||
|
@Override
|
||||||
|
public RcsMessageSnippet createFromParcel(Parcel in) {
|
||||||
|
return new RcsMessageSnippet(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsMessageSnippet[] newArray(int size) {
|
||||||
|
return new RcsMessageSnippet[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeString(mText);
|
||||||
|
dest.writeInt(mStatus);
|
||||||
|
dest.writeLong(mTimestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,106 +16,223 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.WorkerThread;
|
import android.annotation.WorkerThread;
|
||||||
import android.os.RemoteException;
|
import android.net.Uri;
|
||||||
import android.os.ServiceManager;
|
|
||||||
import android.telephony.Rlog;
|
import java.util.List;
|
||||||
import android.telephony.ims.aidl.IRcs;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RcsMessageStore is the application interface to RcsProvider and provides access methods to
|
* RcsMessageStore is the application interface to RcsProvider and provides access methods to
|
||||||
* RCS related database tables.
|
* RCS related database tables.
|
||||||
|
*
|
||||||
* @hide - TODO make this public
|
* @hide - TODO make this public
|
||||||
*/
|
*/
|
||||||
public class RcsMessageStore {
|
public class RcsMessageStore {
|
||||||
static final String TAG = "RcsMessageStore";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the first chunk of existing {@link RcsThread}s in the common storage.
|
* Returns the first chunk of existing {@link RcsThread}s in the common storage.
|
||||||
|
*
|
||||||
* @param queryParameters Parameters to specify to return a subset of all RcsThreads.
|
* @param queryParameters Parameters to specify to return a subset of all RcsThreads.
|
||||||
* Passing a value of null will return all threads.
|
* Passing a value of null will return all threads.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public RcsThreadQueryResult getRcsThreads(@Nullable RcsThreadQueryParameters queryParameters) {
|
@NonNull
|
||||||
try {
|
public RcsThreadQueryResult getRcsThreads(@Nullable RcsThreadQueryParameters queryParameters)
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
throws RcsMessageStoreException {
|
||||||
if (iRcs != null) {
|
return RcsControllerCall.call(iRcs -> iRcs.getRcsThreads(queryParameters));
|
||||||
return iRcs.getRcsThreads(queryParameters);
|
|
||||||
}
|
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsMessageStore: Exception happened during getRcsThreads", re);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the next chunk of {@link RcsThread}s in the common storage.
|
* Returns the next chunk of {@link RcsThread}s in the common storage.
|
||||||
|
*
|
||||||
* @param continuationToken A token to continue the query to get the next chunk. This is
|
* @param continuationToken A token to continue the query to get the next chunk. This is
|
||||||
* obtained through {@link RcsThreadQueryResult#nextChunkToken}.
|
* obtained through {@link RcsThreadQueryResult#getContinuationToken}.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public RcsThreadQueryResult getRcsThreads(RcsThreadQueryContinuationToken continuationToken) {
|
@NonNull
|
||||||
try {
|
public RcsThreadQueryResult getRcsThreads(@NonNull RcsQueryContinuationToken continuationToken)
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
throws RcsMessageStoreException {
|
||||||
if (iRcs != null) {
|
return RcsControllerCall.call(iRcs -> iRcs.getRcsThreadsWithToken(continuationToken));
|
||||||
return iRcs.getRcsThreadsWithToken(continuationToken);
|
}
|
||||||
}
|
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsMessageStore: Exception happened during getRcsThreads", re);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
/**
|
||||||
|
* Returns the first chunk of existing {@link RcsParticipant}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param queryParameters Parameters to specify to return a subset of all RcsParticipants.
|
||||||
|
* Passing a value of null will return all participants.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipantQueryResult getRcsParticipants(
|
||||||
|
@Nullable RcsParticipantQueryParameters queryParameters)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getParticipants(queryParameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the next chunk of {@link RcsParticipant}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param continuationToken A token to continue the query to get the next chunk. This is
|
||||||
|
* obtained through
|
||||||
|
* {@link RcsParticipantQueryResult#getContinuationToken}
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipantQueryResult getRcsParticipants(
|
||||||
|
@NonNull RcsQueryContinuationToken continuationToken)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getParticipantsWithToken(continuationToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the first chunk of existing {@link RcsMessage}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param queryParameters Parameters to specify to return a subset of all RcsMessages.
|
||||||
|
* Passing a value of null will return all messages.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsMessageQueryResult getRcsMessages(
|
||||||
|
@Nullable RcsMessageQueryParameters queryParameters) throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessages(queryParameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the next chunk of {@link RcsMessage}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param continuationToken A token to continue the query to get the next chunk. This is
|
||||||
|
* obtained through {@link RcsMessageQueryResult#getContinuationToken}
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsMessageQueryResult getRcsMessages(
|
||||||
|
@NonNull RcsQueryContinuationToken continuationToken) throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessagesWithToken(continuationToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the first chunk of existing {@link RcsEvent}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param queryParameters Parameters to specify to return a subset of all RcsEvents.
|
||||||
|
* Passing a value of null will return all events.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsEventQueryResult getRcsEvents(
|
||||||
|
@Nullable RcsEventQueryParameters queryParameters) throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getEvents(queryParameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the next chunk of {@link RcsEvent}s in the common storage.
|
||||||
|
*
|
||||||
|
* @param continuationToken A token to continue the query to get the next chunk. This is
|
||||||
|
* obtained through {@link RcsEventQueryResult#getContinuationToken}.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsEventQueryResult getRcsEvents(
|
||||||
|
@NonNull RcsQueryContinuationToken continuationToken) throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getEventsWithToken(continuationToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persists an {@link RcsEvent} to common storage.
|
||||||
|
*
|
||||||
|
* @param persistableEvent The {@link RcsEvent} to persist into storage.
|
||||||
|
* @throws RcsMessageStoreException if the query could not be completed on the storage
|
||||||
|
*
|
||||||
|
* @see RcsGroupThreadNameChangedEvent
|
||||||
|
* @see RcsGroupThreadIconChangedEvent
|
||||||
|
* @see RcsGroupThreadParticipantJoinedEvent
|
||||||
|
* @see RcsGroupThreadParticipantLeftEvent
|
||||||
|
* @see RcsParticipantAliasChangedEvent
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public void persistRcsEvent(RcsEvent persistableEvent) throws RcsMessageStoreException {
|
||||||
|
persistableEvent.persist();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new 1 to 1 thread with the given participant and persists it in the storage.
|
* Creates a new 1 to 1 thread with the given participant and persists it in the storage.
|
||||||
|
*
|
||||||
|
* @param recipient The {@link RcsParticipant} that will receive the messages in this thread.
|
||||||
|
* @return The newly created {@link Rcs1To1Thread}
|
||||||
|
* @throws RcsMessageStoreException if the thread could not be persisted in the storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public Rcs1To1Thread createRcs1To1Thread(RcsParticipant recipient) {
|
@NonNull
|
||||||
try {
|
public Rcs1To1Thread createRcs1To1Thread(@NonNull RcsParticipant recipient)
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
throws RcsMessageStoreException {
|
||||||
if (iRcs != null) {
|
return new Rcs1To1Thread(
|
||||||
return iRcs.createRcs1To1Thread(recipient);
|
RcsControllerCall.call(iRcs -> iRcs.createRcs1To1Thread(recipient.getId())));
|
||||||
}
|
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsMessageStore: Exception happened during createRcs1To1Thread", re);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the {@link RcsThread} identified by the given threadId.
|
* Creates a new group thread with the given participants and persists it in the storage.
|
||||||
* @param threadId threadId of the thread to be deleted.
|
*
|
||||||
|
* @throws RcsMessageStoreException if the thread could not be persisted in the storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public void deleteThread(int threadId) {
|
@NonNull
|
||||||
try {
|
public RcsGroupThread createGroupThread(@Nullable List<RcsParticipant> recipients,
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
@Nullable String groupName, @Nullable Uri groupIcon) throws RcsMessageStoreException {
|
||||||
if (iRcs != null) {
|
int[] recipientIds = null;
|
||||||
iRcs.deleteThread(threadId);
|
if (recipients != null) {
|
||||||
|
recipientIds = new int[recipients.size()];
|
||||||
|
|
||||||
|
for (int i = 0; i < recipients.size(); i++) {
|
||||||
|
recipientIds[i] = recipients.get(i).getId();
|
||||||
}
|
}
|
||||||
} catch (RemoteException re) {
|
}
|
||||||
Rlog.e(TAG, "RcsMessageStore: Exception happened during deleteThread", re);
|
|
||||||
|
int[] finalRecipientIds = recipientIds;
|
||||||
|
return new RcsGroupThread(RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.createGroupThread(finalRecipientIds, groupName, groupIcon)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the given {@link RcsThread} from the storage.
|
||||||
|
*
|
||||||
|
* @param thread The thread to be deleted.
|
||||||
|
* @throws RcsMessageStoreException if the thread could not be deleted from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void deleteThread(@NonNull RcsThread thread) throws RcsMessageStoreException {
|
||||||
|
if (thread == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isDeleteSucceeded = RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.deleteThread(thread.getThreadId(), thread.getThreadType()));
|
||||||
|
|
||||||
|
if (!isDeleteSucceeded) {
|
||||||
|
throw new RcsMessageStoreException("Could not delete RcsThread");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new participant and persists it in the storage.
|
* Creates a new participant and persists it in the storage.
|
||||||
|
*
|
||||||
* @param canonicalAddress The defining address (e.g. phone number) of the participant.
|
* @param canonicalAddress The defining address (e.g. phone number) of the participant.
|
||||||
|
* @param alias The RCS alias for the participant.
|
||||||
|
* @throws RcsMessageStoreException if the participant could not be created on the storage
|
||||||
*/
|
*/
|
||||||
public RcsParticipant createRcsParticipant(String canonicalAddress) {
|
@WorkerThread
|
||||||
try {
|
@NonNull
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
public RcsParticipant createRcsParticipant(String canonicalAddress, @Nullable String alias)
|
||||||
if (iRcs != null) {
|
throws RcsMessageStoreException {
|
||||||
return iRcs.createRcsParticipant(canonicalAddress);
|
return new RcsParticipant(
|
||||||
}
|
RcsControllerCall.call(iRcs -> iRcs.createRcsParticipant(canonicalAddress, alias)));
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsMessageStore: Exception happened during createRcsParticipant", re);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (c) 2019 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -13,13 +13,23 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcelable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A part of a composite {@link RcsMessage}.
|
* An exception that happened on {@link RcsMessageStore} or one of the derived storage classes in
|
||||||
* @hide - TODO(sahinc) make this public
|
* {@link android.telephony.ims}
|
||||||
|
*
|
||||||
|
* @hide TODO: make public
|
||||||
*/
|
*/
|
||||||
public abstract class RcsPart implements Parcelable {
|
public class RcsMessageStoreException extends Exception {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an {@link RcsMessageStoreException} with the specified detail message.
|
||||||
|
* @param message The detail message
|
||||||
|
* @see Throwable#getMessage()
|
||||||
|
*/
|
||||||
|
public RcsMessageStoreException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,50 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A part of a composite {@link RcsMessage} that holds a media that is rendered on the screen
|
|
||||||
* (i.e. image, video etc)
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsMultiMediaPart extends RcsFileTransferPart {
|
|
||||||
public static final Creator<RcsMultiMediaPart> CREATOR = new Creator<RcsMultiMediaPart>() {
|
|
||||||
@Override
|
|
||||||
public RcsMultiMediaPart createFromParcel(Parcel in) {
|
|
||||||
return new RcsMultiMediaPart(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsMultiMediaPart[] newArray(int size) {
|
|
||||||
return new RcsMultiMediaPart[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsMultiMediaPart(Parcel in) {
|
|
||||||
super(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsMultimediaPart;
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsOutgoingMessage;
|
|
||||||
@@ -15,34 +15,53 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a single instance of a message sent over RCS.
|
* This is a single instance of a message sent over RCS.
|
||||||
* @hide - TODO(sahinc) make this public
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsOutgoingMessage extends RcsMessage {
|
public class RcsOutgoingMessage extends RcsMessage {
|
||||||
public static final Creator<RcsOutgoingMessage> CREATOR = new Creator<RcsOutgoingMessage>() {
|
RcsOutgoingMessage(int id) {
|
||||||
@Override
|
super(id);
|
||||||
public RcsOutgoingMessage createFromParcel(Parcel in) {
|
|
||||||
return new RcsOutgoingMessage(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsOutgoingMessage[] newArray(int size) {
|
|
||||||
return new RcsOutgoingMessage[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsOutgoingMessage(Parcel in) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public int describeContents() {
|
* @return Returns the {@link RcsOutgoingMessageDelivery}s associated with this message. Please
|
||||||
return 0;
|
* note that the deliveries returned for the {@link RcsOutgoingMessage} may not always match the
|
||||||
|
* {@link RcsParticipant}s on the {@link RcsGroupThread} as the group recipients may have
|
||||||
|
* changed.
|
||||||
|
* @throws RcsMessageStoreException if the outgoing deliveries could not be read from storage.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
@WorkerThread
|
||||||
|
public List<RcsOutgoingMessageDelivery> getOutgoingDeliveries()
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
int[] deliveryParticipants;
|
||||||
|
List<RcsOutgoingMessageDelivery> messageDeliveries = new ArrayList<>();
|
||||||
|
|
||||||
|
deliveryParticipants = RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getMessageRecipients(mId));
|
||||||
|
|
||||||
|
if (deliveryParticipants != null) {
|
||||||
|
for (Integer deliveryParticipant : deliveryParticipants) {
|
||||||
|
messageDeliveries.add(new RcsOutgoingMessageDelivery(deliveryParticipant, mId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return messageDeliveries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code false} as this is not an incoming message.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public boolean isIncoming() {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class holds the delivery information of an {@link RcsOutgoingMessage} for each
|
||||||
|
* {@link RcsParticipant} that the message was intended for.
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
|
*/
|
||||||
|
public class RcsOutgoingMessageDelivery {
|
||||||
|
// The participant that this delivery is intended for
|
||||||
|
private final int mRecipientId;
|
||||||
|
// The message this delivery is associated with
|
||||||
|
private final int mRcsOutgoingMessageId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor to be used with RcsOutgoingMessage.getDelivery()
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
RcsOutgoingMessageDelivery(int recipientId, int messageId) {
|
||||||
|
mRecipientId = recipientId;
|
||||||
|
mRcsOutgoingMessageId = messageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the delivery time of this outgoing delivery and persists into storage.
|
||||||
|
*
|
||||||
|
* @param deliveredTimestamp The timestamp to set to delivery. It is defined as milliseconds
|
||||||
|
* passed after midnight, January 1, 1970 UTC
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setDeliveredTimestamp(long deliveredTimestamp) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setOutgoingDeliveryDeliveredTimestamp(
|
||||||
|
mRcsOutgoingMessageId, mRecipientId, deliveredTimestamp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the delivered timestamp of the associated message to the associated
|
||||||
|
* participant. Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC.
|
||||||
|
* Returns 0 if the {@link RcsOutgoingMessage} is not delivered yet.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getDeliveredTimestamp() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getOutgoingDeliveryDeliveredTimestamp(
|
||||||
|
mRcsOutgoingMessageId, mRecipientId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the seen time of this outgoing delivery and persists into storage.
|
||||||
|
*
|
||||||
|
* @param seenTimestamp The timestamp to set to delivery. It is defined as milliseconds
|
||||||
|
* passed after midnight, January 1, 1970 UTC
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setSeenTimestamp(long seenTimestamp) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setOutgoingDeliverySeenTimestamp(
|
||||||
|
mRcsOutgoingMessageId, mRecipientId, seenTimestamp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the seen timestamp of the associated message by the associated
|
||||||
|
* participant. Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC.
|
||||||
|
* Returns 0 if the {@link RcsOutgoingMessage} is not seen yet.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public long getSeenTimestamp() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getOutgoingDeliverySeenTimestamp(mRcsOutgoingMessageId, mRecipientId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of this outgoing delivery and persists into storage.
|
||||||
|
*
|
||||||
|
* @param status The status of the associated {@link RcsMessage}s delivery to the associated
|
||||||
|
* {@link RcsParticipant}
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void setStatus(@RcsMessage.RcsMessageStatus int status) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setOutgoingDeliveryStatus(
|
||||||
|
mRcsOutgoingMessageId, mRecipientId, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the status of this outgoing delivery.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public @RcsMessage.RcsMessageStatus int getStatus() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(
|
||||||
|
iRcs -> iRcs.getOutgoingDeliveryStatus(mRcsOutgoingMessageId, mRecipientId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the recipient associated with this delivery.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipant getRecipient() {
|
||||||
|
return new RcsParticipant(mRecipientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsOutgoingMessage} associated with this delivery.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsOutgoingMessage getMessage() {
|
||||||
|
return new RcsOutgoingMessage(mRcsOutgoingMessageId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsParticipant;
|
|
||||||
@@ -15,33 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import static android.telephony.ims.RcsMessageStore.TAG;
|
import android.annotation.Nullable;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
|
||||||
import android.annotation.WorkerThread;
|
import android.annotation.WorkerThread;
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.ServiceManager;
|
|
||||||
import android.telephony.Rlog;
|
|
||||||
import android.telephony.ims.aidl.IRcs;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.android.internal.util.Preconditions;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RcsParticipant is an RCS capable contact that can participate in {@link RcsThread}s.
|
* RcsParticipant is an RCS capable contact that can participate in {@link RcsThread}s.
|
||||||
* @hide - TODO(sahinc) make this public
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsParticipant implements Parcelable {
|
public class RcsParticipant {
|
||||||
// The row ID of this participant in the database
|
// The row ID of this participant in the database
|
||||||
private int mId;
|
private int mId;
|
||||||
// The phone number of this participant
|
|
||||||
private String mCanonicalAddress;
|
|
||||||
// The RCS alias of this participant. This is different than the name of the contact in the
|
|
||||||
// Contacts app - i.e. RCS protocol allows users to define aliases for themselves that doesn't
|
|
||||||
// require other users to add them as contacts and give them a name.
|
|
||||||
private String mAlias;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
* Constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
||||||
@@ -49,68 +33,87 @@ public class RcsParticipant implements Parcelable {
|
|||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public RcsParticipant(int id, @NonNull String canonicalAddress) {
|
public RcsParticipant(int id) {
|
||||||
mId = id;
|
mId = id;
|
||||||
mCanonicalAddress = canonicalAddress;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Returns the canonical address (i.e. normalized phone number) for this participant
|
* @return Returns the canonical address (i.e. normalized phone number) for this
|
||||||
|
* {@link RcsParticipant}
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
*/
|
*/
|
||||||
public String getCanonicalAddress() {
|
@Nullable
|
||||||
return mCanonicalAddress;
|
@WorkerThread
|
||||||
|
public String getCanonicalAddress() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getRcsParticipantCanonicalAddress(mId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the canonical address for this participant and updates it in storage.
|
* @return Returns the alias for this {@link RcsParticipant}. Alias is usually the real name of
|
||||||
* @param canonicalAddress the canonical address to update to.
|
* the person themselves. Please see US5-15 - GSMA RCC.71 (RCS Universal Profile Service
|
||||||
|
* Definition Document)
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@WorkerThread
|
||||||
|
public String getAlias() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getRcsParticipantAlias(mId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the alias for this {@link RcsParticipant} and persists it in storage. Alias is usually
|
||||||
|
* the real name of the person themselves. Please see US5-15 - GSMA RCC.71 (RCS Universal
|
||||||
|
* Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @param alias The alias to set to.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public void setCanonicalAddress(@NonNull String canonicalAddress) {
|
public void setAlias(String alias) throws RcsMessageStoreException {
|
||||||
Preconditions.checkNotNull(canonicalAddress);
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setRcsParticipantAlias(mId, alias));
|
||||||
if (canonicalAddress.equals(mCanonicalAddress)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCanonicalAddress = canonicalAddress;
|
|
||||||
|
|
||||||
try {
|
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
|
||||||
if (iRcs != null) {
|
|
||||||
iRcs.updateRcsParticipantCanonicalAddress(mId, mCanonicalAddress);
|
|
||||||
}
|
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsParticipant: Exception happened during setCanonicalAddress", re);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Returns the alias for this participant. Alias is usually the real name of the person
|
* @return Returns the contact ID for this {@link RcsParticipant}. Contact ID is a unique ID for
|
||||||
* themselves.
|
* an {@link RcsParticipant} that is RCS provisioned. Please see 4.4.5 - GSMA RCC.53 (RCS Device
|
||||||
|
* API 1.6 Specification)
|
||||||
|
* @throws RcsMessageStoreException if the value could not be read from the storage
|
||||||
*/
|
*/
|
||||||
public String getAlias() {
|
@Nullable
|
||||||
return mAlias;
|
@WorkerThread
|
||||||
|
public String getContactId() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getRcsParticipantContactId(mId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the alias for this participant and persists it in storage. Alias is usually the real
|
* Sets the contact ID for this {@link RcsParticipant}. Contact ID is a unique ID for
|
||||||
* name of the person themselves.
|
* an {@link RcsParticipant} that is RCS provisioned. Please see 4.4.5 - GSMA RCC.53 (RCS Device
|
||||||
|
* API 1.6 Specification)
|
||||||
|
*
|
||||||
|
* @param contactId The contact ID to set to.
|
||||||
|
* @throws RcsMessageStoreException if the value could not be persisted into storage
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public void setAlias(String alias) {
|
public void setContactId(String contactId) throws RcsMessageStoreException {
|
||||||
if (TextUtils.equals(mAlias, alias)) {
|
RcsControllerCall.callWithNoReturn(iRcs -> iRcs.setRcsParticipantContactId(mId, contactId));
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
mAlias = alias;
|
|
||||||
|
|
||||||
try {
|
@Override
|
||||||
IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService("ircs"));
|
public boolean equals(Object obj) {
|
||||||
if (iRcs != null) {
|
if (this == obj) {
|
||||||
iRcs.updateRcsParticipantAlias(mId, mAlias);
|
return true;
|
||||||
}
|
|
||||||
} catch (RemoteException re) {
|
|
||||||
Rlog.e(TAG, "RcsParticipant: Exception happened during setCanonicalAddress", re);
|
|
||||||
}
|
}
|
||||||
|
if (!(obj instanceof RcsParticipant)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RcsParticipant other = (RcsParticipant) obj;
|
||||||
|
|
||||||
|
return mId == other.mId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return mId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,34 +124,4 @@ public class RcsParticipant implements Parcelable {
|
|||||||
public int getId() {
|
public int getId() {
|
||||||
return mId;
|
return mId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<RcsParticipant> CREATOR = new Creator<RcsParticipant>() {
|
|
||||||
@Override
|
|
||||||
public RcsParticipant createFromParcel(Parcel in) {
|
|
||||||
return new RcsParticipant(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsParticipant[] newArray(int size) {
|
|
||||||
return new RcsParticipant[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsParticipant(Parcel in) {
|
|
||||||
mId = in.readInt();
|
|
||||||
mCanonicalAddress = in.readString();
|
|
||||||
mAlias = in.readString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
dest.writeInt(mId);
|
|
||||||
dest.writeString(mCanonicalAddress);
|
|
||||||
dest.writeString(mAlias);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,27 +15,93 @@
|
|||||||
*/
|
*/
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An event that indicates an {@link RcsParticipant}'s alias was changed.
|
* An event that indicates an {@link RcsParticipant}'s alias was changed. Please see US18-2 - GSMA
|
||||||
* @hide - TODO(sahinc) make this public
|
* RCC.71 (RCS Universal Profile Service Definition Document)
|
||||||
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public class RcsParticipantAliasChangedEvent extends RcsParticipantEvent {
|
public class RcsParticipantAliasChangedEvent extends RcsEvent {
|
||||||
|
// The ID of the participant that changed their alias
|
||||||
|
private int mParticipantId;
|
||||||
|
// The new alias of the above participant
|
||||||
|
private String mNewAlias;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link RcsParticipantAliasChangedEvent}. This event is not persisted into
|
||||||
|
* storage until {@link RcsMessageStore#persistRcsEvent(RcsEvent)} is called.
|
||||||
|
*
|
||||||
|
* @param timestamp The timestamp of when this event happened, in milliseconds passed after
|
||||||
|
* midnight, January 1st, 1970 UTC
|
||||||
|
* @param participant The {@link RcsParticipant} that got their alias changed
|
||||||
|
* @param newAlias The new alias the {@link RcsParticipant} has.
|
||||||
|
* @see RcsMessageStore#persistRcsEvent(RcsEvent)
|
||||||
|
*/
|
||||||
|
public RcsParticipantAliasChangedEvent(long timestamp, @NonNull RcsParticipant participant,
|
||||||
|
@Nullable String newAlias) {
|
||||||
|
super(timestamp);
|
||||||
|
mParticipantId = participant.getId();
|
||||||
|
mNewAlias = newAlias;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - internal constructor for queries
|
||||||
|
*/
|
||||||
|
public RcsParticipantAliasChangedEvent(long timestamp, int participantId,
|
||||||
|
@Nullable String newAlias) {
|
||||||
|
super(timestamp);
|
||||||
|
mParticipantId = participantId;
|
||||||
|
mNewAlias = newAlias;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the {@link RcsParticipant} whose alias was changed.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public RcsParticipant getParticipantId() {
|
||||||
|
return new RcsParticipant(mParticipantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the alias of the associated {@link RcsParticipant} after this event happened
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getNewAlias() {
|
||||||
|
return mNewAlias;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persists the event to the data store.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void persist() throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.call(iRcs -> iRcs.createParticipantAliasChangedEvent(
|
||||||
|
getTimestamp(), getParticipantId().getId(), getNewAlias()));
|
||||||
|
}
|
||||||
|
|
||||||
public static final Creator<RcsParticipantAliasChangedEvent> CREATOR =
|
public static final Creator<RcsParticipantAliasChangedEvent> CREATOR =
|
||||||
new Creator<RcsParticipantAliasChangedEvent>() {
|
new Creator<RcsParticipantAliasChangedEvent>() {
|
||||||
@Override
|
@Override
|
||||||
public RcsParticipantAliasChangedEvent createFromParcel(Parcel in) {
|
public RcsParticipantAliasChangedEvent createFromParcel(Parcel in) {
|
||||||
return new RcsParticipantAliasChangedEvent(in);
|
return new RcsParticipantAliasChangedEvent(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RcsParticipantAliasChangedEvent[] newArray(int size) {
|
public RcsParticipantAliasChangedEvent[] newArray(int size) {
|
||||||
return new RcsParticipantAliasChangedEvent[size];
|
return new RcsParticipantAliasChangedEvent[size];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
protected RcsParticipantAliasChangedEvent(Parcel in) {
|
protected RcsParticipantAliasChangedEvent(Parcel in) {
|
||||||
|
super(in);
|
||||||
|
mNewAlias = in.readString();
|
||||||
|
mParticipantId = in.readInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -45,5 +111,8 @@ public class RcsParticipantAliasChangedEvent extends RcsParticipantEvent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeString(mNewAlias);
|
||||||
|
dest.writeInt(mParticipantId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsParticipantEvent;
|
|
||||||
@@ -1,25 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcelable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that is associated with an {@link RcsParticipant}
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public abstract class RcsParticipantEvent implements Parcelable {
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsParticipantQueryParameters;
|
||||||
@@ -0,0 +1,310 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.CheckResult;
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.IntRange;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parameters to pass into
|
||||||
|
* {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParameters)} in order to select a
|
||||||
|
* subset of {@link RcsThread}s present in the message store.
|
||||||
|
*
|
||||||
|
* @hide TODO - make the Builder and builder() public. The rest should stay internal only.
|
||||||
|
*/
|
||||||
|
public class RcsParticipantQueryParameters implements Parcelable {
|
||||||
|
/**
|
||||||
|
* Flag to set with {@link Builder#setSortProperty(int)} to sort the results in the order of
|
||||||
|
* creation time for faster query results
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_CREATION_ORDER = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to set with {@link Builder#setSortProperty(int)} to sort depending on the
|
||||||
|
* {@link RcsParticipant} aliases
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_ALIAS = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to set with {@link Builder#setSortProperty(int)} to sort depending on the
|
||||||
|
* {@link RcsParticipant} canonical addresses
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_CANONICAL_ADDRESS = 2;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({SORT_BY_CREATION_ORDER, SORT_BY_ALIAS, SORT_BY_CANONICAL_ADDRESS})
|
||||||
|
public @interface SortingProperty {
|
||||||
|
}
|
||||||
|
|
||||||
|
// The SQL "like" statement to filter against participant aliases
|
||||||
|
private String mAliasLike;
|
||||||
|
// The SQL "like" statement to filter against canonical addresses
|
||||||
|
private String mCanonicalAddressLike;
|
||||||
|
// The property to sort the result against
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
|
// Whether to sort the result in ascending order
|
||||||
|
private boolean mIsAscending;
|
||||||
|
// The number of results to be returned from the query
|
||||||
|
private int mLimit;
|
||||||
|
// Used to limit the results to participants of a single thread
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final String PARTICIPANT_QUERY_PARAMETERS_KEY = "participant_query_parameters";
|
||||||
|
|
||||||
|
RcsParticipantQueryParameters(int rcsThreadId, String aliasLike, String canonicalAddressLike,
|
||||||
|
@SortingProperty int sortingProperty, boolean isAscending,
|
||||||
|
int limit) {
|
||||||
|
mThreadId = rcsThreadId;
|
||||||
|
mAliasLike = aliasLike;
|
||||||
|
mCanonicalAddressLike = canonicalAddressLike;
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
mLimit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
||||||
|
* the thread that the result query should be limited to.
|
||||||
|
*
|
||||||
|
* As we do not expose any sort of integer ID's to public usage, this should be hidden.
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public int getThreadId() {
|
||||||
|
return mThreadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the SQL-inspired "LIKE" clause that will be used to match
|
||||||
|
* {@link RcsParticipant}s with respect to their aliases
|
||||||
|
*
|
||||||
|
* @see RcsParticipant#getAlias()
|
||||||
|
*/
|
||||||
|
public String getAliasLike() {
|
||||||
|
return mAliasLike;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the SQL-inspired "LIKE" clause that will be used to match
|
||||||
|
* {@link RcsParticipant}s with respect to their canonical addresses.
|
||||||
|
*
|
||||||
|
* @see RcsParticipant#getCanonicalAddress()
|
||||||
|
*/
|
||||||
|
public String getCanonicalAddressLike() {
|
||||||
|
return mCanonicalAddressLike;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the number of {@link RcsParticipant}s to be returned from the query. A value
|
||||||
|
* of 0 means there is no set limit.
|
||||||
|
*/
|
||||||
|
public int getLimit() {
|
||||||
|
return mLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the property that will be used to sort the result against.
|
||||||
|
* @see SortingProperty
|
||||||
|
*/
|
||||||
|
public int getSortingProperty() {
|
||||||
|
return mSortingProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} if the result set will be sorted in ascending order,
|
||||||
|
* {@code false} if it will be sorted in descending order.
|
||||||
|
*/
|
||||||
|
public boolean getSortDirection() {
|
||||||
|
return mIsAscending;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class to build the {@link RcsParticipantQueryParameters}.
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
private String mAliasLike;
|
||||||
|
private String mCanonicalAddressLike;
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
|
private boolean mIsAscending;
|
||||||
|
private int mLimit = 100;
|
||||||
|
private int mThreadId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new builder for {@link RcsParticipantQueryParameters} to be used in
|
||||||
|
* {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParameters)}
|
||||||
|
*/
|
||||||
|
public Builder() {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limits the resulting {@link RcsParticipant}s to only the given {@link RcsThread}
|
||||||
|
*
|
||||||
|
* @param rcsThread The thread that the participants should be searched in.
|
||||||
|
* @return The same {@link Builder} to chain methods.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setThread(RcsThread rcsThread) {
|
||||||
|
mThreadId = rcsThread.getThreadId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an SQL-inspired "like" clause to match with participant aliases. Using a percent
|
||||||
|
* sign ('%') wildcard matches any sequence of zero or more characters. Using an underscore
|
||||||
|
* ('_') wildcard matches any single character. Not using any wildcards would only perform a
|
||||||
|
* string match.The input string is case-insensitive.
|
||||||
|
*
|
||||||
|
* The input "An%e" would match {@link RcsParticipant}s with names Anne, Annie, Antonie,
|
||||||
|
* while the input "An_e" would only match Anne.
|
||||||
|
*
|
||||||
|
* @param likeClause The like clause to use for matching {@link RcsParticipant} aliases.
|
||||||
|
* @return The same {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setAliasLike(String likeClause) {
|
||||||
|
mAliasLike = likeClause;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an SQL-inspired "like" clause to match with participant addresses. Using a percent
|
||||||
|
* sign ('%') wildcard matches any sequence of zero or more characters. Using an underscore
|
||||||
|
* ('_') wildcard matches any single character. Not using any wildcards would only perform a
|
||||||
|
* string match. The input string is case-insensitive.
|
||||||
|
*
|
||||||
|
* The input "+999%111" would match {@link RcsParticipant}s with addresses like "+9995111"
|
||||||
|
* or "+99955555111", while the input "+999_111" would only match "+9995111".
|
||||||
|
*
|
||||||
|
* @param likeClause The like clause to use for matching {@link RcsParticipant} canonical
|
||||||
|
* addresses.
|
||||||
|
* @return The same {@link Builder} to chain methods
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setCanonicalAddressLike(String likeClause) {
|
||||||
|
mCanonicalAddressLike = likeClause;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desired number of threads to be returned from the query. Passing in 0 will return all
|
||||||
|
* existing threads at once. The limit defaults to 100.
|
||||||
|
*
|
||||||
|
* @param limit The number to limit the query result to.
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @throws InvalidParameterException If the given limit is negative.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setResultLimit(@IntRange(from = 0) int limit)
|
||||||
|
throws InvalidParameterException {
|
||||||
|
if (limit < 0) {
|
||||||
|
throw new InvalidParameterException("The query limit must be non-negative");
|
||||||
|
}
|
||||||
|
|
||||||
|
mLimit = limit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the property where the results should be sorted against. Defaults to
|
||||||
|
* {@link RcsParticipantQueryParameters.SortingProperty#SORT_BY_CREATION_ORDER}
|
||||||
|
*
|
||||||
|
* @param sortingProperty against which property the results should be sorted
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortProperty(@SortingProperty int sortingProperty) {
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the results should be sorted ascending or descending
|
||||||
|
*
|
||||||
|
* @param isAscending whether the results should be sorted ascending
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortDirection(boolean isAscending) {
|
||||||
|
mIsAscending = isAscending;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the {@link RcsParticipantQueryParameters} to use in
|
||||||
|
* {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParameters)}
|
||||||
|
*
|
||||||
|
* @return An instance of {@link RcsParticipantQueryParameters} to use with the participant
|
||||||
|
* query.
|
||||||
|
*/
|
||||||
|
public RcsParticipantQueryParameters build() {
|
||||||
|
return new RcsParticipantQueryParameters(mThreadId, mAliasLike, mCanonicalAddressLike,
|
||||||
|
mSortingProperty, mIsAscending, mLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parcelable boilerplate below.
|
||||||
|
*/
|
||||||
|
protected RcsParticipantQueryParameters(Parcel in) {
|
||||||
|
mAliasLike = in.readString();
|
||||||
|
mCanonicalAddressLike = in.readString();
|
||||||
|
mSortingProperty = in.readInt();
|
||||||
|
mIsAscending = in.readByte() == 1;
|
||||||
|
mLimit = in.readInt();
|
||||||
|
mThreadId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsParticipantQueryParameters> CREATOR =
|
||||||
|
new Creator<RcsParticipantQueryParameters>() {
|
||||||
|
@Override
|
||||||
|
public RcsParticipantQueryParameters createFromParcel(Parcel in) {
|
||||||
|
return new RcsParticipantQueryParameters(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsParticipantQueryParameters[] newArray(int size) {
|
||||||
|
return new RcsParticipantQueryParameters[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeString(mAliasLike);
|
||||||
|
dest.writeString(mCanonicalAddressLike);
|
||||||
|
dest.writeInt(mSortingProperty);
|
||||||
|
dest.writeByte((byte) (mIsAscending ? 1 : 0));
|
||||||
|
dest.writeInt(mLimit);
|
||||||
|
dest.writeInt(mThreadId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsParticipantQueryResult;
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The result of a {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParameters)}
|
||||||
|
* call. This class allows getting the token for querying the next batch of participants in order to
|
||||||
|
* prevent handling large amounts of data at once.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class RcsParticipantQueryResult implements Parcelable {
|
||||||
|
// A token for the caller to continue their query for the next batch of results
|
||||||
|
private RcsQueryContinuationToken mContinuationToken;
|
||||||
|
// The list of participant IDs returned with this query
|
||||||
|
private List<Integer> mParticipants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
||||||
|
* to create query results
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsParticipantQueryResult(
|
||||||
|
RcsQueryContinuationToken continuationToken,
|
||||||
|
List<Integer> participants) {
|
||||||
|
mContinuationToken = continuationToken;
|
||||||
|
mParticipants = participants;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a token to call
|
||||||
|
* {@link RcsMessageStore#getRcsParticipants(RcsQueryContinuationToken)}
|
||||||
|
* to get the next batch of {@link RcsParticipant}s.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public RcsQueryContinuationToken getContinuationToken() {
|
||||||
|
return mContinuationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all the {@link RcsParticipant}s in the current query result. Call {@link
|
||||||
|
* RcsMessageStore#getRcsParticipants(RcsQueryContinuationToken)} to get the next
|
||||||
|
* batch of {@link RcsParticipant}s.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public List<RcsParticipant> getParticipants() {
|
||||||
|
List<RcsParticipant> participantList = new ArrayList<>();
|
||||||
|
for (Integer participantId : mParticipants) {
|
||||||
|
participantList.add(new RcsParticipant(participantId));
|
||||||
|
}
|
||||||
|
|
||||||
|
return participantList;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsParticipantQueryResult(Parcel in) {
|
||||||
|
mContinuationToken = in.readParcelable(
|
||||||
|
RcsQueryContinuationToken.class.getClassLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsParticipantQueryResult> CREATOR =
|
||||||
|
new Creator<RcsParticipantQueryResult>() {
|
||||||
|
@Override
|
||||||
|
public RcsParticipantQueryResult createFromParcel(Parcel in) {
|
||||||
|
return new RcsParticipantQueryResult(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsParticipantQueryResult[] newArray(int size) {
|
||||||
|
return new RcsParticipantQueryResult[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeParcelable(mContinuationToken, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 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 android.telephony.ims;
|
||||||
|
|
||||||
|
parcelable RcsQueryContinuationToken;
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.telephony.ims;
|
||||||
|
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This interface allows using the same implementation for continuation token usage in
|
||||||
|
* {@link com.android.providers.telephony.RcsProvider}
|
||||||
|
* @hide - TODO make getQueryType() and types public - the rest should stay internal
|
||||||
|
*/
|
||||||
|
public class RcsQueryContinuationToken implements Parcelable {
|
||||||
|
/**
|
||||||
|
* Denotes that this {@link RcsQueryContinuationToken} token is meant to allow continuing
|
||||||
|
* {@link RcsEvent} queries
|
||||||
|
*/
|
||||||
|
public static final int EVENT_QUERY_CONTINUATION_TOKEN_TYPE = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denotes that this {@link RcsQueryContinuationToken} token is meant to allow continuing
|
||||||
|
* {@link RcsMessage} queries
|
||||||
|
*/
|
||||||
|
public static final int MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denotes that this {@link RcsQueryContinuationToken} token is meant to allow continuing
|
||||||
|
* {@link RcsParticipant} queries
|
||||||
|
*/
|
||||||
|
public static final int PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denotes that this {@link RcsQueryContinuationToken} token is meant to allow continuing
|
||||||
|
* {@link RcsThread} queries
|
||||||
|
*/
|
||||||
|
public static final int THREAD_QUERY_CONTINUATION_TOKEN_TYPE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide - not meant for public use
|
||||||
|
*/
|
||||||
|
public static final String QUERY_CONTINUATION_TOKEN = "query_continuation_token";
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({EVENT_QUERY_CONTINUATION_TOKEN_TYPE, MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE,
|
||||||
|
PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE, THREAD_QUERY_CONTINUATION_TOKEN_TYPE})
|
||||||
|
public @interface ContinuationTokenType {}
|
||||||
|
|
||||||
|
// The type of query this token should allow to continue
|
||||||
|
private @ContinuationTokenType int mQueryType;
|
||||||
|
// The raw query string for the initial query
|
||||||
|
private final String mRawQuery;
|
||||||
|
// The number of results that is returned with each query
|
||||||
|
private final int mLimit;
|
||||||
|
// The offset value that this query should start the query from
|
||||||
|
private int mOffset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public RcsQueryContinuationToken(@ContinuationTokenType int queryType, String rawQuery,
|
||||||
|
int limit, int offset) {
|
||||||
|
mQueryType = queryType;
|
||||||
|
mRawQuery = rawQuery;
|
||||||
|
mLimit = limit;
|
||||||
|
mOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the original raw query used on {@link com.android.providers.telephony.RcsProvider}
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public String getRawQuery() {
|
||||||
|
return mRawQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns which index this continuation query should start from
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getOffset() {
|
||||||
|
return mOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increments the offset by the amount of result rows returned with the continuation query for
|
||||||
|
* the next query.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void incrementOffset() {
|
||||||
|
mOffset += mLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the type of query that this {@link RcsQueryContinuationToken} is intended to be used
|
||||||
|
* to continue.
|
||||||
|
*/
|
||||||
|
public @ContinuationTokenType int getQueryType() {
|
||||||
|
return mQueryType;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RcsQueryContinuationToken(Parcel in) {
|
||||||
|
mQueryType = in.readInt();
|
||||||
|
mRawQuery = in.readString();
|
||||||
|
mLimit = in.readInt();
|
||||||
|
mOffset = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsQueryContinuationToken> CREATOR =
|
||||||
|
new Creator<RcsQueryContinuationToken>() {
|
||||||
|
@Override
|
||||||
|
public RcsQueryContinuationToken createFromParcel(Parcel in) {
|
||||||
|
return new RcsQueryContinuationToken(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsQueryContinuationToken[] newArray(int size) {
|
||||||
|
return new RcsQueryContinuationToken[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(mQueryType);
|
||||||
|
dest.writeString(mRawQuery);
|
||||||
|
dest.writeInt(mLimit);
|
||||||
|
dest.writeInt(mOffset);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsTextPart;
|
|
||||||
@@ -1,48 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A part of a composite {@link RcsMessage} that holds a string
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsTextPart extends RcsPart {
|
|
||||||
public static final Creator<RcsTextPart> CREATOR = new Creator<RcsTextPart>() {
|
|
||||||
@Override
|
|
||||||
public RcsTextPart createFromParcel(Parcel in) {
|
|
||||||
return new RcsTextPart(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsTextPart[] newArray(int size) {
|
|
||||||
return new RcsTextPart[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsTextPart(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony;
|
|
||||||
|
|
||||||
parcelable RcsThread;
|
|
||||||
@@ -16,60 +16,117 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_1_TO_1;
|
||||||
import android.os.Parcelable;
|
import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_GROUP;
|
||||||
import android.util.Log;
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.WorkerThread;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RcsThread represents a single RCS conversation thread. It holds messages that were sent and
|
* RcsThread represents a single RCS conversation thread. It holds messages that were sent and
|
||||||
* received and events that occurred on that thread.
|
* received and events that occurred on that thread.
|
||||||
* @hide - TODO(sahinc) make this public
|
*
|
||||||
|
* @hide - TODO(109759350) make this public
|
||||||
*/
|
*/
|
||||||
public abstract class RcsThread implements Parcelable {
|
public abstract class RcsThread {
|
||||||
// Since this is an abstract class that gets parcelled, the sub-classes need to write these
|
// The rcs_participant_thread_id that represents this thread in the database
|
||||||
// magic values into the parcel so that we know which type to unparcel into.
|
|
||||||
protected static final int RCS_1_TO_1_TYPE = 998;
|
|
||||||
protected static final int RCS_GROUP_TYPE = 999;
|
|
||||||
|
|
||||||
protected int mThreadId;
|
protected int mThreadId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
protected RcsThread(int threadId) {
|
protected RcsThread(int threadId) {
|
||||||
mThreadId = threadId;
|
mThreadId = threadId;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected RcsThread(Parcel in) {
|
/**
|
||||||
mThreadId = in.readInt();
|
* @return Returns the summary of the latest message in this {@link RcsThread} packaged in an
|
||||||
|
* {@link RcsMessageSnippet} object
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsMessageSnippet getSnippet() throws RcsMessageStoreException {
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessageSnippet(mThreadId));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<RcsThread> CREATOR = new Creator<RcsThread>() {
|
/**
|
||||||
@Override
|
* Adds a new {@link RcsIncomingMessage} to this RcsThread and persists it in storage.
|
||||||
public RcsThread createFromParcel(Parcel in) {
|
*
|
||||||
int type = in.readInt();
|
* @throws RcsMessageStoreException if the message could not be persisted into storage.
|
||||||
|
*/
|
||||||
switch (type) {
|
@WorkerThread
|
||||||
case RCS_1_TO_1_TYPE:
|
@NonNull
|
||||||
return new Rcs1To1Thread(in);
|
public RcsIncomingMessage addIncomingMessage(
|
||||||
case RCS_GROUP_TYPE:
|
@NonNull RcsIncomingMessageCreationParameters rcsIncomingMessageCreationParameters)
|
||||||
return new RcsGroupThread(in);
|
throws RcsMessageStoreException {
|
||||||
default:
|
return new RcsIncomingMessage(RcsControllerCall.call(iRcs -> iRcs.addIncomingMessage(
|
||||||
Log.e(RcsMessageStore.TAG, "Cannot unparcel RcsThread, wrong type: " + type);
|
mThreadId, rcsIncomingMessageCreationParameters)));
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsThread[] newArray(int size) {
|
|
||||||
return new RcsThread[0];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
* Adds a new {@link RcsOutgoingMessage} to this RcsThread and persists it in storage.
|
||||||
dest.writeInt(mThreadId);
|
*
|
||||||
|
* @throws RcsMessageStoreException if the message could not be persisted into storage.
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsOutgoingMessage addOutgoingMessage(
|
||||||
|
@NonNull RcsMessageCreationParameters rcsMessageCreationParameters)
|
||||||
|
throws RcsMessageStoreException {
|
||||||
|
int messageId = RcsControllerCall.call(iRcs -> iRcs.addOutgoingMessage(
|
||||||
|
mThreadId, rcsMessageCreationParameters));
|
||||||
|
|
||||||
|
return new RcsOutgoingMessage(messageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes an {@link RcsMessage} from this RcsThread and updates the storage.
|
||||||
|
*
|
||||||
|
* @param rcsMessage The message to delete from the thread
|
||||||
|
* @throws RcsMessageStoreException if the message could not be deleted
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
public void deleteMessage(@NonNull RcsMessage rcsMessage) throws RcsMessageStoreException {
|
||||||
|
RcsControllerCall.callWithNoReturn(
|
||||||
|
iRcs -> iRcs.deleteMessage(rcsMessage.getId(), rcsMessage.isIncoming(), mThreadId,
|
||||||
|
isGroup()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function for loading all the {@link RcsMessage}s in this {@link RcsThread}. For
|
||||||
|
* a more detailed and paginated query, please use
|
||||||
|
* {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParameters)}
|
||||||
|
*
|
||||||
|
* @return Loads the {@link RcsMessage}s in this thread and returns them in an immutable list.
|
||||||
|
* @throws RcsMessageStoreException if the messages could not be read from the storage
|
||||||
|
*/
|
||||||
|
@WorkerThread
|
||||||
|
@NonNull
|
||||||
|
public RcsMessageQueryResult getMessages() throws RcsMessageStoreException {
|
||||||
|
RcsMessageQueryParameters queryParameters =
|
||||||
|
new RcsMessageQueryParameters.Builder().setThread(this).build();
|
||||||
|
return RcsControllerCall.call(iRcs -> iRcs.getMessages(queryParameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns whether this is a group thread or not
|
||||||
|
*/
|
||||||
|
public abstract boolean isGroup();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public int getThreadId() {
|
||||||
|
return mThreadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int getThreadType() {
|
||||||
|
return isGroup() ? THREAD_TYPE_GROUP : THREAD_TYPE_1_TO_1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadEvent;
|
|
||||||
@@ -1,25 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcelable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that happened on an {@link RcsThread}.
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public abstract class RcsThreadEvent implements Parcelable {
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadIconChangedEvent;
|
|
||||||
@@ -1,49 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that indicates an {@link RcsGroupThread}'s icon was changed.
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsThreadIconChangedEvent extends RcsThreadEvent {
|
|
||||||
public static final Creator<RcsThreadIconChangedEvent> CREATOR =
|
|
||||||
new Creator<RcsThreadIconChangedEvent>() {
|
|
||||||
@Override
|
|
||||||
public RcsThreadIconChangedEvent createFromParcel(Parcel in) {
|
|
||||||
return new RcsThreadIconChangedEvent(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsThreadIconChangedEvent[] newArray(int size) {
|
|
||||||
return new RcsThreadIconChangedEvent[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsThreadIconChangedEvent(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadNameChangedEvent;
|
|
||||||
@@ -1,49 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that indicates an {@link RcsGroupThread}'s name was changed.
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsThreadNameChangedEvent extends RcsThreadEvent {
|
|
||||||
public static final Creator<RcsThreadNameChangedEvent> CREATOR =
|
|
||||||
new Creator<RcsThreadNameChangedEvent>() {
|
|
||||||
@Override
|
|
||||||
public RcsThreadNameChangedEvent createFromParcel(Parcel in) {
|
|
||||||
return new RcsThreadNameChangedEvent(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsThreadNameChangedEvent[] newArray(int size) {
|
|
||||||
return new RcsThreadNameChangedEvent[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsThreadNameChangedEvent(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadParticipantJoinedEvent;
|
|
||||||
@@ -1,49 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that indicates an RCS participant has joined an {@link RcsGroupThread}.
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsThreadParticipantJoinedEvent extends RcsThreadEvent {
|
|
||||||
public static final Creator<RcsThreadParticipantJoinedEvent> CREATOR =
|
|
||||||
new Creator<RcsThreadParticipantJoinedEvent>() {
|
|
||||||
@Override
|
|
||||||
public RcsThreadParticipantJoinedEvent createFromParcel(Parcel in) {
|
|
||||||
return new RcsThreadParticipantJoinedEvent(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsThreadParticipantJoinedEvent[] newArray(int size) {
|
|
||||||
return new RcsThreadParticipantJoinedEvent[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsThreadParticipantJoinedEvent(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadParticipantLeftEvent;
|
|
||||||
@@ -1,49 +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 android.telephony.ims;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event that indicates an RCS participant has left an {@link RcsGroupThread}.
|
|
||||||
* @hide - TODO(sahinc) make this public
|
|
||||||
*/
|
|
||||||
public class RcsThreadParticipantLeftEvent extends RcsThreadEvent {
|
|
||||||
public static final Creator<RcsThreadParticipantLeftEvent> CREATOR =
|
|
||||||
new Creator<RcsThreadParticipantLeftEvent>() {
|
|
||||||
@Override
|
|
||||||
public RcsThreadParticipantLeftEvent createFromParcel(Parcel in) {
|
|
||||||
return new RcsThreadParticipantLeftEvent(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RcsThreadParticipantLeftEvent[] newArray(int size) {
|
|
||||||
return new RcsThreadParticipantLeftEvent[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected RcsThreadParticipantLeftEvent(Parcel in) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
**
|
|
||||||
** Copyright 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 android.telephony.ims;
|
|
||||||
|
|
||||||
parcelable RcsThreadQueryContinuationToken;
|
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
/*
|
/*
|
||||||
**
|
*
|
||||||
** Copyright 2018, The Android Open Source Project
|
* Copyright 2019, The Android Open Source Project
|
||||||
**
|
*
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
** you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
** You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
**
|
*
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
**
|
*
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
** See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
** limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -17,72 +17,133 @@
|
|||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
import android.annotation.CheckResult;
|
import android.annotation.CheckResult;
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.annotation.IntRange;
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.security.InvalidParameterException;
|
import java.security.InvalidParameterException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The parameters to pass into {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParameters)} in
|
* The parameters to pass into {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParameters)} in
|
||||||
* order to select a subset of {@link RcsThread}s present in the message store.
|
* order to select a subset of {@link RcsThread}s present in the message store.
|
||||||
|
*
|
||||||
* @hide TODO - make the Builder and builder() public. The rest should stay internal only.
|
* @hide TODO - make the Builder and builder() public. The rest should stay internal only.
|
||||||
*/
|
*/
|
||||||
public class RcsThreadQueryParameters implements Parcelable {
|
public class RcsThreadQueryParameters implements Parcelable {
|
||||||
private final boolean mIsGroup;
|
/**
|
||||||
private final Set<RcsParticipant> mRcsParticipants;
|
* Bitmask flag to be used with {@link Builder#setThreadType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParameters)} return
|
||||||
|
* {@link RcsGroupThread}s.
|
||||||
|
*/
|
||||||
|
public static final int THREAD_TYPE_GROUP = 0x0001;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask flag to be used with {@link Builder#setThreadType(int)} to make
|
||||||
|
* {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParameters)} return
|
||||||
|
* {@link Rcs1To1Thread}s.
|
||||||
|
*/
|
||||||
|
public static final int THREAD_TYPE_1_TO_1 = 0x0002;
|
||||||
|
|
||||||
|
// The type of threads to be filtered with the query
|
||||||
|
private final int mThreadType;
|
||||||
|
// The list of participants that are expected in the resulting threads
|
||||||
|
private final List<Integer> mRcsParticipantIds;
|
||||||
|
// The number of RcsThread's that should be returned with this query
|
||||||
private final int mLimit;
|
private final int mLimit;
|
||||||
|
// The property which the result of the query should be sorted against
|
||||||
|
private final @SortingProperty int mSortingProperty;
|
||||||
|
// Whether the sorting should be done in ascending
|
||||||
private final boolean mIsAscending;
|
private final boolean mIsAscending;
|
||||||
|
|
||||||
RcsThreadQueryParameters(boolean isGroup, Set<RcsParticipant> participants, int limit,
|
/**
|
||||||
boolean isAscending) {
|
* Flag to be used with {@link Builder#setSortProperty(int)} to denote that the results should
|
||||||
mIsGroup = isGroup;
|
* be sorted in the order of {@link RcsThread} creation time for faster results.
|
||||||
mRcsParticipants = participants;
|
*/
|
||||||
|
public static final int SORT_BY_CREATION_ORDER = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to be used with {@link Builder#setSortProperty(int)} to denote that the results should
|
||||||
|
* be sorted according to the timestamp of {@link RcsThread#getSnippet()}
|
||||||
|
*/
|
||||||
|
public static final int SORT_BY_TIMESTAMP = 1;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({SORT_BY_CREATION_ORDER, SORT_BY_TIMESTAMP})
|
||||||
|
public @interface SortingProperty {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final String THREAD_QUERY_PARAMETERS_KEY = "thread_query_parameters";
|
||||||
|
|
||||||
|
RcsThreadQueryParameters(int threadType, Set<RcsParticipant> participants,
|
||||||
|
int limit, int sortingProperty, boolean isAscending) {
|
||||||
|
mThreadType = threadType;
|
||||||
|
mRcsParticipantIds = convertParticipantSetToIdList(participants);
|
||||||
mLimit = limit;
|
mLimit = limit;
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
mIsAscending = isAscending;
|
mIsAscending = isAscending;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private static List<Integer> convertParticipantSetToIdList(Set<RcsParticipant> participants) {
|
||||||
* Returns a new builder to build a query with.
|
List<Integer> ids = new ArrayList<>(participants.size());
|
||||||
* TODO - make public
|
for (RcsParticipant participant : participants) {
|
||||||
*/
|
ids.add(participant.getId());
|
||||||
public static Builder builder() {
|
}
|
||||||
return new Builder();
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
||||||
* the list of participants.
|
* the list of participant IDs.
|
||||||
* @hide
|
*
|
||||||
|
* As we don't expose any integer ID's to API users, this should stay hidden
|
||||||
|
*
|
||||||
|
* @hide - not meant for public use
|
||||||
*/
|
*/
|
||||||
public Set<RcsParticipant> getRcsParticipants() {
|
public List<Integer> getRcsParticipantsIds() {
|
||||||
return mRcsParticipants;
|
return Collections.unmodifiableList(mRcsParticipantIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
* @return Returns the bitmask flag for types of {@link RcsThread}s that this query should
|
||||||
* whether group threads should be queried
|
* return.
|
||||||
* @hide
|
|
||||||
*/
|
*/
|
||||||
public boolean isGroupThread() {
|
public int getThreadType() {
|
||||||
return mIsGroup;
|
return mThreadType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to get
|
* @return Returns the number of {@link RcsThread}s to be returned from the query. A value
|
||||||
* the number of tuples the result query should be limited to.
|
* of 0 means there is no set limit.
|
||||||
*/
|
*/
|
||||||
public int getLimit() {
|
public int getLimit() {
|
||||||
return mLimit;
|
return mLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used in {@link com.android.internal.telephony.ims.RcsMessageStoreController} to
|
* @return Returns the property that will be used to sort the result against.
|
||||||
* determine the sort order.
|
* @see SortingProperty
|
||||||
*/
|
*/
|
||||||
public boolean isAscending() {
|
public @SortingProperty int getSortingProperty() {
|
||||||
|
return mSortingProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns {@code true} if the result set will be sorted in ascending order,
|
||||||
|
* {@code false} if it will be sorted in descending order.
|
||||||
|
*/
|
||||||
|
public boolean getSortDirection() {
|
||||||
return mIsAscending;
|
return mIsAscending;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,64 +151,74 @@ public class RcsThreadQueryParameters implements Parcelable {
|
|||||||
* A helper class to build the {@link RcsThreadQueryParameters}.
|
* A helper class to build the {@link RcsThreadQueryParameters}.
|
||||||
*/
|
*/
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
private boolean mIsGroupThread;
|
private int mThreadType;
|
||||||
private Set<RcsParticipant> mParticipants;
|
private Set<RcsParticipant> mParticipants;
|
||||||
private int mLimit = 100;
|
private int mLimit = 100;
|
||||||
|
private @SortingProperty int mSortingProperty;
|
||||||
private boolean mIsAscending;
|
private boolean mIsAscending;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Package private constructor for {@link RcsThreadQueryParameters.Builder}. To obtain this,
|
* Constructs a {@link RcsThreadQueryParameters.Builder} to help build an
|
||||||
* {@link RcsThreadQueryParameters#builder()} needs to be called.
|
* {@link RcsThreadQueryParameters}
|
||||||
*/
|
*/
|
||||||
Builder() {
|
public Builder() {
|
||||||
mParticipants = new HashSet<>();
|
mParticipants = new HashSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Limits the query to only return group threads.
|
* Limits the query to only return group threads.
|
||||||
* @param isGroupThread Whether to limit the query result to group threads.
|
*
|
||||||
|
* @param threadType Whether to limit the query result to group threads.
|
||||||
* @return The same instance of the builder to chain parameters.
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
* @see RcsThreadQueryParameters#THREAD_TYPE_GROUP
|
||||||
|
* @see RcsThreadQueryParameters#THREAD_TYPE_1_TO_1
|
||||||
*/
|
*/
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public Builder isGroupThread(boolean isGroupThread) {
|
public Builder setThreadType(int threadType) {
|
||||||
mIsGroupThread = isGroupThread;
|
mThreadType = threadType;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Limits the query to only return threads that contain the given participant.
|
* Limits the query to only return threads that contain the given participant. If this
|
||||||
|
* property was not set, participants will not be taken into account while querying for
|
||||||
|
* threads.
|
||||||
|
*
|
||||||
* @param participant The participant that must be included in all of the returned threads.
|
* @param participant The participant that must be included in all of the returned threads.
|
||||||
* @return The same instance of the builder to chain parameters.
|
* @return The same instance of the builder to chain parameters.
|
||||||
*/
|
*/
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public Builder withParticipant(RcsParticipant participant) {
|
public Builder setParticipant(@NonNull RcsParticipant participant) {
|
||||||
mParticipants.add(participant);
|
mParticipants.add(participant);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Limits the query to only return threads that contain the given list of participants.
|
* Limits the query to only return threads that contain the given list of participants. If
|
||||||
|
* this property was not set, participants will not be taken into account while querying
|
||||||
|
* for threads.
|
||||||
|
*
|
||||||
* @param participants An iterable list of participants that must be included in all of the
|
* @param participants An iterable list of participants that must be included in all of the
|
||||||
* returned threads.
|
* returned threads.
|
||||||
* @return The same instance of the builder to chain parameters.
|
* @return The same instance of the builder to chain parameters.
|
||||||
*/
|
*/
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public Builder withParticipants(Iterable<RcsParticipant> participants) {
|
public Builder setParticipants(@NonNull List<RcsParticipant> participants) {
|
||||||
for (RcsParticipant participant : participants) {
|
mParticipants.addAll(participants);
|
||||||
mParticipants.add(participant);
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Desired number of threads to be returned from the query. Passing in 0 will return all
|
* Desired number of threads to be returned from the query. Passing in 0 will return all
|
||||||
* existing threads at once. The limit defaults to 100.
|
* existing threads at once. The limit defaults to 100.
|
||||||
|
*
|
||||||
* @param limit The number to limit the query result to.
|
* @param limit The number to limit the query result to.
|
||||||
* @return The same instance of the builder to chain parameters.
|
* @return The same instance of the builder to chain parameters.
|
||||||
* @throws InvalidParameterException If the given limit is negative.
|
* @throws InvalidParameterException If the given limit is negative.
|
||||||
*/
|
*/
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public Builder limitResultsTo(int limit) throws InvalidParameterException {
|
public Builder setResultLimit(@IntRange(from = 0) int limit)
|
||||||
|
throws InvalidParameterException {
|
||||||
if (limit < 0) {
|
if (limit < 0) {
|
||||||
throw new InvalidParameterException("The query limit must be non-negative");
|
throw new InvalidParameterException("The query limit must be non-negative");
|
||||||
}
|
}
|
||||||
@@ -157,15 +228,26 @@ public class RcsThreadQueryParameters implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts the results returned from the query via thread IDs.
|
* Sets the property where the results should be sorted against. Defaults to
|
||||||
|
* {@link SortingProperty#SORT_BY_CREATION_ORDER}
|
||||||
*
|
*
|
||||||
* TODO - add sorting support for other fields
|
* @param sortingProperty whether to sort in ascending order or not
|
||||||
*
|
|
||||||
* @param isAscending whether to sort in ascending order or not
|
|
||||||
* @return The same instance of the builder to chain parameters.
|
* @return The same instance of the builder to chain parameters.
|
||||||
*/
|
*/
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public Builder sort(boolean isAscending) {
|
public Builder setSortProperty(@SortingProperty int sortingProperty) {
|
||||||
|
mSortingProperty = sortingProperty;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the results should be sorted ascending or descending
|
||||||
|
*
|
||||||
|
* @param isAscending whether the results should be sorted ascending
|
||||||
|
* @return The same instance of the builder to chain parameters.
|
||||||
|
*/
|
||||||
|
@CheckResult
|
||||||
|
public Builder setSortDirection(boolean isAscending) {
|
||||||
mIsAscending = isAscending;
|
mIsAscending = isAscending;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -177,8 +259,8 @@ public class RcsThreadQueryParameters implements Parcelable {
|
|||||||
* @return An instance of {@link RcsThreadQueryParameters} to use with the thread query.
|
* @return An instance of {@link RcsThreadQueryParameters} to use with the thread query.
|
||||||
*/
|
*/
|
||||||
public RcsThreadQueryParameters build() {
|
public RcsThreadQueryParameters build() {
|
||||||
return new RcsThreadQueryParameters(
|
return new RcsThreadQueryParameters(mThreadType, mParticipants, mLimit,
|
||||||
mIsGroupThread, mParticipants, mLimit, mIsAscending);
|
mSortingProperty, mIsAscending);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,14 +268,12 @@ public class RcsThreadQueryParameters implements Parcelable {
|
|||||||
* Parcelable boilerplate below.
|
* Parcelable boilerplate below.
|
||||||
*/
|
*/
|
||||||
protected RcsThreadQueryParameters(Parcel in) {
|
protected RcsThreadQueryParameters(Parcel in) {
|
||||||
mIsGroup = in.readBoolean();
|
mThreadType = in.readInt();
|
||||||
|
mRcsParticipantIds = new ArrayList<>();
|
||||||
ArrayList<RcsParticipant> participantArrayList = new ArrayList<>();
|
in.readList(mRcsParticipantIds, Integer.class.getClassLoader());
|
||||||
in.readTypedList(participantArrayList, RcsParticipant.CREATOR);
|
|
||||||
mRcsParticipants = new HashSet<>(participantArrayList);
|
|
||||||
|
|
||||||
mLimit = in.readInt();
|
mLimit = in.readInt();
|
||||||
mIsAscending = in.readBoolean();
|
mSortingProperty = in.readInt();
|
||||||
|
mIsAscending = in.readByte() == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<RcsThreadQueryParameters> CREATOR =
|
public static final Creator<RcsThreadQueryParameters> CREATOR =
|
||||||
@@ -216,10 +296,10 @@ public class RcsThreadQueryParameters implements Parcelable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeBoolean(mIsGroup);
|
dest.writeInt(mThreadType);
|
||||||
dest.writeTypedList(new ArrayList<>(mRcsParticipants));
|
dest.writeList(mRcsParticipantIds);
|
||||||
dest.writeInt(mLimit);
|
dest.writeInt(mLimit);
|
||||||
dest.writeBoolean(mIsAscending);
|
dest.writeInt(mSortingProperty);
|
||||||
|
dest.writeByte((byte) (mIsAscending ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
/*
|
/*
|
||||||
**
|
*
|
||||||
** Copyright 2018, The Android Open Source Project
|
* Copyright 2019, The Android Open Source Project
|
||||||
**
|
*
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
** you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
** You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
**
|
*
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
**
|
*
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
** See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
** limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -16,22 +16,30 @@
|
|||||||
|
|
||||||
package android.telephony.ims;
|
package android.telephony.ims;
|
||||||
|
|
||||||
|
import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_1_TO_1;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import com.android.ims.RcsTypeIdPair;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The result of a {@link RcsMessageStore#getRcsThreads(RcsThreadQueryContinuationToken,
|
* The result of a {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParameters)}
|
||||||
* RcsThreadQueryParameters)}
|
|
||||||
* call. This class allows getting the token for querying the next batch of threads in order to
|
* call. This class allows getting the token for querying the next batch of threads in order to
|
||||||
* prevent handling large amounts of data at once.
|
* prevent handling large amounts of data at once.
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public class RcsThreadQueryResult implements Parcelable {
|
public class RcsThreadQueryResult implements Parcelable {
|
||||||
private RcsThreadQueryContinuationToken mContinuationToken;
|
// A token for the caller to continue their query for the next batch of results
|
||||||
private List<RcsThread> mRcsThreads;
|
private RcsQueryContinuationToken mContinuationToken;
|
||||||
|
// The list of thread IDs returned with this query
|
||||||
|
private List<RcsTypeIdPair> mRcsThreadIds;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
* Internal constructor for {@link com.android.internal.telephony.ims.RcsMessageStoreController}
|
||||||
@@ -40,31 +48,47 @@ public class RcsThreadQueryResult implements Parcelable {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public RcsThreadQueryResult(
|
public RcsThreadQueryResult(
|
||||||
RcsThreadQueryContinuationToken continuationToken, List<RcsThread> rcsThreads) {
|
RcsQueryContinuationToken continuationToken,
|
||||||
|
List<RcsTypeIdPair> rcsThreadIds) {
|
||||||
mContinuationToken = continuationToken;
|
mContinuationToken = continuationToken;
|
||||||
mRcsThreads = rcsThreads;
|
mRcsThreadIds = rcsThreadIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a token to call
|
* Returns a token to call
|
||||||
* {@link RcsMessageStore#getRcsThreads(RcsThreadQueryContinuationToken)}
|
* {@link RcsMessageStore#getRcsThreads(RcsQueryContinuationToken)}
|
||||||
* to get the next batch of {@link RcsThread}s.
|
* to get the next batch of {@link RcsThread}s.
|
||||||
*/
|
*/
|
||||||
public RcsThreadQueryContinuationToken nextChunkToken() {
|
@Nullable
|
||||||
|
public RcsQueryContinuationToken getContinuationToken() {
|
||||||
return mContinuationToken;
|
return mContinuationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all the RcsThreads in the current query result. Call {@link
|
* Returns all the RcsThreads in the current query result. Call {@link
|
||||||
* RcsMessageStore#getRcsThreads(RcsThreadQueryContinuationToken)} to get the next batch of
|
* RcsMessageStore#getRcsThreads(RcsQueryContinuationToken)} to get the next batch of
|
||||||
* {@link RcsThread}s.
|
* {@link RcsThread}s.
|
||||||
*/
|
*/
|
||||||
|
@NonNull
|
||||||
public List<RcsThread> getThreads() {
|
public List<RcsThread> getThreads() {
|
||||||
return mRcsThreads;
|
List<RcsThread> rcsThreads = new ArrayList<>();
|
||||||
|
|
||||||
|
for (RcsTypeIdPair typeIdPair : mRcsThreadIds) {
|
||||||
|
if (typeIdPair.getType() == THREAD_TYPE_1_TO_1) {
|
||||||
|
rcsThreads.add(new Rcs1To1Thread(typeIdPair.getId()));
|
||||||
|
} else {
|
||||||
|
rcsThreads.add(new RcsGroupThread(typeIdPair.getId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rcsThreads;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected RcsThreadQueryResult(Parcel in) {
|
protected RcsThreadQueryResult(Parcel in) {
|
||||||
// TODO - implement
|
mContinuationToken = in.readParcelable(
|
||||||
|
RcsQueryContinuationToken.class.getClassLoader());
|
||||||
|
mRcsThreadIds = new ArrayList<>();
|
||||||
|
in.readList(mRcsThreadIds, Integer.class.getClassLoader());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<RcsThreadQueryResult> CREATOR =
|
public static final Creator<RcsThreadQueryResult> CREATOR =
|
||||||
@@ -87,6 +111,7 @@ public class RcsThreadQueryResult implements Parcelable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
// TODO - implement
|
dest.writeParcelable(mContinuationToken, flags);
|
||||||
|
dest.writeList(mRcsThreadIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,18 @@
|
|||||||
|
|
||||||
package android.telephony.ims.aidl;
|
package android.telephony.ims.aidl;
|
||||||
|
|
||||||
import android.telephony.ims.RcsParticipant;
|
import android.net.Uri;
|
||||||
import android.telephony.ims.Rcs1To1Thread;
|
import android.telephony.ims.RcsEventQueryParameters;
|
||||||
import android.telephony.ims.RcsThreadQueryContinuationToken;
|
import android.telephony.ims.RcsEventQueryResult;
|
||||||
|
import android.telephony.ims.RcsFileTransferCreationParameters;
|
||||||
|
import android.telephony.ims.RcsIncomingMessageCreationParameters;
|
||||||
|
import android.telephony.ims.RcsMessageCreationParameters;
|
||||||
|
import android.telephony.ims.RcsMessageSnippet;
|
||||||
|
import android.telephony.ims.RcsMessageQueryParameters;
|
||||||
|
import android.telephony.ims.RcsMessageQueryResult;
|
||||||
|
import android.telephony.ims.RcsParticipantQueryParameters;
|
||||||
|
import android.telephony.ims.RcsParticipantQueryResult;
|
||||||
|
import android.telephony.ims.RcsQueryContinuationToken;
|
||||||
import android.telephony.ims.RcsThreadQueryParameters;
|
import android.telephony.ims.RcsThreadQueryParameters;
|
||||||
import android.telephony.ims.RcsThreadQueryResult;
|
import android.telephony.ims.RcsThreadQueryResult;
|
||||||
|
|
||||||
@@ -27,23 +36,231 @@ import android.telephony.ims.RcsThreadQueryResult;
|
|||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
interface IRcs {
|
interface IRcs {
|
||||||
|
/////////////////////////
|
||||||
// RcsMessageStore APIs
|
// RcsMessageStore APIs
|
||||||
|
/////////////////////////
|
||||||
RcsThreadQueryResult getRcsThreads(in RcsThreadQueryParameters queryParameters);
|
RcsThreadQueryResult getRcsThreads(in RcsThreadQueryParameters queryParameters);
|
||||||
|
|
||||||
RcsThreadQueryResult getRcsThreadsWithToken(
|
RcsThreadQueryResult getRcsThreadsWithToken(
|
||||||
in RcsThreadQueryContinuationToken continuationToken);
|
in RcsQueryContinuationToken continuationToken);
|
||||||
|
|
||||||
void deleteThread(int threadId);
|
RcsParticipantQueryResult getParticipants(in RcsParticipantQueryParameters queryParameters);
|
||||||
|
|
||||||
Rcs1To1Thread createRcs1To1Thread(in RcsParticipant participant);
|
RcsParticipantQueryResult getParticipantsWithToken(
|
||||||
|
in RcsQueryContinuationToken continuationToken);
|
||||||
|
|
||||||
|
RcsMessageQueryResult getMessages(in RcsMessageQueryParameters queryParameters);
|
||||||
|
|
||||||
|
RcsMessageQueryResult getMessagesWithToken(
|
||||||
|
in RcsQueryContinuationToken continuationToken);
|
||||||
|
|
||||||
|
RcsEventQueryResult getEvents(in RcsEventQueryParameters queryParameters);
|
||||||
|
|
||||||
|
RcsEventQueryResult getEventsWithToken(
|
||||||
|
in RcsQueryContinuationToken continuationToken);
|
||||||
|
|
||||||
|
// returns true if the thread was successfully deleted
|
||||||
|
boolean deleteThread(int threadId, int threadType);
|
||||||
|
|
||||||
|
// Creates an Rcs1To1Thread and returns its row ID
|
||||||
|
int createRcs1To1Thread(int participantId);
|
||||||
|
|
||||||
|
// Creates an RcsGroupThread and returns its row ID
|
||||||
|
int createGroupThread(in int[] participantIds, String groupName, in Uri groupIcon);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
// RcsThread APIs
|
// RcsThread APIs
|
||||||
int getMessageCount(int rcsThreadId);
|
/////////////////////////
|
||||||
|
|
||||||
|
// Creates a new RcsIncomingMessage on the given thread and returns its row ID
|
||||||
|
int addIncomingMessage(int rcsThreadId,
|
||||||
|
in RcsIncomingMessageCreationParameters rcsIncomingMessageCreationParameters);
|
||||||
|
|
||||||
|
// Creates a new RcsOutgoingMessage on the given thread and returns its row ID
|
||||||
|
int addOutgoingMessage(int rcsThreadId,
|
||||||
|
in RcsMessageCreationParameters rcsMessageCreationParameters);
|
||||||
|
|
||||||
|
// TODO: modify RcsProvider URI's to allow deleting a message without specifying its thread
|
||||||
|
void deleteMessage(int rcsMessageId, boolean isIncoming, int rcsThreadId, boolean isGroup);
|
||||||
|
|
||||||
|
RcsMessageSnippet getMessageSnippet(int rcsThreadId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// Rcs1To1Thread APIs
|
||||||
|
/////////////////////////
|
||||||
|
void set1To1ThreadFallbackThreadId(int rcsThreadId, long fallbackId);
|
||||||
|
|
||||||
|
long get1To1ThreadFallbackThreadId(int rcsThreadId);
|
||||||
|
|
||||||
|
int get1To1ThreadOtherParticipantId(int rcsThreadId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// RcsGroupThread APIs
|
||||||
|
/////////////////////////
|
||||||
|
void setGroupThreadName(int rcsThreadId, String groupName);
|
||||||
|
|
||||||
|
String getGroupThreadName(int rcsThreadId);
|
||||||
|
|
||||||
|
void setGroupThreadIcon(int rcsThreadId, in Uri groupIcon);
|
||||||
|
|
||||||
|
Uri getGroupThreadIcon(int rcsThreadId);
|
||||||
|
|
||||||
|
void setGroupThreadOwner(int rcsThreadId, int participantId);
|
||||||
|
|
||||||
|
int getGroupThreadOwner(int rcsThreadId);
|
||||||
|
|
||||||
|
void setGroupThreadConferenceUri(int rcsThreadId, in Uri conferenceUri);
|
||||||
|
|
||||||
|
Uri getGroupThreadConferenceUri(int rcsThreadId);
|
||||||
|
|
||||||
|
void addParticipantToGroupThread(int rcsThreadId, int participantId);
|
||||||
|
|
||||||
|
void removeParticipantFromGroupThread(int rcsThreadId, int participantId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
// RcsParticipant APIs
|
// RcsParticipant APIs
|
||||||
RcsParticipant createRcsParticipant(String canonicalAddress);
|
/////////////////////////
|
||||||
|
|
||||||
void updateRcsParticipantCanonicalAddress(int id, String canonicalAddress);
|
// Creates a new RcsParticipant and returns its rowId
|
||||||
|
int createRcsParticipant(String canonicalAddress, String alias);
|
||||||
|
|
||||||
void updateRcsParticipantAlias(int id, String alias);
|
String getRcsParticipantCanonicalAddress(int participantId);
|
||||||
|
|
||||||
|
String getRcsParticipantAlias(int participantId);
|
||||||
|
|
||||||
|
void setRcsParticipantAlias(int id, String alias);
|
||||||
|
|
||||||
|
String getRcsParticipantContactId(int participantId);
|
||||||
|
|
||||||
|
void setRcsParticipantContactId(int participantId, String contactId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// RcsMessage APIs
|
||||||
|
/////////////////////////
|
||||||
|
void setMessageSubId(int messageId, boolean isIncoming, int subId);
|
||||||
|
|
||||||
|
int getMessageSubId(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setMessageStatus(int messageId, boolean isIncoming, int status);
|
||||||
|
|
||||||
|
int getMessageStatus(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setMessageOriginationTimestamp(int messageId, boolean isIncoming, long originationTimestamp);
|
||||||
|
|
||||||
|
long getMessageOriginationTimestamp(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setGlobalMessageIdForMessage(int messageId, boolean isIncoming, String globalId);
|
||||||
|
|
||||||
|
String getGlobalMessageIdForMessage(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setMessageArrivalTimestamp(int messageId, boolean isIncoming, long arrivalTimestamp);
|
||||||
|
|
||||||
|
long getMessageArrivalTimestamp(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setMessageSeenTimestamp(int messageId, boolean isIncoming, long seenTimestamp);
|
||||||
|
|
||||||
|
long getMessageSeenTimestamp(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setTextForMessage(int messageId, boolean isIncoming, String text);
|
||||||
|
|
||||||
|
String getTextForMessage(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setLatitudeForMessage(int messageId, boolean isIncoming, double latitude);
|
||||||
|
|
||||||
|
double getLatitudeForMessage(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
void setLongitudeForMessage(int messageId, boolean isIncoming, double longitude);
|
||||||
|
|
||||||
|
double getLongitudeForMessage(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
// Returns the ID's of the file transfers attached to the given message
|
||||||
|
int[] getFileTransfersAttachedToMessage(int messageId, boolean isIncoming);
|
||||||
|
|
||||||
|
int getSenderParticipant(int messageId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// RcsOutgoingMessageDelivery APIs
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
// Returns the participant ID's that this message is intended to be delivered to
|
||||||
|
int[] getMessageRecipients(int messageId);
|
||||||
|
|
||||||
|
long getOutgoingDeliveryDeliveredTimestamp(int messageId, int participantId);
|
||||||
|
|
||||||
|
void setOutgoingDeliveryDeliveredTimestamp(int messageId, int participantId, long deliveredTimestamp);
|
||||||
|
|
||||||
|
long getOutgoingDeliverySeenTimestamp(int messageId, int participantId);
|
||||||
|
|
||||||
|
void setOutgoingDeliverySeenTimestamp(int messageId, int participantId, long seenTimestamp);
|
||||||
|
|
||||||
|
int getOutgoingDeliveryStatus(int messageId, int participantId);
|
||||||
|
|
||||||
|
void setOutgoingDeliveryStatus(int messageId, int participantId, int status);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// RcsFileTransferPart APIs
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
// Performs the initial write to storage and returns the row ID.
|
||||||
|
int storeFileTransfer(int messageId, boolean isIncoming,
|
||||||
|
in RcsFileTransferCreationParameters fileTransferCreationParameters);
|
||||||
|
|
||||||
|
void deleteFileTransfer(int partId);
|
||||||
|
|
||||||
|
void setFileTransferSessionId(int partId, String sessionId);
|
||||||
|
|
||||||
|
String getFileTransferSessionId(int partId);
|
||||||
|
|
||||||
|
void setFileTransferContentUri(int partId, in Uri contentUri);
|
||||||
|
|
||||||
|
Uri getFileTransferContentUri(int partId);
|
||||||
|
|
||||||
|
void setFileTransferContentType(int partId, String contentType);
|
||||||
|
|
||||||
|
String getFileTransferContentType(int partId);
|
||||||
|
|
||||||
|
void setFileTransferFileSize(int partId, long fileSize);
|
||||||
|
|
||||||
|
long getFileTransferFileSize(int partId);
|
||||||
|
|
||||||
|
void setFileTransferTransferOffset(int partId, long transferOffset);
|
||||||
|
|
||||||
|
long getFileTransferTransferOffset(int partId);
|
||||||
|
|
||||||
|
void setFileTransferStatus(int partId, int transferStatus);
|
||||||
|
|
||||||
|
int getFileTransferStatus(int partId);
|
||||||
|
|
||||||
|
void setFileTransferWidth(int partId, int width);
|
||||||
|
|
||||||
|
int getFileTransferWidth(int partId);
|
||||||
|
|
||||||
|
void setFileTransferHeight(int partId, int height);
|
||||||
|
|
||||||
|
int getFileTransferHeight(int partId);
|
||||||
|
|
||||||
|
void setFileTransferLength(int partId, long length);
|
||||||
|
|
||||||
|
long getFileTransferLength(int partId);
|
||||||
|
|
||||||
|
void setFileTransferPreviewUri(int partId, in Uri uri);
|
||||||
|
|
||||||
|
Uri getFileTransferPreviewUri(int partId);
|
||||||
|
|
||||||
|
void setFileTransferPreviewType(int partId, String type);
|
||||||
|
|
||||||
|
String getFileTransferPreviewType(int partId);
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// RcsEvent APIs
|
||||||
|
/////////////////////////
|
||||||
|
int createGroupThreadNameChangedEvent(long timestamp, int threadId, int originationParticipantId, String newName);
|
||||||
|
|
||||||
|
int createGroupThreadIconChangedEvent(long timestamp, int threadId, int originationParticipantId, in Uri newIcon);
|
||||||
|
|
||||||
|
int createGroupThreadParticipantJoinedEvent(long timestamp, int threadId, int originationParticipantId, int participantId);
|
||||||
|
|
||||||
|
int createGroupThreadParticipantLeftEvent(long timestamp, int threadId, int originationParticipantId, int participantId);
|
||||||
|
|
||||||
|
int createParticipantAliasChangedEvent(long timestamp, int participantId, String newAlias);
|
||||||
}
|
}
|
||||||
79
telephony/java/com/android/ims/RcsTypeIdPair.java
Normal file
79
telephony/java/com/android/ims/RcsTypeIdPair.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* 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.ims;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A utility class to pass RCS IDs and types in RPC calls
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class RcsTypeIdPair implements Parcelable {
|
||||||
|
private int mType;
|
||||||
|
private int mId;
|
||||||
|
|
||||||
|
public RcsTypeIdPair(int type, int id) {
|
||||||
|
mType = type;
|
||||||
|
mId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType() {
|
||||||
|
return mType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(int type) {
|
||||||
|
mType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return mId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
mId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RcsTypeIdPair(Parcel in) {
|
||||||
|
mType = in.readInt();
|
||||||
|
mId = in.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(mType);
|
||||||
|
dest.writeInt(mId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<RcsTypeIdPair> CREATOR =
|
||||||
|
new Creator<RcsTypeIdPair>() {
|
||||||
|
@Override
|
||||||
|
public RcsTypeIdPair createFromParcel(Parcel in) {
|
||||||
|
return new RcsTypeIdPair(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RcsTypeIdPair[] newArray(int size) {
|
||||||
|
return new RcsTypeIdPair[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsGroupThread;
|
||||||
|
import android.telephony.ims.RcsGroupThreadIconChangedEvent;
|
||||||
|
import android.telephony.ims.RcsParticipant;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsGroupThreadIconChangedEventTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
RcsGroupThread rcsGroupThread = new RcsGroupThread(1);
|
||||||
|
RcsParticipant rcsParticipant = new RcsParticipant(2);
|
||||||
|
Uri newIconUri = Uri.parse("content://new_icon");
|
||||||
|
|
||||||
|
RcsGroupThreadIconChangedEvent iconChangedEvent =
|
||||||
|
new RcsGroupThreadIconChangedEvent(1234567890, rcsGroupThread, rcsParticipant,
|
||||||
|
newIconUri);
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
iconChangedEvent.writeToParcel(parcel, iconChangedEvent.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
|
||||||
|
iconChangedEvent = RcsGroupThreadIconChangedEvent.CREATOR.createFromParcel(parcel);
|
||||||
|
|
||||||
|
assertThat(iconChangedEvent.getNewIcon()).isEqualTo(newIconUri);
|
||||||
|
assertThat(iconChangedEvent.getRcsGroupThread().getThreadId()).isEqualTo(1);
|
||||||
|
assertThat(iconChangedEvent.getOriginatingParticipant().getId()).isEqualTo(2);
|
||||||
|
assertThat(iconChangedEvent.getTimestamp()).isEqualTo(1234567890);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsGroupThread;
|
||||||
|
import android.telephony.ims.RcsGroupThreadNameChangedEvent;
|
||||||
|
import android.telephony.ims.RcsParticipant;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsGroupThreadNameChangedEventTest {
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
String newName = "new name";
|
||||||
|
|
||||||
|
RcsGroupThread rcsGroupThread = new RcsGroupThread(1);
|
||||||
|
RcsParticipant rcsParticipant = new RcsParticipant(2);
|
||||||
|
|
||||||
|
RcsGroupThreadNameChangedEvent nameChangedEvent =
|
||||||
|
new RcsGroupThreadNameChangedEvent(1234567890, rcsGroupThread, rcsParticipant,
|
||||||
|
newName);
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
nameChangedEvent.writeToParcel(parcel, nameChangedEvent.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
|
||||||
|
nameChangedEvent = RcsGroupThreadNameChangedEvent.CREATOR.createFromParcel(
|
||||||
|
parcel);
|
||||||
|
|
||||||
|
assertThat(nameChangedEvent.getNewName()).isEqualTo(newName);
|
||||||
|
assertThat(nameChangedEvent.getRcsGroupThread().getThreadId()).isEqualTo(1);
|
||||||
|
assertThat(nameChangedEvent.getOriginatingParticipant().getId()).isEqualTo(2);
|
||||||
|
assertThat(nameChangedEvent.getTimestamp()).isEqualTo(1234567890);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsGroupThread;
|
||||||
|
import android.telephony.ims.RcsGroupThreadParticipantJoinedEvent;
|
||||||
|
import android.telephony.ims.RcsParticipant;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsGroupThreadParticipantJoinedEventTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
RcsGroupThread rcsGroupThread = new RcsGroupThread(1);
|
||||||
|
RcsParticipant rcsParticipant = new RcsParticipant(2);
|
||||||
|
|
||||||
|
RcsGroupThreadParticipantJoinedEvent participantJoinedEvent =
|
||||||
|
new RcsGroupThreadParticipantJoinedEvent(1234567890, rcsGroupThread, rcsParticipant,
|
||||||
|
rcsParticipant);
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
participantJoinedEvent.writeToParcel(parcel, participantJoinedEvent.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
|
||||||
|
participantJoinedEvent = RcsGroupThreadParticipantJoinedEvent.CREATOR.createFromParcel(
|
||||||
|
parcel);
|
||||||
|
|
||||||
|
assertThat(participantJoinedEvent.getJoinedParticipant().getId()).isEqualTo(2);
|
||||||
|
assertThat(participantJoinedEvent.getRcsGroupThread().getThreadId()).isEqualTo(1);
|
||||||
|
assertThat(participantJoinedEvent.getOriginatingParticipant().getId()).isEqualTo(2);
|
||||||
|
assertThat(participantJoinedEvent.getTimestamp()).isEqualTo(1234567890);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsGroupThread;
|
||||||
|
import android.telephony.ims.RcsGroupThreadParticipantLeftEvent;
|
||||||
|
import android.telephony.ims.RcsParticipant;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsGroupThreadParticipantLeftEventTest {
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
RcsGroupThread rcsGroupThread = new RcsGroupThread(1);
|
||||||
|
RcsParticipant rcsParticipant = new RcsParticipant(2);
|
||||||
|
|
||||||
|
RcsGroupThreadParticipantLeftEvent participantLeftEvent =
|
||||||
|
new RcsGroupThreadParticipantLeftEvent(1234567890, rcsGroupThread, rcsParticipant,
|
||||||
|
rcsParticipant);
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
participantLeftEvent.writeToParcel(parcel, participantLeftEvent.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
|
||||||
|
// create from parcel
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
participantLeftEvent = RcsGroupThreadParticipantLeftEvent.CREATOR.createFromParcel(
|
||||||
|
parcel);
|
||||||
|
assertThat(participantLeftEvent.getRcsGroupThread().getThreadId()).isEqualTo(1);
|
||||||
|
assertThat(participantLeftEvent.getLeavingParticipantId().getId()).isEqualTo(2);
|
||||||
|
assertThat(participantLeftEvent.getTimestamp()).isEqualTo(1234567890);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,32 +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.tests.ims;
|
|
||||||
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
|
||||||
import android.telephony.ims.RcsMessageStore;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class RcsMessageStoreTest {
|
|
||||||
//TODO(sahinc): Add meaningful tests once we have more of the implementation in place
|
|
||||||
@Test
|
|
||||||
public void testDeleteThreadDoesntCrash() {
|
|
||||||
RcsMessageStore mRcsMessageStore = new RcsMessageStore();
|
|
||||||
mRcsMessageStore.deleteThread(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsParticipant;
|
||||||
|
import android.telephony.ims.RcsParticipantAliasChangedEvent;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsParticipantAliasChangedEventTest {
|
||||||
|
private static final String OLD_ALIAS = "old alias";
|
||||||
|
private static final String NEW_ALIAS = "new alias";
|
||||||
|
private RcsParticipant mParticipant;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mParticipant = new RcsParticipant(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
RcsParticipantAliasChangedEvent aliasChangedEvent =
|
||||||
|
new RcsParticipantAliasChangedEvent(1234567890, mParticipant, NEW_ALIAS);
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
aliasChangedEvent.writeToParcel(parcel, aliasChangedEvent.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
|
||||||
|
aliasChangedEvent = RcsParticipantAliasChangedEvent.CREATOR.createFromParcel(
|
||||||
|
parcel);
|
||||||
|
|
||||||
|
assertThat(aliasChangedEvent.getParticipantId().getId()).isEqualTo(3);
|
||||||
|
assertThat(aliasChangedEvent.getNewAlias()).isEqualTo(NEW_ALIAS);
|
||||||
|
assertThat(aliasChangedEvent.getTimestamp()).isEqualTo(1234567890);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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.tests.ims;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.telephony.ims.RcsParticipantQueryParameters;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class RcsParticipantQueryParametersTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanUnparcel() {
|
||||||
|
RcsParticipantQueryParameters rcsParticipantQueryParameters =
|
||||||
|
new RcsParticipantQueryParameters.Builder()
|
||||||
|
.setAliasLike("%alias_")
|
||||||
|
.setCanonicalAddressLike("_canonical%")
|
||||||
|
.setSortProperty(RcsParticipantQueryParameters.SORT_BY_CANONICAL_ADDRESS)
|
||||||
|
.setSortDirection(true)
|
||||||
|
.setResultLimit(432)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
Parcel parcel = Parcel.obtain();
|
||||||
|
rcsParticipantQueryParameters.writeToParcel(parcel,
|
||||||
|
rcsParticipantQueryParameters.describeContents());
|
||||||
|
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
rcsParticipantQueryParameters = RcsParticipantQueryParameters.CREATOR.createFromParcel(
|
||||||
|
parcel);
|
||||||
|
|
||||||
|
assertThat(rcsParticipantQueryParameters.getAliasLike()).isEqualTo("%alias_");
|
||||||
|
assertThat(rcsParticipantQueryParameters.getCanonicalAddressLike()).contains("_canonical%");
|
||||||
|
assertThat(rcsParticipantQueryParameters.getLimit()).isEqualTo(432);
|
||||||
|
assertThat(rcsParticipantQueryParameters.getSortingProperty()).isEqualTo(
|
||||||
|
RcsParticipantQueryParameters.SORT_BY_CANONICAL_ADDRESS);
|
||||||
|
assertThat(rcsParticipantQueryParameters.getSortDirection()).isTrue();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,46 +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.tests.ims;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
|
||||||
import android.telephony.ims.RcsParticipant;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class RcsParticipantTest {
|
|
||||||
private static final int ID = 123;
|
|
||||||
private static final String ALIAS = "alias";
|
|
||||||
private static final String CANONICAL_ADDRESS = "+1234567890";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCanUnparcel() {
|
|
||||||
RcsParticipant rcsParticipant = new RcsParticipant(ID, CANONICAL_ADDRESS);
|
|
||||||
rcsParticipant.setAlias(ALIAS);
|
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
|
||||||
bundle.putParcelable("Some key", rcsParticipant);
|
|
||||||
rcsParticipant = bundle.getParcelable("Some key");
|
|
||||||
|
|
||||||
assertThat(rcsParticipant.getId()).isEqualTo(ID);
|
|
||||||
assertThat(rcsParticipant.getAlias()).isEqualTo(ALIAS);
|
|
||||||
assertThat(rcsParticipant.getCanonicalAddress()).isEqualTo(CANONICAL_ADDRESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,39 +15,44 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.tests.ims;
|
package com.android.tests.ims;
|
||||||
|
|
||||||
|
import static android.telephony.ims.RcsThreadQueryParameters.SORT_BY_TIMESTAMP;
|
||||||
|
import static android.telephony.ims.RcsThreadQueryParameters.THREAD_TYPE_GROUP;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Parcel;
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
import android.telephony.ims.RcsParticipant;
|
import android.telephony.ims.RcsParticipant;
|
||||||
import android.telephony.ims.RcsThreadQueryParameters;
|
import android.telephony.ims.RcsThreadQueryParameters;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class RcsThreadQueryParametersTest {
|
public class RcsThreadQueryParametersTest {
|
||||||
private RcsThreadQueryParameters mRcsThreadQueryParameters;
|
|
||||||
@Mock RcsParticipant mMockParticipant;
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUnparceling() {
|
public void testCanUnparcel() {
|
||||||
String key = "some key";
|
RcsParticipant rcsParticipant = new RcsParticipant(1);
|
||||||
mRcsThreadQueryParameters = RcsThreadQueryParameters.builder()
|
RcsThreadQueryParameters rcsThreadQueryParameters = new RcsThreadQueryParameters.Builder()
|
||||||
.isGroupThread(true)
|
.setThreadType(THREAD_TYPE_GROUP)
|
||||||
.withParticipant(mMockParticipant)
|
.setParticipant(rcsParticipant)
|
||||||
.limitResultsTo(50)
|
.setResultLimit(50)
|
||||||
.sort(true)
|
.setSortProperty(SORT_BY_TIMESTAMP)
|
||||||
|
.setSortDirection(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
Parcel parcel = Parcel.obtain();
|
||||||
bundle.putParcelable(key, mRcsThreadQueryParameters);
|
rcsThreadQueryParameters.writeToParcel(parcel, rcsThreadQueryParameters.describeContents());
|
||||||
mRcsThreadQueryParameters = bundle.getParcelable(key);
|
|
||||||
|
|
||||||
assertThat(mRcsThreadQueryParameters.isGroupThread()).isTrue();
|
parcel.setDataPosition(0);
|
||||||
assertThat(mRcsThreadQueryParameters.getRcsParticipants()).contains(mMockParticipant);
|
rcsThreadQueryParameters = RcsThreadQueryParameters.CREATOR.createFromParcel(parcel);
|
||||||
assertThat(mRcsThreadQueryParameters.getLimit()).isEqualTo(50);
|
|
||||||
assertThat(mRcsThreadQueryParameters.isAscending()).isTrue();
|
assertThat(rcsThreadQueryParameters.getThreadType()).isEqualTo(THREAD_TYPE_GROUP);
|
||||||
|
assertThat(rcsThreadQueryParameters.getRcsParticipantsIds())
|
||||||
|
.contains(rcsParticipant.getId());
|
||||||
|
assertThat(rcsThreadQueryParameters.getLimit()).isEqualTo(50);
|
||||||
|
assertThat(rcsThreadQueryParameters.getSortingProperty()).isEqualTo(SORT_BY_TIMESTAMP);
|
||||||
|
assertThat(rcsThreadQueryParameters.getSortDirection()).isTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user