瀏覽代碼

Invalid characters added into error message

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 年之前
父節點
當前提交
5ae25ec56d

+ 0 - 17
app/src/main/java/com/nextcloud/utils/fileNameValidator/FileNameValidationResult.kt

@@ -1,17 +0,0 @@
-/*
- * Nextcloud - Android Client
- *
- * SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-package com.nextcloud.utils.fileNameValidator
-
-import com.owncloud.android.R
-
-enum class FileNameValidationResult(val messageId: Int) {
-    EMPTY(R.string.filename_empty),
-    INVALID_CHARACTER(R.string.file_name_validator_error_invalid_character),
-    RESERVED_NAME(R.string.file_name_validator_error_reserved_names),
-    ENDS_WITH_SPACE_OR_PERIOD(R.string.file_name_validator_error_ends_with_space_period)
-}

+ 10 - 7
app/src/main/java/com/nextcloud/utils/fileNameValidator/FileNameValidator.kt

@@ -7,10 +7,13 @@
 
 package com.nextcloud.utils.fileNameValidator
 
+import android.content.Context
 import android.text.TextUtils
+import com.owncloud.android.R
 
 object FileNameValidator {
     private val reservedWindowsChars = "[<>:\"/\\\\|?*]".toRegex()
+    private val reservedUnixChars = "[/<>|:&]".toRegex()
     private val reservedWindowsNames = listOf(
         "CON", "PRN", "AUX", "NUL",
         "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
@@ -18,23 +21,23 @@ object FileNameValidator {
         "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
         "LPT¹", "LPT²", "LPT³"
     )
-    private val reservedUnixChars = "[/<>|:&]".toRegex()
 
-    fun isValid(name: String): FileNameValidationResult? {
-        if (name.contains(reservedWindowsChars) || name.contains(reservedUnixChars)) {
-            return FileNameValidationResult.INVALID_CHARACTER
+    fun isValid(name: String, context: Context): String? {
+        val invalidCharacter = name.find { it.toString().matches(reservedWindowsChars) || it.toString().matches(reservedUnixChars) }
+        if (invalidCharacter != null) {
+            return context.getString(R.string.file_name_validator_error_invalid_character, invalidCharacter)
         }
 
         if (reservedWindowsNames.contains(name.uppercase())) {
-            return FileNameValidationResult.RESERVED_NAME
+            return context.getString(R.string.file_name_validator_error_reserved_names)
         }
 
         if (name.endsWith(" ") || name.endsWith(".")) {
-            return FileNameValidationResult.ENDS_WITH_SPACE_OR_PERIOD
+            return context.getString(R.string.file_name_validator_error_ends_with_space_period)
         }
 
         if (TextUtils.isEmpty(name)) {
-            return FileNameValidationResult.EMPTY
+            return context.getString(R.string.filename_empty)
         }
 
         return null

+ 9 - 8
app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt

@@ -221,12 +221,12 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
         val path = parentFolder?.remotePath + name
         val selectedTemplate = adapter?.selectedTemplate
 
-        val errorMessageId: Int? = FileNameValidator.isValid(name)?.messageId
+        val errorMessage = FileNameValidator.isValid(name, requireContext())
 
         if (selectedTemplate == null) {
             DisplayUtils.showSnackMessage(binding.list, R.string.select_one_template)
-        } else if (errorMessageId != null) {
-            DisplayUtils.showSnackMessage(requireActivity(), errorMessageId)
+        } else if (errorMessage != null) {
+            DisplayUtils.showSnackMessage(requireActivity(), errorMessage)
         } else if (name.equals(DOT + selectedTemplate.extension, ignoreCase = true)) {
             DisplayUtils.showSnackMessage(binding.list, R.string.enter_filename)
         } else if (!name.endsWith(selectedTemplate.extension)) {
@@ -245,12 +245,13 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
             DOT + selectedTemplate.extension,
             ignoreCase = true
         )
-        val errorMessageId: Int? = FileNameValidator.isValid(name)?.messageId
+        val errorMessage = FileNameValidator.isValid(name, requireContext())
+
         val error = when {
             name.isEmpty() || isNameJustExtension -> null
-            name[0] == '.' -> R.string.hidden_file_name_warning
-            errorMessageId != null -> errorMessageId
-            fileNames.contains(name) -> R.string.file_already_exists
+            name[0] == '.' -> getText(R.string.hidden_file_name_warning)
+            errorMessage != null -> errorMessage
+            fileNames.contains(name) -> getText(R.string.file_already_exists)
             else -> null
         }
 
@@ -258,7 +259,7 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
         positiveButton?.isClickable = (error == null)
         binding.filenameContainer.isErrorEnabled = (error != null)
         if (error != null) {
-            binding.filenameContainer.error = getText(error)
+            binding.filenameContainer.error = error
         }
     }
 

+ 8 - 8
app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.kt

@@ -117,18 +117,18 @@ class CreateFolderDialogFragment : DialogFragment(), DialogInterface.OnClickList
 
     private fun checkFileNameAfterEachType(fileNames: MutableSet<String>) {
         val newFileName = binding.userInput.text?.toString()?.trim() ?: ""
-        val errorMessageId: Int? = FileNameValidator.isValid(newFileName)?.messageId
+        val errorMessage: String? = FileNameValidator.isValid(newFileName, requireContext())
 
         val error = when {
             newFileName.isEmpty() -> null
-            newFileName[0] == '.' -> R.string.hidden_file_name_warning
-            errorMessageId != null -> errorMessageId
-            fileNames.contains(newFileName) -> R.string.file_already_exists
+            newFileName[0] == '.' -> getString(R.string.hidden_file_name_warning)
+            errorMessage != null -> errorMessage
+            fileNames.contains(newFileName) -> getString(R.string.file_already_exists)
             else -> null
         }
 
         if (error != null) {
-            binding.userInputContainer.error = getString(error)
+            binding.userInputContainer.error = error
             positiveButton?.isEnabled = false
             if (positiveButton == null) {
                 bindButton()
@@ -153,10 +153,10 @@ class CreateFolderDialogFragment : DialogFragment(), DialogInterface.OnClickList
             val newFolderName = (getDialog()?.findViewById<View>(R.id.user_input) as TextView)
                 .text.toString().trim { it <= ' ' }
 
-            val errorMessageId: Int? = FileNameValidator.isValid(newFolderName)?.messageId
+            val errorMessage: String? = FileNameValidator.isValid(newFolderName, requireContext())
 
-            if (errorMessageId != null) {
-                DisplayUtils.showSnackMessage(requireActivity(), errorMessageId)
+            if (errorMessage != null) {
+                DisplayUtils.showSnackMessage(requireActivity(), errorMessage)
                 return
             }
 

+ 6 - 8
app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -24,13 +24,11 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.common.collect.Sets;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.utils.extensions.BundleExtensionsKt;
-import com.nextcloud.utils.fileNameValidator.FileNameValidationResult;
 import com.nextcloud.utils.fileNameValidator.FileNameValidator;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.EditBoxDialogBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.lib.resources.files.FileUtils;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.KeyboardUtils;
@@ -161,9 +159,9 @@ public class RenameFileDialogFragment
                 newFileName = binding.userInput.getText().toString().trim();
             }
 
-            FileNameValidationResult fileNameValidationResult = FileNameValidator.INSTANCE.isValid(newFileName);
-            if (fileNameValidationResult != null) {
-                DisplayUtils.showSnackMessage(requireActivity(), fileNameValidationResult.getMessageId());
+            String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, requireContext());
+            if (errorMessage != null) {
+                DisplayUtils.showSnackMessage(requireActivity(), errorMessage);
                 return;
             }
 
@@ -195,12 +193,12 @@ public class RenameFileDialogFragment
             newFileName = binding.userInput.getText().toString().trim();
         }
 
-        FileNameValidationResult fileNameValidationResult = FileNameValidator.INSTANCE.isValid(newFileName);
+        String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, requireContext());
 
         if (!TextUtils.isEmpty(newFileName) && newFileName.charAt(0) == '.') {
             binding.userInputContainer.setError(getText(R.string.hidden_file_name_warning));
-        } else if (fileNameValidationResult != null) {
-            binding.userInputContainer.setError(getString(fileNameValidationResult.getMessageId()));
+        } else if (errorMessage != null) {
+            binding.userInputContainer.setError(errorMessage);
             positiveButton.setEnabled(false);
         } else if (fileNames.contains(newFileName)) {
             binding.userInputContainer.setError(getText(R.string.file_already_exists));

+ 1 - 1
app/src/main/res/values/strings.xml

@@ -1219,7 +1219,7 @@
     <string name="unified_search_fragment_contact_not_found">Contact not found, you can always sync to update. Redirecting to web…</string>
     <string name="unified_search_fragment_permission_needed">Permissions are required to open search result otherwise it will redirected to web…</string>
 
-    <string name="file_name_validator_error_invalid_character">File name contains invalid characters</string>
+    <string name="file_name_validator_error_invalid_character">File name contains invalid characters %s</string>
     <string name="file_name_validator_error_reserved_names">File name is a reserved name</string>
     <string name="file_name_validator_error_ends_with_space_period">File name ends with a space or a period</string>
 </resources>