From abff121931263e1ef4913cc3139b669c18d1d312 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Wed, 19 Sep 2018 02:47:50 -0400 Subject: [PATCH] #1276 - Delete message option in QK Reply --- .../QKSMS/feature/qkreply/QkReplyViewModel.kt | 42 +++++++++---------- presentation/src/main/res/menu/qkreply.xml | 4 ++ presentation/src/main/res/values/strings.xml | 1 + 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyViewModel.kt index 3fe5b20c0..d975d1047 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyViewModel.kt @@ -26,6 +26,7 @@ import com.moez.QKSMS.common.base.QkViewModel import com.moez.QKSMS.compat.SubscriptionManagerCompat import com.moez.QKSMS.extensions.asObservable import com.moez.QKSMS.extensions.mapNotNull +import com.moez.QKSMS.interactor.DeleteMessages import com.moez.QKSMS.interactor.MarkRead import com.moez.QKSMS.interactor.SendMessage import com.moez.QKSMS.model.Message @@ -45,8 +46,9 @@ import javax.inject.Inject import javax.inject.Named class QkReplyViewModel @Inject constructor( - @Named("threadId") threadId: Long, + @Named("threadId") private val threadId: Long, private val conversationRepo: ConversationRepository, + private val deleteMessages: DeleteMessages, private val markRead: MarkRead, private val messageRepo: MessageRepository, private val navigator: Navigator, @@ -110,10 +112,8 @@ class QkReplyViewModel @Inject constructor( // Mark read view.menuItemIntent .filter { id -> id == R.id.read } - .withLatestFrom(conversation) { _, conversation -> conversation } - .map { conversation -> conversation.id } .autoDisposable(view.scope()) - .subscribe { threadId -> + .subscribe { markRead.execute(listOf(threadId)) { newState { copy(hasError = true) } } } @@ -129,8 +129,7 @@ class QkReplyViewModel @Inject constructor( // Show all messages view.menuItemIntent .filter { id -> id == R.id.expand } - .withLatestFrom(conversation) { _, conversation -> conversation } - .map { conversation -> messageRepo.getMessages(conversation.id) } + .map { messageRepo.getMessages(threadId) } .doOnNext(messages::onNext) .autoDisposable(view.scope()) .subscribe { newState { copy(expanded = true) } } @@ -138,18 +137,24 @@ class QkReplyViewModel @Inject constructor( // Show unread messages only view.menuItemIntent .filter { id -> id == R.id.collapse } - .withLatestFrom(conversation) { _, conversation -> conversation } - .map { conversation -> messageRepo.getUnreadMessages(conversation.id) } + .map { messageRepo.getUnreadMessages(threadId) } .doOnNext(messages::onNext) .autoDisposable(view.scope()) .subscribe { newState { copy(expanded = false) } } + // Delete new messages + view.menuItemIntent + .filter { id -> id == R.id.delete } + .observeOn(Schedulers.io()) + .map { messageRepo.getUnreadMessages(threadId).map { it.id } } + .map { messages -> DeleteMessages.Params(messages, threadId) } + .autoDisposable(view.scope()) + .subscribe { deleteMessages.execute(it) { newState { copy(hasError = true) } } } + // View conversation view.menuItemIntent .filter { id -> id == R.id.view } - .withLatestFrom(conversation) { _, conversation -> conversation } - .map { conversation -> conversation.id } - .doOnNext { threadId -> navigator.showConversation(threadId) } + .doOnNext { navigator.showConversation(threadId) } .autoDisposable(view.scope()) .subscribe { newState { copy(hasError = true) } } @@ -178,18 +183,13 @@ class QkReplyViewModel @Inject constructor( .autoDisposable(view.scope()) .subscribe { remaining -> newState { copy(remaining = remaining) } } - // This allows the conversation to be mapped to a threadId in the correct thread - val safeThreadId = conversation.map { it.takeIf { it.isValid }?.id ?: -1 } - // Update the draft whenever the text is changed view.textChangedIntent .debounce(100, TimeUnit.MILLISECONDS) .map { draft -> draft.toString() } .observeOn(Schedulers.io()) - .withLatestFrom(safeThreadId) { draft, threadId -> Pair(draft, threadId) } - .filter { (_, threadId) -> threadId != -1L } .autoDisposable(view.scope()) - .subscribe { (draft, threadId) -> conversationRepo.saveDraft(threadId, draft) } + .subscribe { draft -> conversationRepo.saveDraft(threadId, draft) } // Toggle to the next sim slot view.changeSimIntent @@ -212,16 +212,12 @@ class QkReplyViewModel @Inject constructor( .map { body -> body.toString() } .withLatestFrom(state, conversation) { body, state, conversation -> val subId = state.subscription?.subscriptionId ?: -1 - val threadId = conversation.id val addresses = conversation.recipients.map { it.address } sendMessage.execute(SendMessage.Params(subId, threadId, addresses, body)) view.setDraft("") - threadId } - .doOnNext { threadId -> - markRead.execute(listOf(threadId)) { - newState { copy(hasError = true) } - } + .doOnNext { + markRead.execute(listOf(threadId)) { newState { copy(hasError = true) } } } .autoDisposable(view.scope()) .subscribe() diff --git a/presentation/src/main/res/menu/qkreply.xml b/presentation/src/main/res/menu/qkreply.xml index 5d885afcd..545732282 100644 --- a/presentation/src/main/res/menu/qkreply.xml +++ b/presentation/src/main/res/menu/qkreply.xml @@ -42,6 +42,10 @@ android:id="@+id/call" android:title="@string/qkreply_menu_call" /> + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 30621c2a8..acc6a4f2c 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -301,6 +301,7 @@ Mark read Call + Delete Show more Show less Open conversation