Skip to content

Commit 98e2db2

Browse files
committed
feat: display correct view to edit the selected space public link
1 parent 545f06e commit 98e2db2

5 files changed

Lines changed: 69 additions & 16 deletions

File tree

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

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import androidx.core.view.isVisible
3131
import androidx.fragment.app.Fragment
3232
import com.owncloud.android.R
3333
import com.owncloud.android.databinding.AddPublicLinkFragmentBinding
34+
import com.owncloud.android.domain.links.model.OCLink
3435
import com.owncloud.android.domain.links.model.OCLinkType
3536
import com.owncloud.android.domain.spaces.model.OCSpace
3637
import com.owncloud.android.extensions.collectLatestLifecycleFlow
@@ -59,6 +60,8 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
5960

6061
private var isPasswordEnforced = true
6162
private var hasPassword = false
63+
private var editMode = false
64+
private var selectedPublicLink: OCLink? = null
6265

6366
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
6467
_binding = AddPublicLinkFragmentBinding.inflate(inflater, container, false)
@@ -67,7 +70,9 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
6770

6871
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6972
super.onViewCreated(view, savedInstanceState)
70-
requireActivity().setTitle(R.string.public_link_create_title)
73+
editMode = requireArguments().getBoolean(ARG_EDIT_MODE)
74+
selectedPublicLink = requireArguments().getParcelable(ARG_SELECTED_PUBLIC_LINK)
75+
requireActivity().setTitle(if (editMode) R.string.public_link_edit_title else R.string.public_link_create_title)
7176

7277
binding.publicLinkPermissions.apply {
7378
canViewPublicLinkRadioButton.tag = OCLinkType.CAN_VIEW
@@ -84,7 +89,7 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
8489
}
8590
}
8691

87-
hasPassword = it.selectedPassword != null
92+
hasPassword = it.hasPassword
8893
it.selectedPermission?.let {
8994
binding.optionsLayout.isVisible = true
9095
binding.passwordLayout.apply {
@@ -105,6 +110,7 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
105110
openDatePickerDialog(uiState.selectedExpirationDate)
106111
} else {
107112
expirationDateSwitch.isChecked = true
113+
openDatePickerDialog(null)
108114
}
109115
}
110116
}
@@ -130,6 +136,8 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
130136
}
131137
}
132138

