diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/base/UseCaseResponse.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/base/UseCaseResponse.kt index 22fca0c35..6a0f7147e 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/base/UseCaseResponse.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/base/UseCaseResponse.kt @@ -24,6 +24,6 @@ import com.nextcloud.talk.newarch.data.model.ErrorModel interface UseCaseResponse { suspend fun onSuccess(result: Type) - fun onError(errorModel: ErrorModel?) + suspend fun onError(errorModel: ErrorModel?) } 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 3bdb09e10..d240d231b 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 @@ -68,6 +68,9 @@ class ChatView : BaseView(), MessageHolders.ContentChecker, MessagesLi private lateinit var recyclerViewAdapter: MessagesListAdapter private lateinit var mentionAutocomplete: Autocomplete<*> + private var shouldShowLobby: Boolean = false + private var isReadOnlyConversation: Boolean = false + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup @@ -88,8 +91,10 @@ class ChatView : BaseView(), MessageHolders.ContentChecker, MessagesLi actionBar?.setIcon(null) } - val shouldShowLobby = conversation!!.shouldShowLobby(user) - val isReadOnlyConversation = conversation.conversationReadOnlyState == Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY + shouldShowLobby = conversation!!.shouldShowLobby(user) + isReadOnlyConversation = conversation.conversationReadOnlyState == Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY + + activity?.invalidateOptionsMenu() if (shouldShowLobby) { view?.messagesListView?.visibility = View.GONE @@ -134,9 +139,21 @@ class ChatView : BaseView(), MessageHolders.ContentChecker, MessagesLi ) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_conversation_plus_filter, menu) + } + + override fun onPrepareOptionsMenu(menu: Menu) { + super.onPrepareOptionsMenu(menu) conversationInfoMenuItem = menu.findItem(R.id.conversation_info) conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call) conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call) + + if (shouldShowLobby || isReadOnlyConversation) { + conversationVoiceCallMenuItem?.isVisible = false + conversationVideoMenuItem?.isVisible = false + } else { + conversationVoiceCallMenuItem?.isVisible = true + conversationVideoMenuItem?.isVisible = true + } } private fun setupViews() { 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 80d59fc32..c6e6f861f 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 @@ -16,6 +16,7 @@ import com.nextcloud.talk.newarch.domain.usecases.JoinConversationUseCase import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse import com.nextcloud.talk.newarch.local.models.UserNgEntity import com.nextcloud.talk.newarch.utils.ConversationsManager +import com.nextcloud.talk.newarch.utils.ConversationsManagerInterface import kotlinx.coroutines.launch import org.koin.core.parameter.parametersOf @@ -24,9 +25,10 @@ class ChatViewModel constructor(application: Application, private val exitConversationUseCase: ExitConversationUseCase, private val conversationsRepository: ConversationsRepository, private val messagesRepository: MessagesRepository, - private val conversationsManager: ConversationsManager) : BaseViewModel(application) { + private val conversationsManager: ConversationsManager) : BaseViewModel(application), ConversationsManagerInterface { lateinit var user: UserNgEntity val conversation: MutableLiveData = MutableLiveData() + var initConversation: Conversation? = null val messagesLiveData = Transformations.switchMap(conversation) { it?.let { messagesRepository.getMessagesWithUserForConversation(it.conversationId!!) @@ -38,45 +40,29 @@ class ChatViewModel constructor(application: Application, fun init(user: UserNgEntity, conversationToken: String, conversationPassword: String?) { viewModelScope.launch { this@ChatViewModel.user = user - this@ChatViewModel.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken) + this@ChatViewModel.initConversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken) this@ChatViewModel.conversationPassword = conversationPassword + conversationsManager.getConversation(conversationToken, this@ChatViewModel) } } - suspend fun joinConversation() { - joinConversationUseCase.invoke(viewModelScope, parametersOf( - user, - conversation.value!!.token, - conversationPassword - ), - object : UseCaseResponse { - override suspend fun onSuccess(result: RoomOverall) { - conversationsRepository.saveConversationsForUser(user.id!!, listOf(result.ocs.data)) - } - - override fun onError(errorModel: ErrorModel?) { - // what do we do on error - } - }) - } - - suspend fun exitConversation() { - exitConversationUseCase.invoke(backgroundScope, parametersOf( - user, - conversation.value!!.token - ), - object : UseCaseResponse { - override suspend fun onSuccess(result: GenericOverall) { - } - - override fun onError(errorModel: ErrorModel?) { - // what do we do on error - } - }) - } - fun sendMessage(message: CharSequence) { } + override suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: ConversationsManagerInterface.OperationStatus) { + if (operationStatus == ConversationsManagerInterface.OperationStatus.STATUS_OK) { + if (userNgEntity.id == user.id && conversation!!.token == initConversation?.token) { + this.conversation.value = conversationsRepository.getConversationForUserWithToken(user.id!!, conversation.token!!) + conversation.token?.let { conversationToken -> + conversationsManager.joinConversation(conversationToken, conversationPassword, this) + } + } + } + } + + override suspend fun joinedConversationForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: ConversationsManagerInterface.OperationStatus) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index 031abcd1b..742dbd32b 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -105,7 +105,6 @@ class ConversationsListView : BaseView(), OnQueryTextListener, } settingsItem = menu.findItem(R.id.action_settings) - loadAvatar() } private fun loadAvatar() { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt index f8096e2ef..886acd953 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt @@ -81,7 +81,7 @@ class ConversationsListViewModel constructor( ) } - override fun onError(errorModel: ErrorModel?) { + override suspend fun onError(errorModel: ErrorModel?) { messageData = errorModel?.getErrorMessage() if (errorModel?.code == 400) { // couldn't leave because we're last moderator @@ -110,7 +110,7 @@ class ConversationsListViewModel constructor( ) } - override fun onError(errorModel: ErrorModel?) { + override suspend fun onError(errorModel: ErrorModel?) { messageData = errorModel?.getErrorMessage() viewModelScope.launch { setConversationUpdateStatus(conversation, false) @@ -141,7 +141,7 @@ class ConversationsListViewModel constructor( ) } - override fun onError(errorModel: ErrorModel?) { + override suspend fun onError(errorModel: ErrorModel?) { messageData = errorModel?.getErrorMessage() viewModelScope.launch { setConversationUpdateStatus(conversation, false) @@ -166,7 +166,7 @@ class ConversationsListViewModel constructor( messageData = "" } - override fun onError(errorModel: ErrorModel?) { + override suspend fun onError(errorModel: ErrorModel?) { messageData = errorModel?.getErrorMessage() } }) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManager.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManager.kt index a2e94b79c..5b7c1b6e0 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManager.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManager.kt @@ -58,7 +58,7 @@ class ConversationsManager constructor(usersRepository: UsersRepository, } } - suspend fun getConversation(conversationToken: String) { + suspend fun getConversation(conversationToken: String, conversationsManagerInterface: ConversationsManagerInterface) { val currentUser = currentUserLiveData.value getConversationUseCase.invoke(applicationScope, parametersOf( currentUser, @@ -68,11 +68,14 @@ class ConversationsManager constructor(usersRepository: UsersRepository, override suspend fun onSuccess(result: RoomOverall) { currentUser?.let { conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data)) + conversationsManagerInterface.gotConversationInfoForUser(it, result.ocs.data, ConversationsManagerInterface.OperationStatus.STATUS_OK) } } - override fun onError(errorModel: ErrorModel?) { - // what do we do on error + override suspend fun onError(errorModel: ErrorModel?) { + currentUser?.let { + conversationsManagerInterface.gotConversationInfoForUser(it, null, ConversationsManagerInterface.OperationStatus.STATUS_FAILED) + } } }) } @@ -89,12 +92,14 @@ class ConversationsManager constructor(usersRepository: UsersRepository, currentUser?.let { conversationsRepository.saveConversationsForUser(it.id!!, listOf(result.ocs.data)) currentConversation = conversationsRepository.getConversationForUserWithToken(it.id!!, result.ocs!!.data!!.token!!) - conversationsManagerInterface.joinedConversationForUser(it, currentConversation) + conversationsManagerInterface.joinedConversationForUser(it, currentConversation, ConversationsManagerInterface.OperationStatus.STATUS_OK) } } - override fun onError(errorModel: ErrorModel?) { - // what do we do on error + override suspend fun onError(errorModel: ErrorModel?) { + currentUser?.let { + conversationsManagerInterface.joinedConversationForUser(it, currentConversation, ConversationsManagerInterface.OperationStatus.STATUS_FAILED) + } } }) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManagerInterface.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManagerInterface.kt index d06360af4..7ebd3992c 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManagerInterface.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/ConversationsManagerInterface.kt @@ -24,6 +24,11 @@ import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.newarch.local.models.UserNgEntity interface ConversationsManagerInterface { - fun gotConversationInfoForuser(userNgEntity: UserNgEntity, conversation: Conversation?) - fun joinedConversationForUser(userNgEntity: UserNgEntity, conversation: Conversation?) -} \ No newline at end of file + enum class OperationStatus { + STATUS_OK, + STATUS_FAILED + } + + suspend fun gotConversationInfoForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: OperationStatus) + suspend fun joinedConversationForUser(userNgEntity: UserNgEntity, conversation: Conversation?, operationStatus: OperationStatus) +}