From cf371ddf85834a1b70e628478b3f3396098af76e Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Wed, 27 Jun 2018 16:57:27 -0400 Subject: [PATCH] Add option to delete scheduled message or send immediately --- .../ScheduledMessageRepositoryImpl.kt | 15 ++++++----- .../feature/scheduled/ScheduledActivity.kt | 19 +++++++++++--- .../scheduled/ScheduledMessageAdapter.kt | 10 +++++--- .../QKSMS/feature/scheduled/ScheduledView.kt | 6 +++++ .../feature/scheduled/ScheduledViewModel.kt | 25 ++++++++++++++++++- presentation/src/main/res/values/strings.xml | 4 +++ 6 files changed, 64 insertions(+), 15 deletions(-) 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 14799b8f..8f50b1c9 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/ScheduledMessageRepositoryImpl.kt @@ -33,19 +33,22 @@ class ScheduledMessageRepositoryImpl @Inject constructor() : ScheduledMessageRep override fun getScheduledMessage(id: Long): ScheduledMessage? { return Realm.getDefaultInstance() + .apply { refresh() } .where(ScheduledMessage::class.java) .equalTo("id", id) .findFirst() } override fun deleteScheduledMessage(id: Long) { - Realm.getDefaultInstance().use { realm -> - val message = realm.where(ScheduledMessage::class.java) - .equalTo("id", id) - .findFirst() + Realm.getDefaultInstance() + .apply { refresh() } + .use { realm -> + val message = realm.where(ScheduledMessage::class.java) + .equalTo("id", id) + .findFirst() - realm.executeTransaction { message?.deleteFromRealm() } - } + realm.executeTransaction { message?.deleteFromRealm() } + } } } \ No newline at end of file diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledActivity.kt index 06bbd5a1..5035e2c2 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProviders import com.moez.QKSMS.R +import com.moez.QKSMS.common.QkDialog import com.moez.QKSMS.common.base.QkThemedActivity import dagger.android.AndroidInjection import kotlinx.android.synthetic.main.scheduled_activity.* @@ -11,9 +12,13 @@ import javax.inject.Inject class ScheduledActivity : QkThemedActivity(), ScheduledView { - @Inject lateinit var adapter: ScheduledMessageAdapter + @Inject lateinit var dialog: QkDialog + @Inject lateinit var messageAdapter: ScheduledMessageAdapter @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + override val messageClickIntent by lazy { messageAdapter.clicks } + override val messageMenuIntent by lazy { dialog.adapter.menuItemClicks } + private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory)[ScheduledViewModel::class.java] } override fun onCreate(savedInstanceState: Bundle?) { @@ -24,12 +29,18 @@ class ScheduledActivity : QkThemedActivity(), ScheduledView { showBackButton(true) viewModel.bindView(this) - adapter.emptyView = empty - messages.adapter = adapter + dialog.adapter.setData(R.array.scheduled_options) + + messageAdapter.emptyView = empty + messages.adapter = messageAdapter } override fun render(state: ScheduledState) { - adapter.updateData(state.scheduledMessages) + messageAdapter.updateData(state.scheduledMessages) + } + + override fun showMessageOptions() { + dialog.show(this) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledMessageAdapter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledMessageAdapter.kt index b81ca520..202a5ef5 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledMessageAdapter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledMessageAdapter.kt @@ -7,25 +7,27 @@ import com.moez.QKSMS.R import com.moez.QKSMS.common.base.QkRealmAdapter import com.moez.QKSMS.common.base.QkViewHolder import com.moez.QKSMS.common.util.DateFormatter -import com.moez.QKSMS.interactor.SendScheduledMessage import com.moez.QKSMS.model.Contact import com.moez.QKSMS.model.PhoneNumber import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.ScheduledMessage import com.moez.QKSMS.repository.ContactRepository +import io.reactivex.subjects.PublishSubject +import io.reactivex.subjects.Subject import io.realm.RealmList import kotlinx.android.synthetic.main.scheduled_message_list_item.view.* import javax.inject.Inject class ScheduledMessageAdapter @Inject constructor( private val contactRepo: ContactRepository, - private val dateFormatter: DateFormatter, - private val sendScheduledMessage: SendScheduledMessage + private val dateFormatter: DateFormatter ) : QkRealmAdapter() { private val contacts by lazy { contactRepo.getContacts() } private val contactMap: HashMap = hashMapOf() + val clicks: Subject = PublishSubject.create() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QkViewHolder { return QkViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.scheduled_message_list_item, parent, false)) } @@ -34,7 +36,7 @@ class ScheduledMessageAdapter @Inject constructor( val message = getItem(position)!! val view = holder.itemView - view.setOnClickListener { sendScheduledMessage.execute(message.id) } + view.setOnClickListener { clicks.onNext(message.id) } message.recipients.forEach { address -> if (!contactMap.containsKey(address)) { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledView.kt b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledView.kt index 73e3013f..fb560389 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledView.kt @@ -1,7 +1,13 @@ package com.moez.QKSMS.feature.scheduled import com.moez.QKSMS.common.base.QkView +import io.reactivex.Observable interface ScheduledView : QkView { + val messageClickIntent: Observable + val messageMenuIntent: Observable + + fun showMessageOptions() + } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledViewModel.kt index c52cfc06..47071afe 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/scheduled/ScheduledViewModel.kt @@ -1,13 +1,36 @@ package com.moez.QKSMS.feature.scheduled +import com.moez.QKSMS.common.androidxcompat.scope import com.moez.QKSMS.common.base.QkViewModel +import com.moez.QKSMS.interactor.SendScheduledMessage import com.moez.QKSMS.repository.ScheduledMessageRepository +import com.uber.autodispose.kotlin.autoDisposable +import io.reactivex.rxkotlin.withLatestFrom import javax.inject.Inject class ScheduledViewModel @Inject constructor( - scheduledMessageRepo: ScheduledMessageRepository + private val scheduledMessageRepo: ScheduledMessageRepository, + private val sendScheduledMessage: SendScheduledMessage ) : QkViewModel(ScheduledState( scheduledMessages = scheduledMessageRepo.getScheduledMessages() )) { + override fun bindView(view: ScheduledView) { + super.bindView(view) + + view.messageClickIntent + .autoDisposable(view.scope()) + .subscribe { view.showMessageOptions() } + + view.messageMenuIntent + .withLatestFrom(view.messageClickIntent) { itemId, messageId -> + when (itemId) { + 0 -> sendScheduledMessage.execute(messageId) + 1 -> scheduledMessageRepo.deleteScheduledMessage(messageId) + } + } + .autoDisposable(view.scope()) + .subscribe() + } + } \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 49ffd7f1..6a17dcda 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -135,6 +135,10 @@ Scheduled Your scheduled messages will appear here + + Send now + Delete + Appearance General