Fix selecting contacts

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-02-23 09:19:13 +01:00
parent 1b5b8beda3
commit cbd73164e2
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
10 changed files with 30 additions and 39 deletions

View File

@ -43,7 +43,6 @@ import com.nextcloud.talk.utils.PushUtils
import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.preferences.AppPreferences
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
import java.net.URLDecoder import java.net.URLDecoder

View File

@ -57,7 +57,7 @@ class ChatViewModel constructor(application: Application,
fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) { fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) {
viewModelScope.launch { viewModelScope.launch {
this@ChatViewModel.user = user this@ChatViewModel.user = user
this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken) this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id, conversationToken)
this@ChatViewModel.conversationPassword = conversationPassword this@ChatViewModel.conversationPassword = conversationPassword
globalService.getConversation(conversationToken, this@ChatViewModel) globalService.getConversation(conversationToken, this@ChatViewModel)
} }
@ -70,7 +70,7 @@ class ChatViewModel constructor(application: Application,
override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) { override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) {
if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) { if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) {
if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) { if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) {
this.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id!!, conversation.token!!) this.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id, conversation.token!!)
conversation.token?.let { conversationToken -> conversation.token?.let { conversationToken ->
globalService.joinConversation(conversationToken, conversationPassword, this) globalService.joinConversation(conversationToken, conversationPassword, this)
} }

View File

