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 5707ae397..a84b2ca6d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -89,10 +89,10 @@ interface NcApiCoroutines { ): AddParticipantOverall @POST - suspend fun makeRoomPublic(@Header("Authorization") authorization: String?, @Url url: String): GenericOverall + suspend fun makeRoomPublic(@Header("Authorization") authorization: String, @Url url: String): GenericOverall @DELETE - suspend fun makeRoomPrivate(@Header("Authorization") authorization: String?, @Url url: String): GenericOverall + suspend fun makeRoomPrivate(@Header("Authorization") authorization: String, @Url url: String): GenericOverall @FormUrlEncoded @PUT diff --git a/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationRepositoryImpl.kt index 1f804e3ad..37f7d1d38 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationRepositoryImpl.kt @@ -168,16 +168,15 @@ class ConversationCreationRepositoryImpl( val result: GenericOverall = if (allow) { ncApiCoroutines.makeRoomPublic( - credentials, + credentials!!, url ) } else { ncApiCoroutines.makeRoomPrivate( - credentials, + credentials!!, url ) } - return result } } 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 f0bae76ee..9d40b112d 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -916,7 +916,9 @@ class ConversationInfoActivity : it, conversation!!, spreedCapabilities, - conversationUser + conversationUser, + viewModel, + this ).setupGuestAccess() } if (ConversationUtils.isNoteToSelfConversation(conversation!!)) { diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt index 43b1a8817..414d2a089 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt @@ -12,9 +12,11 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import androidx.appcompat.app.AlertDialog +import androidx.lifecycle.LifecycleOwner import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.nextcloud.talk.R +import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityConversationInfoBinding import com.nextcloud.talk.databinding.DialogPasswordBinding @@ -33,9 +35,10 @@ class GuestAccessHelper( private val binding: ActivityConversationInfoBinding, private val conversation: ConversationModel, private val spreedCapabilities: SpreedCapability, - private val conversationUser: User + private val conversationUser: User, + private val viewModel: ConversationInfoViewModel, + private val lifecycleOwner: LifecycleOwner ) { - private val conversationsRepository = activity.conversationsRepository private val viewThemeUtils = activity.viewThemeUtils private val context = activity.context @@ -61,11 +64,27 @@ class GuestAccessHelper( binding.guestAccessView.guestAccessSettingsAllowGuest.setOnClickListener { val isChecked = binding.guestAccessView.allowGuestsSwitch.isChecked binding.guestAccessView.allowGuestsSwitch.isChecked = !isChecked - conversationsRepository.allowGuests( - conversation.token!!, - !isChecked - ).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()).subscribe(AllowGuestsResultObserver()) + viewModel.allowGuests(conversation.token, !isChecked) + viewModel.allowGuestsViewState.observe(lifecycleOwner){uiState -> + when(uiState){ + is ConversationInfoViewModel.AllowGuestsUIState.Success ->{ + if(uiState.result){ + showAllOptions() + }else{ + hideAllOptions() + } + } + is ConversationInfoViewModel.AllowGuestsUIState.Error ->{ + val exception = uiState.message + val message = context.getString(R.string.nc_guest_access_allow_failed) + Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG).show() + Log.e(TAG, exception) + } + ConversationInfoViewModel.AllowGuestsUIState.None ->{ + //unused atm + } + } + } } binding.guestAccessView.guestAccessSettingsPasswordProtection.setOnClickListener { @@ -143,32 +162,6 @@ class GuestAccessHelper( } } - inner class AllowGuestsResultObserver : Observer { - - private lateinit var allowGuestsResult: ConversationsRepository.AllowGuestsResult - - override fun onNext(t: ConversationsRepository.AllowGuestsResult) { - allowGuestsResult = t - } - - override fun onError(e: Throwable) { - val message = context.getString(R.string.nc_guest_access_allow_failed) - Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG).show() - Log.e(TAG, message, e) - } - - override fun onComplete() { - binding.guestAccessView.allowGuestsSwitch.isChecked = allowGuestsResult.allow - if (allowGuestsResult.allow) { - showAllOptions() - } else { - hideAllOptions() - } - } - - override fun onSubscribe(d: Disposable) = Unit - } - private fun showAllOptions() { binding.guestAccessView.guestAccessSettingsPasswordProtection.visibility = View.VISIBLE if (conversationUser.capabilities?.spreedCapability?.features?.contains("sip-support") == true) { 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 68e278a99..2ff5c3369 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 @@ -12,18 +12,27 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.nextcloud.talk.chat.data.network.ChatNetworkDataSource +import com.nextcloud.talk.conversationcreation.AllowGuestsUiState +import com.nextcloud.talk.conversationcreation.RoomUIState 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.conversations.Conversation +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 import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch import javax.inject.Inject class ConversationInfoViewModel @Inject constructor( @@ -95,6 +104,10 @@ class ConversationInfoViewModel @Inject constructor( object GetCapabilitiesErrorState : ViewState open class GetCapabilitiesSuccessState(val spreedCapabilities: SpreedCapability) : ViewState + private val _allowGuestsViewState = MutableLiveData(AllowGuestsUIState.None) + val allowGuestsViewState: LiveData + get() = _allowGuestsViewState + private val _getCapabilitiesViewState: MutableLiveData = MutableLiveData(GetCapabilitiesStartState) val getCapabilitiesViewState: LiveData get() = _getCapabilitiesViewState @@ -233,6 +246,23 @@ class ConversationInfoViewModel @Inject constructor( }) } + + fun allowGuests(token:String,allow:Boolean){ + viewModelScope.launch{ + try{ + val allowGuestsResult = conversationsRepository.allowGuests(token,allow) + val statusCode: GenericMeta? = allowGuestsResult.ocs?.meta + val result = (statusCode?.statusCode == STATUS_CODE_OK) + if (result) { + _allowGuestsViewState.value = AllowGuestsUIState.Success(result) + } + }catch(exception:Exception){ + _allowGuestsViewState.value = AllowGuestsUIState.Error(exception.message?: "") + + } + } + } + suspend fun archiveConversation(user: User, token: String) { val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token) @@ -267,4 +297,10 @@ class ConversationInfoViewModel @Inject constructor( companion object { private val TAG = ConversationInfoViewModel::class.simpleName } + + sealed class AllowGuestsUIState { + data object None : AllowGuestsUIState() + data class Success(val result: Boolean) : AllowGuestsUIState() + data class Error(val message: String) : AllowGuestsUIState() + } } 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 941592732..4a858a62d 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 @@ -12,11 +12,7 @@ import io.reactivex.Observable interface ConversationsRepository { - data class AllowGuestsResult( - val allow: Boolean - ) - - fun allowGuests(token: String, allow: Boolean): Observable + suspend fun allowGuests(token: String, allow: Boolean): GenericOverall data class PasswordResult( val passwordSet: Boolean, 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 458b97efe..4967f1051 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 @@ -13,7 +13,6 @@ import com.nextcloud.talk.api.NcApiCoroutines import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.conversations.password.PasswordOverall import com.nextcloud.talk.models.json.generic.GenericOverall -import com.nextcloud.talk.repositories.conversations.ConversationsRepository.AllowGuestsResult import com.nextcloud.talk.repositories.conversations.ConversationsRepository.PasswordResult import com.nextcloud.talk.repositories.conversations.ConversationsRepository.ResendInvitationsResult import com.nextcloud.talk.utils.ApiUtils @@ -24,8 +23,7 @@ class ConversationsRepositoryImpl( private val api: NcApi, private val coroutineApi: NcApiCoroutines, private val userProvider: CurrentUserProviderNew -) : - ConversationsRepository { +) : ConversationsRepository { private val user: User get() = userProvider.currentUser.blockingGet() @@ -33,29 +31,31 @@ class ConversationsRepositoryImpl( private val credentials: String get() = ApiUtils.getCredentials(user.username, user.token)!! - override fun allowGuests(token: String, allow: Boolean): Observable { + val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) + + override suspend fun allowGuests(token: String, allow: Boolean): GenericOverall { val url = ApiUtils.getUrlForRoomPublic( - apiVersion(), + apiVersion, user.baseUrl!!, token ) - val apiObservable = if (allow) { - api.makeRoomPublic( + val result: GenericOverall = if (allow) { + coroutineApi.makeRoomPublic( credentials, url ) } else { - api.makeRoomPrivate( + coroutineApi.makeRoomPrivate( credentials, url ) } - - return apiObservable.map { AllowGuestsResult(it.ocs!!.meta!!.statusCode == STATUS_CODE_OK && allow) } + return result } - override fun password(password: String, token: String): Observable { + +override fun password(password: String, token: String): Observable { val apiObservable = api.setPassword2( credentials, ApiUtils.getUrlForRoomPassword(