Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,16 @@
android:value=".activity.MainActivity" />
</activity>

<activity
android:name=".activity.ParametricEqualizerActivity"
android:exported="false"
android:label="@string/title_activity_peq"
android:theme="@style/Theme.RootlessJamesDSP">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.MainActivity" />
</activity>

<activity
android:name=".activity.GraphicEqualizerActivity"
android:exported="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.timschneeberger.rootlessjamesdsp.activity

import android.os.Bundle
import me.timschneeberger.rootlessjamesdsp.R
import me.timschneeberger.rootlessjamesdsp.databinding.ActivityParametricEqBinding
import me.timschneeberger.rootlessjamesdsp.fragment.ParametricEqualizerFragment

class ParametricEqualizerActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityParametricEqBinding.inflate(layoutInflater)

setContentView(binding.root)
setSupportActionBar(binding.toolbar)

if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.params, ParametricEqualizerFragment.newInstance())
.commit()
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.toolbar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package me.timschneeberger.rootlessjamesdsp.adapter

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.databinding.ObservableArrayList
import androidx.databinding.ObservableList
import androidx.recyclerview.widget.RecyclerView
import me.timschneeberger.rootlessjamesdsp.R
import me.timschneeberger.rootlessjamesdsp.model.ParametricEqBand
import me.timschneeberger.rootlessjamesdsp.model.ParametricEqBandList
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.*

class ParametricEqBandAdapter(var bands: ParametricEqBandList) :
RecyclerView.Adapter<ParametricEqBandAdapter.ViewHolder>() {

private val dfFreq = DecimalFormat("0", DecimalFormatSymbols.getInstance())
private val dfGain = DecimalFormat("0", DecimalFormatSymbols.getInstance())
private val dfQ = DecimalFormat("0", DecimalFormatSymbols.getInstance())

init {
dfFreq.maximumFractionDigits = 1
dfGain.maximumFractionDigits = 2
dfQ.maximumFractionDigits = 2
}

var onItemsChanged: ((ParametricEqBandAdapter) -> Unit)? = null
var onItemClicked: ((ParametricEqBand, Int) -> Unit)? = null

private val callback = object : ObservableList.OnListChangedCallback<ObservableArrayList<ParametricEqBand>>() {
@SuppressLint("NotifyDataSetChanged")
override fun onChanged(sender: ObservableArrayList<ParametricEqBand>?) {
this@ParametricEqBandAdapter.notifyDataSetChanged()
onItemsChanged()
}

override fun onItemRangeChanged(
sender: ObservableArrayList<ParametricEqBand>?,
positionStart: Int,
itemCount: Int,
) {
this@ParametricEqBandAdapter.notifyItemRangeChanged(positionStart, itemCount)
onItemsChanged()
}

override fun onItemRangeInserted(
sender: ObservableArrayList<ParametricEqBand>?,
positionStart: Int,
itemCount: Int,
) {
this@ParametricEqBandAdapter.notifyItemRangeInserted(positionStart, itemCount)
onItemsChanged()
}

@SuppressLint("NotifyDataSetChanged")
override fun onItemRangeMoved(
sender: ObservableArrayList<ParametricEqBand>?,
fromPosition: Int,
toPosition: Int,
itemCount: Int,
) {
this@ParametricEqBandAdapter.notifyDataSetChanged()
onItemsChanged()
}

override fun onItemRangeRemoved(
sender: ObservableArrayList<ParametricEqBand>?,
positionStart: Int,
itemCount: Int,
) {
this@ParametricEqBandAdapter.notifyItemRangeRemoved(positionStart, itemCount)
onItemsChanged()
}
}

private fun onItemsChanged() {
this.onItemsChanged?.invoke(this)
}

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val filterType: TextView = view.findViewById(R.id.filter_type)
val freq: TextView = view.findViewById(R.id.freq)
val gain: TextView = view.findViewById(R.id.gain)
val qFactor: TextView = view.findViewById(R.id.q_factor)
val deleteButton: Button = view.findViewById(R.id.delete)
}

override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
bands.addOnListChangedCallback(callback)
super.onAttachedToRecyclerView(recyclerView)
}

override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
bands.removeOnListChangedCallback(callback)
super.onDetachedFromRecyclerView(recyclerView)
}

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.item_peq_band_list, viewGroup, false)
return ViewHolder(view)
}

@SuppressLint("SetTextI18n")
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
viewHolder.deleteButton.isEnabled = true

val band = bands[position]
viewHolder.filterType.text = band.filterType.displayLabel
viewHolder.freq.text = "${dfFreq.format(band.frequency)}Hz"
viewHolder.gain.text = "${dfGain.format(band.gain)}dB"
viewHolder.qFactor.text = "Q${dfQ.format(band.q)}"

viewHolder.deleteButton.setOnClickListener {
viewHolder.bindingAdapterPosition.let { pos ->
if (pos >= 0) {
bands.removeAt(pos)
}
}
viewHolder.deleteButton.isEnabled = false
}

viewHolder.itemView.setOnClickListener {
viewHolder.bindingAdapterPosition.let { pos ->
bands.getOrNull(pos)?.let {
onItemClicked?.invoke(it, pos)
}
}
}
}

override fun getItemCount() = bands.size
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ class DspFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeListen
R.id.card_eq, PreferenceGroupFragment.newInstance(Constants.PREF_EQ,
R.xml.dsp_equalizer_preferences
))
.replace(
R.id.card_peq, PreferenceGroupFragment.newInstance(Constants.PREF_PEQ,
R.xml.dsp_parametriceq_preferences
))
.replace(
R.id.card_geq, PreferenceGroupFragment.newInstance(Constants.PREF_GEQ,
R.xml.dsp_graphiceq_preferences
Expand Down
Loading