blob: 808ce8621c88375c030eb3566032c680d052b23b [file] [log] [blame]
/*
* Copyright (C) 2020 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.car.messenger.impl.datamodels.util;
import static android.provider.BaseColumns._ID;
import static android.provider.Telephony.BaseMmsColumns.CONTENT_TYPE;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Telephony;
import android.provider.Telephony.Mms.Addr;
import android.provider.Telephony.Mms.Part;
import android.provider.Telephony.Sms;
import androidx.annotation.NonNull;
import java.text.MessageFormat;
import java.time.Instant;
/** MMS Utils for parsing MMS Telephony Content */
class MmsUtils {
@NonNull public static final String FORMAT_CONTENT_MMS_PART = "content://mms/{0}/part";
@NonNull public static final String FORMAT_CONTENT_MMS_ADDR = "content://mms/{0}/addr";
@NonNull public static final String FORMAT_TYPE_AND_MSG_ID = "type={0} AND msg_id={1}";
/** MMS text messages come with extra characters and new lines that need to be removed */
@NonNull private static final String REPLACE_CHARS = "\r\n";
private MmsUtils() {}
@NonNull static final String MMS_CONTENT_TYPE = "application/vnd.wap.multipart.related";
private static final int ORIGINATOR_ADDRESS_TYPE = 137;
/** Returns true, if item on cursor position is an MMS message */
static Boolean isMms(@NonNull Cursor cursor) {
String contentType = cursor.getString(cursor.getColumnIndex(CONTENT_TYPE));
return MMS_CONTENT_TYPE.equals(contentType);
}
/**
* Returns the parsed result as {link @MmsSmsMessage}
*
* @throws IllegalArgumentException if desired columns are missing.
* @see CursorUtils#CONTENT_CONVERSATION_PROJECTION
*/
@NonNull
static MmsSmsMessage parseMms(@NonNull Context context, @NonNull Cursor cursor) {
MmsSmsMessage message = new MmsSmsMessage();
message.mId = cursor.getString(cursor.getColumnIndex(_ID));
message.mThreadId = cursor.getInt(cursor.getColumnIndex(Sms.THREAD_ID));
message.mType = cursor.getInt(cursor.getColumnIndex(Telephony.Mms.MESSAGE_BOX));
message.mSubscriptionId = cursor.getInt(cursor.getColumnIndex(Sms.SUBSCRIPTION_ID));
message.mDate = Instant.ofEpochSecond(cursor.getLong(cursor.getColumnIndex(Sms.DATE)));
message.mRead = cursor.getInt(cursor.getColumnIndex(Sms.READ)) == 1;
message.mPhoneNumber = getOriginator(context, message.mId);
message.mBody = getMmsBody(context, message.mId);
return message;
}
private static String getMmsBody(@NonNull Context context, @NonNull String id) {
String uriStr = MessageFormat.format(FORMAT_CONTENT_MMS_PART, id);
Uri uriAddress = Uri.parse(uriStr);
Cursor cursor = CursorUtils.simpleQuery(context, uriAddress);
StringBuilder stringBuilder = new StringBuilder();
while (cursor != null && cursor.moveToNext()) {
stringBuilder.append(cursor.getString(cursor.getColumnIndex(Part.TEXT)));
stringBuilder.append(" ");
}
return stringBuilder.toString().replace(REPLACE_CHARS, "");
}
@NonNull
private static String getOriginator(@NonNull Context context, @NonNull String id) {
String selection =
MessageFormat.format(FORMAT_TYPE_AND_MSG_ID, ORIGINATOR_ADDRESS_TYPE, id);
String uriStr = MessageFormat.format(FORMAT_CONTENT_MMS_ADDR, id);
Cursor cursor = CursorUtils.simpleQueryWithSelection(context, Uri.parse(uriStr), selection);
String phoneNum = "";
if (cursor != null && cursor.moveToFirst()) {
cursor.moveToFirst();
phoneNum = cursor.getString(cursor.getColumnIndex(Addr.ADDRESS));
cursor.close();
}
return phoneNum;
}
}