Sorting the contacts

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-01-22 19:47:46 +01:00
parent 171fac03c6
commit 91f40d0b7f
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
4 changed files with 57 additions and 35 deletions

View File

@ -80,7 +80,7 @@ class GenericTextHeaderItem(val model: String) : AbstractHeaderItem<GenericTextH
) : FlexibleViewHolder(view, adapter, true) { ) : FlexibleViewHolder(view, adapter, true) {
@JvmField @JvmField
@BindView(R.id.title_text_view) @BindView(R.id.titleTextView)
var titleTextView: TextView? = null var titleTextView: TextView? = null
init { init {

View File

@ -1,6 +1,7 @@
package com.nextcloud.talk.newarch.features.contactsflow package com.nextcloud.talk.newarch.features.contactsflow
import android.content.Context import android.content.Context
import android.util.Log
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import coil.api.load import coil.api.load
@ -14,27 +15,34 @@ import com.nextcloud.talk.utils.ApiUtils
import com.otaliastudios.elements.Element import com.otaliastudios.elements.Element
import com.otaliastudios.elements.Page import com.otaliastudios.elements.Page
import com.otaliastudios.elements.Presenter import com.otaliastudios.elements.Presenter
import com.otaliastudios.elements.extensions.HeaderSource
import kotlinx.android.synthetic.main.rv_item_contact.view.* import kotlinx.android.synthetic.main.rv_item_contact.view.*
import kotlinx.android.synthetic.main.rv_item_title_header.view.*
import org.koin.core.KoinComponent import org.koin.core.KoinComponent
import org.koin.core.inject import org.koin.core.inject
open class ContactPresenter(context: Context, onElementClick: ((Page, Holder, Element<Participant>) -> Unit)?) : Presenter<Participant>(context, onElementClick), KoinComponent { open class ContactPresenter<T : Any>(context: Context, onElementClick: ((Page, Holder, Element<T>) -> Unit)?) : Presenter<T>(context, onElementClick), KoinComponent {
private val globalService: GlobalService by inject() private val globalService: GlobalService by inject()
override val elementTypes: Collection<Int> override val elementTypes: Collection<Int>
get() = listOf(0) get() = listOf(ParticipantElementType.PARTICIPANT.ordinal, ParticipantElementType.PARTICIPANT_HEADER.ordinal)
override fun onCreate(parent: ViewGroup, elementType: Int): Holder { override fun onCreate(parent: ViewGroup, elementType: Int): Holder {
return Holder(getLayoutInflater().inflate(R.layout.rv_item_contact, parent, false)) return if (elementType == ParticipantElementType.PARTICIPANT.ordinal) {
Holder(getLayoutInflater().inflate(R.layout.rv_item_contact, parent, false))
} else {
Holder(getLayoutInflater().inflate(R.layout.rv_item_title_header, parent, false))
}
} }
override fun onBind(page: Page, holder: Holder, element: Element<Participant>, payloads: List<Any>) { override fun onBind(page: Page, holder: Holder, element: Element<T>, payloads: List<Any>) {
super.onBind(page, holder, element, payloads) super.onBind(page, holder, element, payloads)
val participant = element.data if (element.type == ParticipantElementType.PARTICIPANT.ordinal) {
val participant = element.data as Participant?
val user = globalService.currentUserLiveData.value val user = globalService.currentUserLiveData.value
holder.itemView.checkedImageView.isVisible = element.data?.selected == true holder.itemView.checkedImageView.isVisible = participant?.selected == true
if (!payloads.contains(ElementPayload.SELECTION_TOGGLE)) { if (!payloads.contains(ElementPayload.SELECTION_TOGGLE)) {
participant?.displayName?.let { participant?.displayName?.let {
@ -68,5 +76,8 @@ open class ContactPresenter(context: Context, onElementClick: ((Page, Holder, El
} }
} }
} }
} else {
holder.itemView.titleTextView.text = (element.data as HeaderSource.Data<*, *>).header.toString()
}
} }
} }

View File

@ -1,6 +1,7 @@
package com.nextcloud.talk.newarch.features.contactsflow package com.nextcloud.talk.newarch.features.contactsflow
import android.app.Application import android.app.Application
import android.os.Build
import android.util.Log import android.util.Log
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -12,6 +13,8 @@ import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse
import com.nextcloud.talk.newarch.features.conversationslist.ConversationsListView import com.nextcloud.talk.newarch.features.conversationslist.ConversationsListView
import com.nextcloud.talk.newarch.services.GlobalService import com.nextcloud.talk.newarch.services.GlobalService
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
import java.util.*
import kotlin.Comparator
class ContactsViewModel constructor( class ContactsViewModel constructor(
application: Application, application: Application,
@ -26,11 +29,19 @@ class ContactsViewModel constructor(
getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, searchQuery.value, conversationToken), object : getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, searchQuery.value, conversationToken), object :
UseCaseResponse<List<Participant>> { UseCaseResponse<List<Participant>> {
override suspend fun onSuccess(result: List<Participant>) { override suspend fun onSuccess(result: List<Participant>) {
val sortPriority = mapOf("users" to 3, "groups" to 2, "emails" to 1, "circles" to 0) val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 3)
contactsLiveData.postValue(result.sortedWith(Comparator { o1, o2 -> val typeComparator = Comparator<Participant> { o1, o2 ->
sortPriority[o2.source]?.let { sortPriority[o1.source]?.compareTo(it) } sortPriority[o2.source]?.let { sortPriority[o1.source]?.compareTo(it) }
0 0
}
val sortedList = result.sortedWith(compareBy({
sortPriority[it.source]
}, {
it.displayName.toLowerCase(Locale.getDefault())
})) }))
contactsLiveData.postValue(sortedList)
} }
override suspend fun onError(errorModel: ErrorModel?) { override suspend fun onError(errorModel: ErrorModel?) {

View File

@ -25,7 +25,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/title_text_view" android:id="@+id/titleTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"