diff --git a/data/src/main/java/repository/MessageRepositoryImpl.kt b/data/src/main/java/repository/MessageRepositoryImpl.kt index 3a1458a9..b9601809 100644 --- a/data/src/main/java/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/repository/MessageRepositoryImpl.kt @@ -225,6 +225,15 @@ class MessageRepositoryImpl @Inject constructor( .findAll() } + override fun getUnreadMessages(threadId: Long): RealmResults { + return Realm.getDefaultInstance() + .where(Message::class.java) + .equalTo("read", false) + .equalTo("threadId", threadId) + .sort("date") + .findAll() + } + override fun markArchived(threadId: Long) { val realm = Realm.getDefaultInstance() val conversation = realm.where(Conversation::class.java) diff --git a/domain/src/main/java/repository/MessageRepository.kt b/domain/src/main/java/repository/MessageRepository.kt index 13e29e31..259e42f1 100644 --- a/domain/src/main/java/repository/MessageRepository.kt +++ b/domain/src/main/java/repository/MessageRepository.kt @@ -64,6 +64,12 @@ interface MessageRepository { */ fun getUnreadUnseenMessages(threadId: Long): RealmResults + /** + * Retrieves the list of messages which should be shown in the quickreply popup + * for a given conversation + */ + fun getUnreadMessages(threadId: Long): RealmResults + fun markArchived(threadId: Long) fun markUnarchived(threadId: Long) diff --git a/presentation/src/main/java/feature/compose/MessagesAdapter.kt b/presentation/src/main/java/feature/compose/MessagesAdapter.kt index fca17dad..368ad9b8 100644 --- a/presentation/src/main/java/feature/compose/MessagesAdapter.kt +++ b/presentation/src/main/java/feature/compose/MessagesAdapter.kt @@ -26,6 +26,7 @@ import android.view.View import android.view.ViewGroup import com.jakewharton.rxbinding2.view.RxView import com.moez.QKSMS.R +import common.base.QkViewHolder import common.util.Colors import common.util.DateFormatter import common.util.extensions.dpToPx @@ -44,7 +45,6 @@ import model.Contact import model.Conversation import model.Message import model.PhoneNumber -import common.base.QkViewHolder import util.extensions.isImage import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -65,6 +65,8 @@ class MessagesAdapter @Inject constructor( var data: Pair>? = null set(value) { + if (field === value) return + field = value people.clear() contactMap.clear() diff --git a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt index f732cd21..3e87aef6 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt @@ -19,6 +19,7 @@ package feature.qkreply import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager import android.view.ViewGroup import android.view.Window import android.view.WindowManager @@ -27,13 +28,17 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.base.QkThemedActivity import common.util.extensions.setBackgroundTint +import feature.compose.MessagesAdapter import injection.appComponent import kotlinx.android.synthetic.main.qkreply_activity.* +import javax.inject.Inject class QkReplyActivity : QkThemedActivity(), QkReplyView { override val viewModelClass = QkReplyViewModel::class + @Inject lateinit var adapter: MessagesAdapter + init { appComponent.inject(this) } @@ -48,16 +53,22 @@ class QkReplyActivity : QkThemedActivity(), QkReplyView { window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) viewModel.bindView(this) - - toolbar.clipToOutline = true - colors.composeBackground .autoDisposable(scope()) .subscribe { color -> background.setBackgroundTint(color) } + + toolbar.clipToOutline = true + + val layoutManager = LinearLayoutManager(this).apply { stackFromEnd = true } + + messages.layoutManager = layoutManager + messages.adapter = adapter } override fun render(state: QkReplyState) { title = state.title + + adapter.data = state.data } override fun getAppThemeResourcesObservable() = colors.appDialogThemeResources diff --git a/presentation/src/main/java/feature/qkreply/QkReplyState.kt b/presentation/src/main/java/feature/qkreply/QkReplyState.kt index 10268c52..75bbeb54 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyState.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyState.kt @@ -19,9 +19,10 @@ package feature.qkreply import io.realm.RealmResults +import model.Conversation import model.Message data class QkReplyState( val title: String = "", - val data: RealmResults? = null + val data: Pair>? = null ) \ 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 1d9b6878..1f18ab99 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt @@ -40,7 +40,11 @@ class QkReplyViewModel(intent: Intent) : QkViewModel( .asObservable() .filter { it.isLoaded } .filter { it.isValid } - .subscribe { conversation -> newState { it.copy(title = conversation.getTitle()) } } + .distinctUntilChanged() + .doOnNext { conversation -> newState { it.copy(title = conversation.getTitle()) } } + .map { conversation -> Pair(conversation, messageRepo.getUnreadMessages(conversation.id)) } + .doOnNext { data -> newState { it.copy(data = data) } } + .subscribe() } } diff --git a/presentation/src/main/res/layout/qkreply_activity.xml b/presentation/src/main/res/layout/qkreply_activity.xml index b328150e..1ce2b1c3 100644 --- a/presentation/src/main/res/layout/qkreply_activity.xml +++ b/presentation/src/main/res/layout/qkreply_activity.xml @@ -31,6 +31,19 @@ android:elevation="8dp" tools:context="feature.qkreply.QkReplyActivity"> + + - -