From 876e0da557d37a80a87ca073c8f12fe566c8787a Mon Sep 17 00:00:00 2001 From: Eyal Date: Wed, 26 Aug 2020 19:57:23 +0300 Subject: [PATCH] Fixed the final bug. Now there is a bug of opening a new chat with a new user. Not sure it is because of my changes. --- .../res/layout/tavern_chat_intro_item.xml | 6 ++-- .../ui/adapter/social/InboxAdapter.kt | 36 +++++++++++-------- .../social/InboxMessageListFragment.kt | 7 ++-- .../habitica/ui/viewmodels/InboxViewModel.kt | 30 +++++++++++----- 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/Habitica/res/layout/tavern_chat_intro_item.xml b/Habitica/res/layout/tavern_chat_intro_item.xml index 10fbf184c..9dd30971e 100644 --- a/Habitica/res/layout/tavern_chat_intro_item.xml +++ b/Habitica/res/layout/tavern_chat_intro_item.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="200dp" android:gravity="center_horizontal" android:orientation="vertical"> @@ -19,7 +19,7 @@ tools:visibility="visible" /> (DIFF_CALLBACK) { - private var expandedMessageId: String? = null + private val FIRST_MESSAGE = 0 + private val NORMAL_MESSAGE = 1 + private var expandedMessageId: String? = null private val likeMessageEvents = PublishSubject.create() private val userLabelClickEvents = PublishSubject.create() private val deleteMessageEvents = PublishSubject.create() @@ -25,29 +29,29 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : private val replyMessageEvents = PublishSubject.create() private val copyMessageEvents = PublishSubject.create() - override fun getItemViewType(position: Int): Int { - return when (position == super.getItemCount()) { - true -> 1 - false -> 0 - } + private fun isPositionIntroMessage(position: Int) : Boolean { + return (position == super.getItemCount() - 1) } - override fun getItemCount(): Int { - return super.getItemCount() + 1 + override fun getItemViewType(position: Int): Int { + return if (isPositionIntroMessage(position)) FIRST_MESSAGE else NORMAL_MESSAGE + } + + override fun getItemId(position: Int): Long { + return if (isPositionIntroMessage(position)) -1 else super.getItemId(position) + } + + override fun getItem(position: Int) : ChatMessage? { + return if (isPositionIntroMessage(position)) ChatMessage() else super.getItem(position) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatRecyclerViewHolder { - return if (viewType == 1) ChatRecyclerIntroViewHolder(parent.inflate(R.layout.tavern_chat_intro_item), replyToUser.id!!) + return if (viewType == FIRST_MESSAGE) ChatRecyclerIntroViewHolder(parent.inflate(R.layout.tavern_chat_intro_item), replyToUser.id!!) else ChatRecyclerMessageViewHolder(parent.inflate(R.layout.tavern_chat_item), user?.id ?: "", false) } - fun getFirstMessage() : ChatMessage - { - var firstMessage = ChatMessage() - return firstMessage - } override fun onBindViewHolder(holder: ChatRecyclerViewHolder, position: Int) { - val firstMessage : Boolean = getItemViewType(position) == 1 + val firstMessage : Boolean = getItemViewType(position) == FIRST_MESSAGE if (firstMessage) { val introHolder = holder as ChatRecyclerIntroViewHolder introHolder.bind(replyToUser) @@ -95,6 +99,8 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : } private fun expandMessage(id: String, position: Int) { + if (isPositionIntroMessage(position)) + return expandedMessageId = if (expandedMessageId == id) { null } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index d4701b0fd..34b39eeb3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -8,6 +8,8 @@ import android.view.* import androidx.appcompat.app.AlertDialog import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders +import androidx.paging.DataSource +import androidx.paging.PagedList import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -31,6 +33,7 @@ import io.reactivex.functions.Action import io.reactivex.functions.Consumer import kotlinx.android.synthetic.main.fragment_inbox_message_list.* import kotlinx.android.synthetic.main.tavern_chat_new_entry_item.* +import java.lang.Exception import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -67,15 +70,11 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout val layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.getActivity()) recyclerView.layoutManager = layoutManager - compositeSubscription.add(apiClient.getMember(replyToUserUUID!!).subscribe( Consumer { member -> chatAdapter = InboxAdapter(user, member) viewModel?.messages?.observe(this.viewLifecycleOwner, Observer { chatAdapter?.submitList(it) }) - viewModel?.getMemberData()?.observe(this.viewLifecycleOwner, Observer { - activity?.binding?.toolbarTitle?.text = it?.profile?.name - }) recyclerView.adapter = chatAdapter recyclerView.itemAnimator = SafeDefaultItemAnimator() chatAdapter?.let { adapter -> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt index bb1f81a9b..50aa1a3e3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt @@ -37,7 +37,7 @@ class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseVie .setEnablePlaceholders(false) .build() - private val dataSourceFactory = MessagesDataSourceFactory(socialRepository, recipientID) + private val dataSourceFactory = MessagesDataSourceFactory(socialRepository, recipientID, ChatMessage()) val messages: LiveData> = dataSourceFactory.toLiveData(config) private val member: MutableLiveData by lazy { MutableLiveData() @@ -86,7 +86,7 @@ class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseVie } } -private class MessagesDataSource(val socialRepository: SocialRepository, var recipientID: String?): +private class MessagesDataSource(val socialRepository: SocialRepository, var recipientID: String?, var footer : ChatMessage?): PositionalDataSource() { private var lastFetchWasEnd = false override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback) { @@ -99,8 +99,15 @@ private class MessagesDataSource(val socialRepository: SocialRepository, var rec val page = ceil(params.startPosition.toFloat() / params.loadSize.toFloat()).toInt() socialRepository.retrieveInboxMessages(recipientID ?: "", page) .subscribe(Consumer { - if (it.size != 10) lastFetchWasEnd = true - callback.onResult(it) + if (it.size < 10) { + lastFetchWasEnd = true + if (footer != null) + callback.onResult(it.plusElement(footer!!)) + else + callback.onResult(it) + } + else + callback.onResult(it) }, RxErrorHandler.handleEmptyError()) } } @@ -116,23 +123,28 @@ private class MessagesDataSource(val socialRepository: SocialRepository, var rec if (recipientID?.isNotBlank() != true) { return@flatMapPublisher Flowable.just(it) } socialRepository.retrieveInboxMessages(recipientID ?: "", 0) .doOnNext { - messages -> if (messages.size != 10) lastFetchWasEnd = true + messages -> if (messages.size < 10) { + lastFetchWasEnd = true + } } } else { Flowable.just(it) } } .subscribe(Consumer { - callback.onResult(it, 0) + if (it.size < 10 && footer != null) + callback.onResult(it.plusElement(footer!!), 0) + else + callback.onResult(it, 0) }, RxErrorHandler.handleEmptyError()) } } } -private class MessagesDataSourceFactory(val socialRepository: SocialRepository, var recipientID: String?) : +private class MessagesDataSourceFactory(val socialRepository: SocialRepository, var recipientID: String?, val footer : ChatMessage?) : DataSource.Factory() { val sourceLiveData = MutableLiveData() - var latestSource: MessagesDataSource = MessagesDataSource(socialRepository, recipientID) + var latestSource: MessagesDataSource = MessagesDataSource(socialRepository, recipientID, footer) fun updateRecipientID(newID: String?) { recipientID = newID @@ -140,7 +152,7 @@ private class MessagesDataSourceFactory(val socialRepository: SocialRepository, } override fun create(): DataSource { - latestSource = MessagesDataSource(socialRepository, recipientID) + latestSource = MessagesDataSource(socialRepository, recipientID, footer) sourceLiveData.postValue(latestSource) return latestSource }