2020
2121package com.owncloud.android.presentation.sharing
2222
23+ import android.app.AlertDialog
2324import android.content.Context
2425import android.os.Bundle
2526import android.view.LayoutInflater
@@ -32,6 +33,8 @@ import com.owncloud.android.R
3233import com.owncloud.android.databinding.MembersFragmentBinding
3334import com.owncloud.android.domain.files.model.OCFile
3435import com.owncloud.android.domain.roles.model.OCRole
36+ import com.owncloud.android.domain.sharing.shares.model.MemberPermission
37+ import com.owncloud.android.extensions.avoidScreenshotsIfNeeded
3538import com.owncloud.android.extensions.collectLatestLifecycleFlow
3639import com.owncloud.android.extensions.showErrorInSnackbar
3740import com.owncloud.android.extensions.showMessageInSnackbar
@@ -40,7 +43,7 @@ import org.koin.androidx.viewmodel.ext.android.activityViewModel
4043import org.koin.core.parameter.parametersOf
4144import timber.log.Timber
4245
43- class GraphShareFragment : Fragment () {
46+ class GraphShareFragment : Fragment (), GraphSharesAdapter.GraphSharesAdapterListener {
4447 private var _binding : MembersFragmentBinding ? = null
4548 private val binding get() = _binding !!
4649
@@ -55,6 +58,7 @@ class GraphShareFragment : Fragment() {
5558
5659 private var roles: List <OCRole > = emptyList()
5760 private var listener: GraphShareFragmentListener ? = null
61+ private var canRemoveShares: Boolean = false
5862
5963 override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View {
6064 _binding = MembersFragmentBinding .inflate(inflater, container, false )
@@ -65,7 +69,7 @@ class GraphShareFragment : Fragment() {
6569 super .onViewCreated(view, savedInstanceState)
6670 binding.membersTitle.text = getString(R .string.share_with_people_title)
6771
68- graphSharesAdapter = GraphSharesAdapter ()
72+ graphSharesAdapter = GraphSharesAdapter (this )
6973 binding.membersRecyclerView.apply {
7074 layoutManager = LinearLayoutManager (requireContext())
7175 adapter = graphSharesAdapter
@@ -104,10 +108,23 @@ class GraphShareFragment : Fragment() {
104108 _binding = null
105109 }
106110
111+ override fun onRemoveShare (share : MemberPermission ) {
112+ AlertDialog .Builder (requireContext())
113+ .setIcon(R .drawable.ic_warning)
114+ .setTitle(getString(R .string.confirmation_remove_private_share_title))
115+ .setMessage(getString(R .string.confirmation_remove_share_message, share.displayName))
116+ .setPositiveButton(getString(R .string.common_yes)) { _, _ -> graphShareViewModel.removeGraphShare(share.id) }
117+ .setNegativeButton(getString(R .string.common_no)) { dialog, _ -> dialog.dismiss() }
118+ .show()
119+ .avoidScreenshotsIfNeeded()
120+ }
121+
107122 private fun subscribeToViewModels () {
108123 observeRoles()
109124 observeShares()
125+ observeSpacePermissions()
110126 observeAddShareResult()
127+ observeRemoveShareResult()
111128 }
112129
113130 private fun observeRoles () {
@@ -139,7 +156,7 @@ class GraphShareFragment : Fragment() {
139156 val hasMembers = it.members.isNotEmpty()
140157 binding.membersRecyclerView.isVisible = hasMembers
141158 binding.noSharesMessage.isVisible = ! hasMembers
142- graphSharesAdapter.setShares(it.members, it.roles)
159+ graphSharesAdapter.setShares(it.members, it.roles, canRemoveShares )
143160 binding.swipeRefreshMembers.isRefreshing = false
144161 }
145162 }
@@ -154,6 +171,28 @@ class GraphShareFragment : Fragment() {
154171 }
155172 }
156173
174+ private fun observeSpacePermissions () {
175+ collectLatestLifecycleFlow(graphShareViewModel.spacePermissions) { event ->
176+ event?.let {
177+ when (val uiResult = event.peekContent()) {
178+ is UIResult .Success -> {
179+ uiResult.data?.let { spacePermissions ->
180+ checkPermissions(spacePermissions)
181+ }
182+ }
183+ is UIResult .Loading -> { }
184+ is UIResult .Error -> {
185+ Timber .e(uiResult.error, " Failed to retrieve space permissions" )
186+ }
187+ }
188+ }
189+ }
190+ }
191+
192+ private fun checkPermissions (spacePermissions : List <String >) {
193+ canRemoveShares = DRIVES_DELETE_PERMISSION in spacePermissions
194+ }
195+
157196 private fun observeAddShareResult () {
158197 collectLatestLifecycleFlow(graphShareViewModel.addShareResultFlow) { event ->
159198 event?.peekContent()?.let { uiResult ->
@@ -169,13 +208,30 @@ class GraphShareFragment : Fragment() {
169208 }
170209 }
171210
211+ private fun observeRemoveShareResult () {
212+ collectLatestLifecycleFlow(graphShareViewModel.removeShareResultFlow) { uiResult ->
213+ when (uiResult) {
214+ is UIResult .Loading -> { }
215+ is UIResult .Success -> {
216+ showMessageInSnackbar(getString(R .string.share_remove_correctly))
217+ graphShareViewModel.getGraphShares()
218+ }
219+ is UIResult .Error -> {
220+ showErrorInSnackbar(R .string.share_remove_failed, uiResult.error)
221+ Timber .e(uiResult.error, " Failed to remove a graph share" )
222+ }
223+ }
224+ }
225+ }
226+
172227 interface GraphShareFragmentListener {
173228 fun addGraphShare (file : OCFile , accountName : String )
174229 }
175230
176231 companion object {
177232 private const val ARG_FILE = " FILE"
178233 private const val ARG_ACCOUNT_NAME = " ACCOUNT_NAME"
234+ private const val DRIVES_DELETE_PERMISSION = " libre.graph/driveItem/permissions/delete"
179235
180236 fun newInstance (file : OCFile , accountName : String ): GraphShareFragment {
181237 val args = Bundle ().apply {
0 commit comments