diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt index 500cf0ea1..f016ed69a 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt @@ -72,7 +72,7 @@ class NextcloudTalkRepositoryImpl(private val apiService: ApiService) : Nextclou return apiService.joinConversation(user.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(user.baseUrl, conversationToken), conversationPassword) } - override suspend fun exitConversationForUser(user: UserNgEntity, conversationToken: String): GenericOverall { + override suspend fun exitConversationForUser(user: User, conversationToken: String): GenericOverall { return apiService.exitConversation(user.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(user.baseUrl, conversationToken)) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt index 2a88d16ba..9790c0194 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt @@ -82,7 +82,7 @@ interface NextcloudTalkRepository { ): ConversationOverall suspend fun exitConversationForUser( - userNgEntity: UserNgEntity, + user: User, conversationToken: String ): GenericOverall diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt index 853247f13..bced434a5 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt @@ -456,11 +456,13 @@ class ChatView(private val bundle: Bundle) : BaseView(), ImageLoaderInterface { viewModel.view = this setupViews() toolbar?.setOnClickListener(toolbarOnClickListener) + viewModel.joinConversation() } override fun onDetach(view: View) { super.onDetach(view) viewModel.view = null + viewModel.leaveConversation() toolbar?.setOnClickListener(null) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatViewModel.kt index dea7b9dd1..7e3abc98c 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatViewModel.kt @@ -96,7 +96,6 @@ class ChatViewModel constructor(application: Application, this@ChatViewModel.user = user this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken) this@ChatViewModel.conversationPassword = conversationPassword - globalService.getConversation(conversationToken, this@ChatViewModel) } } @@ -171,6 +170,23 @@ class ChatViewModel constructor(application: Application, } } + fun joinConversation() { + initConversation?.token?.let { + viewModelScope.launch { + globalService.getConversation(it, this@ChatViewModel) + } + } + } + + fun leaveConversation() { + conversation.value?.let { + viewModelScope.launch { + globalService.exitConversation(it.token!!, this@ChatViewModel) + } + + } + } + override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) { if (operationStatus == GlobalServiceInterface.OperationStatus.STATUS_OK) { if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) { @@ -190,6 +206,10 @@ class ChatViewModel constructor(application: Application, } } + override suspend fun leftConversationForUser(user: User, conversation: Conversation?, operationStatus: GlobalServiceInterface.OperationStatus) { + // We left the conversation + } + private suspend fun pullPastMessagesForUserAndConversation(userNgEntity: UserNgEntity, conversation: Conversation) { if (userNgEntity.id == user.id && conversation.token == initConversation?.token && view != null) { val getChatMessagesUseCase = GetChatMessagesUseCase(networkComponents.getRepository(true, userNgEntity.toUser()), apiErrorHandler) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/local/converters/HashMapHashMapConverter.kt b/app/src/main/java/com/nextcloud/talk/newarch/local/converters/HashMapHashMapConverter.kt index 5a48ae328..72ba7bc9f 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/local/converters/HashMapHashMapConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/local/converters/HashMapHashMapConverter.kt @@ -7,7 +7,7 @@ class HashMapHashMapConverter { @TypeConverter fun fromDoubleHashMapToString(map: HashMap>?): String? { if (map == null) { - return "" + return LoganSquare.serialize(hashMapOf>()) } return LoganSquare.serialize(map) @@ -16,7 +16,7 @@ class HashMapHashMapConverter { @TypeConverter fun fromStringToDoubleHashMap(value: String?): HashMap>? { if (value.isNullOrEmpty()) { - return null + return hashMapOf() } return LoganSquare.parseMap(value, HashMap::class.java) as HashMap>? diff --git a/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalService.kt b/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalService.kt index 37d446729..6ebb1da36 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalService.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalService.kt @@ -29,11 +29,13 @@ import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatOverall import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.ConversationOverall +import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.newarch.data.model.ErrorModel import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler import com.nextcloud.talk.newarch.domain.repository.offline.ConversationsRepository import com.nextcloud.talk.newarch.domain.repository.offline.MessagesRepository import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository +import com.nextcloud.talk.newarch.domain.usecases.ExitConversationUseCase import com.nextcloud.talk.newarch.domain.usecases.GetConversationUseCase import com.nextcloud.talk.newarch.domain.usecases.JoinConversationUseCase import com.nextcloud.talk.newarch.domain.usecases.SendChatMessageUseCase @@ -45,6 +47,7 @@ import com.nextcloud.talk.newarch.utils.NetworkComponents import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import org.koin.core.KoinComponent import org.koin.core.parameter.parametersOf @@ -128,6 +131,22 @@ class GlobalService constructor(usersRepository: UsersRepository, } } + suspend fun exitConversation(conversationToken: String, globalServiceInterface: GlobalServiceInterface) { + val currentUser = currentUserLiveData.value!!.toUser() + val exitConversationUseCase = ExitConversationUseCase(networkComponents.getRepository(true, currentUser), apiErrorHandler) + exitConversationUseCase.invoke(applicationScope, parametersOf(currentUser, conversationToken), object: UseCaseResponse { + override suspend fun onSuccess(result: GenericOverall) { + globalServiceInterface.leftConversationForUser(currentUser, currentConversation.value, GlobalServiceInterface.OperationStatus.STATUS_OK) + withContext(Dispatchers.Main) { + currentConversation.postValue(null) + } + } + + override suspend fun onError(errorModel: ErrorModel?) { + globalServiceInterface.leftConversationForUser(currentUser, currentConversation.value, GlobalServiceInterface.OperationStatus.STATUS_FAILED) + } + }) + } suspend fun getConversation(conversationToken: String, globalServiceInterface: GlobalServiceInterface) { val currentUser = currentUserLiveData.value val getConversationUseCase = GetConversationUseCase(networkComponents.getRepository(true, currentUser!!.toUser()), apiErrorHandler) @@ -165,7 +184,9 @@ class GlobalService constructor(usersRepository: UsersRepository, override suspend fun onSuccess(result: ConversationOverall) { currentUser?.let { conversationsRepository.saveConversationsForUser(it.id, listOf(result.ocs.data), false) - currentConversation.postValue(conversationsRepository.getConversationForUserWithToken(it.id, result.ocs!!.data!!.token!!)) + withContext(Dispatchers.Main) { + currentConversation.postValue(conversationsRepository.getConversationForUserWithToken(it.id, result.ocs!!.data!!.token!!)) + } globalServiceInterface.joinedConversationForUser(it, currentConversation.value, GlobalServiceInterface.OperationStatus.STATUS_OK) } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalServiceInterface.kt b/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalServiceInterface.kt index e5930c5b6..890ea7ebb 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalServiceInterface.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/services/GlobalServiceInterface.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.newarch.services import com.nextcloud.talk.models.json.conversations.Conversation +import com.nextcloud.talk.newarch.local.models.User import com.nextcloud.talk.newarch.local.models.UserNgEntity interface GlobalServiceInterface { @@ -33,4 +34,5 @@ interface GlobalServiceInterface { suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: OperationStatus) suspend fun joinedConversationForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: OperationStatus) + suspend fun leftConversationForUser(user: User, conversation: Conversation?, operationStatus: OperationStatus) }