[Android] New equalizer: implement the title edit
Nicolas Pomepuy
git at videolan.org
Fri Jul 25 11:46:43 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Tue Jun 17 08:07:51 2025 +0200| [32cfd726de193648629352ed98e549cef9429bc8] | committer: Nicolas Pomepuy
New equalizer: implement the title edit
> https://code.videolan.org/videolan/vlc-android/commit/32cfd726de193648629352ed98e549cef9429bc8
---
.../resources/src/main/res/values/strings.xml | 1 +
.../vlc/gui/dialogs/EqualizerFragmentDialog.kt | 19 ++++++++++++++++++-
.../videolan/vlc/viewmodels/EqualizerViewModel.kt | 22 ++++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index abfc093ae8..da62d324b7 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/application/resources/src/main/res/values/strings.xml
@@ -1147,6 +1147,7 @@
<string name="remove_from_playlist">Remove from playlist</string>
<string name="play_media">Play %s</string>
<string name="edit_eq_preset">Edit equalizer preset</string>
+ <string name="edit_eq_name_not_allowed">This name is not allowed</string>
<!-- Duplication Warning Dialog -->
<string name="message_primary_default">Add duplicated item(s)?</string>
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
index 255e661e51..16bddc14d5 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
@@ -25,6 +25,8 @@ package org.videolan.vlc.gui.dialogs
import android.animation.LayoutTransition
import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater
import android.view.View
@@ -167,6 +169,20 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
binding.edit.setOnClickListener {
viewModel.createCustomEqualizer(requireActivity())
}
+
+ binding.presetTitleEdit.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+ if (s.toString() == viewModel.getCurrentEqualizer().equalizerEntry.name) return
+ if (!viewModel.isNameAllowed(s.toString())) {
+ binding.presetTitleEdit.error = getString(R.string.edit_eq_name_not_allowed)
+ } else {
+ viewModel.updateEqualizerName(requireActivity(), s.toString())
+ binding.presetTitleEdit.error = null
+ }
+ }
+ override fun afterTextChanged(s: Editable?) { }
+ })
updateEnabledState()
}
@@ -191,6 +207,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
viewModel.clearHistory()
binding.undo.isEnabled = false
viewModel.currentEqualizerId = it.tag as Long
+ binding.presetTitleEdit.clearFocus()
fillPreamp()
fillBands()
selectPreset()
@@ -259,7 +276,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
*/
fun selectPreset() {
updateEqualizer()
- binding.name = viewModel.getCurrentEqualizer().equalizerEntry.name
+ if (!binding.presetTitleEdit.hasFocus()) binding.name = viewModel.getCurrentEqualizer().equalizerEntry.name
binding.custom = getEqualizerType() == TYPE_CUSTOM
val selectedChip = binding.equalizerPresets.findViewWithTag<Chip>(viewModel.getCurrentEqualizer().equalizerEntry.id)
binding.equalizerPresets.check(selectedChip.id)
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
index dcbb509e9a..314c75b4bb 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
@@ -134,6 +134,28 @@ class EqualizerViewModel(context: Context, private val equalizerRepository: Equa
presetToDelete = null
}
}
+
+ /**
+ * Is name allowed
+ *
+ * @param name the name to check
+ * @return true if name is not empty and not already used
+ */
+ fun isNameAllowed(name: String): Boolean {
+ return name.isNotBlank() && !equalizerEntries.value!!.any { it.equalizerEntry.name == name }
+ }
+
+ /**
+ * Update equalizer name
+ *
+ * @param context the context
+ * @param name the new name
+ */
+ fun updateEqualizerName(context: Context, name: String) = viewModelScope.launch(Dispatchers.IO) {
+ val currentEqualizer = getCurrentEqualizer()
+ val newEq = currentEqualizer.copy(equalizerEntry = currentEqualizer.equalizerEntry.copy(name = name).apply { id = currentEqualizer.equalizerEntry.id })
+ equalizerRepository.addOrUpdateEqualizerWithBands(context, newEq)
+ }
}
class EqualizerViewModelFactory(private val context: Context, private val repository: EqualizerRepository) : ViewModelProvider.Factory {
More information about the Android
mailing list