diff --git a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt index c733cf6c..8dc52fc4 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt @@ -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(), QkReplyView { override val viewModelClass = QkReplyViewModel::class + override val menuItemIntent: Subject = PublishSubject.create() @Inject lateinit var adapter: MessagesAdapter @@ -95,12 +100,26 @@ class QkReplyActivity : QkThemedActivity(), 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 } \ No newline at end of file diff --git a/presentation/src/main/java/feature/qkreply/QkReplyState.kt b/presentation/src/main/java/feature/qkreply/QkReplyState.kt index 75bbeb54..8069311a 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyState.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyState.kt @@ -24,5 +24,6 @@ import model.Message data class QkReplyState( val title: String = "", + val expanded: Boolean = false, val data: Pair>? = null ) \ No newline at end of file diff --git a/presentation/src/main/java/feature/qkreply/QkReplyView.kt b/presentation/src/main/java/feature/qkreply/QkReplyView.kt index ce34a1ea..6b1a20a6 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyView.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyView.kt @@ -18,6 +18,12 @@ */ package feature.qkreply +import android.view.MenuItem import common.base.QkView +import io.reactivex.Observable -interface QkReplyView : QkView \ No newline at end of file +interface QkReplyView : QkView { + + val menuItemIntent: Observable + +} \ No newline at end of file diff --git a/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt b/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt index 1f18ab99..1b3ea3f2 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt @@ -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(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() .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) } } } } diff --git a/presentation/src/main/res/drawable/ic_unfold_less_black_24dp.xml b/presentation/src/main/res/drawable/ic_unfold_less_black_24dp.xml new file mode 100644 index 00000000..f65d57f3 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_unfold_less_black_24dp.xml @@ -0,0 +1,27 @@ + + + + diff --git a/presentation/src/main/res/drawable/ic_unfold_more_black_24dp.xml b/presentation/src/main/res/drawable/ic_unfold_more_black_24dp.xml new file mode 100644 index 00000000..d540e6c6 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_unfold_more_black_24dp.xml @@ -0,0 +1,27 @@ + + + + diff --git a/presentation/src/main/res/menu/qkreply.xml b/presentation/src/main/res/menu/qkreply.xml new file mode 100644 index 00000000..94c0c9e6 --- /dev/null +++ b/presentation/src/main/res/menu/qkreply.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + \ 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 e372d126..b5ccd107 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -140,6 +140,10 @@ Loading… View more conversations + Mark read + Expand + Collapse + Material QKSMS+ Apply