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