Skip to content
Snippets Groups Projects
Commit b0b92a60 authored by Amirhossein Naghshzan's avatar Amirhossein Naghshzan
Browse files

ConversationFacade: fix contact search problem

Change-Id: Icff67c3bded5835c948f7a5566dee3aaa5394dc5
parent 37c2251c
No related branches found
No related tags found
No related merge requests found
......@@ -45,11 +45,11 @@ class SmartListAdapter(
private var convHeaderIndex: Int = -1
private var conversations = setItems(conversations ?: ConversationFacade.ConversationList())
fun setItems(list: ConversationFacade.ConversationList): ConversationFacade.ConversationList {
private fun setItems(list: ConversationFacade.ConversationList): ConversationFacade.ConversationList {
itemCount = list.getCombinedSize()
if (list.publicDirectory.isNotEmpty()) {
if (list.searchResult.result.isNotEmpty()) {
searchHeaderIndex = 0
convHeaderIndex = if (list.conversations.isEmpty()) -1 else list.publicDirectory.size + 1
convHeaderIndex = if (list.conversations.isEmpty()) -1 else list.searchResult.result.size + 1
} else {
searchHeaderIndex = -1
convHeaderIndex = -1
......
......@@ -101,7 +101,7 @@ class SmartListFragment : BaseSupportFragment<SmartListPresenter, SmartListView>
super.onStart()
if (mHomeFragment == null)
mHomeFragment =
activity!!.supportFragmentManager.findFragmentById(R.id.home_fragment) as HomeFragment?
requireActivity().supportFragmentManager.findFragmentById(R.id.home_fragment) as HomeFragment?
}
override fun setLoading(loading: Boolean) {
......
......@@ -91,7 +91,7 @@ class ContactSearchFragment : BaseSearchFragment<ContactSearchPresenter>(),
override fun displayResults(contacts: ConversationFacade.ConversationList, conversationFacade: ConversationFacade) {
var scrollToTop = false
if (contacts.publicDirectory.isEmpty()) {
if (contacts.searchResult.result.isEmpty()) {
if (directoryRow != null) {
mRowsAdapter.remove(directoryRow)
directoryRow = null
......@@ -99,12 +99,12 @@ class ContactSearchFragment : BaseSearchFragment<ContactSearchPresenter>(),
} else {
if (directoryRow == null) {
val adapter = ArrayObjectAdapter(CardPresenterSelector(requireContext(), conversationFacade))
adapter.addAll(0, contacts.publicDirectory.map { item -> ContactCard(item, Card.Type.SEARCH_RESULT) })
adapter.addAll(0, contacts.searchResult.result.map { item -> ContactCard(item, Card.Type.SEARCH_RESULT) })
directoryRow = ListRow(HeaderItem(getString(R.string.search_results)), adapter)
mRowsAdapter.add(0, directoryRow)
} else {
(directoryRow!!.adapter as ArrayObjectAdapter).setItems(
contacts.publicDirectory.map { item -> ContactCard(item, Card.Type.SEARCH_RESULT) }, diff)
contacts.searchResult.result.map { item -> ContactCard(item, Card.Type.SEARCH_RESULT) }, diff)
}
scrollToTop = true
}
......
......@@ -26,8 +26,6 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject
import io.reactivex.rxjava3.subjects.Subject
import net.jami.model.*
import net.jami.model.Account.ContactLocationEntry
import net.jami.model.Call.CallStatus
......@@ -325,57 +323,63 @@ class ConversationFacade(
}
}*/
private fun getConversationSearchResults(account: Account, query: String): Single<List<Conversation>> {
data class SearchResult(val query: String, val result: List<Conversation>) {
companion object {
val EMPTY_RESULT = SearchResult("", emptyList())
}
}
private fun getConversationSearchResults(account: Account, query: String): Single<SearchResult> {
val uri = Uri.fromString(query)
return if (uri.isEmpty) {
Single.just(emptyList())
Single.just(SearchResult.EMPTY_RESULT)
} else if (account.isSip || uri.isHexId) {
Single.just(listOf(account.getByUri(uri)!!))
Single.just(SearchResult(query, listOf(account.getByUri(uri)!!)))
} else if (account.canSearch() && !query.contains("@")) {
mAccountService.searchUser(account.accountId, query)
.map { results -> results.results!!.map { contact -> account.getByUri(contact.conversationUri.blockingFirst())!! } }
.map { results -> SearchResult(query, results.results!!.map { contact -> account.getByUri(contact.conversationUri.blockingFirst())!! }) }
} else {
mAccountService.findRegistrationByName(account.accountId, "", query)
.map { result: RegisteredName ->
if (result.state == 0)
listOf(account.getByKey(result.address!!).apply {
SearchResult(query, listOf(account.getByKey(result.address!!).apply {
contact?.let { c -> synchronized(c) {
if (c.username == null)
c.username = Single.just(result.name)
}}
})
}))
else
emptyList()
SearchResult.EMPTY_RESULT
}
}
}
fun getConversationSearchResults(account: Account, query: Observable<String>): Observable<List<Conversation>> =
fun getConversationSearchResults(account: Account, query: Observable<String>): Observable<SearchResult> =
query.switchMapSingle { q: String ->
if (q.isEmpty())
Single.just(emptyList())
Single.just(SearchResult.EMPTY_RESULT)
else getConversationSearchResults(account, q)
}
data class ConversationList(val conversations: List<Conversation> = emptyList(), val publicDirectory: List<Conversation> = emptyList(), val query: String = "") {
fun isEmpty(): Boolean = conversations.isEmpty() && publicDirectory.isEmpty()
data class ConversationList(val conversations: List<Conversation> = emptyList(), val searchResult: SearchResult = SearchResult.EMPTY_RESULT, val latestQuery: String = "") {
fun isEmpty(): Boolean = conversations.isEmpty() && searchResult.result.isEmpty()
fun getCombinedSize(): Int {
if (publicDirectory.isEmpty()) return conversations.size
if (conversations.isEmpty()) return publicDirectory.size + 1
return conversations.size + publicDirectory.size + 2
if (searchResult.result.isEmpty()) return conversations.size
if (conversations.isEmpty()) return searchResult.result.size + 1
return conversations.size + searchResult.result.size + 2
}
operator fun get(index: Int): Conversation? {
return if (publicDirectory.isEmpty()) conversations.getOrNull(index)
else if (conversations.isEmpty() || index < publicDirectory.size + 1) publicDirectory.getOrNull(index - 1)
else conversations.getOrNull(index - publicDirectory.size - 2)
return if (searchResult.result.isEmpty()) conversations.getOrNull(index)
else if (conversations.isEmpty() || index < searchResult.result.size + 1) searchResult.result.getOrNull(index - 1)
else conversations.getOrNull(index - searchResult.result.size - 2)
}
fun getHeader(index: Int): ConversationItemViewModel.Title {
return if (publicDirectory.isEmpty()) ConversationItemViewModel.Title.None
return if (searchResult.result.isEmpty()) ConversationItemViewModel.Title.None
else if (index == 0) ConversationItemViewModel.Title.PublicDirectory
else if (conversations.isNotEmpty() && index == publicDirectory.size + 1) ConversationItemViewModel.Title.Conversations
else if (conversations.isNotEmpty() && index == searchResult.result.size + 1) ConversationItemViewModel.Title.Conversations
else ConversationItemViewModel.Title.None
}
}
......@@ -400,13 +404,13 @@ class ConversationFacade(
getConversationSearchResults(account, query),
query
) { conversations, searchResults, q -> ConversationList(conversations, searchResults, q) }
}.flatMapSingle { list ->
if (list.query.isNotEmpty() && list.conversations.isNotEmpty()) {
val lq = list.query.lowercase()
}.switchMapSingle { list ->
if (list.latestQuery.isNotBlank() && list.conversations.isNotEmpty()) {
val lq = list.latestQuery.lowercase()
Maybe.concatEager(list.conversations.map { c -> mContactService.getLoadedConversation(c)
.filter { it.matches(lq) }.map { c }
}).toList().map { newList -> ConversationList(newList, list.publicDirectory, list.query) }
} else Single.just(list)
}).toList().map { newList -> ConversationList(newList, list.searchResult, lq) }
} else Single.just(ConversationList(list.conversations))
}
/**
......
......@@ -57,7 +57,7 @@ class SmartListPresenter @Inject constructor(
.subscribe { list ->
val v = this.view ?: return@subscribe
v.setLoading(false)
if (list.isEmpty()) {
if (list.conversations.isEmpty()) {
v.hideList()
v.displayNoConversationMessage()
} else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment