package com.airplayer.fragment.child; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.media.audiofx.BassBoost; import android.media.audiofx.Equalizer; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.SeekBar; import android.widget.Spinner; import com.airplayer.R; import com.airplayer.activity.AirMainActivity; import java.util.ArrayList; /** * Created by ZiyiTsang on 15/8/11. */ public class EqualizerFragment extends ChildFragment { private static final String TAG = EqualizerFragment.class.getSimpleName(); private Spinner spinner; private SeekBar[] bandSeekBars = new SeekBar[5]; private SeekBar seekBarBassBoost; private Equalizer mEqualizer; private BassBoost mBassBoost; //===== sharedPreferences ===== public static final String EQUALIZER_GENRES = "equalizer_genres"; public static final String EQUALIZER_USER_BAND = "equalizer_user_band"; public static final String BASS_BOOST = "bass_boost"; private SharedPreferences sp; private HeadsetPlugReceiver receiver; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); AirMainActivity activity = ((AirMainActivity) getActivity()); mEqualizer = activity.getPlayerControlBinder().getEqualizer(); mBassBoost = activity.getPlayerControlBinder().getBassBoost(); sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); //===== receiver ===== receiver = new HeadsetPlugReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); activity.registerReceiver(receiver, filter); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_equalizer, container, false); // ===== spinner ===== spinner = (Spinner) rootView.findViewById(R.id.equalizer_spinner); ArrayList<String> presets = getPresets(); ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<> (getActivity(), android.R.layout.simple_dropdown_item_1line, presets); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); spinner.setAdapter(spinnerAdapter); spinner.setSelection(sp.getInt(EQUALIZER_GENRES, 0)); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { sp.edit().putInt(EQUALIZER_GENRES, position).apply(); short presetPosition = (short) position; if (mEqualizer == null) return; if (presetPosition < mEqualizer.getNumberOfPresets()) { mEqualizer.usePreset(presetPosition); updateBandSeekBarProgress(); } else { for (int i = 0; i < mEqualizer.getNumberOfBands(); i++) { bandSeekBars[i].setProgress(sp.getInt(EQUALIZER_USER_BAND + i, 0) + 1500); } } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // ===== seek bars ===== // ----- band seek bars ----- if (mEqualizer != null) { setupBandSeekBar(rootView); } // ----- bass booster ----- if (mBassBoost != null) { setupBassBoostSeekBar(rootView); } return rootView; } @Override public void onResume() { super.onResume(); TabLayout tabLayout = ((AirMainActivity) getActivity()).getTabLayout(); tabLayout.setVisibility(View.GONE); } @Override public void onDestroy() { getActivity().unregisterReceiver(receiver); super.onDestroy(); } private ArrayList<String> getPresets() { ArrayList<String> presets = new ArrayList<>(); if (mEqualizer == null) return new ArrayList<>(); short presetsNum = mEqualizer.getNumberOfPresets(); for (short i = 0; i < presetsNum + 1; i++) { if (i == presetsNum) { presets.add("User"); } else { presets.add(mEqualizer.getPresetName(i)); } } return presets; } private void setupBandSeekBar(View rootView) { bandSeekBars[0] = (SeekBar) rootView.findViewById(R.id.seek_bar_60hz); bandSeekBars[1] = (SeekBar) rootView.findViewById(R.id.seek_bar_230hz); bandSeekBars[2] = (SeekBar) rootView.findViewById(R.id.seek_bar_910hz); bandSeekBars[3] = (SeekBar) rootView.findViewById(R.id.seek_bar_4khz); bandSeekBars[4] = (SeekBar) rootView.findViewById(R.id.seek_bar_14khz); for (short i = 0; i < mEqualizer.getNumberOfBands(); i++) { final short bandNum = i; bandSeekBars[i].setMax(3000); bandSeekBars[i].setProgress(mEqualizer.getBandLevel(bandNum) + 1500); bandSeekBars[i].setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int userBandLevel = progress - 1500; if (mEqualizer == null) return; mEqualizer.setBandLevel(bandNum, (short) userBandLevel); if (fromUser) { spinner.setSelection(mEqualizer.getNumberOfPresets()); sp.edit().putInt(EQUALIZER_USER_BAND + bandNum, userBandLevel).apply(); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } } private void setupBassBoostSeekBar(View rootView) { seekBarBassBoost = (SeekBar) rootView.findViewById(R.id.seek_bar_bass_boost); seekBarBassBoost.setMax(1000); seekBarBassBoost.setProgress(mBassBoost.getRoundedStrength()); seekBarBassBoost.setEnabled(mBassBoost.getEnabled()); seekBarBassBoost.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mBassBoost == null) return; mBassBoost.setStrength((short)progress); sp.edit().putInt(BASS_BOOST, progress).apply(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void updateBandSeekBarProgress() { if (mEqualizer == null) return; for (short i = 0; i < mEqualizer.getNumberOfBands(); i++) { bandSeekBars[i].setProgress(mEqualizer.getBandLevel(i) + 1500); } } private class HeadsetPlugReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { if (intent.getIntExtra("state", -1) == 0) { seekBarBassBoost.setEnabled(false); } else { seekBarBassBoost.setEnabled(true); } } } } }