@ -23,7 +23,6 @@
package com.nextcloud.talk.newarch.features.contactsflow.contacts package com.nextcloud.talk.newarch.features.contactsflow.contacts
import android.content.Context import android.content.Context
import android.content.res.ColorStateList
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -42,6 +41,7 @@ import com.nextcloud.talk.controllers.ChatController
import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.newarch.data.presenters.AdvancedEmptyPresenter import com.nextcloud.talk.newarch.data.presenters.AdvancedEmptyPresenter
import com.nextcloud.talk.newarch.features.contactsflow.ContactsViewOperationState import com.nextcloud.talk.newarch.features.contactsflow.ContactsViewOperationState
import com.nextcloud.talk.newarch.features.contactsflow.ParticipantElement
import com.nextcloud.talk.newarch.features.contactsflow.groupconversation.GroupConversationView import com.nextcloud.talk.newarch.features.contactsflow.groupconversation.GroupConversationView
import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher
import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.BaseView
@ -168,8 +168,6 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() {
} }
selectedParticipantsLiveData.observe(this@ContactsView) { participants -> selectedParticipantsLiveData.observe(this@ContactsView) { participants ->
view.selectedParticipantsRecyclerView.isVisible = participants.isNotEmpty()
view.divider.isVisible = participants.isNotEmpty()
floatingActionButton?.isVisible = participants.isNotEmpty() floatingActionButton?.isVisible = participants.isNotEmpty()
} }
@ -223,29 +221,24 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() {
} }
private fun onElementClick(page: Page, holder: Presenter.Holder, element: Element<Any>) { private fun onElementClick(page: Page, holder: Presenter.Holder, element: Element<Any>) {
if (element.data is Participant?) { if (element.type == ParticipantElementType.PARTICIPANT.ordinal || element.type == ParticipantElementType.PARTICIPANT_SELECTED.ordinal) {
val participant = element.data as Participant? val participantElement = element.data as ParticipantElement
val participant = participantElement.data as Participant
if (isNewGroupConversation || hasToken) { if (isNewGroupConversation || hasToken) {
val isElementSelected = participant?.selected == true if (participant.selected) {
participant?.let { viewModel.unselectParticipant(participant)
if (isElementSelected) {
viewModel.unselectParticipant(it)
} else { } else {
viewModel.selectParticipant(it) viewModel.selectParticipant(participant)
} }
it.selected = !isElementSelected participant.selected = !participant.selected
if (element.type == ParticipantElementType.PARTICIPANT_SELECTED.ordinal) { if (element.type == ParticipantElementType.PARTICIPANT_SELECTED.ordinal) {
participantsAdapter.notifyItemRangeChanged(0, participantsAdapter.itemCount, ElementPayload.SELECTION_TOGGLE) participantsAdapter.notifyItemRangeChanged(0, participantsAdapter.itemCount, ElementPayload.SELECTION_TOGGLE)
} else { } else {
participantsAdapter.notifyItemChanged(holder.adapterPosition, ElementPayload.SELECTION_TOGGLE) participantsAdapter.notifyItemChanged(holder.adapterPosition, ElementPayload.SELECTION_TOGGLE)
} }
}
} else { } else {
participant?.let { viewModel.createConversation(1, participant.userId)
// One to one conversation
viewModel.createConversation(1, it.userId)
}
} }
} else if (element.type == ParticipantElementType.PARTICIPANT_NEW_GROUP.ordinal) { } else if (element.type == ParticipantElementType.PARTICIPANT_NEW_GROUP.ordinal) {
router.replaceTopController(RouterTransaction.with(GroupConversationView()) router.replaceTopController(RouterTransaction.with(GroupConversationView())

View File

@ -97,7 +97,6 @@ class ContactsViewModel constructor(
if (result.ocs.data.type == Conversation.ConversationType.ONE_TO_ONE_CONVERSATION || participants.isEmpty()) { if (result.ocs.data.type == Conversation.ConversationType.ONE_TO_ONE_CONVERSATION || participants.isEmpty()) {
result.ocs.data.token?.let { result.ocs.data.token?.let {
_operationState.postValue(ContactsViewOperationStateWrapper(ContactsViewOperationState.OK, null, it)) _operationState.postValue(ContactsViewOperationStateWrapper(ContactsViewOperationState.OK, null, it))
} ?: run { } ?: run {
_operationState.postValue(ContactsViewOperationStateWrapper(ContactsViewOperationState.CONVERSATION_CREATION_FAILED, null, null)) _operationState.postValue(ContactsViewOperationStateWrapper(ContactsViewOperationState.CONVERSATION_CREATION_FAILED, null, null))
} }

View File

@ -29,7 +29,6 @@ import com.otaliastudios.elements.Element
import com.otaliastudios.elements.Page import com.otaliastudios.elements.Page
import com.otaliastudios.elements.Source import com.otaliastudios.elements.Source
import com.otaliastudios.elements.extensions.MainSource import com.otaliastudios.elements.extensions.MainSource
import java.lang.Exception
class ContactsViewSource<T : ParticipantElement>(private val data: LiveData<List<T>>, loadingIndicatorsEnabled: Boolean = true, errorIndicatorEnabled: Boolean = true, emptyIndicatorEnabled: Boolean = true) : MainSource<T>(loadingIndicatorsEnabled, errorIndicatorEnabled, emptyIndicatorEnabled) { class ContactsViewSource<T : ParticipantElement>(private val data: LiveData<List<T>>, loadingIndicatorsEnabled: Boolean = true, errorIndicatorEnabled: Boolean = true, emptyIndicatorEnabled: Boolean = true) : MainSource<T>(loadingIndicatorsEnabled, errorIndicatorEnabled, emptyIndicatorEnabled) {
private var currentPage: Page? = null private var currentPage: Page? = null

View File

@ -164,7 +164,7 @@ class ConversationsListView : BaseView() {
bundle.putString(BundleKeys.KEY_ROOM_ID, conversation.conversationId) bundle.putString(BundleKeys.KEY_ROOM_ID, conversation.conversationId)
bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(conversation)) bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(conversation))
ConductorRemapping.remapChatController( ConductorRemapping.remapChatController(
router, user.id!!, conversation.token!!, router, user.id, conversation.token!!,
bundle, false bundle, false
) )
} }

View File

@ -78,7 +78,7 @@ class ConversationsListViewModel constructor(
filterLiveData.value = null filterLiveData.value = null
Transformations.switchMap(filterLiveData) { filter -> Transformations.switchMap(filterLiveData) { filter ->
if (user != null) { if (user != null) {
conversationsRepository.getConversationsForUser(user.id!!, filter) conversationsRepository.getConversationsForUser(user.id, filter)
} else { } else {
liveData { liveData {
listOf<Conversation>() listOf<Conversation>()
@ -99,7 +99,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> { object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) { override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.deleteConversation( conversationsRepository.deleteConversation(
globalService.currentUserLiveData.value!!.id!!, conversation globalService.currentUserLiveData.value!!.id, conversation
.conversationId!! .conversationId!!
) )
} }
@ -128,7 +128,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> { object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) { override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.deleteConversation( conversationsRepository.deleteConversation(
globalService.currentUserLiveData.value!!.id!!, conversation globalService.currentUserLiveData.value!!.id, conversation
.conversationId!! .conversationId!!
) )
} }
@ -159,7 +159,7 @@ class ConversationsListViewModel constructor(
object : UseCaseResponse<GenericOverall> { object : UseCaseResponse<GenericOverall> {
override suspend fun onSuccess(result: GenericOverall) { override suspend fun onSuccess(result: GenericOverall) {
conversationsRepository.setFavoriteValueForConversation( conversationsRepository.setFavoriteValueForConversation(
globalService.currentUserLiveData.value!!.id!!, globalService.currentUserLiveData.value!!.id,
conversation.conversationId!!, favorite conversation.conversationId!!, favorite
) )
} }
@ -202,7 +202,7 @@ class ConversationsListViewModel constructor(
} }
conversationsRepository.saveConversationsForUser( conversationsRepository.saveConversationsForUser(
internalUserId!!, internalUserId,
mutableList) mutableList)
messageData = "" messageData = ""
conversationsLoadingLock.unlock() conversationsLoadingLock.unlock()
@ -223,7 +223,7 @@ class ConversationsListViewModel constructor(
value: Boolean value: Boolean
) { ) {
conversationsRepository.setChangingValueForConversation( conversationsRepository.setChangingValueForConversation(
globalService.currentUserLiveData.value!!.id!!, conversation globalService.currentUserLiveData.value!!.id, conversation
.conversationId!!, value .conversationId!!, value
) )
} }

View File

@ -71,7 +71,7 @@ class GlobalService constructor(usersRepository: UsersRepository,
object : UseCaseResponse<ConversationOverall> { object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) { override suspend fun onSuccess(result: ConversationOverall) {
currentUser?.let { currentUser?.let {
conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data)) conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data))
globalServiceInterface.gotConversationInfoForUser(it, result.ocs.data, GlobalServiceInterface.OperationStatus.STATUS_OK) globalServiceInterface.gotConversationInfoForUser(it, result.ocs.data, GlobalServiceInterface.OperationStatus.STATUS_OK)
} }
} }
@ -94,8 +94,8 @@ class GlobalService constructor(usersRepository: UsersRepository,
object : UseCaseResponse<ConversationOverall> { object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) { override suspend fun onSuccess(result: ConversationOverall) {
currentUser?.let { currentUser?.let {
conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data)) conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data))
currentConversation = conversationsRepository.getConversationForUserWithToken(it.id!!, result.ocs!!.data!!.token!!) currentConversation = conversationsRepository.getConversationForUserWithToken(it.id, result.ocs!!.data!!.token!!)
globalServiceInterface.joinedConversationForUser(it, currentConversation, GlobalServiceInterface.OperationStatus.STATUS_OK) globalServiceInterface.joinedConversationForUser(it, currentConversation, GlobalServiceInterface.OperationStatus.STATUS_OK)
} }
} }

View File

@ -61,7 +61,7 @@ class ShortcutService constructor(private var context: Context,
currentUser = user currentUser = user
var internalUserId: Long = -1 var internalUserId: Long = -1
currentUser?.let { currentUser?.let {
internalUserId = it.id!! internalUserId = it.id
} }
conversationsRepository.getShortcutTargetConversations(internalUserId) conversationsRepository.getShortcutTargetConversations(internalUserId)
} }

View File

@ -15,6 +15,7 @@
<View <View
android:id="@+id/divider" android:id="@+id/divider"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_below="@id/selectedParticipantsRecyclerView" android:layout_below="@id/selectedParticipantsRecyclerView"