Skip to content

Commit 3640413

Browse files
committed
feat: add detailed logic for checking permissions and UI
1 parent bf812a9 commit 3640413

8 files changed

Lines changed: 96 additions & 11 deletions

File tree

owncloudApp/src/main/java/com/owncloud/android/extensions/SpaceMenuOptionExt.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fun SpaceMenuOption.toStringResId() =
3232
SpaceMenuOption.DELETE -> R.string.delete_space
3333
SpaceMenuOption.SET_ICON -> R.string.set_space_icon
3434
SpaceMenuOption.MEMBERS -> R.string.members_title
35+
SpaceMenuOption.PERMALINK -> R.string.space_menu_permalink
3536
}
3637

3738
fun SpaceMenuOption.toDrawableResId() =
@@ -43,4 +44,5 @@ fun SpaceMenuOption.toDrawableResId() =
4344
SpaceMenuOption.DELETE -> R.drawable.ic_action_delete_white
4445
SpaceMenuOption.SET_ICON -> R.drawable.ic_set_space_icon
4546
SpaceMenuOption.MEMBERS -> R.drawable.ic_share_generic_white
47+
SpaceMenuOption.PERMALINK -> R.drawable.ic_share_generic_white
4648
}

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,9 +468,13 @@ class SpacesListFragment :
468468
val setIconDialog = SetSpaceIconDialogFragment.newInstance(listener = this@SpacesListFragment)
469469
setIconDialog.show(requireActivity().supportFragmentManager, DIALOG_SET_ICON)
470470
}
471-
SpaceMenuOption.MEMBERS -> {
471+
SpaceMenuOption.MEMBERS, SpaceMenuOption.PERMALINK -> {
472472
val intent = Intent(requireActivity(), SpaceMembersActivity::class.java)
473473
intent.putExtra(SpaceMembersActivity.EXTRA_SPACE, currentSpace)
474+
intent.putExtra(
475+
SpaceMembersActivity.EXTRA_OPENED_AS_MEMBERS_MENU,
476+
menuOption == SpaceMenuOption.MEMBERS,
477+
)
474478
startActivity(intent)
475479
}
476480
}

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ class SpaceMembersActivity: FileActivity(), SpaceMembersFragment.SpaceMemberFrag
132132
private const val KEY_UUID = "oc_uuid"
133133

134134
const val EXTRA_SPACE = "EXTRA_SPACE"
135+
const val EXTRA_OPENED_AS_MEMBERS_MENU = "EXTRA_OPENED_AS_MEMBERS_MENU"
135136
}
136137

137138
}

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
7373
private var canRemoveMembers = false
7474
private var canEditMembers = false
7575
private var canReadMembers = false
76+
private var spacePermissionsLoadedSuccessfully = false
77+
private var cachedSpaceLinks: List<OCLink> = emptyList()
7678
private var numberOfManagers = 1
7779

7880
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
@@ -101,7 +103,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
101103
canEditMembers = it.getBoolean(CAN_EDIT_MEMBERS, false)
102104
canReadMembers = it.getBoolean(CAN_READ_MEMBERS, false)
103105
}
104-
binding.membersRecyclerView.isVisible = canReadMembers
106+
applyMembersReadAccessUi()
105107

106108
subscribeToViewModels()
107109

@@ -119,7 +121,17 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
119121

120122
override fun onActivityCreated(savedInstanceState: Bundle?) {
121123
super.onActivityCreated(savedInstanceState)
122-
requireActivity().setTitle(R.string.space_members_label)
124+
val openedAsMembersMenu = requireActivity().intent.getBooleanExtra(
125+
SpaceMembersActivity.EXTRA_OPENED_AS_MEMBERS_MENU,
126+
true,
127+
)
128+
requireActivity().setTitle(
129+
if (openedAsMembersMenu) {
130+
R.string.space_members_label
131+
} else {
132+
R.string.space_menu_permalink
133+
},
134+
)
123135
}
124136

