/*****************************************************************************
* EqualizerFragment.java
*****************************************************************************
* Copyright © 2013 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
package org.videolan.vlc.gui.audio;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.LibVlcException;
import org.videolan.vlc.Util;
import org.videolan.vlc.VLCApplication;
import org.videolan.vlc.interfaces.OnEqualizerBarChangeListener;
import org.videolan.vlc.widget.EqualizerBar;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Spinner;
import android.widget.ToggleButton;
import com.actionbarsherlock.app.SherlockFragment;
import org.tribler.triblersvod.gui.R;
public class EqualizerFragment extends SherlockFragment {
public final static String TAG = "VLC/EqualizerFragment";
private ToggleButton button;
private Spinner equalizer_presets;
private SeekBar preamp;
private LinearLayout bands_layout;
LibVLC libVlc = null;
float[] equalizer = null;
/* All subclasses of Fragment must include a public empty constructor. */
public EqualizerFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
getSherlockActivity().getSupportActionBar().setTitle(getResources().getString(R.string.equalizer));
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.equalizer, container, false);
button = (ToggleButton) v.findViewById(R.id.equalizer_button);
equalizer_presets = (Spinner) v.findViewById(R.id.equalizer_presets);
preamp = (SeekBar) v.findViewById(R.id.equalizer_preamp);
bands_layout = (LinearLayout) v.findViewById(R.id.equalizer_bands);
// only allow scroll in the lower 50dp part of the layout (where frequencies are displayed)
HorizontalScrollView scroll = (HorizontalScrollView) v.findViewById(R.id.equalizer_scroll);
final float density = this.getResources().getDisplayMetrics().density;
scroll.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int delta = v.getHeight() - (int) event.getY();
return delta > 50 * density;
}
});
return v;
}
@Override
public void onResume() {
super.onResume();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(VLCApplication.getAppContext());
float[] bands = null;
String[] presets = null;
try {
libVlc = Util.getLibVlcInstance();
bands = libVlc.getBands();
presets = libVlc.getPresets();
if (equalizer == null)
equalizer = Util.getFloatArray(preferences, "equalizer_values");
if (equalizer == null)
equalizer = new float[bands.length + 1];
} catch (LibVlcException e) {
e.printStackTrace();
}
// on/off
button.setChecked(libVlc.getEqualizer() != null);
button.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (libVlc == null)
return;
libVlc.setEqualizer(isChecked ? equalizer : null);
}
});
// presets
equalizer_presets.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_dropdown_item, presets));
equalizer_presets.setSelection(preferences.getInt("equalizer_preset", 0), false);
// set listener asynchronously to prevent the listener from being fired during spinner init
equalizer_presets.post(new Runnable() {
@Override
public void run() {
equalizer_presets.setOnItemSelectedListener(mPresetListener);
}
});
// preamp
preamp.setMax(40);
preamp.setProgress((int) equalizer[0] + 20);
preamp.setOnSeekBarChangeListener(mPreampListener);
// bands
for (int i = 0; i < bands.length; i++) {
float band = bands[i];
EqualizerBar bar = new EqualizerBar(getActivity(), band);
bar.setValue(equalizer[i + 1]);
bar.setListener(new BandListener(i + 1));
bands_layout.addView(bar);
LayoutParams params = bar.getLayoutParams();
params.height = LayoutParams.MATCH_PARENT;
bar.setLayoutParams(params);
}
}
@Override
public void onPause() {
super.onPause();
button.setOnCheckedChangeListener(null);
equalizer_presets.setOnItemSelectedListener(null);
preamp.setOnSeekBarChangeListener(null);
bands_layout.removeAllViews();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(VLCApplication.getAppContext());
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("equalizer_enabled", button.isChecked());
Util.putFloatArray(editor, "equalizer_values", equalizer);
editor.putInt("equalizer_preset", equalizer_presets.getSelectedItemPosition());
editor.commit();
}
private final OnItemSelectedListener mPresetListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if (libVlc == null)
return;
float[] preset = libVlc.getPreset(pos);
if (preset == null)
return;
equalizer = preset;
preamp.setProgress((int) equalizer[0] + 20);
for (int i = 0; i < equalizer.length - 1; ++i) {
EqualizerBar bar = (EqualizerBar) bands_layout.getChildAt(i);
bar.setValue(equalizer[i + 1]);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
private final OnSeekBarChangeListener mPreampListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser)
return;
equalizer[0] = progress - 20;
if (libVlc != null && button.isChecked())
libVlc.setEqualizer(equalizer);
}
};
private class BandListener implements OnEqualizerBarChangeListener {
private int index;
public BandListener(int index) {
this.index = index;
}
@Override
public void onProgressChanged(float value) {
equalizer[index] = value;
if (libVlc != null && button.isChecked())
libVlc.setEqualizer(equalizer);
}
};
}