139+
if (editMode) { bindEditMode() }
140+
133141
binding.publicLinkPermissions.apply {
134142
canViewPublicLinkRadioButton.setOnClickListener { selectRadioButton(canViewPublicLinkRadioButton) }
135143
canViewPublicLinkLayout.setOnClickListener { selectRadioButton(canViewPublicLinkRadioButton) }
@@ -166,10 +174,11 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
166174

167175
override fun onSetPassword(password: String) {
168176
val normalizedPassword = password.ifBlank { null }
169-
if (!isPasswordEnforced && normalizedPassword == null) {
177+
val hasPassword = normalizedPassword != null
178+
if (!isPasswordEnforced && !hasPassword) {
170179
binding.passwordLayout.setPasswordSwitch.isChecked = false
171180
}
172-
spaceLinksViewModel.onPasswordSelected(normalizedPassword)
181+
spaceLinksViewModel.onPasswordSelected(normalizedPassword, hasPassword)
173182
}
174183

175184
private fun selectRadioButton(selectedRadioButton: RadioButton) {
@@ -186,9 +195,9 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
186195
}
187196

188197
private fun bindDatePickerDialog(expirationDate: String?) {
189-
binding.expirationDateLayout.expirationDateSwitch.setOnCheckedChangeListener { _, isChecked ->
198+
binding.expirationDateLayout.expirationDateSwitch.setOnClickListener {
190199
hideKeyboardAndClearFocus()
191-
if (isChecked) {
200+
if (binding.expirationDateLayout.expirationDateSwitch.isChecked) {
192201
openDatePickerDialog(expirationDate)
193202
} else {
194203
binding.expirationDateLayout.expirationDateValue.visibility = View.GONE
@@ -241,26 +250,58 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
241250

242251
private fun removePassword() {
243252
hideKeyboardAndClearFocus()
244-
spaceLinksViewModel.onPasswordSelected(null)
253+
spaceLinksViewModel.onPasswordSelected(null, false)
245254
}
246255

247256
private fun hideKeyboardAndClearFocus() {
248257
hideSoftKeyboard()
249258
binding.publicLinkNameEditText.clearFocus()
250259
}
251260

261+
private fun bindEditMode() {
262+
selectedPublicLink?.let {
263+
binding.publicLinkNameEditText.setText(it.displayName)
264+
binding.createPublicLinkButton.setText(R.string.share_confirm_public_link_button)
265+
266+
// Do not recreate the edit view after the first iteration
267+
if (spaceLinksViewModel.addPublicLinkUIState.value?.selectedPermission != null) return
268+
269+
when (it.type) {
270+
OCLinkType.CAN_VIEW -> selectRadioButton(binding.publicLinkPermissions.canViewPublicLinkRadioButton)
271+
OCLinkType.CAN_EDIT -> selectRadioButton(binding.publicLinkPermissions.canEditPublicLinkRadioButton)
272+
OCLinkType.CREATE_ONLY -> selectRadioButton(binding.publicLinkPermissions.secretFileDropPublicLinkRadioButton)
273+
else -> {}
274+
}
275+
276+
if (it.hasPassword) {
277+
spaceLinksViewModel.onPasswordSelected(null, true)
278+
}
279+
280+
it.expirationDateTime?.let { expirationDate ->
281+
spaceLinksViewModel.onExpirationDateSelected(expirationDate)
282+
binding.expirationDateLayout.expirationDateSwitch.isChecked = true
283+
}
284+
}
285+
}
286+
252287
companion object {
253288
private const val DIALOG_SET_PASSWORD = "DIALOG_SET_PASSWORD"
254289
private const val ARG_ACCOUNT_NAME = "ARG_ACCOUNT_NAME"
255290
private const val ARG_CURRENT_SPACE = "ARG_CURRENT_SPACE"
291+
private const val ARG_EDIT_MODE = "ARG_EDIT_MODE"
292+
private const val ARG_SELECTED_PUBLIC_LINK = "ARG_SELECTED_PUBLIC_LINK"
256293

257294
fun newInstance(
258295
accountName: String,
259-
currentSpace: OCSpace
296+
currentSpace: OCSpace,
297+
editMode: Boolean,
298+
selectedPublicLink: OCLink?
260299
): AddPublicLinkFragment {
261300
val args = Bundle().apply {
262301
putString(ARG_ACCOUNT_NAME, accountName)
263302
putParcelable(ARG_CURRENT_SPACE, currentSpace)
303+
putBoolean(ARG_EDIT_MODE, editMode)
304+
putParcelable(ARG_SELECTED_PUBLIC_LINK, selectedPublicLink)
264305
}
265306
return AddPublicLinkFragment().apply {
266307
arguments = args

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ class SpaceLinksViewModel(
7575
_addPublicLinkUIState.update { it?.copy(selectedExpirationDate = expirationDate) }
7676
}
7777

78-
fun onPasswordSelected(password: String?) {
79-
_addPublicLinkUIState.update { it?.copy(selectedPassword = password) }
78+
fun onPasswordSelected(password: String?, hasPassword: Boolean) {
79+
_addPublicLinkUIState.update { it?.copy(selectedPassword = password, hasPassword = hasPassword) }
8080
}
8181

8282
fun createPublicLink(displayName: String) {
@@ -126,6 +126,7 @@ class SpaceLinksViewModel(
126126
data class AddPublicLinkUIState(
127127
val selectedPermission: OCLinkType? = null,
128128
val selectedExpirationDate: String? = null,
129-
val selectedPassword: String? = null
129+
val selectedPassword: String? = null,
130+
val hasPassword: Boolean = false
130131
)
131132
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import android.view.MenuItem
2828
import androidx.fragment.app.transaction
2929
import com.owncloud.android.R
3030
import com.owncloud.android.databinding.MembersActivityBinding
31+
import com.owncloud.android.domain.links.model.OCLink
3132
import com.owncloud.android.domain.roles.model.OCRole
3233
import com.owncloud.android.domain.spaces.model.OCSpace
3334
import com.owncloud.android.domain.spaces.model.SpaceMember
@@ -101,8 +102,8 @@ class SpaceMembersActivity: FileActivity(), SpaceMembersFragment.SpaceMemberFrag
101102
}
102103
}
103104

104-
override fun addPublicLink(space: OCSpace) {
105-
val addPublicLinkFragment = AddPublicLinkFragment.newInstance(account.name, space)
105+
override fun addPublicLink(space: OCSpace, editMode: Boolean, selectedPublicLink: OCLink?) {
106+
val addPublicLinkFragment = AddPublicLinkFragment.newInstance(account.name, space, editMode, selectedPublicLink)
106107
val transaction = supportFragmentManager.beginTransaction()
107108
transaction.apply {
108109
replace(R.id.members_fragment_container, addPublicLinkFragment, TAG_ADD_PUBLIC_LINK_FRAGMENT)

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
131131

132132
binding.addPublicLinkButton.setOnClickListener {
133133
spaceLinksViewModel.resetViewModel()
134-
listener?.addPublicLink(currentSpace)
134+
listener?.addPublicLink(
135+
space = currentSpace,
136+
editMode = false,
137+
selectedPublicLink = null
138+
)
135139
}
136140
}
137141

@@ -198,7 +202,12 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
198202
}
199203

200204
override fun onEditPublicLink(publicLink: OCLink) {
201-
205+
spaceLinksViewModel.resetViewModel()
206+
listener?.addPublicLink(
207+
space = currentSpace,
208+
editMode = true,
209+
selectedPublicLink = publicLink
210+
)
202211
}
203212

204213
private fun subscribeToViewModels() {
@@ -409,7 +418,7 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter
409418

410419
interface SpaceMemberFragmentListener {
411420
fun addMember(space: OCSpace, spaceMembers: List<SpaceMember>, roles: List<OCRole>, editMode: Boolean, selectedMember: SpaceMember?)
412-
fun addPublicLink(space: OCSpace)
421+
fun addPublicLink(space: OCSpace, editMode: Boolean, selectedPublicLink: OCLink?)
413422
fun copyOrSendPublicLink(publicLinkUrl: String, spaceName: String)
414423
}
415424

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,7 @@
936936
<string name="public_link_remove_dialog_message">Recreating the same link again is not possible</string>
937937
<string name="public_link_remove_correctly">Public link removed correctly</string>
938938
<string name="public_link_remove_failed">Public link could not be removed</string>
939+
<string name="public_link_edit_title">Edit public link</string>
939940

940941
<string name="feedback_dialog_get_in_contact_description"><![CDATA[ Ask for help in our <a href=\"%1$s\"><b>forum</b></a> or contribute in our <a href=\"%2$s\"><b>GitHub repo</b></a>]]></string>
941942

0 commit comments

Comments
 (0)