@@ -29,9 +29,9 @@ import android.view.ViewGroup
2929import androidx.core.view.isVisible
3030import androidx.fragment.app.Fragment
3131import androidx.recyclerview.widget.LinearLayoutManager
32- import androidx.recyclerview.widget.RecyclerView
3332import com.owncloud.android.R
3433import com.owncloud.android.databinding.MembersFragmentBinding
34+ import com.owncloud.android.domain.links.model.OCLink
3535import com.owncloud.android.domain.roles.model.OCRole
3636import com.owncloud.android.domain.roles.model.OCRoleType
3737import com.owncloud.android.domain.spaces.model.OCSpace
@@ -41,11 +41,17 @@ import com.owncloud.android.extensions.collectLatestLifecycleFlow
4141import com.owncloud.android.extensions.showErrorInSnackbar
4242import com.owncloud.android.extensions.showMessageInSnackbar
4343import com.owncloud.android.presentation.common.UIResult
44+ import com.owncloud.android.presentation.spaces.links.SpaceLinksAdapter
45+ import com.owncloud.android.utils.DisplayUtils
4446import org.koin.androidx.viewmodel.ext.android.activityViewModel
4547import org.koin.core.parameter.parametersOf
4648import timber.log.Timber
49+ import java.text.SimpleDateFormat
50+ import java.util.Date
51+ import java.util.Locale
52+ import java.util.TimeZone
4753
48- class SpaceMembersFragment : Fragment (), SpaceMembersAdapter.SpaceMembersAdapterListener {
54+ class SpaceMembersFragment : Fragment (), SpaceMembersAdapter.SpaceMembersAdapterListener, SpaceLinksAdapter.SpaceLinksAdapterListener {
4955 private var _binding : MembersFragmentBinding ? = null
5056 private val binding get() = _binding !!
5157
@@ -57,7 +63,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
5763 }
5864
5965 private lateinit var spaceMembersAdapter: SpaceMembersAdapter
60- private lateinit var recyclerView : RecyclerView
66+ private lateinit var spaceLinksAdapter : SpaceLinksAdapter
6167 private lateinit var currentSpace: OCSpace
6268
6369 private var roles: List <OCRole > = emptyList()
@@ -77,12 +83,17 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
7783 super .onViewCreated(view, savedInstanceState)
7884 val accountId = requireArguments().getString(ARG_ACCOUNT_ID )
7985 spaceMembersAdapter = SpaceMembersAdapter (this , accountId)
80- recyclerView = binding.membersRecyclerView
81- recyclerView.apply {
86+ binding.membersRecyclerView.apply {
8287 layoutManager = LinearLayoutManager (requireContext())
8388 adapter = spaceMembersAdapter
8489 }
8590
91+ spaceLinksAdapter = SpaceLinksAdapter (this )
92+ binding.publicLinksRecyclerView.apply {
93+ layoutManager = LinearLayoutManager (requireContext())
94+ adapter = spaceLinksAdapter
95+ }
96+
8697 currentSpace = requireArguments().getParcelable<OCSpace >(ARG_CURRENT_SPACE ) ? : return
8798 savedInstanceState?.let {
8899 canRemoveMembers = it.getBoolean(CAN_REMOVE_MEMBERS , false )
@@ -150,6 +161,10 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
150161 )
151162 }
152163
164+ override fun onCopyOrSendPublicLink (publicLinkUrl : String ) {
165+ listener?.copyOrSendPublicLink(publicLinkUrl, currentSpace.name)
166+ }
167+
153168 private fun subscribeToViewModels () {
154169 collectLatestLifecycleFlow(spaceMembersViewModel.roles) { event ->
155170 event?.let {
@@ -179,10 +194,14 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
179194 spaceMembers = it.members
180195 addMemberRoles = it.roles
181196 spaceMembersAdapter.setSpaceMembers(spaceMembers, roles, canRemoveMembers, canEditMembers, numberOfManagers)
197+ val hasLinks = it.links.isNotEmpty()
198+ showOrHideEmptyView(hasLinks)
199+ if (hasLinks) { showSpaceLinks(it.links) }
200+ binding.indeterminateProgressBar.isVisible = false
182201 }
183202 }
184203 }
185- is UIResult .Loading -> { }
204+ is UIResult .Loading -> { binding.indeterminateProgressBar.isVisible = true }
186205 is UIResult .Error -> {
187206 requireActivity().finish()
188207 Timber .e(uiResult.error, " Failed to retrieve space members for space: ${currentSpace.id} (${currentSpace.id} )" )
@@ -251,8 +270,29 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
251270 }
252271 }
253272
273+ private fun showOrHideEmptyView (hasLinks : Boolean ) {
274+ binding.apply {
275+ publicLinksRecyclerView.isVisible = hasLinks
276+ noPublicLinksMessage.isVisible = ! hasLinks
277+ }
278+ }
279+
280+ private fun showSpaceLinks (spaceLinks : List <OCLink >) {
281+ val formatter = SimpleDateFormat (DisplayUtils .DATE_FORMAT_ISO , Locale .ROOT ).apply {
282+ timeZone = TimeZone .getTimeZone(" UTC" )
283+ }
284+ spaceLinksAdapter.setSpaceLinks(spaceLinks.sortedByDescending { spaceLink ->
285+ if (spaceLink.createdDateTime.isNotEmpty()) {
286+ formatter.parse(spaceLink.createdDateTime)
287+ } else {
288+ Date (0 )
289+ }
290+ })
291+ }
292+
254293 interface SpaceMemberFragmentListener {
255294 fun addMember (space : OCSpace , spaceMembers : List <SpaceMember >, roles : List <OCRole >, editMode : Boolean , selectedMember : SpaceMember ? )
295+ fun copyOrSendPublicLink (publicLinkUrl : String , spaceName : String )
256296 }
257297
258298 companion object {
0 commit comments