From 4f8afcf7df0c3989897203e73eaea33ce412e4b5 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Wed, 1 Aug 2018 12:07:13 -0400 Subject: [PATCH] Fix implicit broadcast usage for SMS intents --- .../moez/QKSMS/manager/AlarmManagerImpl.kt | 8 +++---- .../QKSMS/receiver/SmsDeliveredReceiver.kt | 5 +++++ .../moez/QKSMS/receiver/SmsSentReceiver.kt | 5 +++++ .../QKSMS/repository/MessageRepositoryImpl.kt | 21 +++++++++---------- .../SendScheduledMessageService.kt} | 14 ++++++------- .../SendSmsService.kt} | 14 ++++++------- presentation/src/main/AndroidManifest.xml | 18 ++++------------ .../android/BroadcastReceiverBuilderModule.kt | 12 ++--------- .../injection/android/ServiceBuilderModule.kt | 10 +++++++++ 9 files changed, 51 insertions(+), 56 deletions(-) rename data/src/main/java/com/moez/QKSMS/{receiver/SendScheduledMessageReceiver.kt => service/SendScheduledMessageService.kt} (75%) rename data/src/main/java/com/moez/QKSMS/{receiver/SendSmsReceiver.kt => service/SendSmsService.kt} (76%) diff --git a/data/src/main/java/com/moez/QKSMS/manager/AlarmManagerImpl.kt b/data/src/main/java/com/moez/QKSMS/manager/AlarmManagerImpl.kt index a89a8c9b..1767085f 100644 --- a/data/src/main/java/com/moez/QKSMS/manager/AlarmManagerImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/manager/AlarmManagerImpl.kt @@ -22,16 +22,14 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.os.Build -import com.klinker.android.send_message.BroadcastUtils +import com.moez.QKSMS.service.SendScheduledMessageService import javax.inject.Inject class AlarmManagerImpl @Inject constructor(private val context: Context) : AlarmManager { override fun getScheduledMessageIntent(id: Long): PendingIntent { - val action = "com.moez.QKSMS.SEND_SCHEDULED_MESSAGE" - val intent = Intent(action).putExtra("id", id) - BroadcastUtils.addClassName(context, intent, action) - return PendingIntent.getBroadcast(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) + val intent = Intent(context, SendScheduledMessageService::class.java).putExtra("id", id) + return PendingIntent.getService(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) } override fun setAlarm(date: Long, intent: PendingIntent) { diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SmsDeliveredReceiver.kt b/data/src/main/java/com/moez/QKSMS/receiver/SmsDeliveredReceiver.kt index 1fa162a4..cbc0bc59 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/SmsDeliveredReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/receiver/SmsDeliveredReceiver.kt @@ -29,11 +29,16 @@ import javax.inject.Inject class SmsDeliveredReceiver : BroadcastReceiver() { + companion object { + const val ACTION = "com.moez.QKSMS.SMS_DELIVERED" + } + @Inject lateinit var markDelivered: MarkDelivered @Inject lateinit var markDeliveryFailed: MarkDeliveryFailed override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) + context.unregisterReceiver(this) val id = intent.getLongExtra("id", 0L) diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SmsSentReceiver.kt b/data/src/main/java/com/moez/QKSMS/receiver/SmsSentReceiver.kt index ffc6e550..1777dc7f 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/SmsSentReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/receiver/SmsSentReceiver.kt @@ -30,11 +30,16 @@ import javax.inject.Inject class SmsSentReceiver : BroadcastReceiver() { + companion object { + const val ACTION = "com.moez.QKSMS.SMS_SENT" + } + @Inject lateinit var markSent: MarkSent @Inject lateinit var markFailed: MarkFailed override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) + context.unregisterReceiver(this) val id = intent.getLongExtra("id", 0L) 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 a62ac730..f46f6c9e 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -24,13 +24,13 @@ import android.content.ContentUris import android.content.ContentValues import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.os.Build import android.provider.Telephony import android.telephony.PhoneNumberUtils import android.telephony.SmsManager import com.google.android.mms.ContentType import com.google.android.mms.MMSPart -import com.klinker.android.send_message.BroadcastUtils import com.klinker.android.send_message.SmsManagerFactory import com.klinker.android.send_message.StripAccents import com.klinker.android.send_message.Transaction @@ -41,6 +41,9 @@ import com.moez.QKSMS.model.Attachment import com.moez.QKSMS.model.Conversation import com.moez.QKSMS.model.Message import com.moez.QKSMS.model.MmsPart +import com.moez.QKSMS.receiver.SmsDeliveredReceiver +import com.moez.QKSMS.receiver.SmsSentReceiver +import com.moez.QKSMS.service.SendSmsService import com.moez.QKSMS.util.ImageUtils import com.moez.QKSMS.util.Preferences import com.moez.QKSMS.util.tryOrNull @@ -265,16 +268,14 @@ class MessageRepositoryImpl @Inject constructor( ?: arrayListOf() val sentIntents = parts.map { - val action = "com.moez.QKSMS.SMS_SENT" - val intent = Intent(action).putExtra("id", message.id) - BroadcastUtils.addClassName(context, intent, action) + context.registerReceiver(SmsSentReceiver(), IntentFilter(SmsSentReceiver.ACTION)) + val intent = Intent(SmsSentReceiver.ACTION).putExtra("id", message.id) PendingIntent.getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) } val deliveredIntents = parts.map { - val action = "com.moez.QKSMS.SMS_DELIVERED" - val intent = Intent(action).putExtra("id", message.id) - BroadcastUtils.addClassName(context, intent, action) + context.registerReceiver(SmsDeliveredReceiver(), IntentFilter(SmsDeliveredReceiver.ACTION)) + val intent = Intent(SmsDeliveredReceiver.ACTION).putExtra("id", message.id) val pendingIntent = PendingIntent.getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) if (prefs.delivery.get()) pendingIntent else null } @@ -288,10 +289,8 @@ class MessageRepositoryImpl @Inject constructor( } private fun getIntentForDelayedSms(id: Long): PendingIntent { - val action = "com.moez.QKSMS.SEND_SMS" - val intent = Intent(action).putExtra("id", id) - BroadcastUtils.addClassName(context, intent, action) - return PendingIntent.getBroadcast(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) + val intent = Intent(context, SendSmsService::class.java).putExtra("id", id) + return PendingIntent.getService(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) } override fun insertSentSms(subId: Int, threadId: Long, address: String, body: String, date: Long): Message { diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt b/data/src/main/java/com/moez/QKSMS/service/SendScheduledMessageService.kt similarity index 75% rename from data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt rename to data/src/main/java/com/moez/QKSMS/service/SendScheduledMessageService.kt index dcd2f393..e1151e04 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/service/SendScheduledMessageService.kt @@ -16,27 +16,25 @@ * You should have received a copy of the GNU General Public License * along with QKSMS. If not, see . */ -package com.moez.QKSMS.receiver +package com.moez.QKSMS.service -import android.content.BroadcastReceiver -import android.content.Context +import android.app.IntentService import android.content.Intent import com.moez.QKSMS.interactor.SendScheduledMessage import com.moez.QKSMS.repository.MessageRepository import dagger.android.AndroidInjection import javax.inject.Inject -class SendScheduledMessageReceiver : BroadcastReceiver() { +class SendScheduledMessageService : IntentService(null) { @Inject lateinit var messageRepo: MessageRepository @Inject lateinit var sendScheduledMessage: SendScheduledMessage - override fun onReceive(context: Context, intent: Intent) { - AndroidInjection.inject(this, context) + override fun onHandleIntent(intent: Intent) { + AndroidInjection.inject(this) intent.getLongExtra("id", -1L).takeIf { it >= 0 }?.let { id -> - val result = goAsync() - sendScheduledMessage.execute(id) { result.finish() } + sendScheduledMessage.buildObservable(id).blockingSubscribe() } } diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt b/data/src/main/java/com/moez/QKSMS/service/SendSmsService.kt similarity index 76% rename from data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt rename to data/src/main/java/com/moez/QKSMS/service/SendSmsService.kt index d7a55720..6838ddee 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/SendSmsReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/service/SendSmsService.kt @@ -16,28 +16,26 @@ * You should have received a copy of the GNU General Public License * along with QKSMS. If not, see . */ -package com.moez.QKSMS.receiver +package com.moez.QKSMS.service -import android.content.BroadcastReceiver -import android.content.Context +import android.app.IntentService import android.content.Intent import com.moez.QKSMS.interactor.RetrySending import com.moez.QKSMS.repository.MessageRepository import dagger.android.AndroidInjection import javax.inject.Inject -class SendSmsReceiver : BroadcastReceiver() { +class SendSmsService : IntentService(null) { @Inject lateinit var messageRepo: MessageRepository @Inject lateinit var retrySending: RetrySending - override fun onReceive(context: Context, intent: Intent) { - AndroidInjection.inject(this, context) + override fun onHandleIntent(intent: Intent) { + AndroidInjection.inject(this) val id = intent.getLongExtra("id", 0L) messageRepo.getMessage(id)?.let { message -> - val result = goAsync() - retrySending.execute(message) { result.finish() } + retrySending.buildObservable(message).blockingSubscribe() } } diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index 41964452..f24978b6 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -25,7 +25,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -128,18 +128,6 @@ - - - - @@ -180,6 +168,8 @@ + +