@@ -31,6 +31,7 @@ import androidx.core.view.isVisible
3131import androidx.fragment.app.Fragment
3232import com.owncloud.android.R
3333import com.owncloud.android.databinding.AddPublicLinkFragmentBinding
34+ import com.owncloud.android.domain.links.model.OCLink
3435import com.owncloud.android.domain.links.model.OCLinkType
3536import com.owncloud.android.domain.spaces.model.OCSpace
3637import 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
0 commit comments