125137
override fun onAttach(context: Context) {
@@ -208,16 +220,24 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
208220
spaceMember.roles.contains(OCRoleType.toString(OCRoleType.CAN_MANAGE)) }
209221
spaceMembers = it.members
210222
addMemberRoles = it.roles
223+
cachedSpaceLinks = it.links
211224
val membersForList = if (canReadMembers) spaceMembers else emptyList()
212225
spaceMembersAdapter.setSpaceMembers(membersForList, roles, canRemoveMembers, canEditMembers, numberOfManagers)
213-
val hasLinks = it.links.isNotEmpty()
214-
showOrHideEmptyView(hasLinks)
215-
if (hasLinks) { showSpaceLinks(it.links) }
226+
if (canReadMembers) {
227+
val hasLinks = it.links.isNotEmpty()
228+
showOrHideEmptyView(hasLinks)
229+
if (hasLinks) { showSpaceLinks(it.links) }
230+
} else {
231+
hidePublicLinksUi()
232+
}
216233
binding.indeterminateProgressBar.isVisible = false
217234
}
218235
}
219236
}
220-
is UIResult.Loading -> { binding.indeterminateProgressBar.isVisible = true }
237+
is UIResult.Loading -> {
238+
binding.indeterminateProgressBar.isVisible =
239+
!spacePermissionsLoadedSuccessfully || canReadMembers
240+
}
221241
is UIResult.Error -> {
222242
requireActivity().finish()
223243
Timber.e(uiResult.error, "Failed to retrieve space members for space: ${currentSpace.id} (${currentSpace.id})")
@@ -233,17 +253,28 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
233253
when (val uiResult = event.peekContent()) {
234254
is UIResult.Success -> {
235255
uiResult.data?.let { spacePermissions ->
236-
binding.addMemberButton.isVisible = DRIVES_CREATE_PERMISSION in spacePermissions
256+
spacePermissionsLoadedSuccessfully = true
237257
canRemoveMembers = DRIVES_DELETE_PERMISSION in spacePermissions
238258
canEditMembers = DRIVES_UPDATE_PERMISSION in spacePermissions
239259
canReadMembers = DRIVES_READ_PERMISSION in spacePermissions
240-
binding.membersRecyclerView.isVisible = canReadMembers
260+
val canCreateMembers = DRIVES_CREATE_PERMISSION in spacePermissions
261+
binding.addMemberButton.isVisible = canReadMembers && canCreateMembers
241262
val membersForList = if (canReadMembers) spaceMembers else emptyList()
242263
spaceMembersAdapter.setSpaceMembers(membersForList, roles, canRemoveMembers, canEditMembers, numberOfManagers)
264+
applyMembersReadAccessUi()
265+
if (canReadMembers) {
266+
val hasLinks = cachedSpaceLinks.isNotEmpty()
267+
showOrHideEmptyView(hasLinks)
268+
if (hasLinks) {
269+
showSpaceLinks(cachedSpaceLinks)
270+
}
271+
}
243272
}
244273
}
245274
is UIResult.Loading -> { }
246275
is UIResult.Error -> {
276+
spacePermissionsLoadedSuccessfully = false
277+
binding.noReadMembersPermissionMessage.isVisible = false
247278
Timber.e(uiResult.error, "Failed to retrieve space permissions for space: ${currentSpace.id} (${currentSpace?.id})")
248279
}
249280
}
@@ -297,7 +328,33 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
297328
}
298329
}
299330

