From 7ef15dd448d4f1e2a6217f6d3c56b097d981d4aa Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Wed, 27 Jun 2018 17:13:32 -0400 Subject: [PATCH] Scheduled messages will automatically be sent --- .../receiver/SendScheduledMessageReceiver.kt | 43 +++++++++++++++++++ .../ScheduledMessageRepositoryImpl.kt | 28 +++++++++--- .../repository/ScheduledMessageRepository.kt | 4 +- presentation/src/main/AndroidManifest.xml | 3 ++ .../BroadcastReceiverBuilderModule.kt | 5 +++ 5 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt diff --git a/data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt b/data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt new file mode 100644 index 00000000..dcd2f393 --- /dev/null +++ b/data/src/main/java/com/moez/QKSMS/receiver/SendScheduledMessageReceiver.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 Moez Bhatti + * + * This file is part of QKSMS. + * + * QKSMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QKSMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QKSMS. If not, see . + */ +package com.moez.QKSMS.receiver + +import android.content.BroadcastReceiver +import android.content.Context +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() { + + @Inject lateinit var messageRepo: MessageRepository + @Inject lateinit var sendScheduledMessage: SendScheduledMessage + + override fun onReceive(context: Context, intent: Intent) { + AndroidInjection.inject(this, context) + + intent.getLongExtra("id", -1L).takeIf { it >= 0 }?.let { id -> + val result = goAsync() + sendScheduledMessage.execute(id) { result.finish() } + } + } + +} \ No newline at end of file diff --git a/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt index 8f50b1c9..0bfccc79 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt @@ -1,26 +1,44 @@ package com.moez.QKSMS.repository +import android.app.AlarmManager +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.model.ScheduledMessage import io.realm.Realm import io.realm.RealmList import io.realm.RealmResults import javax.inject.Inject -class ScheduledMessageRepositoryImpl @Inject constructor() : ScheduledMessageRepository { +class ScheduledMessageRepositoryImpl @Inject constructor( + private val context: Context +) : ScheduledMessageRepository { override fun saveScheduledMessage(date: Long, subId: Int, recipients: List, sendAsGroup: Boolean, - body: String, attachments: List): Long { + body: String, attachments: List) { - return Realm.getDefaultInstance().use { realm -> + Realm.getDefaultInstance().use { realm -> val id = (realm.where(ScheduledMessage::class.java).max("id")?.toLong() ?: -1) + 1 val recipientsRealmList = RealmList(*recipients.toTypedArray()) val attachmentsRealmList = RealmList(*attachments.toTypedArray()) val message = ScheduledMessage(id, date, subId, recipientsRealmList, sendAsGroup, body, attachmentsRealmList) - realm.executeTransaction { realm.insertOrUpdate(message) } + val action = "com.moez.QKSMS.SEND_SCHEDULED_MESSAGE" + val intent = Intent(action).putExtra("id", id) + BroadcastUtils.addClassName(context, intent, action) + val pendingIntent = PendingIntent.getBroadcast(context, id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT) - id + val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, date, pendingIntent) + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, date, pendingIntent) + } + + realm.executeTransaction { realm.insertOrUpdate(message) } } } diff --git a/domain/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepository.kt index bf7966d5..71766001 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepository.kt @@ -6,10 +6,10 @@ import io.realm.RealmResults interface ScheduledMessageRepository { /** - * Saves a scheduled message and returns the id if successful + * Saves a scheduled message */ fun saveScheduledMessage(date: Long, subId: Int, recipients: List, sendAsGroup: Boolean, body: String, - attachments: List): Long + attachments: List) /** * Returns all of the scheduled messages, sorted chronologically diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index d37784b8..bce660be 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -104,6 +104,9 @@ + diff --git a/presentation/src/main/java/com/moez/QKSMS/injection/BroadcastReceiverBuilderModule.kt b/presentation/src/main/java/com/moez/QKSMS/injection/BroadcastReceiverBuilderModule.kt index e42e4e09..53f918bd 100644 --- a/presentation/src/main/java/com/moez/QKSMS/injection/BroadcastReceiverBuilderModule.kt +++ b/presentation/src/main/java/com/moez/QKSMS/injection/BroadcastReceiverBuilderModule.kt @@ -28,6 +28,7 @@ import com.moez.QKSMS.receiver.MmsSentReceiver import com.moez.QKSMS.receiver.MmsUpdatedReceiver import com.moez.QKSMS.receiver.NightModeReceiver import com.moez.QKSMS.receiver.RemoteMessagingReceiver +import com.moez.QKSMS.receiver.SendScheduledMessageReceiver import com.moez.QKSMS.receiver.SendSmsReceiver import com.moez.QKSMS.receiver.SmsDeliveredReceiver import com.moez.QKSMS.receiver.SmsProviderChangedReceiver @@ -75,6 +76,10 @@ abstract class BroadcastReceiverBuilderModule { @ContributesAndroidInjector() abstract fun bindRemoteMessagingReceiver(): RemoteMessagingReceiver + @ActivityScope + @ContributesAndroidInjector() + abstract fun bindSendScheduledMessageReceiver(): SendScheduledMessageReceiver + @ActivityScope @ContributesAndroidInjector() abstract fun bindSendSmsReceiver(): SendSmsReceiver