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 a5438d346..ff2d7f3d2 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -294,6 +294,7 @@ class MessageRepositoryImpl @Inject constructor( } override fun sendMessage( + saveSentMessage: Boolean, subId: Int, threadId: Long, addresses: List, @@ -301,6 +302,7 @@ class MessageRepositoryImpl @Inject constructor( attachments: List, delay: Int ) { + val saveMessage = delay > 0 || saveSentMessage val signedBody = when { prefs.signature.get().isEmpty() -> body body.isNotEmpty() -> body + '\n' + prefs.signature.get() @@ -323,7 +325,7 @@ class MessageRepositoryImpl @Inject constructor( if (addresses.size == 1 && attachments.isEmpty() && !forceMms) { // SMS if (delay > 0) { // With delay val sendTime = System.currentTimeMillis() + delay - val message = insertSentSms(subId, threadId, addresses.first(), strippedBody, sendTime) + val message = insertSentSms(subId, threadId, addresses.first(), strippedBody, sendTime, saveMessage) val intent = getIntentForDelayedSms(message.id) @@ -334,7 +336,7 @@ class MessageRepositoryImpl @Inject constructor( alarmManager.setExact(AlarmManager.RTC_WAKEUP, sendTime, intent) } } else { // No delay - val message = insertSentSms(subId, threadId, addresses.first(), strippedBody, now()) + val message = insertSentSms(subId, threadId, addresses.first(), strippedBody, now(), saveMessage) sendSms(message) } } else { // MMS @@ -444,15 +446,19 @@ class MessageRepositoryImpl @Inject constructor( ?: arrayListOf() val sentIntents = parts.map { - val intent = Intent(context, SmsSentReceiver::class.java).putExtra("id", message.id) - PendingIntent.getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) + if (message.id <= 0) null else { + val intent = Intent(context, SmsSentReceiver::class.java).putExtra("id", message.id) + PendingIntent.getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) + } } val deliveredIntents = parts.map { - val intent = Intent(context, SmsDeliveredReceiver::class.java).putExtra("id", message.id) - val pendingIntent = PendingIntent - .getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) - if (prefs.delivery.get()) pendingIntent else null + if (message.id <= 0) null else { + val intent = Intent(context, SmsDeliveredReceiver::class.java).putExtra("id", message.id) + val pendingIntent = PendingIntent + .getBroadcast(context, message.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) + if (prefs.delivery.get()) pendingIntent else null + } } try { @@ -498,8 +504,7 @@ class MessageRepositoryImpl @Inject constructor( return PendingIntent.getBroadcast(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) } - override fun insertSentSms(subId: Int, threadId: Long, address: String, body: String, date: Long): Message { - + override fun insertSentSms(subId: Int, threadId: Long, address: String, body: String, date: Long, saveMessage: Boolean): Message { // Insert the message to Realm val message = Message().apply { this.threadId = threadId @@ -514,6 +519,8 @@ class MessageRepositoryImpl @Inject constructor( read = true seen = true } + if (!saveMessage) return message + val realm = Realm.getDefaultInstance() var managedMessage: Message? = null realm.executeTransaction { managedMessage = realm.copyToRealmOrUpdate(message) } diff --git a/domain/src/main/java/com/moez/QKSMS/interactor/SendMessage.kt b/domain/src/main/java/com/moez/QKSMS/interactor/SendMessage.kt index 6018670dc..1e02ae5e8 100644 --- a/domain/src/main/java/com/moez/QKSMS/interactor/SendMessage.kt +++ b/domain/src/main/java/com/moez/QKSMS/interactor/SendMessage.kt @@ -40,7 +40,8 @@ class SendMessage @Inject constructor( val addresses: List, val body: String, val attachments: List = listOf(), - val delay: Int = 0 + val delay: Int = 0, + val saveSentMessage: Boolean = true ) override fun buildObservable(params: Params): Flowable<*> = Flowable.just(Unit) @@ -51,7 +52,7 @@ class SendMessage @Inject constructor( 0L -> TelephonyCompat.getOrCreateThreadId(context, params.addresses.toSet()) else -> params.threadId } - messageRepo.sendMessage(params.subId, threadId, params.addresses, params.body, params.attachments, + messageRepo.sendMessage(params.saveSentMessage, params.subId, threadId, params.addresses, params.body, params.attachments, params.delay) } .mapNotNull { 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 a3ef7c19f..08a76ff71 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt @@ -63,6 +63,7 @@ interface MessageRepository { fun markUnread(vararg threadIds: Long) fun sendMessage( + saveSentMessage: Boolean, subId: Int, threadId: Long, addresses: List, @@ -83,7 +84,7 @@ interface MessageRepository { */ fun cancelDelayedSms(id: Long) - fun insertSentSms(subId: Int, threadId: Long, address: String, body: String, date: Long): Message + fun insertSentSms(subId: Int, threadId: Long, address: String, body: String, date: Long, saveMessage: Boolean): Message fun insertReceivedSms(subId: Int, address: String, body: String, sentTime: Long): Message diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayServer.kt b/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayServer.kt index 5bbbc8b3d..a784ad6d4 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayServer.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayServer.kt @@ -15,7 +15,7 @@ class GatewayServer( ) : Server(port) { interface Handler { - fun onSendMessage(phone: String, message: String): String? + fun onSendMessage(phone: String, message: String, saveMessage: Boolean): String? } init { @@ -50,18 +50,20 @@ class GatewayServer( var phone: String? = null var message: String? = null + var saveMessage = false val reader = JsonReader(request.reader) reader.beginObject() while (reader.hasNext()) { when (reader.nextName()) { - "to" -> phone = reader.nextString() - "message" -> message = reader.nextString() + "to" -> phone = reader.nextString() + "message" -> message = reader.nextString() + "saveMessage" -> saveMessage = reader.nextBoolean() } } val result = if (phone != null && message != null) { - handler.onSendMessage(phone, message) + handler.onSendMessage(phone, message, saveMessage) } else { "Missing phone or message" } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayService.kt b/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayService.kt index 9f5d2c63e..8d02be8d9 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayService.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/gateway/GatewayService.kt @@ -12,6 +12,9 @@ import android.widget.Toast import androidx.core.app.NotificationCompat import com.moez.QKSMS.R import com.moez.QKSMS.common.util.NotificationManagerImpl +import com.moez.QKSMS.injection.appComponent +import com.moez.QKSMS.interactor.SendMessage +import javax.inject.Inject class GatewayService : Service(), GatewayServer.Handler { @@ -21,6 +24,7 @@ class GatewayService : Service(), GatewayServer.Handler { } private lateinit var gatewayServer: GatewayServer + @Inject lateinit var sendMessage: SendMessage private fun createNotification(context: Context): Notification { val intent = Intent(this, GatewayActivity::class.java) @@ -36,6 +40,7 @@ class GatewayService : Service(), GatewayServer.Handler { @Suppress("DEPRECATION") override fun onCreate() { + appComponent.inject(this) val key = PreferenceManager .getDefaultSharedPreferences(this) .getString(GatewayViewModel.PREFERENCE_KEY, null) @@ -56,9 +61,9 @@ class GatewayService : Service(), GatewayServer.Handler { return null } - override fun onSendMessage(phone: String, message: String): String? { + override fun onSendMessage(phone: String, message: String, saveMessage: Boolean): String? { return try { - SmsManager.getDefault().sendTextMessage(phone, null, message, null, null) + sendMessage.execute(SendMessage.Params(-1, 0L, listOf(phone), message, saveSentMessage = saveMessage)) null } catch (e: Exception) { Toast.makeText(this, e.message, Toast.LENGTH_LONG).show() diff --git a/presentation/src/main/java/com/moez/QKSMS/injection/AppComponent.kt b/presentation/src/main/java/com/moez/QKSMS/injection/AppComponent.kt index a1208c9b5..c61b81b9a 100644 --- a/presentation/src/main/java/com/moez/QKSMS/injection/AppComponent.kt +++ b/presentation/src/main/java/com/moez/QKSMS/injection/AppComponent.kt @@ -35,6 +35,7 @@ import com.moez.QKSMS.feature.blocking.messages.BlockedMessagesController import com.moez.QKSMS.feature.blocking.numbers.BlockedNumbersController import com.moez.QKSMS.feature.compose.editing.DetailedChipView import com.moez.QKSMS.feature.conversationinfo.injection.ConversationInfoComponent +import com.moez.QKSMS.feature.gateway.GatewayService import com.moez.QKSMS.feature.settings.SettingsController import com.moez.QKSMS.feature.settings.about.AboutController import com.moez.QKSMS.feature.settings.swipe.SwipeActionsController @@ -73,6 +74,7 @@ interface AppComponent { fun inject(dialog: QkDialog) fun inject(service: WidgetAdapter) + fun inject(service: GatewayService) /** * This can't use AndroidInjection, or else it will crash on pre-marshmallow devices