forked from upstream-mirrors/quik
Add ability to mark read, and expand/collapse qk reply
This commit is contained in:
@@ -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) } }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user