diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index ae3e4242c..0125394f6 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -70,6 +70,7 @@ import com.nextcloud.talk.account.WebViewLoginActivity import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.CallActivity import com.nextcloud.talk.activities.MainActivity +import com.nextcloud.talk.adapters.items.ContactItem import com.nextcloud.talk.adapters.items.ConversationItem import com.nextcloud.talk.adapters.items.GenericTextHeaderItem import com.nextcloud.talk.adapters.items.LoadMoreResultsItem @@ -80,6 +81,8 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.contacts.ContactsActivityCompose +import com.nextcloud.talk.contacts.ContactsUiState +import com.nextcloud.talk.contacts.ContactsViewModel import com.nextcloud.talk.conversationlist.viewmodels.ConversationsListViewModel import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User @@ -95,6 +98,9 @@ import com.nextcloud.talk.messagesearch.MessageSearchHelper import com.nextcloud.talk.messagesearch.MessageSearchHelper.MessageSearchResults import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.json.conversations.ConversationEnums +import com.nextcloud.talk.models.json.conversations.RoomsOverall +import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter +import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository import com.nextcloud.talk.settings.SettingsActivity import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment @@ -178,6 +184,9 @@ class ConversationsListActivity : @Inject lateinit var networkMonitor: NetworkMonitor + @Inject + lateinit var contactsViewModel: ContactsViewModel + lateinit var conversationsListViewModel: ConversationsListViewModel override val appBarLayoutType: AppBarLayoutType @@ -387,6 +396,45 @@ class ConversationsListActivity : setConversationList(list) }.collect() } + + lifecycleScope.launch { + contactsViewModel.contactsViewState.onEach { state -> + when (state) { + is ContactsUiState.Success -> { + if (state.contacts.isNullOrEmpty()) return@onEach + + val userItems: MutableList> = ArrayList() + val actorTypeConverter = EnumActorTypeConverter() + var genericTextHeaderItem: GenericTextHeaderItem + for (autocompleteUser in state.contacts) { + val headerTitle = resources!!.getString(R.string.nc_user) + if (!callHeaderItems.containsKey(headerTitle)) { + genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils) + callHeaderItems[headerTitle] = genericTextHeaderItem + } + + val participant = Participant() + participant.actorId = autocompleteUser.id + participant.actorType = actorTypeConverter.getFromString(autocompleteUser.source) + participant.displayName = autocompleteUser.label + + val contactItem = ContactItem( + participant, + currentUser!!, + callHeaderItems[headerTitle], + viewThemeUtils + ) + + userItems.add(contactItem) + } + + searchableConversationItems.addAll(userItems) + } + + else -> {} + } + }.collect() + } } private fun setConversationList(list: List) { @@ -411,6 +459,9 @@ class ConversationsListActivity : intArrayOf(ApiUtils.API_V4, ApiUtils.API_V3, 1) ) fetchOpenConversations(apiVersion) + + // Get users + fetchUsers() } private fun hasFilterEnabled(): Boolean { @@ -944,40 +995,45 @@ class ConversationsListActivity : ) ) { val openConversationItems: MutableList> = ArrayList() - // openConversationsQueryDisposable = ncApi.getOpenConversations( - // credentials, - // ApiUtils.getUrlForOpenConversations(apiVersion, currentUser!!.baseUrl!!) - // ) - // .subscribeOn(Schedulers.io()) - // .observeOn(AndroidSchedulers.mainThread()) - // .subscribe({ (ocs): RoomsOverall -> - // for (conversation in ocs!!.data!!) { - // val headerTitle = resources!!.getString(R.string.openConversations) - // var genericTextHeaderItem: GenericTextHeaderItem - // if (!callHeaderItems.containsKey(headerTitle)) { - // genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils) - // callHeaderItems[headerTitle] = genericTextHeaderItem - // } - // val conversationItem = ConversationItem( - // conversation, - // currentUser!!, - // this, - // callHeaderItems[headerTitle], - // viewThemeUtils - // ) - // openConversationItems.add(conversationItem) - // } - // searchableConversationItems.addAll(openConversationItems) - // }, { throwable: Throwable -> - // Log.e(TAG, "fetchData - getRooms - ERROR", throwable) - // handleHttpExceptions(throwable) - // dispose(openConversationsQueryDisposable) - // }) { dispose(openConversationsQueryDisposable) } + openConversationsQueryDisposable = ncApi.getOpenConversations( + credentials, + ApiUtils.getUrlForOpenConversations(apiVersion, currentUser!!.baseUrl!!), + "" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ (ocs): RoomsOverall -> + for (conversation in ocs!!.data!!) { + val headerTitle = resources!!.getString(R.string.openConversations) + var genericTextHeaderItem: GenericTextHeaderItem + if (!callHeaderItems.containsKey(headerTitle)) { + genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils) + callHeaderItems[headerTitle] = genericTextHeaderItem + } + val conversationItem = ConversationItem( + ConversationModel.mapToConversationModel(conversation, currentUser!!), + currentUser!!, + this, + callHeaderItems[headerTitle], + viewThemeUtils + ) + openConversationItems.add(conversationItem) + } + searchableConversationItems.addAll(openConversationItems) + }, { throwable: Throwable -> + Log.e(TAG, "fetchData - getRooms - ERROR", throwable) + handleHttpExceptions(throwable) + dispose(openConversationsQueryDisposable) + }) { dispose(openConversationsQueryDisposable) } } else { Log.d(TAG, "no open conversations fetched because of missing capability") } } + private fun fetchUsers() { + contactsViewModel.getContactsFromSearchParams() + } + private fun handleHttpExceptions(throwable: Throwable) { if (throwable is HttpException) { when (throwable.code()) { @@ -1923,8 +1979,8 @@ class ConversationsListActivity : if (results.hasMore) { adapterItems.add(LoadMoreResultsItem) } - // add unified search result at the end of the list - adapter!!.addItems(adapter!!.mainItemCount + adapter!!.scrollableHeaders.size, adapterItems) + + adapter!!.addItems(0, adapterItems) binding.recyclerView?.scrollToPosition(0) } }