ActivityMusic.java revision 9c37307a1e0b59572fc474a77aeeb371477a3e8a
166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/*
266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Copyright (C) 2010-2011 The Android Open Source Project
366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * you may not use this file except in compliance with the License.
666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * You may obtain a copy of the License at
766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
1066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Unless required by applicable law or agreed to in writing, software
1166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
1266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * See the License for the specific language governing permissions and
1466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * limitations under the License.
1566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
1666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
1766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpackage com.android.musicfx;
1866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
19c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.audiofx.OpenSLESConstants;
20c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.musicfx.seekbar.SeekBar;
21c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.musicfx.seekbar.SeekBar.OnSeekBarChangeListener;
22c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
23709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.app.ActionBar;
2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Activity;
2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.AlertDialog;
2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Dialog;
2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothClass;
2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothDevice;
2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.BroadcastReceiver;
3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context;
3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface;
3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface.OnCancelListener;
3366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Intent;
3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.IntentFilter;
3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.AudioManager;
3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect;
3766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect.Descriptor;
3866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.os.Bundle;
3966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.util.Log;
4066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.Gravity;
4166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.LayoutInflater;
4266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.MotionEvent;
4366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View;
4466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View.OnClickListener;
4566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View.OnTouchListener;
4666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.ViewGroup;
47e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.AdapterView;
48e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.AdapterView.OnItemSelectedListener;
49e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.ArrayAdapter;
5066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.CompoundButton;
5166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener;
5266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.LinearLayout;
5366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.ListView;
5466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.RelativeLayout;
55e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.Spinner;
56709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.widget.Switch;
5766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.TextView;
5866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.Toast;
5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
60f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Formatter;
61f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Locale;
6266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/**
6466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ActivityMusic extends Activity implements OnSeekBarChangeListener {
6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String TAG = "MusicFXActivityMusic";
6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Max number of EQ bands supported
7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int EQUALIZER_MAX_BANDS = 32;
7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Virtualizer effect is supported.
7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mVirtualizerSupported;
7866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if BassBoost effect is supported.
8066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mBassBoostSupported;
8266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Equalizer effect is supported.
8466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mEqualizerSupported;
8666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Preset Reverb effect is supported.
8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mPresetReverbSupported;
9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
9166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Equalizer fields
9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS];
9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mNumberEqualizerBands;
9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEqualizerMinBandLevel;
9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetUserPos = 1;
9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPreset;
9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetPrevious;
9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int[] mEQPresetUserBandLevelsPrev;
99c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private String[] mEQPresetNames;
10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mPRPreset;
102e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private int mPRPresetPrevious;
10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mIsHeadsetOn = false;
105709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen    private CompoundButton mToggleSwitch;
10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
107f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private StringBuilder mFormatBuilder = new StringBuilder();
108f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
109f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
11066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
11166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Mapping for the EQ widget ids per band
11266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
11366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int[][] EQViewElementIds = {
114c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand0TextView, R.id.EQBand0SeekBar },
115c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand1TextView, R.id.EQBand1SeekBar },
116c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand2TextView, R.id.EQBand2SeekBar },
117c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand3TextView, R.id.EQBand3SeekBar },
118c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand4TextView, R.id.EQBand4SeekBar },
119c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand5TextView, R.id.EQBand5SeekBar },
120c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand6TextView, R.id.EQBand6SeekBar },
121c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand7TextView, R.id.EQBand7SeekBar },
122c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand8TextView, R.id.EQBand8SeekBar },
123c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand9TextView, R.id.EQBand9SeekBar },
124c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand10TextView, R.id.EQBand10SeekBar },
125c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand11TextView, R.id.EQBand11SeekBar },
126c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand12TextView, R.id.EQBand12SeekBar },
127c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand13TextView, R.id.EQBand13SeekBar },
128c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand14TextView, R.id.EQBand14SeekBar },
129c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand15TextView, R.id.EQBand15SeekBar },
130c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand16TextView, R.id.EQBand16SeekBar },
131c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand17TextView, R.id.EQBand17SeekBar },
132c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand18TextView, R.id.EQBand18SeekBar },
133c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand19TextView, R.id.EQBand19SeekBar },
134c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand20TextView, R.id.EQBand20SeekBar },
135c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand21TextView, R.id.EQBand21SeekBar },
136c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand22TextView, R.id.EQBand22SeekBar },
137c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand23TextView, R.id.EQBand23SeekBar },
138c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand24TextView, R.id.EQBand24SeekBar },
139c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand25TextView, R.id.EQBand25SeekBar },
140c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand26TextView, R.id.EQBand26SeekBar },
141c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand27TextView, R.id.EQBand27SeekBar },
142c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand28TextView, R.id.EQBand28SeekBar },
143c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand29TextView, R.id.EQBand29SeekBar },
144c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand30TextView, R.id.EQBand30SeekBar },
145c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand31TextView, R.id.EQBand31SeekBar } };
14666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
14766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Preset Reverb fields
14866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
14966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Array containing the PR preset names.
15066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
15166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final String[] PRESETREVERBPRESETSTRINGS = { "None", "SmallRoom", "MediumRoom",
15266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            "LargeRoom", "MediumHall", "LargeHall", "Plate" };
15366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
15466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
15566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Context field
15666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
15766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private Context mContext;
15866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
15966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Calling package name field
16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private String mCallingPackageName = "empty";
16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Audio session field
16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mAudioSession = AudioEffect.ERROR_BAD_VALUE;
16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Broadcast receiver to handle wired and Bluetooth A2dp headset events
17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        @Override
17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        public void onReceive(final Context context, final Intent intent) {
17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String action = intent.getAction();
17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isHeadsetOnPrev = mIsHeadsetOn;
17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1)
17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || audioManager.isBluetoothA2dpOn();
17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
18166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
18266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
18366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
18466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
18566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = true;
18666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
18766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
18866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn();
18966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
19066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
19166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
19266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
19366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
19466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
19566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = audioManager.isWiredHeadsetOn();
19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (isHeadsetOnPrev != mIsHeadsetOn) {
19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                updateUIHeadset();
20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    };
20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar
20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * onchange methods on creation.
20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.ActivityGroup#onCreate(android.os.Bundle)
21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onCreate(final Bundle savedInstanceState) {
21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onCreate(savedInstanceState);
21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Init context to be used in listeners
21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mContext = this;
21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Receive intent
22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // get calling intent
22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Intent intent = getIntent();
22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mAudioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION,
22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                AudioEffect.ERROR_BAD_VALUE);
22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "audio session: " + mAudioSession);
22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mCallingPackageName = getCallingPackage();
22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // check for errors
22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mCallingPackageName == null) {
23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "Package name is null");
23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            setResult(RESULT_CANCELED);
23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            finish();
23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setResult(RESULT_OK);
23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, mCallingPackageName + " (" + mAudioSession + ")");
23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.initEffectsPreferences(mContext, mCallingPackageName, mAudioSession);
24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // query available effects
24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Descriptor[] effects = AudioEffect.queryEffects();
24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Determine available/supported effects
24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Available effects:");
24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (final Descriptor effect : effects) {
24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, effect.name.toString() + ", type: " + effect.type.toString());
24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (effect.type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) {
25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mVirtualizerSupported = true;
25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) {
25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mBassBoostSupported = true;
25366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) {
25466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mEqualizerSupported = true;
25566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_PRESET_REVERB)) {
25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mPresetReverbSupported = true;
25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setContentView(R.layout.music_main);
26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.contentSoundEffects);
26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
263c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // Fill array with presets from AudioEffects call.
264c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // allocate a space for 2 extra strings (CI Extreme & User)
265c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int numPresets = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
266c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_presets);
267c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames = new String[numPresets + 2];
268c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short i = 0; i < numPresets; i++) {
269c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            mEQPresetNames[i] = ControlPanelEffect.getParameterString(mContext,
270c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                    mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_preset_name, i);
271c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
272c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets] = getString(R.string.ci_extreme);
273c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets + 1] = getString(R.string.user);
274c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetUserPos = numPresets + 1;
275c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
27666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Watch for button clicks and initialization.
27766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
27866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
27966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the listener for the main enhancements toggle button.
28066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Depending on the state enable the supported effects if they were
28166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // checked in the setup tab.
282709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch = new Switch(this);
283709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
28466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                @Override
28566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                public void onCheckedChanged(final CompoundButton buttonView,
28666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final boolean isChecked) {
28766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
28866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // set parameter and state
28966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
29066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mAudioSession, ControlPanelEffect.Key.global_enabled, isChecked);
29166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Enable Linear layout (in scroll layout) view with all
29266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect contents depending on checked state
29329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                    setEnabledAllChildren(viewGroup, isChecked);
29466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // update UI according to headset state
29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    updateUIHeadset();
29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            });
29866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Virtualizer elements.
30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
30166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mVirtualizerSupported) {
30266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.vILayout).setOnTouchListener(new OnTouchListener() {
30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
30784c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
30884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
30984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
31266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
31366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.vIStrengthSeekBar);
31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.VIRTUALIZER_MAX_STRENGTH
31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.VIRTUALIZER_MIN_STRENGTH);
31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
32666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
32766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.virt_strength, progress);
32866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, true);
33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, false);
34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Bass Boost elements.
35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mBassBoostSupported) {
35466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
35566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.bBLayout).setOnTouchListener(new OnTouchListener() {
35666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
35766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
35866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
35984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
36084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
36184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
36266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
36366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.bBStrengthSeekBar);
36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.BASSBOOST_MAX_STRENGTH
36866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.BASSBOOST_MIN_STRENGTH);
36966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
37066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
37166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
37266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
37366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
37466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
37566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
37666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
37766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.bb_strength, progress);
38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
38466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
38566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, true);
38866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
38966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
39066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
39366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
39466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
39566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
39666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
39766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, false);
39866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Equalizer elements.
40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mEqualizerSupported) {
406e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
407e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.eq_current_preset);
408e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (mEQPreset >= mEQPresetNames.length) {
409e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    mEQPreset = 0;
410e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
411e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = mEQPreset;
412e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner));
413e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerBandsInit(findViewById(R.id.eqcontainer));
41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Preset Reverb elements.
41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set Spinner listeners.
41866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mPresetReverbSupported) {
419e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
420e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.pr_current_preset);
421e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = mPRPreset;
422e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner));
42366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
42466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
42566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } else {
42666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            viewGroup.setVisibility(View.GONE);
42766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE);
42866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
42984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen
430709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ActionBar ab = getActionBar();
431709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        final int padding = getResources().getDimensionPixelSize(
432709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                R.dimen.action_bar_switch_padding);
433709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        mToggleSwitch.setPadding(0,0, padding, 0);
434709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ab.setCustomView(mToggleSwitch, new ActionBar.LayoutParams(
435709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                ActionBar.LayoutParams.WRAP_CONTENT,
436709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                ActionBar.LayoutParams.WRAP_CONTENT,
437709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                Gravity.CENTER_VERTICAL | Gravity.RIGHT));
438709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM);
43966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
44066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
44166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
44266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
44466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onResume()
44566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
44666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
44766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onResume() {
44866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onResume();
44966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
45066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
45166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Listen for broadcast intents that might affect the onscreen UI for headset.
45266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
45366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
45466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
45566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
45666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            registerReceiver(mReceiver, intentFilter);
45766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
45866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Check if wired or Bluetooth headset is connected/on
45966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
46066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn());
46166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn);
46266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
46366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Update UI
46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            updateUI();
46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
46866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onPause()
47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onPause() {
47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onPause();
47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Unregister for broadcast intents. (These affect the visible UI,
47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // so we only care about them while we're in the foreground.)
47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        unregisterReceiver(mReceiver);
48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
482e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void reverbSpinnerInit(Spinner spinner) {
483e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
484e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, PRESETREVERBPRESETSTRINGS);
485e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
486e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
487e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
488e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
489e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
490e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
491e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mPRPresetPrevious) {
492e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    presetReverbSetPreset(position);
49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
494e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = position;
495e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
497e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
498e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
499e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
500e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
501e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mPRPreset);
50266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
50366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
504e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerSpinnerInit(Spinner spinner) {
505e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
506e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, mEQPresetNames);
507e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
508e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
509e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
510e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
511e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
512e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
513e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mEQPresetPrevious) {
514e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    equalizerSetPreset(position);
515e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
516e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = position;
517743172011ae03fe3f82759750932c6220a3a50a6Marco Nelissen            }
518e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
519e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
520e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
521e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
522e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
523e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mEQPreset);
52466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
52566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
526e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
52766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
52829daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * En/disables all children for a given view. For linear and relative layout children do this
52966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * recursively
53066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
53129daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * @param viewGroup
53266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param enabled
53366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
53429daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen    private void setEnabledAllChildren(final ViewGroup viewGroup, final boolean enabled) {
53566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int count = viewGroup.getChildCount();
53666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int i = 0; i < count; i++) {
53766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final View view = viewGroup.getChildAt(i);
53866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if ((view instanceof LinearLayout) || (view instanceof RelativeLayout)) {
53966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final ViewGroup vg = (ViewGroup) view;
54029daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                setEnabledAllChildren(vg, enabled);
54166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
54266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            view.setEnabled(enabled);
54366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
54466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
54566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
54666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
54766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI (checkbox, seekbars, enabled states) according to the current stored preferences.
54866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
54966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUI() {
55066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final boolean isEnabled = ControlPanelEffect.getParameterBoolean(mContext,
55166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.global_enabled);
552709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        mToggleSwitch.setChecked(isEnabled);
55329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen        setEnabledAllChildren((ViewGroup) findViewById(R.id.contentSoundEffects), isEnabled);
55466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        updateUIHeadset();
55566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
55666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mVirtualizerSupported) {
55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setProgress(ControlPanelEffect
55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
55966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.Key.virt_strength));
56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
56166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mBassBoostSupported) {
56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setProgress(ControlPanelEffect
56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
56466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.Key.bb_strength));
56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mEqualizerSupported) {
56784c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            equalizerUpdateDisplay();
56866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mPresetReverbSupported) {
570e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            int reverb = ControlPanelEffect.getParameterInt(
57166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mContext, mCallingPackageName, mAudioSession,
572e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                                    ControlPanelEffect.Key.pr_current_preset);
573e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            ((Spinner)findViewById(R.id.prSpinner)).setSelection(reverb);
57466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
57666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
57766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
57866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI for headset mode. En/disable VI and BB controls depending on headset state
57966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (on/off) if effects are on. Do the inverse for their layouts so they can take over
58066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * control/events.
58166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
58266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUIHeadset() {
583709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        if (mToggleSwitch.isChecked()) {
58466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.vIStrengthText)).setEnabled(mIsHeadsetOn);
58566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled(mIsHeadsetOn);
58666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn);
58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn);
58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn);
58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn);
59066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
59166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
59266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
59466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Initializes the equalizer elements. Set the SeekBars and Spinner listeners.
59566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
596e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerBandsInit(View eqcontainer) {
59766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Initialize the N-Band Equalizer elements.
59866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mNumberEqualizerBands = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
59966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_bands);
60066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mEQPresetUserBandLevelsPrev = ControlPanelEffect.getParameterIntArray(mContext,
60166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession,
60266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_preset_user_band_level);
60366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] centerFreqs = ControlPanelEffect.getParameterIntArray(mContext,
60466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_center_freq);
60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevelRange = ControlPanelEffect.getParameterIntArray(mContext,
60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_level_range);
60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mEqualizerMinBandLevel = bandLevelRange[0];
60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int mEqualizerMaxBandLevel = bandLevelRange[1];
60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
61066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = 0; band < mNumberEqualizerBands; band++) {
61166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Unit conversion from mHz to Hz and use k prefix if necessary to display
61266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int centerFreq = centerFreqs[band] / 1000;
61366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            float centerFreqHz = centerFreq;
61466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            String unitPrefix = "";
61566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (centerFreqHz >= 1000) {
61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                centerFreqHz = centerFreqHz / 1000;
61766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                unitPrefix = "k";
61866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
61984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            ((TextView) eqcontainer.findViewById(EQViewElementIds[band][0])).setText(
620f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen                    format("%.0f ", centerFreqHz) + unitPrefix + "Hz");
62184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            mEqualizerSeekBar[band] = (SeekBar) eqcontainer
62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .findViewById(EQViewElementIds[band][1]);
62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setMax(mEqualizerMaxBandLevel - mEqualizerMinBandLevel);
62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setOnSeekBarChangeListener(this);
62566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Hide the inactive Equalizer bands.
62866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = mNumberEqualizerBands; band < EQUALIZER_MAX_BANDS; band++) {
62966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // CenterFreq text
63084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][0]).setVisibility(View.GONE);
63166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // SeekBar
63284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][1]).setVisibility(View.GONE);
63366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
634c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
635c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // TODO: get the actual values from somewhere
636c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        TextView tv = (TextView) findViewById(R.id.maxLevelText);
637c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("+15 dB");
638c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.centerLevelText);
639c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("0 dB");
640c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.minLevelText);
641c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("-15 dB");
64284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen        equalizerUpdateDisplay();
64366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
645f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private String format(String format, Object... args) {
646f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatBuilder.setLength(0);
647f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatter.format(format, args);
648f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        return mFormatBuilder.toString();
649f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    }
650f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * For the EQ Band SeekBars
65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
65466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
65566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android
65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar, int, boolean)
65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
65966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
66166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onProgressChanged(final SeekBar seekbar, final int progress, final boolean fromUser) {
66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int id = seekbar.getId();
66366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
66466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
66566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (id == EQViewElementIds[band][1]) {
66666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short level = (short) (progress + mEqualizerMinBandLevel);
66766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (fromUser) {
66866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerBandUpdate(band, level);
66966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
67066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
67166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
67466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
67566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
67666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
67766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
67866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStartTrackingTouch(android
67966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
68166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
68366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStartTrackingTouch(final SeekBar seekbar) {
684c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // get current levels
685c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
686c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
687c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // copy current levels to user preset
688c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
689c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            equalizerBandUpdate(band, bandLevels[band]);
690c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
691c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerSetPreset(mEQPresetUserPos);
6929c37307a1e0b59572fc474a77aeeb371477a3e8aMarco Nelissen        ((Spinner)findViewById(R.id.eqSpinner)).setSelection(mEQPresetUserPos);
69366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
69466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
69566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
69666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ display when the user stops changing.
69766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
69866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStopTrackingTouch(android
70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStopTrackingTouch(final SeekBar seekbar) {
70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        equalizerUpdateDisplay();
70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ by getting the parameters.
71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void equalizerUpdateDisplay() {
71366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Update and show the active N-Band Equalizer bands.
71466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
71566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
71666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
71766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int level = bandLevels[band];
71866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int progress = level - mEqualizerMinBandLevel;
71966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setProgress(progress);
72066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
72166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates/sets a given EQ band level.
72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param band
72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            Band id
72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param level
72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ band level
73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
731c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerBandUpdate(final int band, final int level) {
73266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
73366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_band_level, level, band);
73466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
73566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
73666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
73766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given EQ preset.
73866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
73966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
74066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ preset id.
74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
742c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerSetPreset(final int preset) {
74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_current_preset, preset);
745c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerUpdateDisplay();
74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given PR preset.
75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            PR preset id.
75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
754e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void presetReverbSetPreset(final int preset) {
75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.pr_current_preset, preset);
75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
76066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Show msg that headset needs to be plugged.
76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void showHeadsetMsg() {
76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Context context = getApplicationContext();
76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int duration = Toast.LENGTH_SHORT;
76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Toast toast = Toast.makeText(context, getString(R.string.headset_plug), duration);
76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2, toast.getYOffset() / 2);
76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.show();
76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
771