diff --git a/CHANGELOG.md b/CHANGELOG.md index 655576da816..f3431bba751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,7 +120,9 @@ ownCloud admins and users. been implemented and, it is shown when the floating action button is tapped. https://github.com/owncloud/android/issues/4606 + https://github.com/owncloud/android/issues/4688 https://github.com/owncloud/android/pull/4683 + https://github.com/owncloud/android/pull/4694 * Enhancement - Edit a space: [#4607](https://github.com/owncloud/android/issues/4607) @@ -128,7 +130,9 @@ ownCloud admins and users. users with the required permissions when the three-dot menu button is tapped. https://github.com/owncloud/android/issues/4607 + https://github.com/owncloud/android/issues/4688 https://github.com/owncloud/android/pull/4687 + https://github.com/owncloud/android/pull/4694 * Enhancement - Update test in GitHub Actions: [#4663](https://github.com/owncloud/android/pull/4663) diff --git a/changelog/unreleased/4683 b/changelog/unreleased/4683 index 4a5f0eb6d04..605eafd840e 100644 --- a/changelog/unreleased/4683 +++ b/changelog/unreleased/4683 @@ -4,4 +4,6 @@ A new floating action button has been added to the spaces list, visible only to In addition, a new dialog for space creation has been implemented and, it is shown when the floating action button is tapped. https://github.com/owncloud/android/issues/4606 +https://github.com/owncloud/android/issues/4688 https://github.com/owncloud/android/pull/4683 +https://github.com/owncloud/android/pull/4694 diff --git a/changelog/unreleased/4687 b/changelog/unreleased/4687 index 894f738b4a1..185ac43ed86 100644 --- a/changelog/unreleased/4687 +++ b/changelog/unreleased/4687 @@ -4,4 +4,6 @@ A new edit space option has been added to the bottom sheet, available only to us with the required permissions when the three-dot menu button is tapped. https://github.com/owncloud/android/issues/4607 +https://github.com/owncloud/android/issues/4688 https://github.com/owncloud/android/pull/4687 +https://github.com/owncloud/android/pull/4694 diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt index e8eeed30889..f0243ebe00b 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt @@ -30,6 +30,7 @@ import androidx.fragment.app.DialogFragment import com.owncloud.android.R import com.owncloud.android.databinding.CreateSpaceDialogBinding import com.owncloud.android.domain.spaces.model.OCSpace +import com.owncloud.android.utils.DisplayUtils class CreateSpaceDialogFragment : DialogFragment() { private var _binding: CreateSpaceDialogBinding? = null @@ -51,9 +52,20 @@ class CreateSpaceDialogFragment : DialogFragment() { val canEditQuota = requireArguments().getBoolean(ARG_CAN_EDIT_SPACE_QUOTA) binding.apply { cancelCreateSpaceButton.setOnClickListener { dialog?.dismiss() } - createSpaceDialogNameValue.doOnTextChanged { name, _, _, _ -> - val errorMessage = validateName(name.toString()) - updateUI(errorMessage) + createSpaceDialogNameValue.doOnTextChanged { _, _, _, _ -> + updateUI() + } + + createSpaceDialogQuotaValue.doOnTextChanged { _, _, _, _ -> + updateUI() + } + + createSpaceDialogQuotaSwitch.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { createSpaceDialogQuotaValue.setText("1") } + updateUI() + createSpaceDialogQuotaNoRestrictionLabel.isVisible = !isChecked + createSpaceDialogQuotaLayout.isVisible = isChecked + createSpaceDialogQuotaGbLabel.isVisible = isChecked } if (isEditMode) { @@ -63,7 +75,11 @@ class CreateSpaceDialogFragment : DialogFragment() { currentSpace?.let { createSpaceDialogNameValue.setText(it.name) createSpaceDialogSubtitleValue.setText(it.description) - createSpaceDialogQuotaUnit.setSelection(getQuotaValueForSpinner(it.quota!!.total)) + val totalQuota = it.quota?.total ?: 0L + if (totalQuota != 0L) { + createSpaceDialogQuotaSwitch.isChecked = true + createSpaceDialogQuotaValue.setText(DisplayUtils.formatFromBytesToGb(totalQuota)) + } } createSpaceButton.apply { @@ -75,7 +91,7 @@ class CreateSpaceDialogFragment : DialogFragment() { createSpaceButton.setOnClickListener { val spaceName = createSpaceDialogNameValue.text.toString() val spaceSubtitle = createSpaceDialogSubtitleValue.text.toString() - val spaceQuota = convertToBytes(createSpaceDialogQuotaUnit.selectedItem.toString()) + val spaceQuota = if (createSpaceDialogQuotaSwitch.isChecked) convertToBytes(createSpaceDialogQuotaValue.text.toString()) else 0L if (isEditMode) { currentSpace?.let { @@ -106,37 +122,39 @@ class CreateSpaceDialogFragment : DialogFragment() { else -> null } - private fun updateUI(errorMessage: String?) { - val colorButton = if (errorMessage == null) { + private fun validateQuota(spaceQuota: String): String? { + if (!binding.createSpaceDialogQuotaSwitch.isChecked) return null + + return when { + spaceQuota.isEmpty() -> getString(R.string.create_space_dialog_quota_empty_error) + spaceQuota.toDouble() == MIN_SPACE_QUOTA_GB -> getString(R.string.create_space_dialog_quota_zero_error) + spaceQuota.toDouble() > MAX_SPACE_QUOTA_GB -> getString(R.string.create_space_dialog_quota_too_large_error) + else -> null + } + } + + private fun updateUI() { + val nameError = validateName(binding.createSpaceDialogNameValue.text.toString()) + val quotaError = validateQuota(binding.createSpaceDialogQuotaValue.text.toString()) + val noErrors = nameError == null && quotaError == null + + val colorButton = if (noErrors) { resources.getColor(R.color.primary_button_background_color, null) } else { resources.getColor(R.color.grey, null) } - binding.createSpaceDialogNameValue.error = errorMessage + binding.createSpaceDialogNameValue.error = nameError + binding.createSpaceDialogQuotaValue.error = quotaError binding.createSpaceButton.apply { setTextColor(colorButton) - isEnabled = errorMessage == null + isEnabled = noErrors } } private fun convertToBytes(spaceQuota: String): Long { - val quotaNumber = spaceQuota.removeSuffix(" GB").toLongOrNull() ?: return 0L - return quotaNumber * 1_000_000_000L - } - - private fun getQuotaValueForSpinner(spaceQuota: Long): Int { - val totalGB = spaceQuota / 1_000_000_000.0 - return when (totalGB) { - 1.0 -> 0 - 2.0 -> 1 - 5.0 -> 2 - 10.0 -> 3 - 50.0 -> 4 - 100.0 -> 5 - 0.0 -> 6 - else -> 0 - } + val quotaNumber = spaceQuota.toDoubleOrNull() ?: return 0L + return (quotaNumber * 1_000_000_000L).toLong() } interface CreateSpaceListener { @@ -149,6 +167,8 @@ class CreateSpaceDialogFragment : DialogFragment() { private const val ARG_CAN_EDIT_SPACE_QUOTA = "CAN_EDIT_SPACE_QUOTA" private const val ARG_CURRENT_SPACE = "CURRENT_SPACE" private const val FORBIDDEN_CHARACTERS = """[/\\.:?*"'><|]""" + private const val MIN_SPACE_QUOTA_GB = 0.0 + private const val MAX_SPACE_QUOTA_GB = 1_000_000.0 fun newInstance( isEditMode: Boolean, diff --git a/owncloudApp/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/owncloudApp/src/main/java/com/owncloud/android/utils/DisplayUtils.java index 9606f24e2e0..c0746bc7736 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/owncloudApp/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -255,4 +255,9 @@ public static int getDrawerHeaderHeight(int displayCutout, Resources resources) return (int) resources.getDimension(R.dimen.nav_drawer_header_height); } } + + public static String formatFromBytesToGb(long bytes) { + BigDecimal valueInGB = new BigDecimal(bytes).divide(BigDecimal.valueOf(1_000_000_000L)).stripTrailingZeros(); + return valueInGB.toPlainString(); + } } diff --git a/owncloudApp/src/main/res/layout/create_space_dialog.xml b/owncloudApp/src/main/res/layout/create_space_dialog.xml index 67dbaf73999..68ab2000638 100644 --- a/owncloudApp/src/main/res/layout/create_space_dialog.xml +++ b/owncloudApp/src/main/res/layout/create_space_dialog.xml @@ -119,33 +119,84 @@ - + android:layout_height="wrap_content"> + android:textSize="15sp" + android:labelFor="@+id/create_space_dialog_quota_value" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent"/> - + android:layout_marginTop="@dimen/standard_half_margin" + android:contentDescription="@string/content_description_quota_switch" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/create_space_dialog_quota"/> - + + + + + + + + + + + Nimi Alapealkiri Mahupiir - - 1 GB - 2 GB - 5 GB - 10 GB - 50 GB - 100 GB - Piiranguteta - Ruumi nimi ei tohi olla tühi Ruumi nii ei tphi olla pikem kui 255 märki Keelatud märgid: / \\ . : ? * \" \' > < | diff --git a/owncloudApp/src/main/res/values-sq/strings.xml b/owncloudApp/src/main/res/values-sq/strings.xml index cba02beb1f6..d87ecf77aa7 100644 --- a/owncloudApp/src/main/res/values-sq/strings.xml +++ b/owncloudApp/src/main/res/values-sq/strings.xml @@ -769,15 +769,6 @@ Emër Nëntitull Kuota - - 1 GB - 2 GB - 5 GB - 10 GB - 50 GB - 100 GB - Pa kufizim - Emri i hapësirës s’mund të jetë i zbrazët Emri i hapësirës s’mund të jetë më i gjatë se 255 shenja Shenja të ndaluara: / \\ . : ? * \" \' > < | diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index 6d662c72a50..03fdbafe26d 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -826,6 +826,7 @@ %1$s space subtitle Create button Cancel button + Space quota Create a shortcut URL @@ -839,18 +840,14 @@ Name Subtitle Quota - - 1 GB - 2 GB - 5 GB - 10 GB - 50 GB - 100 GB - No restriction - + No restriction + GB Space name must not be empty Space name must not be longer than 255 characters Forbidden characters: / \\ . : ? * " ' > < | + Space quota must not be empty + Space quota must be greater than zero + Space quota cannot exceed 1 PB Space created correctly Space could not be created Edit space