diff --git a/app/build.gradle b/app/build.gradle
index b1549caae..c1a1beb57 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -194,4 +194,4 @@ dependencies {
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation 'com.github.ologe:scroll-helper:1.1.5'
-}
\ No newline at end of file
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 888def0e7..95f43643c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,7 +17,6 @@
-
+
+
-
-
-
@@ -149,8 +147,6 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
-
-
-
-
-
+
+
+
+
+
+
-
-
-
@@ -266,4 +265,5 @@
android:name="com.android.vending.splits.required"
android:value="true" />
-
+
+
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt
new file mode 100644
index 000000000..ef2c34e48
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt
@@ -0,0 +1,123 @@
+package code.name.monkey.retromusic.activities
+
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.AdapterView.OnItemSelectedListener
+import android.widget.ArrayAdapter
+import code.name.monkey.appthemehelper.ThemeStore
+import code.name.monkey.appthemehelper.util.ATHUtil
+import code.name.monkey.appthemehelper.util.ColorUtil
+import code.name.monkey.appthemehelper.util.MaterialValueHelper
+import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
+import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
+import code.name.monkey.retromusic.equalizer.FreqLevelItem
+import code.name.monkey.retromusic.equalizer.MainContract
+import code.name.monkey.retromusic.equalizer.MainPresenter
+import code.name.monkey.retromusic.helper.MusicPlayerRemote
+import code.name.monkey.retromusic.model.Band
+import kotlinx.android.synthetic.main.activity_equalizer.*
+
+
+class EqualizerActivity : AbsMusicServiceActivity(), MainContract.View {
+
+ private lateinit var mainPresenter: MainPresenter
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_equalizer)
+ setStatusbarColorAuto()
+ setNavigationbarColorAuto()
+ setLightNavigationBar(true)
+
+ val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface)
+ toolbar.setBackgroundColor(toolbarColor)
+ ToolbarContentTintHelper.colorBackButton(toolbar)
+ setSupportActionBar(toolbar)
+
+ equalizerToggle.setOnCheckedChangeListener { _, isChecked ->
+ mainPresenter.effectOnOff(isChecked)
+ }
+
+ mainPresenter = MainPresenter(this)
+ mainPresenter.initEqualizer()
+
+ val accentColor = ThemeStore.accentColor(this)
+ val textColor = MaterialValueHelper.getPrimaryTextColor(
+ this,
+ ColorUtil.isColorLight(accentColor)
+ )
+ equalizerToggle.setBackgroundColor(accentColor)
+ equalizerToggle.setTextColor(textColor)
+
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mainPresenter.detachView()
+ }
+
+ override fun showEmptyView() {
+
+ }
+
+
+ override fun showBandInfo(bands: Array) {
+ bandList.removeAllViews()
+ for (i in bands.indices) {
+ val band = bands[i]
+ val freqLevelItem = FreqLevelItem(this, null, 0)
+ freqLevelItem.setLevelInfo(band)
+ freqLevelItem.id = i
+ bandList.addView(freqLevelItem, i)
+ }
+ }
+
+ override fun showPresetList(presetNames: Array?) {
+ val spinnerAdapter: ArrayAdapter<*> = ArrayAdapter(
+ this,
+ R.layout.dropdown_item,
+ presetNames!!
+ )
+ spinnerAdapter.setDropDownViewResource(R.layout.dropdown_item)
+ preset.adapter = spinnerAdapter
+ preset.onItemSelectedListener = object : OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?,
+ view: View?,
+ position: Int,
+ id: Long
+ ) {
+ Log.d("eq", "onItemSelected position $position, id $id")
+ mainPresenter.changePreset(position.toShort())
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+ Log.d("eq", "onNothingSelected")
+ }
+ }
+ }
+
+ override fun showBandLevel(levels: ShortArray) {
+ val count = bandList.childCount
+ for (i in 0 until count) {
+ val item: View = bandList.getChildAt(i)
+ if (item is FreqLevelItem) {
+ val freqLevelItem = item as FreqLevelItem
+ freqLevelItem.setBandLevel(levels[i])
+ }
+ }
+ }
+
+ override fun onServiceConnected() {
+ super.onServiceConnected()
+ mainPresenter.changeAudioSession(MusicPlayerRemote.audioSessionId)
+ }
+
+ override fun onPlayingMetaChanged() {
+ super.onPlayingMetaChanged()
+ mainPresenter.changeAudioSession(MusicPlayerRemote.audioSessionId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java
new file mode 100644
index 000000000..0ab7307e6
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java
@@ -0,0 +1,272 @@
+package code.name.monkey.retromusic.equalizer;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.media.audiofx.BassBoost;
+import android.media.audiofx.Equalizer;
+import android.util.Log;
+
+import code.name.monkey.retromusic.R;
+
+
+public class AudioEffects {
+
+ public static final short BASSBOOST_MAX_STRENGTH = 1000;
+ private static final String PREF_EQ_ENABLED = "enabled";
+ private static final String PREF_BAND_LEVEL = "level";
+ private static final String PREF_PRESET = "preset";
+ private static final String PREF_BASSBOOST = "bassboost";
+ private static final String AUDIO_EFFECTS_PREFS = "audioeffects";
+
+ private static final BassBoostValues sBassBoostValues = new BassBoostValues();
+ private static final EqualizerValues sEqualizerValues = new EqualizerValues();
+ private static BassBoost sBassBoost;
+ private static Equalizer sEqualizer;
+ private static boolean sCustomPreset;
+
+ public static void init(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE);
+
+ initBassBoostValues(prefs);
+ initEqualizerValues(prefs);
+ }
+
+
+ public static void openAudioEffectSession(Context context, int audioSessionId) {
+ SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE);
+
+ initBassBoost(audioSessionId);
+ initEqualizer(prefs, audioSessionId);
+ }
+
+ public static void closeAudioEffectSession() {
+ if (sBassBoost != null) {
+ sBassBoost.release();
+ sBassBoost = null;
+ }
+
+ if (sEqualizer != null) {
+ sEqualizer.release();
+ sEqualizer = null;
+ }
+ }
+
+ private static void initBassBoostValues(SharedPreferences prefs) {
+ sBassBoostValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false);
+ sBassBoostValues.strength = (short) prefs.getInt(PREF_BASSBOOST, 0);
+ }
+
+ private static void initBassBoost(int audioSessionId) {
+ if (sBassBoost != null) {
+ sBassBoost.release();
+ sBassBoost = null;
+ }
+ sBassBoost = new BassBoost(0, audioSessionId);
+ sBassBoost.setEnabled(sBassBoostValues.enabled);
+
+ short strength = sBassBoostValues.strength;
+
+ if (strength >= 0 && strength <= BASSBOOST_MAX_STRENGTH) {
+ sBassBoost.setStrength(strength);
+ }
+ }
+
+ private static void initEqualizerValues(SharedPreferences prefs) {
+
+
+ sEqualizerValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false);
+
+ sEqualizerValues.preset = (short) prefs.getInt(PREF_PRESET, -1);
+
+ if (sEqualizerValues.preset == -1) {
+ sCustomPreset = true;
+ }
+ }
+
+ private static void initEqualizer(SharedPreferences prefs, int audioSessionId) {
+
+ if (sEqualizer != null) {
+ sEqualizer.release();
+ sEqualizer = null;
+ }
+ sEqualizer = new Equalizer(0, audioSessionId);
+ sEqualizer.setEnabled(sEqualizerValues.enabled);
+
+ if (!sCustomPreset) {
+ usePreset(sEqualizerValues.preset);
+
+ }
+
+ sEqualizerValues.numberOfBands = sEqualizer.getNumberOfBands();
+
+
+ if (!sEqualizerValues.levelsSet) {
+ sEqualizerValues.bandLevels = new short[sEqualizerValues.numberOfBands];
+ }
+ for (short b = 0; b < sEqualizerValues.numberOfBands; b++) {
+ if (!sEqualizerValues.levelsSet) {
+ short level = (short) prefs.getInt(PREF_BAND_LEVEL + b, sEqualizer.getBandLevel(b));
+ sEqualizerValues.bandLevels[b] = level;
+ if (sCustomPreset) {
+
+ sEqualizer.setBandLevel(b, level);
+ }
+ } else {
+ sEqualizer.setBandLevel(b, sEqualizerValues.bandLevels[b]);
+ }
+ }
+
+ sEqualizerValues.levelsSet = true;
+
+
+ }
+
+ public static short getBassBoostStrength() {
+ return sBassBoostValues.strength;
+ }
+
+ public static void setBassBoostStrength(short strength) {
+ sBassBoostValues.strength = strength;
+ if (sBassBoost != null) {
+ sBassBoost.setStrength(strength);
+ }
+
+ }
+
+ public static short[] getBandLevelRange() {
+ if (sEqualizer == null) {
+ return null;
+ }
+ return sEqualizer.getBandLevelRange();
+ }
+
+ public static short getBandLevel(short band) {
+ if (sEqualizer == null) {
+ if (sEqualizerValues.levelsSet && sEqualizerValues.bandLevels.length > band) {
+ return sEqualizerValues.bandLevels[band];
+ }
+ }
+ Log.d("audiofx", "eeeD");
+ return sEqualizer.getBandLevel(band);
+ }
+
+ public static boolean areAudioEffectsEnabled() {
+ if (sEqualizer == null) {
+ return sEqualizerValues.enabled;
+ }
+ return sEqualizer.getEnabled();
+ }
+
+ public static void setAudioEffectsEnabled(boolean enabled) {
+ if (sEqualizer == null || sBassBoost == null) {
+ return;
+ }
+ sBassBoost.setEnabled(true);
+ sEqualizer.setEnabled(enabled);
+ }
+
+ public static void setBandLevel(short band, short level) {
+ sCustomPreset = true;
+
+ if (sEqualizerValues.bandLevels.length > band) {
+ sEqualizerValues.preset = -1;
+ sEqualizerValues.bandLevels[band] = level;
+ }
+
+ if (sEqualizer != null) {
+ sEqualizer.setBandLevel(band, level);
+ }
+ }
+
+ public static String[] getEqualizerPresets(Context context) {
+ if (sEqualizer == null) {
+ return new String[]{};
+ }
+ short numberOfPresets = sEqualizer.getNumberOfPresets();
+
+ String[] presets = new String[numberOfPresets + 1];
+
+ presets[0] = context.getResources().getString(R.string.custom);
+
+ for (short n = 0; n < numberOfPresets; n++) {
+ presets[n + 1] = sEqualizer.getPresetName(n);
+ }
+
+ return presets;
+ }
+
+ public static int getCurrentPreset() {
+ if (sEqualizer == null || sCustomPreset) {
+ return 0;
+ }
+
+ return sEqualizer.getCurrentPreset() + 1;
+ }
+
+ public static void usePreset(short preset) {
+ if (sEqualizer == null) {
+ return;
+ }
+ sCustomPreset = false;
+ sEqualizer.usePreset(preset);
+
+ }
+
+
+ public static short getNumberOfBands() {
+ if (sEqualizer == null) {
+ return 0;
+ }
+ return sEqualizer.getNumberOfBands();
+ }
+
+ public static int getCenterFreq(short band) {
+ if (sEqualizer == null) {
+ return 0;
+ }
+ return sEqualizer.getCenterFreq(band);
+ }
+
+ @SuppressLint("CommitPrefEdits")
+ public static void savePrefs(Context context) {
+ if (sEqualizer == null || sBassBoost == null) {
+ return;
+ }
+ SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = prefs.edit();
+
+ editor.putInt(PREF_BASSBOOST, sBassBoostValues.strength);
+
+ short preset = sCustomPreset ? -1 : sEqualizer.getCurrentPreset();
+ editor.putInt(PREF_PRESET, preset);
+
+
+ short bands = sEqualizer.getNumberOfBands();
+
+ for (short b = 0; b < bands; b++) {
+ short level = sEqualizer.getBandLevel(b);
+
+ editor.putInt(PREF_BAND_LEVEL + b, level);
+ }
+ editor.putBoolean(PREF_EQ_ENABLED,
+ sEqualizer.getEnabled());
+
+ editor.commit();
+ }
+
+ private static class BassBoostValues {
+ public boolean enabled;
+ public short strength;
+ }
+
+ private static class EqualizerValues {
+ public boolean enabled;
+ public short preset;
+ public short numberOfBands;
+ public short[] bandLevels;
+
+ public boolean levelsSet = false;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java
new file mode 100644
index 000000000..d7be8f6bd
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java
@@ -0,0 +1,27 @@
+package code.name.monkey.retromusic.equalizer;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class AudioEffectsReceiver extends BroadcastReceiver {
+
+ public static final String EXTRA_AUDIO_SESSION_ID = "org.oucho.musicplayer.EXTRA_AUDIO_SESSION_ID";
+
+ public static final String ACTION_OPEN_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.OPEN_AUDIO_EFFECT_SESSION";
+ public static final String ACTION_CLOSE_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.CLOSE_AUDIO_EFFECT_SESSION";
+
+ public AudioEffectsReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ int audioSessionId = intent.getIntExtra(EXTRA_AUDIO_SESSION_ID, 0);
+ if (ACTION_OPEN_AUDIO_EFFECT_SESSION.equals(action)) {
+ AudioEffects.openAudioEffectSession(context, audioSessionId);
+ } else if (ACTION_CLOSE_AUDIO_EFFECT_SESSION.equals(action)) {
+ AudioEffects.closeAudioEffectSession();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java
new file mode 100644
index 000000000..8b1a0a5d5
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java
@@ -0,0 +1,15 @@
+package code.name.monkey.retromusic.equalizer;
+
+import code.name.monkey.retromusic.mvp.BaseView;
+
+public class BasePresenter {
+ protected T mView;
+
+ final public void attachView(T view){
+ mView = view;
+ }
+
+ final public void detachView(){
+ mView = null;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt b/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt
new file mode 100644
index 000000000..852871db2
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt
@@ -0,0 +1,105 @@
+package code.name.monkey.retromusic.equalizer
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.SeekBar
+import android.widget.SeekBar.OnSeekBarChangeListener
+import android.widget.TextView
+import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.model.Band
+
+/**
+ * Created by 1100416 on 2018. 1. 11..
+ */
+class FreqLevelItem @JvmOverloads constructor(
+ context: Context?,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : LinearLayout(context, attrs, defStyleAttr) {
+ private var band: Band? = null
+ private var mSeekBar: SeekBar? = null
+ private var mCenterFreq: TextView? = null
+ private var mLevel: TextView? = null
+
+ interface OnBandLevelChangeListener {
+ fun onBandLevelChange(band: View?, level: Short)
+ fun onBandLevelChangeStop()
+ }
+
+ var mBandLevelChangeListener: OnBandLevelChangeListener? = null
+ private fun initView() {
+ val rootView =
+ LayoutInflater.from(context).inflate(R.layout.freq_level_item, this, false)
+ mCenterFreq = rootView.findViewById(R.id.centerFreq)
+
+ mLevel = rootView.findViewById(R.id.currentLevel)
+ mSeekBar = rootView.findViewById(R.id.seekBar)
+ mSeekBar?.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
+ override fun onProgressChanged(
+ seekBar: SeekBar,
+ i: Int,
+ b: Boolean
+ ) {
+ if (band != null) {
+ mLevel?.text = "${i + band!!.rangeMin}"
+ } else {
+ mLevel?.text = "$i"
+ }
+ if (mBandLevelChangeListener != null) {
+ mBandLevelChangeListener!!.onBandLevelChange(
+ this@FreqLevelItem,
+ (i + band!!.rangeMin).toShort()
+ )
+ }
+ }
+
+ override fun onStartTrackingTouch(seekBar: SeekBar) {}
+ override fun onStopTrackingTouch(seekBar: SeekBar) {
+ if (mBandLevelChangeListener != null) {
+ mBandLevelChangeListener!!.onBandLevelChangeStop()
+ }
+ }
+ })
+ addView(rootView)
+ }
+
+ fun setLevelInfo(band: Band?) {
+ this.band = band
+ mCenterFreq!!.text = displayNameOfHz(band!!.centerFreq)
+
+ mSeekBar!!.max = band.rangeMax - band.rangeMin
+ mSeekBar!!.progress = band.level - band.rangeMin
+ }
+
+ private fun displayNameOfHz(freq: Int): String {
+ var display = freq.toString() + "mHz"
+ when {
+ 1000 * 1000 * 1000 < freq -> {
+ display = String.format("%.1f", freq / 1000 / 1000f) + "MHz"
+ }
+ 1000 * 1000 < freq -> {
+ display = String.format("%.1f", freq / 1000 / 1000f) + "KHz"
+ }
+ 1000 < freq -> {
+ display = String.format("%d", freq / 1000) + "Hz"
+ }
+ }
+ return display
+ }
+
+ fun setBandLevel(level: Short) {
+ band!!.level = level
+ setLevelInfo(band)
+ }
+
+ fun setBandLevelChangeListener(listener: OnBandLevelChangeListener?) {
+ mBandLevelChangeListener = listener
+ }
+
+ init {
+ initView()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java
new file mode 100644
index 000000000..785e2764b
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java
@@ -0,0 +1,24 @@
+package code.name.monkey.retromusic.equalizer;
+
+import code.name.monkey.retromusic.model.Band;
+import code.name.monkey.retromusic.mvp.BaseView;
+
+public interface MainContract {
+ interface View extends BaseView {
+ void showBandInfo(Band[] bands);
+
+ void showPresetList(String[] presetNames);
+
+ void showBandLevel(short[] levels);
+ }
+
+ abstract class Presenter extends BasePresenter {
+ abstract void initEqualizer();
+
+ abstract void changePreset(short presetId);
+
+ abstract void changeAudioSession(int audioSession);
+
+ abstract public void effectOnOff(boolean effectOn);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java
new file mode 100644
index 000000000..22422bcef
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java
@@ -0,0 +1,116 @@
+package code.name.monkey.retromusic.equalizer;
+
+import android.media.audiofx.Equalizer;
+import android.util.Log;
+
+import code.name.monkey.retromusic.helper.MusicPlayerRemote;
+import code.name.monkey.retromusic.model.Band;
+
+
+/**
+ * Created by 1100416 on 2018. 1. 15..
+ */
+
+public class MainPresenter extends MainContract.Presenter {
+ private Equalizer mEqualizer;
+ private int mAudioSession = -1;
+ private boolean mEffectEnabled = false;
+
+ private short mPreset = 0;
+
+
+ public MainPresenter(MainContract.View view) {
+ attachView(view);
+ }
+
+ @Override
+ public void initEqualizer() {
+ initEqualizer(MusicPlayerRemote.INSTANCE.getAudioSessionId());
+ mAudioSession = 0;
+ displayEQStatus(mEqualizer);
+ }
+
+ @Override
+ public void changePreset(short presetId) {
+ mEqualizer.usePreset(presetId);
+ updateBandLevel(mEqualizer);
+ mPreset = presetId;
+ }
+
+ @Override
+ public void changeAudioSession(int audioSession) {
+ initEqualizer(audioSession);
+ mAudioSession = audioSession;
+ enableEqualisingEffect(mEffectEnabled);
+ }
+
+ @Override
+ public void effectOnOff(boolean effectOn) {
+ mEffectEnabled = effectOn;
+ enableEqualisingEffect(mEffectEnabled);
+ }
+
+
+ private void initEqualizer(int audioSession) {
+ if (mAudioSession != audioSession) {
+ try {
+ mEqualizer = new Equalizer(0, audioSession);
+ mEqualizer.usePreset(mPreset);
+ mEqualizer.setParameterListener(mEqualizerParameterChangeListener);
+ } catch (UnsupportedOperationException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void enableEqualisingEffect(boolean enable) {
+ if (mEqualizer != null) {
+ mEqualizer.setEnabled(enable);
+ }
+ }
+
+ private void displayEQStatus(Equalizer equalizer) {
+ if (mView != null && equalizer != null) {
+ int numOfPresets = equalizer.getNumberOfPresets();
+ String[] presetNames = new String[numOfPresets];
+
+ for (short p = 0; p < numOfPresets; p++) {
+ presetNames[p] = equalizer.getPresetName(p);
+ }
+ ((MainContract.View) mView).showPresetList(presetNames);
+
+ int numOfBands = mEqualizer.getNumberOfBands();
+ Band[] bands = new Band[numOfBands];
+ for (short i = 0; i < numOfBands; i++) {
+ int centerFreq = mEqualizer.getCenterFreq(i);
+ short bandLevel = mEqualizer.getBandLevel(i);
+ int freqRange[] = mEqualizer.getBandFreqRange(i);
+ short[] bandLevelRange = mEqualizer.getBandLevelRange();
+
+ Band band = new Band(centerFreq, bandLevel, freqRange, bandLevelRange[0], bandLevelRange[bandLevelRange.length - 1]);
+ bands[i] = band;
+ }
+ ((MainContract.View) mView).showBandInfo(bands);
+ }
+ }
+
+ private void updateBandLevel(Equalizer equalizer) {
+ if (equalizer != null) {
+ int numOfBands = equalizer.getNumberOfBands();
+ short[] bandLevels = new short[numOfBands];
+ for (short i = 0; i < numOfBands; i++) {
+ bandLevels[i] = equalizer.getBandLevel(i);
+ }
+
+ if (mView != null) {
+ ((MainContract.View) mView).showBandLevel(bandLevels);
+ }
+ }
+ }
+
+
+ private Equalizer.OnParameterChangeListener mEqualizerParameterChangeListener = (equalizer, i, i1, i2, i3) -> {
+ Log.d("eq", "onParameterChange : i " + i + ", i1 " + i1 + ", i2 " + i2 + ", i3 " + i3);
+ updateBandLevel(equalizer);
+ };
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Band.java b/app/src/main/java/code/name/monkey/retromusic/model/Band.java
new file mode 100644
index 000000000..1ccfde6d6
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/Band.java
@@ -0,0 +1,29 @@
+package code.name.monkey.retromusic.model;
+
+public class Band {
+ public final int centerFreq;
+ public short level;
+
+ private final int[] freqRange;
+ public final int freqLow;
+ public final int freqHigh;
+ public final short rangeMin;
+ public final short rangeMax;
+
+ public Band(int centerFreq, short level, int[] freqRange, short rangeMin, short rangeMax) {
+ this.centerFreq = centerFreq;
+ this.level = level;
+ this.freqRange = freqRange;
+
+ if (0 < freqRange.length) {
+ freqLow = freqRange[0];
+ freqHigh = freqRange[freqRange.length - 1];
+ } else {
+ freqLow = 0;
+ freqHigh = 0;
+ }
+
+ this.rangeMin = rangeMin;
+ this.rangeMax = rangeMax;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java
index 2fe34fbef..cb0455505 100644
--- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java
+++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java
@@ -168,4 +168,4 @@ class PlaybackHandler extends Handler {
break;
}
}
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java
index c6812aeb0..9e18d09ec 100755
--- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java
+++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java
@@ -32,6 +32,7 @@ import code.name.monkey.retromusic.activities.AboutActivity;
import code.name.monkey.retromusic.activities.AlbumDetailsActivity;
import code.name.monkey.retromusic.activities.ArtistDetailActivity;
import code.name.monkey.retromusic.activities.DriveModeActivity;
+import code.name.monkey.retromusic.activities.EqualizerActivity;
import code.name.monkey.retromusic.activities.GenreDetailsActivity;
import code.name.monkey.retromusic.activities.LicenseActivity;
import code.name.monkey.retromusic.activities.LyricsActivity;
@@ -39,7 +40,6 @@ import code.name.monkey.retromusic.activities.PlayingQueueActivity;
import code.name.monkey.retromusic.activities.PlaylistDetailActivity;
import code.name.monkey.retromusic.activities.PurchaseActivity;
import code.name.monkey.retromusic.activities.SearchActivity;
-import code.name.monkey.retromusic.activities.SettingsActivity;
import code.name.monkey.retromusic.activities.SupportDevelopmentActivity;
import code.name.monkey.retromusic.activities.UserInfoActivity;
import code.name.monkey.retromusic.activities.WhatsNewActivity;
@@ -139,7 +139,7 @@ public class NavigationUtil {
}
public static void goToSettings(@NonNull Activity activity) {
- ActivityCompat.startActivity(activity, new Intent(activity, SettingsActivity.class), null);
+ ActivityCompat.startActivity(activity, new Intent(activity, EqualizerActivity.class), null);
}
public static void goToSupportDevelopment(@NonNull Activity activity) {
diff --git a/app/src/main/res/layout/activity_equalizer.xml b/app/src/main/res/layout/activity_equalizer.xml
new file mode 100644
index 000000000..5ec86dc98
--- /dev/null
+++ b/app/src/main/res/layout/activity_equalizer.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dropdown_item.xml b/app/src/main/res/layout/dropdown_item.xml
new file mode 100644
index 000000000..15c4fa0de
--- /dev/null
+++ b/app/src/main/res/layout/dropdown_item.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/equalizer_slider.xml b/app/src/main/res/layout/equalizer_slider.xml
new file mode 100644
index 000000000..e4804fc17
--- /dev/null
+++ b/app/src/main/res/layout/equalizer_slider.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/freq_level_item.xml b/app/src/main/res/layout/freq_level_item.xml
new file mode 100644
index 000000000..71ac6596c
--- /dev/null
+++ b/app/src/main/res/layout/freq_level_item.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 126cc8ce1..287bfb656 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -844,5 +844,6 @@
Start payment
Show now playing screen
Clicking on the notification will show now playing screen instead of the home screen
+ Custom
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d63156045..c86606bd6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -2,15 +2,15 @@
-
-
-
@@ -211,4 +211,10 @@
- @color/md_white_1000
- @color/md_red_400
+
+
diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt
index 6bdff1f72..1aba187dd 100755
--- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt
+++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt
@@ -10,22 +10,14 @@ import code.name.monkey.appthemehelper.ThemeStore
/**
* @author Aidan Follestad (afollestad)
*/
-class ATESwitch : SwitchCompat {
+class ATESwitch @JvmOverloads constructor(
+ context: Context?,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : SwitchCompat(context, attrs, defStyleAttr) {
- constructor(context: Context) : super(context) {
- init(context)
- }
-
- constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
- init(context)
- }
-
- constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
- init(context)
- }
-
- private fun init(context: Context) {
- ATH.setTint(this, ThemeStore.accentColor(context))
+ init {
+ ATH.setTint(this, ThemeStore.accentColor(getContext()))
}
override fun isShown(): Boolean {