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
}