From 4701a07799817a695b7f709a9fedb413c8c0c173 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 30 Sep 2026 13:52:21 +0200 Subject: [PATCH 1/5] refactor: improve filter for space members Signed-off-by: Jorge Aguado Recio --- .../presentation/spaces/members/AddMemberFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt index c4d6e530c55..110c86c25a8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt @@ -151,9 +151,9 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi binding.membersRecyclerView.visibility = View.GONE } else { binding.indeterminateProgressBar.visibility = View.GONE - val listOfMembersFiltered = uiState.members.filter { member -> - !spaceMembers.any { spaceMember -> - spaceMember.id == "u:${member.id}" || spaceMember.id == "g:${member.id}" } + val spaceMemberIds = spaceMembers.mapTo(HashSet()) { it.id } + val listOfMembersFiltered = uiState.members.filterNot { member -> + "u:${member.id}" in spaceMemberIds || "g:${member.id}" in spaceMemberIds } val hasMembers = listOfMembersFiltered.isNotEmpty() showOrHideEmptyView(hasMembers) From c77761e02547b892fe0d4c3d9812f10a2bfe8ac5 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 30 Sep 2026 16:10:06 +0200 Subject: [PATCH 2/5] refactor: set up roles adapter for space members in onViewCreated method Signed-off-by: Jorge Aguado Recio --- .../spaces/members/AddMemberFragment.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt index 110c86c25a8..ec286c66b0d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt @@ -80,6 +80,10 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + editMode = requireArguments().getBoolean(ARG_EDIT_MODE, false) + roles = requireArguments().getParcelableArrayList(ARG_ROLES) ?: arrayListOf() + searchMembersAdapter = SearchMembersAdapter(this) recyclerView = binding.membersRecyclerView recyclerView.apply { @@ -87,8 +91,15 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi adapter = searchMembersAdapter } - editMode = requireArguments().getBoolean(ARG_EDIT_MODE, false) - roles = requireArguments().getParcelableArrayList(ARG_ROLES) ?: arrayListOf() + rolesAdapter = SpaceRolesAdapter(onRoleSelected = { + binding.inviteMemberButton.isEnabled = true + spaceMembersViewModel.onRoleSelected(it) + }) + binding.rolesRecyclerView.apply { + layoutManager = LinearLayoutManager(requireContext()) + adapter = rolesAdapter + } + rolesAdapter.setRoles(roles) if (editMode) { val selectedMember = requireArguments().getParcelable(ARG_SELECTED_MEMBER) @@ -237,15 +248,6 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi } private fun bindRoles(selectedRoleId: String?) { - rolesAdapter = SpaceRolesAdapter(onRoleSelected = { - binding.inviteMemberButton.isEnabled = true - spaceMembersViewModel.onRoleSelected(it) - }) - binding.rolesRecyclerView.apply { - layoutManager = LinearLayoutManager(requireContext()) - adapter = rolesAdapter - } - rolesAdapter.setRoles(roles) selectedRoleId?.let { binding.inviteMemberButton.isEnabled = true rolesAdapter.setSelectedRole(it) From 791a9bda843ab01f6c0883da9ca15be4b02543e4 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 30 Sep 2026 16:15:16 +0200 Subject: [PATCH 3/5] feat: delay member search request until typing stops Signed-off-by: Jorge Aguado Recio --- .../presentation/spaces/members/SpaceMembersViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 978dcf0bb72..57c09c7adda 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 @@ -43,6 +43,7 @@ import com.owncloud.android.extensions.toOCMember import com.owncloud.android.presentation.common.UIResult import com.owncloud.android.providers.CoroutinesDispatcherProvider import kotlinx.coroutines.Job +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow @@ -128,6 +129,7 @@ class SpaceMembersViewModel( fun searchMembers(query: String) { searchJob?.cancel() searchJob = viewModelScope.launch(coroutineDispatcherProvider.io) { + delay(SEARCH_DELAY_MS) _members.emit(MembersUIState(members = emptyList(), isLoading = true , error = null)) when (val result = searchMembersUseCase(SearchMembersUseCase.Params(accountName, query))) { is UseCaseResult.Success -> _members.emit(MembersUIState(members = result.data, isLoading = false, error = null)) @@ -218,4 +220,8 @@ class SpaceMembersViewModel( val selectedRole: OCRole? = null, val selectedExpirationDate: String? = null ) + + companion object { + private const val SEARCH_DELAY_MS = 500L + } } From bcaefaaf2f9a3f77b62b439e5a39f942e8d64f83 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Thu, 1 Oct 2026 11:21:13 +0200 Subject: [PATCH 4/5] refactor: extract shared fragment logic to extensions to avoid duplicated code Signed-off-by: Jorge Aguado Recio --- .../spaces/members/AddMemberFragment.kt | 97 ++----------------- 1 file changed, 10 insertions(+), 87 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt index ec286c66b0d..b2b9ca6b5e7 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt @@ -20,33 +20,31 @@ package com.owncloud.android.presentation.spaces.members -import android.app.DatePickerDialog -import android.icu.util.Calendar import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible 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.AddMemberFragmentBinding import com.owncloud.android.domain.members.model.OCMember -import com.owncloud.android.domain.members.model.OCMemberType import com.owncloud.android.domain.roles.model.OCRole import com.owncloud.android.domain.spaces.model.OCSpace import com.owncloud.android.domain.sharing.shares.model.MemberPermission +import com.owncloud.android.extensions.bindDatePickerDialog +import com.owncloud.android.extensions.bindRoles +import com.owncloud.android.extensions.bindSelectedMember import com.owncloud.android.extensions.collectLatestLifecycleFlow +import com.owncloud.android.extensions.openDatePickerDialog import com.owncloud.android.extensions.showErrorInSnackbar +import com.owncloud.android.extensions.showOrHideEmptyView import com.owncloud.android.presentation.common.UIResult import com.owncloud.android.utils.DisplayUtils import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.core.parameter.parametersOf import timber.log.Timber -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.TimeZone class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterListener { private var _binding: AddMemberFragmentBinding? = null @@ -129,19 +127,6 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi } } - private fun showOrHideEmptyView(hasMembers: Boolean) { - binding.membersRecyclerView.isVisible = hasMembers - binding.emptyDataParent.apply { - val shouldShow = !hasMembers && binding.searchBar.query.length >= searchMinLength - root.isVisible = shouldShow - if (shouldShow) { - listEmptyDatasetIcon.setImageResource(R.drawable.ic_share_generic_white) - listEmptyDatasetTitle.setText(R.string.members_search_failed) - listEmptyDatasetSubTitle.setText(R.string.members_search_empty) - } - } - } - override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) requireActivity().setTitle(if (editMode) R.string.members_edit else R.string.members_add) @@ -167,7 +152,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi "u:${member.id}" in spaceMemberIds || "g:${member.id}" in spaceMemberIds } val hasMembers = listOfMembersFiltered.isNotEmpty() - showOrHideEmptyView(hasMembers) + binding.showOrHideEmptyView(hasMembers, searchMinLength) if (hasMembers) searchMembersAdapter.setMembers(listOfMembersFiltered) uiState.error?.let { Timber.e(uiState.error, "Failed to retrieve available users and groups") @@ -184,7 +169,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi inviteMemberButton.visibility = View.VISIBLE } it.selectedMember?.let { member -> - bindSelectedMember(member) + binding.bindSelectedMember(member) } it.selectedExpirationDate?.let { expirationDate -> binding.expirationDateLayout.expirationDateValue.apply { @@ -192,13 +177,13 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi text = DisplayUtils.displayDateToHumanReadable(expirationDate) } } - bindRoles(uiState.selectedRole?.id) - bindDatePickerDialog(uiState.selectedExpirationDate) + binding.bindRoles(rolesAdapter, uiState.selectedRole?.id) + bindDatePickerDialog(binding, uiState.selectedExpirationDate, spaceMembersViewModel::onExpirationDateSelected) binding.expirationDateLayout.apply { expirationDateLayout.setOnClickListener { if (uiState.selectedExpirationDate != null) { - openDatePickerDialog(uiState.selectedExpirationDate) + openDatePickerDialog(binding, uiState.selectedExpirationDate, spaceMembersViewModel::onExpirationDateSelected) } else { expirationDateSwitch.isChecked = true } @@ -239,68 +224,6 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi } } - private fun bindSelectedMember(member: OCMember) { - binding.selectedMemberLayout.apply { - memberIcon.setImageResource(if (member.type == OCMemberType.GROUP) R.drawable.ic_group else R.drawable.ic_user) - memberName.text = member.displayName - memberRole.text = member.surname - } - } - - private fun bindRoles(selectedRoleId: String?) { - selectedRoleId?.let { - binding.inviteMemberButton.isEnabled = true - rolesAdapter.setSelectedRole(it) - } - } - - private fun bindDatePickerDialog(expirationDate: String?) { - binding.expirationDateLayout.expirationDateSwitch.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - openDatePickerDialog(expirationDate) - } else { - binding.expirationDateLayout.expirationDateValue.visibility = View.GONE - spaceMembersViewModel.onExpirationDateSelected(null) - } - } - } - - private fun openDatePickerDialog(expirationDate: String?) { - val calendar = Calendar.getInstance() - val formatter = SimpleDateFormat(DisplayUtils.DATE_FORMAT_ISO, Locale.ROOT).apply { - timeZone = TimeZone.getTimeZone("UTC") - } - - expirationDate?.let { - calendar.time = formatter.parse(it) - } - - DatePickerDialog( - requireContext(), - { _, selectedYear, selectedMonth, selectedDay -> - calendar.set(selectedYear, selectedMonth, selectedDay, 23, 59, 59) - calendar.set(Calendar.MILLISECOND, 999) - val isoExpirationDate = formatter.format(calendar.time) - spaceMembersViewModel.onExpirationDateSelected(isoExpirationDate) - binding.expirationDateLayout.expirationDateValue.apply { - visibility = View.VISIBLE - text = DisplayUtils.displayDateToHumanReadable(isoExpirationDate) - } - }, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ).apply { - datePicker.minDate = Calendar.getInstance().timeInMillis - show() - setOnCancelListener { - if (expirationDate == null) { - binding.expirationDateLayout.expirationDateSwitch.isChecked = false - } - } - } - } - private fun bindEditMode(member: MemberPermission, roles: List) { selectedMemberId = member.id spaceMembersViewModel.onMemberSelected(member) From 80fc724c06062275d12c83f55bd12a47d05b25b7 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Fri, 2 Oct 2026 14:21:06 +0200 Subject: [PATCH 5/5] refactor: use neutral names for UI shared between shares and space members Signed-off-by: Jorge Aguado Recio --- .../extensions/AddMemberFragmentBindingExt.kt | 6 +++--- .../members/SearchMembersAdapter.kt | 2 +- .../members/SearchMembersDiffUtil.kt | 2 +- .../RolesAdapter.kt} | 14 +++++++------- .../sharing/AddGraphShareFragment.kt | 18 +++++++++--------- .../spaces/members/AddMemberFragment.kt | 14 ++++++++------ .../main/res/layout/add_member_fragment.xml | 4 ++-- 7 files changed, 31 insertions(+), 29 deletions(-) rename owncloudApp/src/main/java/com/owncloud/android/presentation/{spaces => }/members/SearchMembersAdapter.kt (98%) rename owncloudApp/src/main/java/com/owncloud/android/presentation/{spaces => }/members/SearchMembersDiffUtil.kt (96%) rename owncloudApp/src/main/java/com/owncloud/android/presentation/{spaces/members/SpaceRolesAdapter.kt => roles/RolesAdapter.kt} (89%) diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/AddMemberFragmentBindingExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/AddMemberFragmentBindingExt.kt index bc469678838..5d3fb909918 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/AddMemberFragmentBindingExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/AddMemberFragmentBindingExt.kt @@ -25,7 +25,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.AddMemberFragmentBinding import com.owncloud.android.domain.members.model.OCMember import com.owncloud.android.domain.members.model.OCMemberType -import com.owncloud.android.presentation.spaces.members.SpaceRolesAdapter +import com.owncloud.android.presentation.roles.RolesAdapter fun AddMemberFragmentBinding.showOrHideEmptyView(hasMembers: Boolean, searchMinLength: Int) { membersRecyclerView.isVisible = hasMembers @@ -48,9 +48,9 @@ fun AddMemberFragmentBinding.bindSelectedMember(member: OCMember) { } } -fun AddMemberFragmentBinding.bindRoles(rolesAdapter: SpaceRolesAdapter, selectedRoleId: String?) { +fun AddMemberFragmentBinding.bindRoles(rolesAdapter: RolesAdapter, selectedRoleId: String?) { selectedRoleId?.let { - inviteMemberButton.isEnabled = true + confirmActionButton.isEnabled = true rolesAdapter.setSelectedRole(it) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersAdapter.kt similarity index 98% rename from owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersAdapter.kt rename to owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersAdapter.kt index 7f316e30e3d..990e271cc56 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersAdapter.kt @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package com.owncloud.android.presentation.spaces.members +package com.owncloud.android.presentation.members import android.view.LayoutInflater import android.view.View diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersDiffUtil.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersDiffUtil.kt similarity index 96% rename from owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersDiffUtil.kt rename to owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersDiffUtil.kt index 074c39c39df..b19f760af08 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SearchMembersDiffUtil.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/members/SearchMembersDiffUtil.kt @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package com.owncloud.android.presentation.spaces.members +package com.owncloud.android.presentation.members import androidx.recyclerview.widget.DiffUtil import com.owncloud.android.domain.members.model.OCMember diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceRolesAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/roles/RolesAdapter.kt similarity index 89% rename from owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceRolesAdapter.kt rename to owncloudApp/src/main/java/com/owncloud/android/presentation/roles/RolesAdapter.kt index 5b0a01a1186..55baf132d71 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceRolesAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/roles/RolesAdapter.kt @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package com.owncloud.android.presentation.spaces.members +package com.owncloud.android.presentation.roles import android.view.LayoutInflater import android.view.View @@ -30,23 +30,23 @@ import com.owncloud.android.domain.roles.model.OCRole import com.owncloud.android.domain.roles.model.OCRoleType import com.owncloud.android.utils.PreferenceUtils -class SpaceRolesAdapter( +class RolesAdapter( val onRoleSelected: ((OCRole) -> Unit)? = null -): RecyclerView.Adapter() { +): RecyclerView.Adapter() { private var roles: List = emptyList() private var selectedRoleId: String? = null - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SpaceRolesViewHolder { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RolesViewHolder { val inflater = LayoutInflater.from(parent.context) val view = inflater.inflate(R.layout.role_item, parent, false) view.filterTouchesWhenObscured = PreferenceUtils.shouldDisallowTouchesWithOtherVisibleWindows(parent.context) - return SpaceRolesViewHolder(view) + return RolesViewHolder(view) } - override fun onBindViewHolder(holder: SpaceRolesViewHolder, position: Int) { + override fun onBindViewHolder(holder: RolesViewHolder, position: Int) { val role = roles[position] holder.binding.apply { @@ -91,7 +91,7 @@ class SpaceRolesAdapter( this.selectedRoleId = id } - class SpaceRolesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + class RolesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val binding = RoleItemBinding.bind(itemView) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/AddGraphShareFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/AddGraphShareFragment.kt index fe147b4f61c..058028bfafe 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/AddGraphShareFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/AddGraphShareFragment.kt @@ -43,8 +43,8 @@ import com.owncloud.android.extensions.openDatePickerDialog import com.owncloud.android.extensions.showErrorInSnackbar import com.owncloud.android.extensions.showOrHideEmptyView import com.owncloud.android.extensions.toOCMember -import com.owncloud.android.presentation.spaces.members.SearchMembersAdapter -import com.owncloud.android.presentation.spaces.members.SpaceRolesAdapter +import com.owncloud.android.presentation.members.SearchMembersAdapter +import com.owncloud.android.presentation.roles.RolesAdapter import com.owncloud.android.utils.DisplayUtils import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.core.parameter.parametersOf @@ -62,7 +62,7 @@ class AddGraphShareFragment : Fragment(), SearchMembersAdapter.SearchMembersAdap } private lateinit var searchMembersAdapter: SearchMembersAdapter - private lateinit var rolesAdapter: SpaceRolesAdapter + private lateinit var rolesAdapter: RolesAdapter private lateinit var recyclerView: RecyclerView private var roles: List = emptyList() @@ -97,8 +97,8 @@ class AddGraphShareFragment : Fragment(), SearchMembersAdapter.SearchMembersAdap adapter = searchMembersAdapter } - rolesAdapter = SpaceRolesAdapter(onRoleSelected = { - binding.inviteMemberButton.isEnabled = true + rolesAdapter = RolesAdapter(onRoleSelected = { + binding.confirmActionButton.isEnabled = true graphShareViewModel.onRoleSelected(it) }) binding.rolesRecyclerView.apply { @@ -207,9 +207,9 @@ class AddGraphShareFragment : Fragment(), SearchMembersAdapter.SearchMembersAdap binding.apply { searchMemberLayout.visibility = View.GONE addMemberLayout.visibility = View.VISIBLE - inviteMemberButton.visibility = View.VISIBLE - inviteMemberButton.text = getString(if (editMode) R.string.share_confirm_public_link_button else R.string.action_share) - inviteMemberButton.contentDescription = + confirmActionButton.visibility = View.VISIBLE + confirmActionButton.text = getString(if (editMode) R.string.share_confirm_public_link_button else R.string.action_share) + confirmActionButton.contentDescription = getString(if (editMode) R.string.content_description_edit_share_button else R.string.content_description_create_share_button) } it.selectedMember?.let { member -> @@ -234,7 +234,7 @@ class AddGraphShareFragment : Fragment(), SearchMembersAdapter.SearchMembersAdap } } - binding.inviteMemberButton.setOnClickListener { + binding.confirmActionButton.setOnClickListener { uiState.selectedMember?.let { selectedMember -> uiState.selectedRole?.let { selectedRole -> if (editMode) { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt index b2b9ca6b5e7..598a6943e9e 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt @@ -41,6 +41,8 @@ import com.owncloud.android.extensions.openDatePickerDialog import com.owncloud.android.extensions.showErrorInSnackbar import com.owncloud.android.extensions.showOrHideEmptyView import com.owncloud.android.presentation.common.UIResult +import com.owncloud.android.presentation.members.SearchMembersAdapter +import com.owncloud.android.presentation.roles.RolesAdapter import com.owncloud.android.utils.DisplayUtils import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.core.parameter.parametersOf @@ -58,7 +60,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi } private lateinit var searchMembersAdapter: SearchMembersAdapter - private lateinit var rolesAdapter: SpaceRolesAdapter + private lateinit var rolesAdapter: RolesAdapter private lateinit var recyclerView: RecyclerView private lateinit var roles: List @@ -89,8 +91,8 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi adapter = searchMembersAdapter } - rolesAdapter = SpaceRolesAdapter(onRoleSelected = { - binding.inviteMemberButton.isEnabled = true + rolesAdapter = RolesAdapter(onRoleSelected = { + binding.confirmActionButton.isEnabled = true spaceMembersViewModel.onRoleSelected(it) }) binding.rolesRecyclerView.apply { @@ -166,7 +168,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi binding.apply { searchMemberLayout.visibility = View.GONE addMemberLayout.visibility = View.VISIBLE - inviteMemberButton.visibility = View.VISIBLE + confirmActionButton.visibility = View.VISIBLE } it.selectedMember?.let { member -> binding.bindSelectedMember(member) @@ -189,7 +191,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi } } } - binding.inviteMemberButton.setOnClickListener { + binding.confirmActionButton.setOnClickListener { uiState.selectedMember?.let { selectedMember -> uiState.selectedRole?.let { selectedRole -> if (editMode) { @@ -235,7 +237,7 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi spaceMembersViewModel.onExpirationDateSelected(expirationDate) binding.expirationDateLayout.expirationDateSwitch.isChecked = true } - binding.inviteMemberButton.text = getString(R.string.share_confirm_public_link_button) + binding.confirmActionButton.text = getString(R.string.share_confirm_public_link_button) } companion object { diff --git a/owncloudApp/src/main/res/layout/add_member_fragment.xml b/owncloudApp/src/main/res/layout/add_member_fragment.xml index cc0d4051291..199302aa598 100644 --- a/owncloudApp/src/main/res/layout/add_member_fragment.xml +++ b/owncloudApp/src/main/res/layout/add_member_fragment.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@id/invite_member_button" + app:layout_constraintBottom_toTopOf="@id/confirm_action_button" app:layout_constraintStart_toStartOf="parent">