diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt index 8c94e9a9b..a35b17507 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -142,8 +142,13 @@ interface NcApiCoroutines { ): GenericOverall @DELETE - suspend fun clearChatHistory( + suspend fun clearChatHistory(@Header("Authorization") authorization: String, @Url url: String): GenericOverall + + @FormUrlEncoded + @PUT + suspend fun setConversationReadOnly( @Header("Authorization") authorization: String, - @Url url: String + @Url url: String, + @Field("state") state: Int ): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/conversation/RenameConversationDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/conversation/RenameConversationDialogFragment.kt index 451016bfe..8899febd2 100644 --- a/app/src/main/java/com/nextcloud/talk/conversation/RenameConversationDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/conversation/RenameConversationDialogFragment.kt @@ -171,13 +171,12 @@ class RenameConversationDialogFragment : DialogFragment() { private fun setupStateObserver() { viewModel.renameRoomUiState.observe(viewLifecycleOwner) { state -> when (state) { - is ConversationInfoEditViewModel.RenameRoomUiState.None ->{ - + is ConversationInfoEditViewModel.RenameRoomUiState.None -> { } - is ConversationInfoEditViewModel.RenameRoomUiState.Success ->{ + is ConversationInfoEditViewModel.RenameRoomUiState.Success -> { handleSuccess() } - is ConversationInfoEditViewModel.RenameRoomUiState.Error ->{ + is ConversationInfoEditViewModel.RenameRoomUiState.Error -> { showError() } } diff --git a/app/src/main/java/com/nextcloud/talk/conversation/repository/ConversationRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/conversation/repository/ConversationRepositoryImpl.kt index 8f344f5e5..d7b3467ef 100644 --- a/app/src/main/java/com/nextcloud/talk/conversation/repository/ConversationRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/conversation/repository/ConversationRepositoryImpl.kt @@ -23,8 +23,6 @@ class ConversationRepositoryImpl(private val ncApi: NcApi, currentUserProvider: val currentUser: User = currentUserProvider.currentUser.blockingGet() val credentials: String = ApiUtils.getCredentials(currentUser.username, currentUser.token)!! - - override fun createConversation( roomName: String, conversationType: ConversationEnums.ConversationType? diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 77ca78d55..8fa81c85c 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -260,37 +260,33 @@ class ConversationInfoActivity : viewModel.getConversationReadOnlyState.observe(this) { state -> when (state) { - is ConversationInfoViewModel.SetConversationReadOnlySuccessState -> { + is ConversationInfoViewModel.SetConversationReadOnlyViewState.Success -> { } - is ConversationInfoViewModel.SetConversationReadOnlyErrorState -> { + is ConversationInfoViewModel.SetConversationReadOnlyViewState.Error -> { Snackbar.make(binding.root, R.string.conversation_read_only_failed, Snackbar.LENGTH_LONG).show() } - else -> { + is ConversationInfoViewModel.SetConversationReadOnlyViewState.None -> { + } } } - viewModel.clearChatHistoryViewState.observe(this){uiState -> - when(uiState){ - is ConversationInfoViewModel.ClearChatHistoryViewState.None ->{ - + viewModel.clearChatHistoryViewState.observe(this) { uiState -> + when (uiState) { + is ConversationInfoViewModel.ClearChatHistoryViewState.None -> { } - is ConversationInfoViewModel.ClearChatHistoryViewState.Success ->{ + is ConversationInfoViewModel.ClearChatHistoryViewState.Success -> { Snackbar.make( binding.root, context.getString(R.string.nc_clear_history_success), Snackbar.LENGTH_LONG ).show() - - } - is ConversationInfoViewModel.ClearChatHistoryViewState.Error ->{ + is ConversationInfoViewModel.ClearChatHistoryViewState.Error -> { Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() Log.e(TAG, "failed to clear chat history", uiState.exception) - } } - } } @@ -747,7 +743,7 @@ class ConversationInfoActivity : private fun clearHistory() { val apiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1)) - viewModel.clearChatHistory(apiVersion,conversationToken) + viewModel.clearChatHistory(apiVersion, conversationToken) } private fun deleteConversation() { @@ -842,7 +838,7 @@ class ConversationInfoActivity : binding.lockConversationSwitch.isChecked = !isLocked databaseStorageModule!!.saveBoolean("lock_switch", !isLocked) val state = if (isLocked) 0 else 1 - makeConversationReadOnly(conversationUser, conversationToken, state) + makeConversationReadOnly(conversationToken, state) } } else { binding.lockConversation.visibility = GONE @@ -922,8 +918,8 @@ class ConversationInfoActivity : } } - private fun makeConversationReadOnly(conversationUser: User, roomToken: String, state: Int) { - viewModel.setConversationReadOnly(conversationUser, roomToken, state) + private fun makeConversationReadOnly(roomToken: String, state: Int) { + viewModel.setConversationReadOnly( roomToken, state) } private fun initRecordingConsentOption() { diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index f24c994ed..4dedfcb93 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -18,11 +18,9 @@ import com.nextcloud.talk.chat.data.network.ChatNetworkDataSource import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.json.capabilities.SpreedCapability -import com.nextcloud.talk.models.json.generic.GenericMeta import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.participants.TalkBan import com.nextcloud.talk.repositories.conversations.ConversationsRepository -import com.nextcloud.talk.repositories.conversations.ConversationsRepositoryImpl.Companion.STATUS_CODE_OK import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -81,13 +79,6 @@ class ConversationInfoViewModel @Inject constructor( val getUnBanActorState: LiveData get() = _getUnBanActorState - object SetConversationReadOnlySuccessState : ViewState - object SetConversationReadOnlyErrorState : ViewState - - private val _getConversationReadOnlyState: MutableLiveData = MutableLiveData() - val getConversationReadOnlyState: LiveData - get() = _getConversationReadOnlyState - object GetRoomStartState : ViewState object GetRoomErrorState : ViewState open class GetRoomSuccessState(val conversationModel: ConversationModel) : ViewState @@ -112,10 +103,16 @@ class ConversationInfoViewModel @Inject constructor( val getCapabilitiesViewState: LiveData get() = _getCapabilitiesViewState - private val _clearChatHistoryViewState:MutableLiveData = MutableLiveData(ClearChatHistoryViewState.None) - val clearChatHistoryViewState:LiveData + private val _clearChatHistoryViewState: MutableLiveData = + MutableLiveData(ClearChatHistoryViewState.None) + val clearChatHistoryViewState: LiveData get() = _clearChatHistoryViewState + private val _getConversationReadOnlyState: MutableLiveData = + MutableLiveData(SetConversationReadOnlyViewState.None) + val getConversationReadOnlyState: LiveData + get() = _getConversationReadOnlyState + fun getRoom(user: User, token: String) { _viewState.value = GetRoomStartState chatNetworkDataSource.getRoom(user, token) @@ -202,28 +199,15 @@ class ConversationInfoViewModel @Inject constructor( }) } - fun setConversationReadOnly(user: User, token: String, state: Int) { - val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) - val url = ApiUtils.getUrlForConversationReadOnly(apiVersion, user.baseUrl!!, token) - conversationsRepository.setConversationReadOnly(user.getCredentials(), url, state) - .subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(p0: Disposable) { - } - - override fun onError(error: Throwable) { - _getConversationReadOnlyState.value = SetConversationReadOnlyErrorState - } - - override fun onComplete() { - // unused atm - } - - override fun onNext(p0: GenericOverall) { - _getConversationReadOnlyState.value = SetConversationReadOnlySuccessState - } - }) + fun setConversationReadOnly(roomToken: String, state: Int) { + viewModelScope.launch { + try { + conversationsRepository.setConversationReadOnly(roomToken, state) + _getConversationReadOnlyState.value = SetConversationReadOnlyViewState.Success + } catch (exception: Exception) { + _getConversationReadOnlyState.value = SetConversationReadOnlyViewState.Error(exception) + } + } } fun unbanActor(user: User, token: String, banId: Int) { @@ -285,16 +269,12 @@ class ConversationInfoViewModel @Inject constructor( conversationsRepository.unarchiveConversation(user.getCredentials(), url) } - fun clearChatHistory(apiVersion:Int,roomToken:String){ - viewModelScope.launch{ - try{ - val clearChatResult = conversationsRepository.clearChatHistory(apiVersion,roomToken) - val statusCode: GenericMeta? = clearChatResult.ocs?.meta - val result = statusCode?.statusCode == STATUS_CODE_OK - if (result) { - _clearChatHistoryViewState.value = ClearChatHistoryViewState.Success - } - }catch(exception:Exception){ + fun clearChatHistory(apiVersion: Int, roomToken: String) { + viewModelScope.launch { + try { + conversationsRepository.clearChatHistory(apiVersion, roomToken) + _clearChatHistoryViewState.value = ClearChatHistoryViewState.Success + } catch (exception: Exception) { _clearChatHistoryViewState.value = ClearChatHistoryViewState.Error(exception) } } @@ -323,10 +303,16 @@ class ConversationInfoViewModel @Inject constructor( private val TAG = ConversationInfoViewModel::class.simpleName } - sealed class ClearChatHistoryViewState{ - data object None: ClearChatHistoryViewState() - data object Success:ClearChatHistoryViewState() - data class Error(val exception:Exception):ClearChatHistoryViewState() + sealed class ClearChatHistoryViewState { + data object None : ClearChatHistoryViewState() + data object Success : ClearChatHistoryViewState() + data class Error(val exception: Exception) : ClearChatHistoryViewState() + } + + sealed class SetConversationReadOnlyViewState { + data object None : SetConversationReadOnlyViewState() + data object Success : SetConversationReadOnlyViewState() + data class Error(val exception: Exception) : SetConversationReadOnlyViewState() } sealed class AllowGuestsUIState { diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt index 2f750368b..43d7cb2b2 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt @@ -167,19 +167,18 @@ class ConversationInfoEditActivity : BaseActivity() { else -> {} } } - conversationInfoEditViewModel.renameRoomUiState.observe(this){uiState -> - when(uiState){ - is ConversationInfoEditViewModel.RenameRoomUiState.None ->{ - + conversationInfoEditViewModel.renameRoomUiState.observe(this) { uiState -> + when (uiState) { + is ConversationInfoEditViewModel.RenameRoomUiState.None -> { } - is ConversationInfoEditViewModel.RenameRoomUiState.Success ->{ + is ConversationInfoEditViewModel.RenameRoomUiState.Success -> { if (CapabilitiesUtil.isConversationDescriptionEndpointAvailable(spreedCapabilities)) { saveConversationDescription() } else { finish() } } - is ConversationInfoEditViewModel.RenameRoomUiState.Error ->{ + is ConversationInfoEditViewModel.RenameRoomUiState.Error -> { Snackbar.make( binding.root, context.getString(R.string.default_error_msg), @@ -190,27 +189,23 @@ class ConversationInfoEditActivity : BaseActivity() { } } - conversationInfoEditViewModel.setConversationDescriptionUiState.observe(this){ uiState -> - when(uiState){ - is ConversationInfoEditViewModel.SetConversationDescriptionUiState.None ->{ - + conversationInfoEditViewModel.setConversationDescriptionUiState.observe(this) { uiState -> + when (uiState) { + is ConversationInfoEditViewModel.SetConversationDescriptionUiState.None -> { } - is ConversationInfoEditViewModel.SetConversationDescriptionUiState.Success ->{ + is ConversationInfoEditViewModel.SetConversationDescriptionUiState.Success -> { finish() } - is ConversationInfoEditViewModel.SetConversationDescriptionUiState.Error ->{ + is ConversationInfoEditViewModel.SetConversationDescriptionUiState.Error -> { Snackbar.make( binding.root, context.getString(R.string.default_error_msg), Snackbar.LENGTH_LONG ).show() Log.e(TAG, "Error while saving conversation description", uiState.exception) - } } - } - } private fun setupAvatarOptions() { @@ -276,14 +271,14 @@ class ConversationInfoEditActivity : BaseActivity() { private fun saveConversationNameAndDescription() { val newRoomName = binding.conversationName.text.toString() - conversationInfoEditViewModel.renameRoom( - conversation!!.token, - newRoomName - ) + conversationInfoEditViewModel.renameRoom( + conversation!!.token, + newRoomName + ) } fun saveConversationDescription() { - val conversationDescription = binding.conversationDescription.text.toString() + val conversationDescription = binding.conversationDescription.text.toString() conversationInfoEditViewModel.setConversationDescription(conversation!!.token, conversationDescription) } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepository.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepository.kt index a70500326..7b3571b6f 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepository.kt @@ -20,5 +20,5 @@ interface ConversationInfoEditRepository { suspend fun renameConversation(roomToken: String, roomNameNew: String): GenericOverall - suspend fun setConversationDescription(roomToken:String, conversationDescription:String?): GenericOverall + suspend fun setConversationDescription(roomToken: String, conversationDescription: String?): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepositoryImpl.kt index ee188f588..a664419cc 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/data/ConversationInfoEditRepositoryImpl.kt @@ -20,9 +20,11 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import java.io.File -class ConversationInfoEditRepositoryImpl(private val ncApi: NcApi, +class ConversationInfoEditRepositoryImpl( + private val ncApi: NcApi, private val ncApiCoroutines: NcApiCoroutines, - currentUserProvider: CurrentUserProviderNew) : + currentUserProvider: CurrentUserProviderNew +) : ConversationInfoEditRepository { val currentUser: User = currentUserProvider.currentUser.blockingGet() diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/viewmodel/ConversationInfoEditViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/viewmodel/ConversationInfoEditViewModel.kt index 8d4c8a761..a7ddbf605 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/viewmodel/ConversationInfoEditViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/viewmodel/ConversationInfoEditViewModel.kt @@ -47,11 +47,12 @@ class ConversationInfoEditViewModel @Inject constructor( get() = _viewState private val _renameRoomUiState = MutableLiveData(RenameRoomUiState.None) - val renameRoomUiState:LiveData + val renameRoomUiState: LiveData get() = _renameRoomUiState - private val _setConversationDescriptionUiState = MutableLiveData(SetConversationDescriptionUiState.None) - val setConversationDescriptionUiState:LiveData + private val _setConversationDescriptionUiState = + MutableLiveData(SetConversationDescriptionUiState.None) + val setConversationDescriptionUiState: LiveData get() = _setConversationDescriptionUiState fun getRoom(user: User, token: String) { @@ -76,31 +77,34 @@ class ConversationInfoEditViewModel @Inject constructor( ?.subscribe(DeleteConversationAvatarObserver()) } - fun renameRoom(roomToken:String, newRoomName:String){ - viewModelScope.launch{ - try{ + fun renameRoom(roomToken: String, newRoomName: String) { + viewModelScope.launch { + try { val renameRoomResult = conversationInfoEditRepository.renameConversation(roomToken, newRoomName) - val statusCode:GenericMeta? = renameRoomResult.ocs?.meta + val statusCode: GenericMeta? = renameRoomResult.ocs?.meta val result = statusCode?.statusCode == STATUS_CODE_OK - if(result){ + if (result) { _renameRoomUiState.value = RenameRoomUiState.Success(result) } - }catch(exception:Exception){ + } catch (exception: Exception) { _renameRoomUiState.value = RenameRoomUiState.Error(exception) } } } - fun setConversationDescription(roomToken:String, conversationDescription:String?){ - viewModelScope.launch{ - try{ - val setConversationDescriptionResult = conversationInfoEditRepository.setConversationDescription(roomToken, conversationDescription) + fun setConversationDescription(roomToken: String, conversationDescription: String?) { + viewModelScope.launch { + try { + val setConversationDescriptionResult = conversationInfoEditRepository.setConversationDescription( + roomToken, + conversationDescription + ) val statusCode: GenericMeta? = setConversationDescriptionResult.ocs?.meta val result = statusCode?.statusCode == STATUS_CODE_OK - if(result){ + if (result) { _setConversationDescriptionUiState.value = SetConversationDescriptionUiState.Success(result) } - }catch(exception:Exception){ + } catch (exception: Exception) { _setConversationDescriptionUiState.value = SetConversationDescriptionUiState.Error(exception) } } @@ -167,15 +171,15 @@ class ConversationInfoEditViewModel @Inject constructor( private val TAG = ConversationInfoEditViewModel::class.simpleName } - sealed class RenameRoomUiState{ - data object None: RenameRoomUiState() - data class Success(val result:Boolean): RenameRoomUiState() - data class Error(val exception:Exception): RenameRoomUiState() + sealed class RenameRoomUiState { + data object None : RenameRoomUiState() + data class Success(val result: Boolean) : RenameRoomUiState() + data class Error(val exception: Exception) : RenameRoomUiState() } - sealed class SetConversationDescriptionUiState{ - data object None: SetConversationDescriptionUiState() - data class Success(val result:Boolean):SetConversationDescriptionUiState() - data class Error(val exception:Exception):SetConversationDescriptionUiState() + sealed class SetConversationDescriptionUiState { + data object None : SetConversationDescriptionUiState() + data class Success(val result: Boolean) : SetConversationDescriptionUiState() + data class Error(val exception: Exception) : SetConversationDescriptionUiState() } } diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index 352988960..b33c9ffbb 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -162,7 +162,7 @@ class RepositoryModule { ncApiCoroutines: NcApiCoroutines, userProvider: CurrentUserProviderNew ): ConversationInfoEditRepository { - return ConversationInfoEditRepositoryImpl(ncApi, ncApiCoroutines,userProvider) + return ConversationInfoEditRepositoryImpl(ncApi, ncApiCoroutines, userProvider) } @Provides diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt index c22e7f55f..75d373dd6 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt @@ -25,7 +25,7 @@ interface ConversationsRepository { suspend fun setPassword(password: String, token: String): GenericOverall - fun setConversationReadOnly(credentials: String, url: String, state: Int): Observable + suspend fun setConversationReadOnly(roomToken: String, state: Int): GenericOverall - suspend fun clearChatHistory(apiVersion:Int,roomToken:String): GenericOverall + suspend fun clearChatHistory(apiVersion: Int, roomToken: String): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt index 7e2ef91c5..173269719 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt @@ -74,8 +74,10 @@ class ConversationsRepositoryImpl( return coroutineApi.unarchiveConversation(credentials, url) } - override fun setConversationReadOnly(credentials: String, url: String, state: Int): Observable { - return api.setConversationReadOnly(credentials, url, state) + override suspend fun setConversationReadOnly(roomToken: String, state: Int): GenericOverall { + val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) + val url = ApiUtils.getUrlForConversationReadOnly(apiVersion, user.baseUrl!!, roomToken) + return coroutineApi.setConversationReadOnly(credentials, url, state) } override suspend fun setPassword(password: String, token: String): GenericOverall { @@ -91,7 +93,6 @@ class ConversationsRepositoryImpl( return result } - override suspend fun clearChatHistory(roomToken:String): GenericOverall { override suspend fun clearChatHistory(apiVersion:Int,roomToken:String): GenericOverall { return coroutineApi.clearChatHistory( credentials,