331+
private fun applyMembersReadAccessUi() {
332+
binding.apply {
333+
val show = canReadMembers
334+
membersHeaderBar.isVisible = show
335+
membersRecyclerView.isVisible = show
336+
publicLinksHeaderBar.isVisible = show
337+
publicLinksWarning.isVisible = show
338+
if (!show) {
339+
indeterminateProgressBar.isVisible = false
340+
hidePublicLinksUi()
341+
}
342+
noReadMembersPermissionMessage.isVisible = spacePermissionsLoadedSuccessfully && !show
343+
}
344+
}
345+
346+
private fun hidePublicLinksUi() {
347+
binding.apply {
348+
publicLinksRecyclerView.isVisible = false
349+
noPublicLinksMessage.isVisible = false
350+
}
351+
}
352+
300353
private fun showOrHideEmptyView(hasLinks: Boolean) {
354+
if (!canReadMembers) {
355+
hidePublicLinksUi()
356+
return
357+
}
301358
binding.apply {
302359
publicLinksRecyclerView.isVisible = hasLinks
303360
noPublicLinksMessage.isVisible = !hasLinks

owncloudApp/src/main/res/layout/members_fragment.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
android:orientation="vertical">
3232

3333
<androidx.constraintlayout.widget.ConstraintLayout
34+
android:id="@+id/members_header_bar"
3435
android:layout_width="match_parent"
3536
android:layout_height="match_parent"
3637
android:background="@color/actionbar_start_color">
@@ -84,6 +85,7 @@
8485
tools:visibility="visible"/>
8586

8687
<androidx.constraintlayout.widget.ConstraintLayout
88+
android:id="@+id/public_links_header_bar"
8789
android:layout_width="match_parent"
8890
android:layout_height="match_parent"
8991
android:background="@color/actionbar_start_color">
@@ -136,6 +138,17 @@
136138
android:textSize="15sp"
137139
android:visibility="gone"/>
138140

141+
<TextView
142+
android:id="@+id/no_read_members_permission_message"
143+
android:layout_width="match_parent"
144+
android:layout_height="wrap_content"
145+
android:gravity="center"
146+
android:padding="@dimen/standard_padding"
147+
android:text="@string/space_members_no_read_permission"
148+
android:textColor="@color/textColor"
149+
android:textSize="15sp"
150+
android:visibility="gone" />
151+
139152
</LinearLayout>
140153

141154
</androidx.core.widget.NestedScrollView>

owncloudApp/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,8 @@
886886
<string name="delete_space_failed">Space could not be deleted</string>
887887
<string name="set_space_icon">Set icon</string>
888888
<string name="members_title">Members</string>
889+
<string name="space_menu_permalink">Permalink</string>
890+
<string name="space_members_no_read_permission">You do not have permission to view members or public links for this space.</string>
889891
<string name="members_add">Add member</string>
890892
<string name="members_add_correctly">Member invited correctly</string>
891893
<string name="members_add_failed">Member could not be invited</string>

owncloudDomain/src/main/java/com/owncloud/android/domain/spaces/model/SpaceMenuOption.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@
2121
package com.owncloud.android.domain.spaces.model
2222

2323
enum class SpaceMenuOption {
24-
EDIT, EDIT_IMAGE, DISABLE, ENABLE, DELETE, SET_ICON, MEMBERS
24+
EDIT, EDIT_IMAGE, DISABLE, ENABLE, DELETE, SET_ICON, MEMBERS, PERMALINK
2525
}

owncloudDomain/src/main/java/com/owncloud/android/domain/spaces/usecases/FilterSpaceMenuOptionsUseCase.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ class FilterSpaceMenuOptionsUseCase(
4545

4646
val editImagePermission = hasSpacePermission(spacePermissionsResult, DRIVES_MANAGE_PERMISSION)
4747

48-
optionsToShow.add(SpaceMenuOption.MEMBERS)
48+
val readMembersPermission = hasSpacePermission(spacePermissionsResult, DRIVES_READ_PERMISSION)
49+
if (readMembersPermission) {
50+
optionsToShow.add(SpaceMenuOption.MEMBERS)
51+
} else {
52+
optionsToShow.add(SpaceMenuOption.PERMALINK)
53+
}
4954

5055
if (editPermission || (isSpaceManager && currentSpace.isDisabled)) {
5156
optionsToShow.add(SpaceMenuOption.EDIT)
@@ -83,6 +88,7 @@ class FilterSpaceMenuOptionsUseCase(
8388
companion object {
8489
private const val DRIVES_MANAGE_PERMISSION = "libre.graph/driveItem/permissions/update"
8590
private const val DRIVES_DELETE_PERMISSION = "libre.graph/driveItem/permissions/delete"
91+
private const val DRIVES_READ_PERMISSION = "libre.graph/driveItem/permissions/read"
8692
private const val DRIVES_MANAGER_ROLE = "manager"
8793
}
8894
}

0 commit comments

Comments
 (0)