diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersActivity.kt index 1d96476ef63..599d5c0a555 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersActivity.kt @@ -3,7 +3,7 @@ * * @author Jorge Aguado Recio * - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -25,21 +25,42 @@ import android.view.Menu import android.view.MenuItem import androidx.fragment.app.transaction import com.owncloud.android.R +import com.owncloud.android.databinding.MembersActivityBinding import com.owncloud.android.domain.spaces.model.OCSpace import com.owncloud.android.ui.activity.FileActivity +import com.owncloud.android.utils.DisplayUtils class SpaceMembersActivity: FileActivity() { + private lateinit var binding: MembersActivityBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.members_activity) + binding = MembersActivityBinding.inflate(layoutInflater) + setContentView(binding.root) setupStandardToolbar(title = null, displayHomeAsUpEnabled = true, homeButtonEnabled = true, displayShowTitleEnabled = true) supportActionBar?.setHomeActionContentDescription(R.string.common_back) - val currentSpace = intent.getParcelableExtra(EXTRA_SPACE) + val currentSpace = intent.getParcelableExtra(EXTRA_SPACE) ?: return + binding.apply { + itemName.text = currentSpace.name + currentSpace.quota?.let { quota -> + val usedQuota = quota.used + val totalQuota = quota.total + itemSize.text = when { + usedQuota == null -> getString(R.string.drawer_unavailable_used_storage) + totalQuota == 0L -> DisplayUtils.bytesToHumanReadable(usedQuota, baseContext, true) + else -> getString( + R.string.drawer_quota, + DisplayUtils.bytesToHumanReadable(usedQuota, baseContext, true), + DisplayUtils.bytesToHumanReadable(totalQuota, baseContext, true), + quota.getRelative().toString()) + } + } + } supportFragmentManager.transaction { if (savedInstanceState == null && currentSpace != null) { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt index 00ed053774d..88c28eb9455 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt @@ -3,7 +3,7 @@ * * @author Jorge Aguado Recio * - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -27,13 +27,11 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.owncloud.android.R import com.owncloud.android.databinding.MembersFragmentBinding import com.owncloud.android.domain.roles.model.OCRole import com.owncloud.android.domain.spaces.model.OCSpace import com.owncloud.android.extensions.collectLatestLifecycleFlow import com.owncloud.android.presentation.common.UIResult -import com.owncloud.android.utils.DisplayUtils import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -96,20 +94,16 @@ class SpaceMembersFragment : Fragment() { } } - val currentSpace = requireArguments().getParcelable(ARG_CURRENT_SPACE) ?: return - binding.apply { - itemName.text = currentSpace.name - currentSpace.quota?.let { quota -> - val usedQuota = quota.used - val totalQuota = quota.total - itemSize.text = when { - usedQuota == null -> getString(R.string.drawer_unavailable_used_storage) - totalQuota == 0L -> DisplayUtils.bytesToHumanReadable(usedQuota, requireContext(), true) - else -> getString( - R.string.drawer_quota, - DisplayUtils.bytesToHumanReadable(usedQuota, requireContext(), true), - DisplayUtils.bytesToHumanReadable(totalQuota, requireContext(), true), - quota.getRelative().toString()) + collectLatestLifecycleFlow(spaceMembersViewModel.spacePermissions) { event -> + event?.let { + when (val uiResult = event.peekContent()) { + is UIResult.Success -> { + uiResult.data?.let { spacePermissions -> + if (DRIVES_CREATE_PERMISSION in spacePermissions) { binding.addMemberButton.visibility = View.VISIBLE } + } + } + is UIResult.Loading -> { } + is UIResult.Error -> { } } } } @@ -118,6 +112,7 @@ class SpaceMembersFragment : Fragment() { companion object { private const val ARG_CURRENT_SPACE = "CURRENT_SPACE" private const val ARG_ACCOUNT_NAME = "ACCOUNT_NAME" + private const val DRIVES_CREATE_PERMISSION = "libre.graph/driveItem/permissions/create" fun newInstance( accountName: String, diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt index 72b4fa673fb..8fb7d58a54d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersViewModel.kt @@ -3,7 +3,7 @@ * * @author Jorge Aguado Recio * - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -26,6 +26,7 @@ import com.owncloud.android.domain.spaces.model.OCSpace import com.owncloud.android.domain.spaces.model.SpaceMembers import com.owncloud.android.domain.spaces.usecases.GetSpaceMembersUseCase import com.owncloud.android.domain.roles.usecases.GetRolesAsyncUseCase +import com.owncloud.android.domain.spaces.usecases.GetSpacePermissionsAsyncUseCase import com.owncloud.android.domain.utils.Event import com.owncloud.android.extensions.ViewModelExt.runUseCaseWithResult import com.owncloud.android.presentation.common.UIResult @@ -36,6 +37,7 @@ import kotlinx.coroutines.flow.StateFlow class SpaceMembersViewModel( private val getRolesAsyncUseCase: GetRolesAsyncUseCase, private val getSpaceMembersUseCase: GetSpaceMembersUseCase, + private val getSpacePermissionsAsyncUseCase: GetSpacePermissionsAsyncUseCase, private val accountName: String, private val space: OCSpace, private val coroutineDispatcherProvider: CoroutinesDispatcherProvider @@ -47,6 +49,9 @@ class SpaceMembersViewModel( private val _spaceMembers = MutableStateFlow>?>(null) val spaceMembers: StateFlow>?> = _spaceMembers + private val _spacePermissions = MutableStateFlow>>?>(null) + val spacePermissions: StateFlow>>?> = _spacePermissions + init { runUseCaseWithResult( coroutineDispatcher = coroutineDispatcherProvider.io, @@ -56,6 +61,16 @@ class SpaceMembersViewModel( showLoading = false, requiresConnection = true ) + + runUseCaseWithResult( + coroutineDispatcher = coroutineDispatcherProvider.io, + flow = _spacePermissions, + useCase = getSpacePermissionsAsyncUseCase, + useCaseParams = GetSpacePermissionsAsyncUseCase.Params(accountName = accountName, spaceId = space.id), + showLoading = false, + requiresConnection = true + ) + } fun getSpaceMembers() = runUseCaseWithResult( diff --git a/owncloudApp/src/main/res/layout/members_activity.xml b/owncloudApp/src/main/res/layout/members_activity.xml index dae7364c3da..72ca2162ba2 100644 --- a/owncloudApp/src/main/res/layout/members_activity.xml +++ b/owncloudApp/src/main/res/layout/members_activity.xml @@ -1,7 +1,7 @@ - + + + + + + + + + +