Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelog/unreleased/4728
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ This new option opens a new view that shows information like member names, roles
https://github.com/owncloud/android/issues/4612
https://github.com/owncloud/android/issues/4763
https://github.com/owncloud/android/issues/4772
https://github.com/owncloud/android/issues/4782
https://github.com/owncloud/android/pull/4728
https://github.com/owncloud/android/pull/4765
https://github.com/owncloud/android/pull/4779
https://github.com/owncloud/android/pull/4784
https://github.com/owncloud/android/pull/4809
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
private var listener: SpaceMemberFragmentListener? = null
private var canRemoveMembers = false
private var canEditMembers = false
private var canReadMembers = false
private var numberOfManagers = 1

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
Expand All @@ -98,6 +99,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
savedInstanceState?.let {
canRemoveMembers = it.getBoolean(CAN_REMOVE_MEMBERS, false)
canEditMembers = it.getBoolean(CAN_EDIT_MEMBERS, false)
canReadMembers = it.getBoolean(CAN_READ_MEMBERS, false)
}

subscribeToViewModels()
Expand Down Expand Up @@ -138,6 +140,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
super.onSaveInstanceState(outState)
outState.putBoolean(CAN_REMOVE_MEMBERS, canRemoveMembers)
outState.putBoolean(CAN_EDIT_MEMBERS, canEditMembers)
outState.putBoolean(CAN_READ_MEMBERS, canReadMembers)
}

override fun onRemoveMember(spaceMember: SpaceMember) {
Expand Down Expand Up @@ -166,6 +169,15 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}

private fun subscribeToViewModels() {
observeRoles()
observeSpaceMembers()
observeSpacePermissions()
observeAddMemberResult()
observeRemoveMemberResult()
observeEditMemberResult()
}

private fun observeRoles() {
collectLatestLifecycleFlow(spaceMembersViewModel.roles) { event ->
event?.let {
when (val uiResult = event.peekContent()) {
Expand All @@ -182,7 +194,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}
}
}
}

private fun observeSpaceMembers() {
collectLatestLifecycleFlow(spaceMembersViewModel.spaceMembers) { event ->
event?.let {
when (val uiResult = event.peekContent()) {
Expand All @@ -193,10 +207,12 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
spaceMember.roles.contains(OCRoleType.toString(OCRoleType.CAN_MANAGE)) }
spaceMembers = it.members
addMemberRoles = it.roles
spaceMembersAdapter.setSpaceMembers(spaceMembers, roles, canRemoveMembers, canEditMembers, numberOfManagers)
val hasLinks = it.links.isNotEmpty()
showOrHideEmptyView(hasLinks)
if (hasLinks) { showSpaceLinks(it.links) }
if (canReadMembers) {
spaceMembersAdapter.setSpaceMembers(spaceMembers, roles, canRemoveMembers, canEditMembers, numberOfManagers)
val hasLinks = it.links.isNotEmpty()
showOrHideEmptyView(hasLinks)
if (hasLinks) { showSpaceLinks(it.links) }
}
binding.indeterminateProgressBar.isVisible = false
}
}
Expand All @@ -209,7 +225,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}
}
}
}

private fun observeSpacePermissions() {
collectLatestLifecycleFlow(spaceMembersViewModel.spacePermissions) { event ->
event?.let {
when (val uiResult = event.peekContent()) {
Expand All @@ -218,7 +236,12 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
binding.addMemberButton.isVisible = DRIVES_CREATE_PERMISSION in spacePermissions
canRemoveMembers = DRIVES_DELETE_PERMISSION in spacePermissions
canEditMembers = DRIVES_UPDATE_PERMISSION in spacePermissions
spaceMembersAdapter.setSpaceMembers(spaceMembers, roles, canRemoveMembers, canEditMembers, numberOfManagers)
canReadMembers = DRIVES_READ_PERMISSION in spacePermissions
binding.membersListSection.isVisible = canReadMembers
binding.publicLinksSection.isVisible = canReadMembers
if (canReadMembers) {
spaceMembersAdapter.setSpaceMembers(spaceMembers, roles, canRemoveMembers, canEditMembers, numberOfManagers)
}
}
}
is UIResult.Loading -> { }
Expand All @@ -228,7 +251,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}
}
}
}

private fun observeAddMemberResult() {
collectLatestLifecycleFlow(spaceMembersViewModel.addMemberResultFlow) { event ->
event?.peekContent()?.let { uiResult ->
when (uiResult) {
Expand All @@ -241,7 +266,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}
}
}
}

private fun observeRemoveMemberResult() {
collectLatestLifecycleFlow(spaceMembersViewModel.removeMemberResultFlow) { uiResult ->
when (uiResult) {
is UIResult.Loading -> { }
Expand All @@ -255,7 +282,9 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
}
}
}
}

