[Android] New equalizer: improve the history management

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


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Jun 11 06:34:18 2025 +0200| [8d72bc6cdf350d62158962dad7ee1d39bc60e5c9] | committer: Nicolas Pomepuy

New equalizer: improve the history management

> https://code.videolan.org/videolan/vlc-android/commit/8d72bc6cdf350d62158962dad7ee1d39bc60e5c9
---

 .../vlc/gui/dialogs/EqualizerFragmentDialog.kt     | 50 +++++++++++-----------
 .../videolan/vlc/viewmodels/EqualizerViewModel.kt  | 14 +++---
 2 files changed, 33 insertions(+), 31 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 700c42f3f8..a04a4dbf19 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
@@ -34,6 +34,7 @@ import androidx.databinding.ObservableBoolean
 import androidx.databinding.ObservableField
 import androidx.databinding.ObservableInt
 import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.lifecycleScope
 import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
 import com.google.android.material.chip.Chip
@@ -81,9 +82,6 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             return presets.toTypedArray()
         }
 
-    private lateinit var equalizer: MediaPlayer.Equalizer
-
-
     override fun getDefaultState(): Int {
         return STATE_EXPANDED
     }
@@ -103,11 +101,15 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-
     }
 
     override fun onResume() {
-        equalizer = VLCOptions.getEqualizerSetFromSettings(requireActivity(), true)!!
+        viewModel.equalizer = MutableLiveData(VLCOptions.getEqualizerSetFromSettings(requireActivity(), true)!!)
+        viewModel.equalizer.observe(this) {
+            var pos = getCurrentPosition()
+            if (pos < 0) return at observe
+            VLCOptions.saveCustomSet(requireActivity(), it, binding.presetTitleEdit.text.toString())
+        }
         lifecycleScope.launch {
             if (viewModel.bandCount == -1) viewModel.bandCount = withContext(Dispatchers.IO) {
                 VLCInstance.getInstance(requireContext())
@@ -149,21 +151,17 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
         // on/off
         binding.equalizerButton.isChecked = VLCOptions.getEqualizerEnabledState(requireActivity())
         binding.equalizerButton.setOnCheckedChangeListener { _, isChecked ->
-            viewModel.setEqualizer(if (isChecked) equalizer else null)
+            viewModel.updateEqualizer(if (isChecked) viewModel.equalizer.value else null)
             updateEnabledState()
         }
 
         // preamp
-        binding.equalizerPreamp.value = equalizer.preAmp.roundToInt().toFloat()
+        binding.equalizerPreamp.value = viewModel.equalizer.value!!.preAmp.roundToInt().toFloat()
         binding.equalizerPreamp.addOnChangeListener(this at EqualizerFragmentDialog)
 
         binding.undo.setOnClickListener {
-            viewModel.getAndRemoveLastFromHistory()?.let {
-                equalizer = it
-                viewModel.setEqualizer(equalizer)
-                updateBars()
-            }
-
+            viewModel.undoFromHistory()
+            updateBars()
         }
 
         var selectedChip: Chip? = null
@@ -205,7 +203,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             val band = MediaPlayer.Equalizer.getBandFrequency(i)
 
             val bar = EqualizerBar(requireContext(), band)
-            bar.setValue(equalizer.getAmp(i))
+            bar.setValue(viewModel.equalizer.value!!.getAmp(i))
 
             binding.equalizerBands.addView(bar)
 
@@ -260,12 +258,12 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     fun updateEqualizer(pos: Int) = lifecycleScope.launch(start = CoroutineStart.UNDISPATCHED) {
         when {
             getEqualizerType(pos) == TYPE_PRESET -> {
-                equalizer = MediaPlayer.Equalizer.createFromPreset(pos - customCount)
+                viewModel.equalizer.value = MediaPlayer.Equalizer.createFromPreset(pos - customCount)
                 state.update(pos, true)
             }
 
             getEqualizerType(pos) == TYPE_CUSTOM -> {
-                equalizer = VLCOptions.getCustomSet(requireActivity(), allSets[pos])!!
+                viewModel.equalizer.value = VLCOptions.getCustomSet(requireActivity(), allSets[pos])!!
                 state.update(pos, true)
             }
         }
@@ -274,7 +272,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
             MediaPlayer.Equalizer.getBandCount()
         }
         updateBars()
-        if (binding.equalizerButton.isChecked) viewModel.setEqualizer(equalizer)
+        if (binding.equalizerButton.isChecked) viewModel.updateEqualizer(viewModel.equalizer.value)
     }
 
     /**
@@ -284,10 +282,10 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     private fun updateBars() {
         if (!isStarted()) return
 
-        binding.equalizerPreamp.value = equalizer.preAmp.roundToInt().toFloat()
+        binding.equalizerPreamp.value = viewModel.equalizer.value!!.preAmp.roundToInt().toFloat()
         for (i in 0 until viewModel.bandCount) {
             val bar = binding.equalizerBands.getChildAt(i) as EqualizerBar
-            bar.setValue(equalizer.getAmp(i))
+            bar.setValue(viewModel.equalizer.value!!.getAmp(i))
         }
     }
 
@@ -316,9 +314,9 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
 
     override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
         if (!fromUser) return
-        viewModel.saveInHistory(equalizer, -1)
-        equalizer.preAmp = binding.equalizerPreamp.value
-        if (binding.equalizerButton.isChecked) viewModel.setEqualizer(equalizer)
+        viewModel.saveInHistory(viewModel.equalizer.value!!, -1)
+        viewModel.equalizer.value!!.preAmp = binding.equalizerPreamp.value
+        if (binding.equalizerButton.isChecked) viewModel.updateEqualizer(viewModel.equalizer.value)
     }
 
 
@@ -371,8 +369,8 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
         override fun onProgressChanged(value: Float, fromUser: Boolean) {
             if (!fromUser)
                 return
-            viewModel.saveInHistory(equalizer, index)
-            equalizer.setAmp(index, value)
+            viewModel.saveInHistory(viewModel.equalizer.value!!, index)
+            viewModel.equalizer.value!!.setAmp(index, value)
             if (!binding.equalizerButton.isChecked)
                 binding.equalizerButton.isChecked = true
 
@@ -396,13 +394,13 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
 
                     if (binding.equalizerButton.isChecked) {
 
-                        equalizer.setAmp(i, eqBandsViews[i].getValue())
+                        viewModel.equalizer.value!!.setAmp(i, eqBandsViews[i].getValue())
                     }
 
                 }
             }
 
-            if (binding.equalizerButton.isChecked) viewModel.setEqualizer(equalizer)
+            if (binding.equalizerButton.isChecked) viewModel.updateEqualizer(viewModel.equalizer.value)
         }
 
         override fun onStartTrackingTouch() {
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 275d4b1549..38d57ff945 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
@@ -24,6 +24,8 @@
 
 package org.videolan.vlc.viewmodels
 
+import android.content.Context
+import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import org.videolan.libvlc.MediaPlayer
 import org.videolan.vlc.PlaybackService
@@ -32,13 +34,14 @@ import org.videolan.vlc.PlaybackService
  * View model storing data for the equalizer dialog
  *
  */
-class EqualizerViewModel : ViewModel() {
+class EqualizerViewModel(context: Context) : ViewModel() {
     private val history = ArrayList<MediaPlayer.Equalizer>()
     var bandCount = -1
     var lastSaveToHistoryFrom = -2
+    lateinit var equalizer: MutableLiveData<MediaPlayer.Equalizer>
 
 
-    fun setEqualizer(equalizer: MediaPlayer.Equalizer?) {
+    fun updateEqualizer(equalizer: MediaPlayer.Equalizer?) {
         PlaybackService.equalizer.value = equalizer
     }
 
@@ -57,6 +60,7 @@ class EqualizerViewModel : ViewModel() {
         if (from != lastSaveToHistoryFrom)
             history.add(mediaPlayerEqualizer)
         lastSaveToHistoryFrom = from
+        this.equalizer.postValue(equalizer)
     }
 
     /**
@@ -64,9 +68,9 @@ class EqualizerViewModel : ViewModel() {
      *
      * @return the last equalizer from history
      */
-    fun getAndRemoveLastFromHistory(): MediaPlayer.Equalizer? {
+    fun undoFromHistory() {
         lastSaveToHistoryFrom = -2
-        if (history.isEmpty()) return null
-        return history.removeAt(history.lastIndex)
+        if (history.isEmpty()) return
+        equalizer.value = history.removeAt(history.lastIndex)
     }
 }
\ No newline at end of file



More information about the Android mailing list