diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt index 6fd4e3743..9a4af93df 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt @@ -152,7 +152,7 @@ class BookmarksPrefsFragment : BasePrefsFragment() { path: String, ): Pair { return when { - name.isEmpty() -> Pair(false, R.string.invalid_name) + name.isEmpty() || path.isEmpty() -> Pair(false, R.string.invalid_name) dataUtils.containsBooks(arrayOf(name, path)) != -1 -> Pair(false, R.string.bookmark_exists) !FileUtils.isPathAccessible(path, activity.prefs) -> Pair(false, R.string.ftp_path_change_error_invalid) else -> Pair(true, 0) @@ -190,6 +190,17 @@ class BookmarksPrefsFragment : BasePrefsFragment() { .setOnClickListener { val oldName = p.title.toString() val oldPath = p.summary.toString() + + val result = isValidBookmark(editText1.text.toString(), editText2.text.toString()) + if (!result.first) { + Toast.makeText( + requireContext(), + requireContext().getString(result.second), + Toast.LENGTH_SHORT, + ).show() + return@setOnClickListener + } + dataUtils.removeBook(position[p]!!) position.remove(p) bookmarksList?.removePreference(p) diff --git a/app/src/main/java/com/amaze/filemanager/utils/DataUtils.java b/app/src/main/java/com/amaze/filemanager/utils/DataUtils.java index f610e12e3..5fe3fdce3 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/DataUtils.java +++ b/app/src/main/java/com/amaze/filemanager/utils/DataUtils.java @@ -284,20 +284,25 @@ public class DataUtils { clear(); } - int contains(String a, ArrayList b) { + /** + * Searches pair list of {@code {name, path}} pairs for an entry that matches the given pair by + * either name or path. An entry is considered pair match when its name (index 0) equals + * {@code pair[0]} or its path (index 1) equals {@code pair[1]}. + * + *

Both should be unique since we cannot have two items with the same name. But this prevents + * two bookmarks / servers pointing to the same path with different names. + * + * @param pair the {@code {name, path}} pair to search for + * @param list the list to search; each element is expected to be pair two-element {@code {name, + * path}} array. May be {@code null}. + * @return the index of the first matching entry, or {@code -1} if {@code list} is {@code null} or + * no entry matches + */ + int contains(String[] pair, ArrayList list) { + if (list == null) return -1; int i = 0; - for (String[] x : b) { - if (x[1].equals(a)) return i; - i++; - } - return -1; - } - - int contains(String[] a, ArrayList b) { - if (b == null) return -1; - int i = 0; - for (String[] x : b) { - if (x[0].equals(a[0]) && x[1].equals(a[1])) return i; + for (String[] item : list) { + if (item[0].equals(pair[0]) || item[1].equals(pair[1])) return i; i++; } return -1;