private fun observeEditMemberResult() {
collectLatestLifecycleFlow(spaceMembersViewModel.editMemberResultFlow) { event ->
event?.peekContent()?.let { uiResult ->
when (uiResult) {
Expand Down Expand Up @@ -302,8 +331,10 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
private const val DRIVES_CREATE_PERMISSION = "libre.graph/driveItem/permissions/create"
private const val DRIVES_DELETE_PERMISSION = "libre.graph/driveItem/permissions/delete"
private const val DRIVES_UPDATE_PERMISSION = "libre.graph/driveItem/permissions/update"
private const val DRIVES_READ_PERMISSION = "libre.graph/driveItem/permissions/read"
private const val CAN_REMOVE_MEMBERS = "CAN_REMOVE_MEMBERS"
private const val CAN_EDIT_MEMBERS = "CAN_EDIT_MEMBERS"
private const val CAN_READ_MEMBERS = "CAN_READ_MEMBERS"

fun newInstance(
accountName: String,
Expand Down
208 changes: 111 additions & 97 deletions owncloudApp/src/main/res/layout/members_fragment.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,111 +30,125 @@
android:layout_height="wrap_content"
android:orientation="vertical">

<androidx.constraintlayout.widget.ConstraintLayout
<LinearLayout
android:id="@+id/members_list_section"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/actionbar_start_color">

<TextView
android:id="@+id/members_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/members_title"
android:layout_marginStart="@dimen/standard_half_margin"
android:textAllCaps="true"
android:textColor="@color/white"
android:textStyle="bold"
android:accessibilityHeading="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<ImageButton
android:id="@+id/add_member_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="@dimen/standard_padding"
android:background="@color/transparent"
android:src="@drawable/ic_add"
android:contentDescription="@string/content_description_add_member"
android:visibility="gone"
android:focusable="true"
android:clickable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<ProgressBar
android:id="@+id/indeterminate_progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:visibility="gone"/>
android:orientation="vertical">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/actionbar_start_color">

<TextView
android:id="@+id/members_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/members_title"
android:layout_marginStart="@dimen/standard_half_margin"
android:textAllCaps="true"
android:textColor="@color/white"
android:textStyle="bold"
android:accessibilityHeading="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<ImageButton
android:id="@+id/add_member_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="@dimen/standard_padding"
android:background="@color/transparent"
android:src="@drawable/ic_add"
android:contentDescription="@string/content_description_add_member"
android:visibility="gone"
android:focusable="true"
android:clickable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<ProgressBar
android:id="@+id/indeterminate_progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:visibility="gone"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/members_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:visibility="visible"
tools:visibility="visible"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/members_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"/>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/actionbar_start_color">
</LinearLayout>

<TextView
android:id="@+id/public_links_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/share_via_link_section_title"
android:layout_marginStart="@dimen/standard_half_margin"
android:textAllCaps="true"
android:textColor="@color/white"
android:textStyle="bold"
android:accessibilityHeading="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<TextView
android:id="@+id/public_links_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/warning_background_color"
android:paddingTop="@dimen/standard_padding"
android:paddingBottom="@dimen/standard_padding"
android:paddingStart="@dimen/standard_half_padding"
android:paddingEnd="@dimen/standard_half_padding"
android:text="@string/share_warning_about_forwarding_space_public_links"
android:textColor="@color/warning_grey_text"
android:textSize="15sp" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/public_links_recycler_view"
<LinearLayout
android:id="@+id/public_links_section"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />
android:orientation="vertical">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/actionbar_start_color">

<TextView
android:id="@+id/public_links_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/share_via_link_section_title"
android:layout_marginStart="@dimen/standard_half_margin"
android:textAllCaps="true"
android:textColor="@color/white"
android:textStyle="bold"
android:accessibilityHeading="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<TextView
android:id="@+id/no_public_links_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/standard_padding"
android:paddingBottom="@dimen/standard_padding"
android:paddingStart="@dimen/standard_half_padding"
android:paddingEnd="@dimen/standard_half_padding"
android:text="@string/share_no_public_links"
android:textSize="15sp"
android:visibility="gone"/>
<TextView
android:id="@+id/public_links_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/warning_background_color"
android:paddingTop="@dimen/standard_padding"
android:paddingBottom="@dimen/standard_padding"
android:paddingStart="@dimen/standard_half_padding"
android:paddingEnd="@dimen/standard_half_padding"
android:text="@string/share_warning_about_forwarding_space_public_links"
android:textColor="@color/warning_grey_text"
android:textSize="15sp" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/public_links_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />

<TextView
android:id="@+id/no_public_links_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/standard_padding"
android:paddingBottom="@dimen/standard_padding"
android:paddingStart="@dimen/standard_half_padding"
android:paddingEnd="@dimen/standard_half_padding"
android:text="@string/share_no_public_links"
android:textSize="15sp"
android:visibility="gone"/>

</LinearLayout>

</LinearLayout>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,7 @@ class FilterSpaceMenuOptionsUseCase(

val editImagePermission = hasSpacePermission(spacePermissionsResult, DRIVES_MANAGE_PERMISSION)

val membersPermission = hasSpacePermission(spacePermissionsResult, DRIVES_READ_PERMISSION)

if (membersPermission) {
optionsToShow.add(SpaceMenuOption.MEMBERS)
}
optionsToShow.add(SpaceMenuOption.MEMBERS)

if (editPermission || (isSpaceManager && currentSpace.isDisabled)) {
optionsToShow.add(SpaceMenuOption.EDIT)
Expand Down Expand Up @@ -87,7 +83,6 @@ class FilterSpaceMenuOptionsUseCase(
companion object {
private const val DRIVES_MANAGE_PERMISSION = "libre.graph/driveItem/permissions/update"
private const val DRIVES_DELETE_PERMISSION = "libre.graph/driveItem/permissions/delete"
private const val DRIVES_READ_PERMISSION = "libre.graph/driveItem/permissions/read"
private const val DRIVES_MANAGER_ROLE = "manager"
}
}