Add ability to mark read, and expand/collapse qk reply

This commit is contained in:
Moez Bhatti
2018-03-28 04:15:45 -04:00
parent c136920c68
commit fb97ede7aa
8 changed files with 174 additions and 10 deletions
@@ -21,6 +21,8 @@ package feature.qkreply
import android.content.res.ColorStateList
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
@@ -33,12 +35,15 @@ import common.util.extensions.setBackgroundTint
import feature.compose.MessagesAdapter
import injection.appComponent
import io.reactivex.rxkotlin.Observables
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.qkreply_activity.*
import javax.inject.Inject
class QkReplyActivity : QkThemedActivity<QkReplyViewModel>(), QkReplyView {
override val viewModelClass = QkReplyViewModel::class
override val menuItemIntent: Subject<Int> = PublishSubject.create()
@Inject lateinit var adapter: MessagesAdapter
@@ -95,12 +100,26 @@ class QkReplyActivity : QkThemedActivity<QkReplyViewModel>(), QkReplyView {
}
override fun render(state: QkReplyState) {
title = state.title
threadId.onNext(state.data?.first?.id ?: 0)
title = state.title
toolbar.menu.findItem(R.id.expand)?.isVisible = !state.expanded
toolbar.menu.findItem(R.id.collapse)?.isVisible = state.expanded
adapter.data = state.data
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.qkreply, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
menuItemIntent.onNext(item.itemId)
return true
}
override fun getAppThemeResourcesObservable() = colors.appDialogThemeResources
}
@@ -24,5 +24,6 @@ import model.Message
data class QkReplyState(
val title: String = "",
val expanded: Boolean = false,
val data: Pair<Conversation, RealmResults<Message>>? = null
)
@@ -18,6 +18,12 @@
*/
package feature.qkreply
import android.view.MenuItem
import common.base.QkView
import io.reactivex.Observable
interface QkReplyView : QkView<QkReplyState>
interface QkReplyView : QkView<QkReplyState> {
val menuItemIntent: Observable<Int>
}
@@ -19,9 +19,14 @@
package feature.qkreply
import android.content.Intent
import com.moez.QKSMS.R
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.kotlin.autoDisposable
import common.base.QkViewModel
import injection.appComponent
import interactor.MarkRead
import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.withLatestFrom
import model.Conversation
import repository.MessageRepository
import util.extensions.asObservable
@@ -29,22 +34,55 @@ import javax.inject.Inject
class QkReplyViewModel(intent: Intent) : QkViewModel<QkReplyView, QkReplyState>(QkReplyState()) {
@Inject lateinit var markRead: MarkRead
@Inject lateinit var messageRepo: MessageRepository
init {
appComponent.inject(this)
val threadId = intent.getLongExtra("threadId", -1)
disposables += messageRepo.getConversationAsync(threadId)
private val conversation by lazy {
messageRepo.getConversationAsync(intent.getLongExtra("threadId", -1))
.asObservable<Conversation>()
.filter { it.isLoaded }
.filter { it.isValid }
.distinctUntilChanged()
}
init {
appComponent.inject(this)
disposables += markRead
disposables += conversation
.doOnNext { conversation -> newState { it.copy(title = conversation.getTitle()) } }
.take(1) // We only need to set the messages once
.map { conversation -> Pair(conversation, messageRepo.getUnreadMessages(conversation.id)) }
.doOnNext { data -> newState { it.copy(data = data) } }
.subscribe()
.subscribe { data -> newState { it.copy(data = data) } }
}
override fun bindView(view: QkReplyView) {
super.bindView(view)
// Mark read
view.menuItemIntent
.filter { id -> id == R.id.read }
.withLatestFrom(conversation, { _, conversation -> conversation })
.map { conversation -> conversation.id }
.autoDisposable(view.scope())
.subscribe { threadId -> markRead.execute(threadId) }
// Show all messages
view.menuItemIntent
.filter { id -> id == R.id.expand }
.withLatestFrom(conversation, { _, conversation -> conversation })
.map { conversation -> Pair(conversation, messageRepo.getMessages(conversation.id)) }
.autoDisposable(view.scope())
.subscribe { data -> newState { it.copy(expanded = true, data = data) } }
// Show unread messages only
view.menuItemIntent
.filter { id -> id == R.id.collapse }
.withLatestFrom(conversation, { _, conversation -> conversation })
.map { conversation -> Pair(conversation, messageRepo.getUnreadMessages(conversation.id)) }
.autoDisposable(view.scope())
.subscribe { data -> newState { it.copy(expanded = false, data = data) } }
}
}