diff --git a/android-smsmms/src/main/java/com/klinker/android/send_message/Transaction.kt b/android-smsmms/src/main/java/com/klinker/android/send_message/Transaction.kt index ccc3b8c3..79b237f9 100755 --- a/android-smsmms/src/main/java/com/klinker/android/send_message/Transaction.kt +++ b/android-smsmms/src/main/java/com/klinker/android/send_message/Transaction.kt @@ -83,8 +83,7 @@ class Transaction @JvmOverloads constructor(private val context: Context, settin * * @param threadId is the thread id of who to send the message to (can also be set to Transaction.NO_THREAD_ID) */ - fun sendNewMessage(subId: Int, threadId: Long, addresses: List, parts: List, subject: String?) { - + fun sendNewMessage(subId: Int, threadId: Long, addresses: List, parts: List, subject: String?, existingUri: Uri?) { RateController.init(context) DownloadManager.init(context) @@ -95,7 +94,7 @@ class Transaction @JvmOverloads constructor(private val context: Context, settin val sendReq = buildPdu(context, addresses, subject, parts) val persister = PduPersister.getPduPersister(context) - val messageUri = persister.persist(sendReq, Uri.parse("content://mms/outbox"), true, true, null) + val messageUri = existingUri ?: persister.persist(sendReq, Uri.parse("content://mms/outbox"), true, true, null) val sentIntent = Intent(MMS_SENT) BroadcastUtils.addClassName(context, sentIntent, MMS_SENT) diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt b/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt index 5ac2aefc..7e181878 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt @@ -39,7 +39,7 @@ class SendSmsReceiver : BroadcastReceiver() { ?.let(messageRepo::getMessage) ?.let { message -> val result = goAsync() - retrySending.execute(message) { result.finish() } + retrySending.execute(message.id) { result.finish() } } } diff --git a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt index 529ffc12..cd3f7769 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -33,6 +33,8 @@ import android.webkit.MimeTypeMap import androidx.core.content.contentValuesOf import com.google.android.mms.ContentType import com.google.android.mms.MMSPart +import com.google.android.mms.pdu_alt.MultimediaMessagePdu +import com.google.android.mms.pdu_alt.PduPersister import com.klinker.android.send_message.SmsManagerFactory import com.klinker.android.send_message.StripAccents import com.klinker.android.send_message.Transaction @@ -330,8 +332,7 @@ class MessageRepositoryImpl @Inject constructor( .map { attachment -> attachment.vCard.toByteArray() } .map { vCard -> MMSPart("contact", ContentType.TEXT_VCARD, vCard) } - val transaction = Transaction(context) - transaction.sendNewMessage(subId, threadId, addresses.map(phoneNumberUtils::normalizeNumber), parts, null) + Transaction(context).sendNewMessage(subId, threadId, addresses, parts, null, null) } } @@ -370,6 +371,25 @@ class MessageRepositoryImpl @Inject constructor( } } + override fun resendMms(message: Message) { + val subId = message.subId + val threadId = message.threadId + val pdu = tryOrNull { + PduPersister.getPduPersister(context).load(message.getUri()) as MultimediaMessagePdu + } ?: return + + val addresses = pdu.to.map { it.string }.filter { it.isNotBlank() } + val parts = message.parts.mapNotNull { part -> + val bytes = tryOrNull { + context.contentResolver.openInputStream(part.getUri())?.use { inputStream -> inputStream.readBytes() } + } ?: return@mapNotNull null + + MMSPart(part.name.orEmpty(), part.type, bytes) + } + + Transaction(context).sendNewMessage(subId, threadId, addresses, parts, message.subject, message.getUri()) + } + override fun cancelDelayedSms(id: Long) { val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmManager.cancel(getIntentForDelayedSms(id)) @@ -489,12 +509,17 @@ class MessageRepositoryImpl @Inject constructor( message?.let { // Update the message in realm realm.executeTransaction { - message.boxId = Telephony.Sms.MESSAGE_TYPE_OUTBOX + message.boxId = when (message.isSms()) { + true -> Telephony.Sms.MESSAGE_TYPE_OUTBOX + false -> Telephony.Mms.MESSAGE_BOX_OUTBOX + } } // Update the message in the native ContentProvider - val values = ContentValues() - values.put(Telephony.Sms.TYPE, Telephony.Sms.MESSAGE_TYPE_OUTBOX) + val values = when (message.isSms()) { + true -> contentValuesOf(Telephony.Sms.TYPE to Telephony.Sms.MESSAGE_TYPE_OUTBOX) + false -> contentValuesOf(Telephony.Mms.MESSAGE_BOX to Telephony.Mms.MESSAGE_BOX_OUTBOX) + } context.contentResolver.update(message.getUri(), values, null, null) } } diff --git a/domain/src/main/java/com/moez/QKSMS/interactor/RetrySending.kt b/domain/src/main/java/com/moez/QKSMS/interactor/RetrySending.kt index 2f646b3d..27df7874 100644 --- a/domain/src/main/java/com/moez/QKSMS/interactor/RetrySending.kt +++ b/domain/src/main/java/com/moez/QKSMS/interactor/RetrySending.kt @@ -18,29 +18,25 @@ */ package com.moez.QKSMS.interactor +import com.moez.QKSMS.extensions.mapNotNull import com.moez.QKSMS.model.Message import com.moez.QKSMS.repository.MessageRepository import io.reactivex.Flowable import javax.inject.Inject -class RetrySending @Inject constructor(private val messageRepo: MessageRepository) : Interactor() { +class RetrySending @Inject constructor(private val messageRepo: MessageRepository) : Interactor() { - override fun buildObservable(params: Message): Flowable { + override fun buildObservable(params: Long): Flowable { - // We don't want to touch the supplied message on another thread in case it's a live realm - // object, so copy the required fields into a new object that is safe to pass around threads - val message = Message().apply { - id = params.id - type = params.type - address = params.address - body = params.body - subId = params.subId - } - - return Flowable.just(message) - .filter { message.isSms() } // TODO support resending failed MMS - .doOnNext { messageRepo.markSending(message.id) } - .doOnNext { messageRepo.sendSms(message) } + return Flowable.just(params) + .mapNotNull(messageRepo::getMessage) + .doOnNext { message -> messageRepo.markSending(message.id) } + .doOnNext { message -> + when (message.isSms()) { + true -> messageRepo.sendSms(message) + false -> messageRepo.resendMms(message) + } + } } } \ No newline at end of file diff --git a/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt index 80530bb1..afb1a339 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt @@ -74,6 +74,8 @@ interface MessageRepository { */ fun sendSms(message: Message) + fun resendMms(message: Message) + /** * Attempts to cancel sending the message with the given id */ diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt index 4d42eb27..9d54191b 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt @@ -422,7 +422,7 @@ class ComposeViewModel @Inject constructor( view.messageClickIntent .mapNotNull(messageRepo::getMessage) .filter { message -> message.isFailedMessage() } - .doOnNext { message -> retrySending.execute(message) } + .doOnNext { message -> retrySending.execute(message.id) } .autoDisposable(view.scope()) .subscribe()