[Android] New equalizer: fine tune the UI refresh on data change

Nicolas Pomepuy git at videolan.org
Fri Jul 25 11:46:42 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Thu Jun 12 08:48:18 2025 +0200| [2b464322381d4221092448ed3ca1151e97664ffa] | committer: Nicolas Pomepuy

New equalizer: fine tune the UI refresh on data change

> https://code.videolan.org/videolan/vlc-android/commit/2b464322381d4221092448ed3ca1151e97664ffa
---

 .../vlc/gui/dialogs/EqualizerFragmentDialog.kt     | 47 ++++++++++++++++------
 1 file changed, 34 insertions(+), 13 deletions(-)

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 594bc63306..04c02dab89 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
@@ -55,6 +55,7 @@ import org.videolan.vlc.databinding.DialogEqualizerBinding
 import org.videolan.vlc.gui.view.EqualizerBar
 import org.videolan.vlc.interfaces.OnEqualizerBarChangeListener
 import org.videolan.vlc.mediadb.models.EqualizerBand
+import org.videolan.vlc.mediadb.models.EqualizerWithBands
 import org.videolan.vlc.repository.EqualizerRepository
 import org.videolan.vlc.viewmodels.EqualizerViewModel
 import org.videolan.vlc.viewmodels.EqualizerViewModelFactory
@@ -74,8 +75,9 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     private lateinit var binding: DialogEqualizerBinding
     private val state = EqualizerState()
 
-    private var customCount = 0
     private val eqBandsViews = ArrayList<EqualizerBar>()
+    var oldEqualiserSets = listOf<String>()
+    var oldCurrentEqualizer: EqualizerWithBands? = null
 
     override fun getDefaultState(): Int {
         return STATE_EXPANDED
@@ -97,7 +99,19 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         viewModel.equalizerEntries.observe(this) {
-            fillViews()
+            val newEqualizerSets = it.map { it.equalizerEntry.name }
+
+            if (oldEqualiserSets != newEqualizerSets) fillPresets()
+            if (oldCurrentEqualizer?.equalizerEntry?.preamp != viewModel.getCurrentEqualizer().equalizerEntry.preamp) {
+                fillPreamp()
+            }
+
+            if (oldCurrentEqualizer == null || oldCurrentEqualizer?.equalizerEntry?.id != viewModel.getCurrentEqualizer().equalizerEntry.id) {
+                fillBands()
+            }
+            if (oldCurrentEqualizer == null) fillViews()
+            oldEqualiserSets = newEqualizerSets
+            oldCurrentEqualizer = viewModel.getCurrentEqualizer()
         }
     }
 
@@ -124,10 +138,6 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             viewModel.updateEqualizer()
         }
 
-        // preamp
-        binding.equalizerPreamp.value = viewModel.getCurrentEqualizer().equalizerEntry.preamp.roundToInt().toFloat()
-        binding.equalizerPreamp.addOnChangeListener(this at EqualizerFragmentDialog)
-
         binding.undo.setOnClickListener {
             viewModel.undoFromHistory(requireActivity())
             updateBars()
@@ -137,8 +147,17 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
         binding.edit.setOnClickListener {
                 viewModel.createCustomEqualizer(requireActivity())
         }
+        updateEnabledState()
+
+    }
 
+    private fun fillPreamp() {
+        // preamp
+        binding.equalizerPreamp.value = viewModel.getCurrentEqualizer().equalizerEntry.preamp.roundToInt().toFloat()
+        binding.equalizerPreamp.addOnChangeListener(this at EqualizerFragmentDialog)
+    }
 
+    private fun fillPresets() {
         var selectedChip: Chip? = null
         binding.equalizerPresets.removeAllViews()
         viewModel.equalizerEntries.value?.forEachIndexed { index, item ->
@@ -151,6 +170,9 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             chip.setOnClickListener {
                 viewModel.currentEqualizerId = it.tag as Long
                 selectPreset()
+                fillPreamp()
+                fillBands()
+                oldCurrentEqualizer = viewModel.getCurrentEqualizer()
             }
             binding.equalizerPresets.addView(chip)
         }
@@ -159,10 +181,6 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             selectPreset()
             binding.equalizerPresetsContainer.scrollTo(selectedChip!!.left, selectedChip!!.top)
         }
-
-        fillBands()
-        updateEnabledState()
-
     }
 
     /**
@@ -174,7 +192,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
         binding.equalizerBands.removeAllViews()
         // bands
         val currentEqualizer = viewModel.getCurrentEqualizer()
-        currentEqualizer.bands.forEach { band ->
+        currentEqualizer.bands.sortedBy { it.index }.forEach { band ->
             val bandFrequency = MediaPlayer.Equalizer.getBandFrequency(band.index)
             val bar = EqualizerBar(requireContext(), bandFrequency)
             bar.setValue(band.bandValue)
@@ -314,14 +332,16 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     private inner class BandListener(private val index: Int) : OnEqualizerBarChangeListener {
 
         private var oldBands: MutableList<Int> = ArrayList()
+        private var newBandList = ArrayList<EqualizerBand>()
 
 
         override fun onProgressChanged(value: Float, fromUser: Boolean) {
+            if (BuildConfig.DEBUG) Log.d(TAG, "onProgressChanged $index, $value, $fromUser")
             if (!fromUser)
                 return
             viewModel.saveInHistory(index)
 
-            val newBandList = ArrayList<EqualizerBand>()
+            newBandList = ArrayList<EqualizerBand>()
             newBandList.add(viewModel.getCurrentEqualizer().bands.first { it.index ==  index}.copy(bandValue = value))
             if (!binding.equalizerButton.isChecked)
                 binding.equalizerButton.isChecked = true
@@ -351,7 +371,6 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
                 if (newBandList.firstOrNull { it.index == oldBand.index } == null)
                     newBandList.add(oldBand)
             }
-            viewModel.updateEqualizerBands(requireActivity(), newBandList)
 
             if (binding.equalizerButton.isChecked) viewModel.updateEqualizer()
         }
@@ -365,6 +384,8 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
 
         override fun onStopTrackingTouch() {
             oldBands.clear()
+            viewModel.updateEqualizerBands(requireActivity(), newBandList)
+            if (BuildConfig.DEBUG) Log.d(TAG, "onStopTrackingTouch $index")
         }
     }
 



More information about the Android mailing list