From 459b1bd6683def50b3c870923dbe718ae7aae72a Mon Sep 17 00:00:00 2001 From: h4h13 Date: Sun, 19 Apr 2020 00:14:24 +0530 Subject: [PATCH] Equalizer WIP --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 26 +- .../activities/EqualizerActivity.kt | 123 ++++++++ .../retromusic/equalizer/AudioEffects.java | 272 ++++++++++++++++++ .../equalizer/AudioEffectsReceiver.java | 27 ++ .../retromusic/equalizer/BasePresenter.java | 15 + .../retromusic/equalizer/FreqLevelItem.kt | 105 +++++++ .../retromusic/equalizer/MainContract.java | 24 ++ .../retromusic/equalizer/MainPresenter.java | 116 ++++++++ .../name/monkey/retromusic/model/Band.java | 29 ++ .../retromusic/service/PlaybackHandler.java | 2 +- .../retromusic/util/NavigationUtil.java | 4 +- .../main/res/layout/activity_equalizer.xml | 66 +++++ app/src/main/res/layout/dropdown_item.xml | 10 + app/src/main/res/layout/equalizer_slider.xml | 32 +++ app/src/main/res/layout/freq_level_item.xml | 27 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 12 +- .../appthemehelper/common/views/ATESwitch.kt | 22 +- 19 files changed, 880 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/model/Band.java create mode 100644 app/src/main/res/layout/activity_equalizer.xml create mode 100644 app/src/main/res/layout/dropdown_item.xml create mode 100644 app/src/main/res/layout/equalizer_slider.xml create mode 100644 app/src/main/res/layout/freq_level_item.xml 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 {