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;
621c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissenimport java.util.UUID;
6366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/**
6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ActivityMusic extends Activity implements OnSeekBarChangeListener {
6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String TAG = "MusicFXActivityMusic";
6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Max number of EQ bands supported
7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int EQUALIZER_MAX_BANDS = 32;
7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Virtualizer effect is supported.
7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mVirtualizerSupported;
791c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen    private boolean mVirtualizerIsHeadphoneOnly;
8066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if BassBoost effect is supported.
8266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mBassBoostSupported;
8466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Equalizer effect is supported.
8666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mEqualizerSupported;
8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Preset Reverb effect is supported.
9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mPresetReverbSupported;
9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Equalizer fields
9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS];
9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mNumberEqualizerBands;
9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEqualizerMinBandLevel;
9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetUserPos = 1;
9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPreset;
9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetPrevious;
10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int[] mEQPresetUserBandLevelsPrev;
101c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private String[] mEQPresetNames;
10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mPRPreset;
104e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private int mPRPresetPrevious;
10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mIsHeadsetOn = false;
107709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen    private CompoundButton mToggleSwitch;
10866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
109f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private StringBuilder mFormatBuilder = new StringBuilder();
110f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
111f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
11266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
11366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Mapping for the EQ widget ids per band
11466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
11566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int[][] EQViewElementIds = {
116c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand0TextView, R.id.EQBand0SeekBar },
117c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand1TextView, R.id.EQBand1SeekBar },
118c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand2TextView, R.id.EQBand2SeekBar },
119c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand3TextView, R.id.EQBand3SeekBar },
120c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand4TextView, R.id.EQBand4SeekBar },
121c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand5TextView, R.id.EQBand5SeekBar },
122c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand6TextView, R.id.EQBand6SeekBar },
123c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand7TextView, R.id.EQBand7SeekBar },
124c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand8TextView, R.id.EQBand8SeekBar },
125c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand9TextView, R.id.EQBand9SeekBar },
126c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand10TextView, R.id.EQBand10SeekBar },
127c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand11TextView, R.id.EQBand11SeekBar },
128c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand12TextView, R.id.EQBand12SeekBar },
129c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand13TextView, R.id.EQBand13SeekBar },
130c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand14TextView, R.id.EQBand14SeekBar },
131c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand15TextView, R.id.EQBand15SeekBar },
132c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand16TextView, R.id.EQBand16SeekBar },
133c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand17TextView, R.id.EQBand17SeekBar },
134c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand18TextView, R.id.EQBand18SeekBar },
135c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand19TextView, R.id.EQBand19SeekBar },
136c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand20TextView, R.id.EQBand20SeekBar },
137c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand21TextView, R.id.EQBand21SeekBar },
138c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand22TextView, R.id.EQBand22SeekBar },
139c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand23TextView, R.id.EQBand23SeekBar },
140c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand24TextView, R.id.EQBand24SeekBar },
141c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand25TextView, R.id.EQBand25SeekBar },
142c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand26TextView, R.id.EQBand26SeekBar },
143c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand27TextView, R.id.EQBand27SeekBar },
144c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand28TextView, R.id.EQBand28SeekBar },
145c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand29TextView, R.id.EQBand29SeekBar },
146c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand30TextView, R.id.EQBand30SeekBar },
147c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand31TextView, R.id.EQBand31SeekBar } };
14866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
14966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Preset Reverb fields
15066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
15166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Array containing the PR preset names.
15266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
15366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final String[] PRESETREVERBPRESETSTRINGS = { "None", "SmallRoom", "MediumRoom",
15466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            "LargeRoom", "MediumHall", "LargeHall", "Plate" };
15566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
15666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
15766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Context field
15866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
15966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private Context mContext;
16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Calling package name field
16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private String mCallingPackageName = "empty";
16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Audio session field
16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mAudioSession = AudioEffect.ERROR_BAD_VALUE;
17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Broadcast receiver to handle wired and Bluetooth A2dp headset events
17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        @Override
17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        public void onReceive(final Context context, final Intent intent) {
17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String action = intent.getAction();
17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isHeadsetOnPrev = mIsHeadsetOn;
17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1)
18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || audioManager.isBluetoothA2dpOn();
18166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
18266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
18366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
18466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
18566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
18666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
18766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = true;
18866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
18966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
19066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn();
19166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
19266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
19366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
19466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
19566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = audioManager.isWiredHeadsetOn();
19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (isHeadsetOnPrev != mIsHeadsetOn) {
20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                updateUIHeadset();
20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    };
20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar
20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * onchange methods on creation.
20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.ActivityGroup#onCreate(android.os.Bundle)
21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onCreate(final Bundle savedInstanceState) {
21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onCreate(savedInstanceState);
21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Init context to be used in listeners
21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mContext = this;
22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Receive intent
22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // get calling intent
22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Intent intent = getIntent();
22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mAudioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION,
22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                AudioEffect.ERROR_BAD_VALUE);
22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "audio session: " + mAudioSession);
22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mCallingPackageName = getCallingPackage();
22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // check for errors
23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mCallingPackageName == null) {
23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "Package name is null");
23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            setResult(RESULT_CANCELED);
23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            finish();
23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setResult(RESULT_OK);
23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, mCallingPackageName + " (" + mAudioSession + ")");
24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.initEffectsPreferences(mContext, mCallingPackageName, mAudioSession);
24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // query available effects
24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Descriptor[] effects = AudioEffect.queryEffects();
24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Determine available/supported effects
24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Available effects:");
24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (final Descriptor effect : effects) {
24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, effect.name.toString() + ", type: " + effect.type.toString());
25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (effect.type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) {
25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mVirtualizerSupported = true;
2531c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                if (effect.uuid.equals(UUID.fromString("1d4033c0-8557-11df-9f2d-0002a5d5c51b"))) {
2541c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                    mVirtualizerIsHeadphoneOnly = true;
2551c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                }
25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) {
25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mBassBoostSupported = true;
25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) {
25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mEqualizerSupported = true;
26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_PRESET_REVERB)) {
26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mPresetReverbSupported = true;
26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
26366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
26566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setContentView(R.layout.music_main);
26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.contentSoundEffects);
26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
268c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // Fill array with presets from AudioEffects call.
269c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // allocate a space for 2 extra strings (CI Extreme & User)
270c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int numPresets = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
271c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_presets);
272c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames = new String[numPresets + 2];
273c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short i = 0; i < numPresets; i++) {
274c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            mEQPresetNames[i] = ControlPanelEffect.getParameterString(mContext,
275c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                    mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_preset_name, i);
276c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
277c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets] = getString(R.string.ci_extreme);
278c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets + 1] = getString(R.string.user);
279c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetUserPos = numPresets + 1;
280c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
28166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Watch for button clicks and initialization.
28266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
28366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
28466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the listener for the main enhancements toggle button.
28566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Depending on the state enable the supported effects if they were
28666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // checked in the setup tab.
287709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch = new Switch(this);
288709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
28966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                @Override
29066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                public void onCheckedChanged(final CompoundButton buttonView,
29166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final boolean isChecked) {
29266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
29366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // set parameter and state
29466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mAudioSession, ControlPanelEffect.Key.global_enabled, isChecked);
29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Enable Linear layout (in scroll layout) view with all
29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect contents depending on checked state
29829daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                    setEnabledAllChildren(viewGroup, isChecked);
29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // update UI according to headset state
30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    updateUIHeadset();
30166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
30266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            });
30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Virtualizer elements.
30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mVirtualizerSupported) {
30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.vILayout).setOnTouchListener(new OnTouchListener() {
30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
31284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
31384c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
31484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.vIStrengthSeekBar);
32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.VIRTUALIZER_MAX_STRENGTH
32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.VIRTUALIZER_MIN_STRENGTH);
32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
32666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
32866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.virt_strength, progress);
33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, true);
34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, false);
35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
354bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen
355bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final Switch sw = (Switch) findViewById(R.id.vIStrengthToggle);
356bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setOnCheckedChangeListener(new OnCheckedChangeListener() {
357bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    @Override
358bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    public void onCheckedChanged(final CompoundButton buttonView,
359bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            final boolean isChecked) {
360bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
361bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                                mAudioSession, ControlPanelEffect.Key.virt_enabled, isChecked);
362bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    }
363bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                });
36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Bass Boost elements.
36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
36866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mBassBoostSupported) {
36966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
37066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.bBLayout).setOnTouchListener(new OnTouchListener() {
37166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
37266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
37366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
37484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
37584c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
37684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
37766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.bBStrengthSeekBar);
38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.BASSBOOST_MAX_STRENGTH
38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.BASSBOOST_MIN_STRENGTH);
38466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
38866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
39066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
39366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
39466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.bb_strength, progress);
39566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
39666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
39766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
39866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, true);
40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, false);
41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
41866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Equalizer elements.
42066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mEqualizerSupported) {
421e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
422e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.eq_current_preset);
423e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (mEQPreset >= mEQPresetNames.length) {
424e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    mEQPreset = 0;
425e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
426e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = mEQPreset;
427e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner));
428e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerBandsInit(findViewById(R.id.eqcontainer));
42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
43066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Preset Reverb elements.
43266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set Spinner listeners.
43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mPresetReverbSupported) {
434e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
435e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.pr_current_preset);
436e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = mPRPreset;
437e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner));
43866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
43966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
44066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } else {
44166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            viewGroup.setVisibility(View.GONE);
44266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE);
44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
44484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen
445709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ActionBar ab = getActionBar();
446709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        final int padding = getResources().getDimensionPixelSize(
447709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                R.dimen.action_bar_switch_padding);
448709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        mToggleSwitch.setPadding(0,0, padding, 0);
449709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ab.setCustomView(mToggleSwitch, new ActionBar.LayoutParams(
450709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                ActionBar.LayoutParams.WRAP_CONTENT,
451709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                ActionBar.LayoutParams.WRAP_CONTENT,
452709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen                Gravity.CENTER_VERTICAL | Gravity.RIGHT));
453709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM);
45466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
45566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
45666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
45766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
45866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
45966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onResume()
46066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
46166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
46266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onResume() {
46366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onResume();
46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Listen for broadcast intents that might affect the onscreen UI for headset.
46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
46866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            registerReceiver(mReceiver, intentFilter);
47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Check if wired or Bluetooth headset is connected/on
47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn());
47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn);
47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Update UI
47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            updateUI();
48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onPause()
48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onPause() {
49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onPause();
49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Unregister for broadcast intents. (These affect the visible UI,
49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // so we only care about them while we're in the foreground.)
49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        unregisterReceiver(mReceiver);
49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
497e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void reverbSpinnerInit(Spinner spinner) {
498e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
499e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, PRESETREVERBPRESETSTRINGS);
500e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
501e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
502e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
503e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
504e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
505e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
506e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mPRPresetPrevious) {
507e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    presetReverbSetPreset(position);
50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
509e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = position;
510e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
51166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
512e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
513e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
514e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
515e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
516e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mPRPreset);
51766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
51866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
519e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerSpinnerInit(Spinner spinner) {
520e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
521e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, mEQPresetNames);
522e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
523e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
524e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
525e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
526e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
527e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
528e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mEQPresetPrevious) {
529e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    equalizerSetPreset(position);
530e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
531e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = position;
532743172011ae03fe3f82759750932c6220a3a50a6Marco Nelissen            }
533e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
534e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
535e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
536e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
537e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
538e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mEQPreset);
53966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
54066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
541e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
54266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
54329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * En/disables all children for a given view. For linear and relative layout children do this
54466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * recursively
54566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
54629daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * @param viewGroup
54766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param enabled
54866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
54929daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen    private void setEnabledAllChildren(final ViewGroup viewGroup, final boolean enabled) {
55066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int count = viewGroup.getChildCount();
55166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int i = 0; i < count; i++) {
55266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final View view = viewGroup.getChildAt(i);
55366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if ((view instanceof LinearLayout) || (view instanceof RelativeLayout)) {
55466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final ViewGroup vg = (ViewGroup) view;
55529daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                setEnabledAllChildren(vg, enabled);
55666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            view.setEnabled(enabled);
55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
55966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI (checkbox, seekbars, enabled states) according to the current stored preferences.
56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
56466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUI() {
56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final boolean isEnabled = ControlPanelEffect.getParameterBoolean(mContext,
56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.global_enabled);
567709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        mToggleSwitch.setChecked(isEnabled);
56829daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen        setEnabledAllChildren((ViewGroup) findViewById(R.id.contentSoundEffects), isEnabled);
56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        updateUIHeadset();
57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
57166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mVirtualizerSupported) {
572bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            SeekBar bar = (SeekBar) findViewById(R.id.vIStrengthSeekBar);
573bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            Switch sw = (Switch) findViewById(R.id.vIStrengthToggle);
574bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            int strength = ControlPanelEffect
57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
576bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            ControlPanelEffect.Key.virt_strength);
577bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            bar.setProgress(strength);
578bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            boolean hasStrength = ControlPanelEffect.getParameterBoolean(mContext,
579bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    mCallingPackageName, mAudioSession,
580bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    ControlPanelEffect.Key.virt_strength_supported);
581bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            if (hasStrength) {
582bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setVisibility(View.GONE);
583bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            } else {
584bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                bar.setVisibility(View.GONE);
585bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setChecked(sw.isEnabled() && strength != 0);
586bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            }
58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mBassBoostSupported) {
58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setProgress(ControlPanelEffect
59066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
59166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.Key.bb_strength));
59266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mEqualizerSupported) {
59484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            equalizerUpdateDisplay();
59566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
59666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mPresetReverbSupported) {
597e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            int reverb = ControlPanelEffect.getParameterInt(
59866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mContext, mCallingPackageName, mAudioSession,
599e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                                    ControlPanelEffect.Key.pr_current_preset);
600e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            ((Spinner)findViewById(R.id.prSpinner)).setSelection(reverb);
60166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
60266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
60366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
60466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI for headset mode. En/disable VI and BB controls depending on headset state
60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (on/off) if effects are on. Do the inverse for their layouts so they can take over
60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * control/events.
60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUIHeadset() {
610709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        if (mToggleSwitch.isChecked()) {
6111c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            ((TextView) findViewById(R.id.vIStrengthText)).setEnabled(
6121c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                    mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
6131c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled(
6141c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                    mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
6151c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn);
61766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn);
61866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn);
61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Initializes the equalizer elements. Set the SeekBars and Spinner listeners.
62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
625e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerBandsInit(View eqcontainer) {
62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Initialize the N-Band Equalizer elements.
62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mNumberEqualizerBands = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
62866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_bands);
62966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mEQPresetUserBandLevelsPrev = ControlPanelEffect.getParameterIntArray(mContext,
63066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession,
63166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_preset_user_band_level);
63266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] centerFreqs = ControlPanelEffect.getParameterIntArray(mContext,
63366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_center_freq);
63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevelRange = ControlPanelEffect.getParameterIntArray(mContext,
63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_level_range);
63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mEqualizerMinBandLevel = bandLevelRange[0];
63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int mEqualizerMaxBandLevel = bandLevelRange[1];
63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = 0; band < mNumberEqualizerBands; band++) {
64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Unit conversion from mHz to Hz and use k prefix if necessary to display
64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int centerFreq = centerFreqs[band] / 1000;
64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            float centerFreqHz = centerFreq;
64366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            String unitPrefix = "";
64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (centerFreqHz >= 1000) {
64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                centerFreqHz = centerFreqHz / 1000;
64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                unitPrefix = "k";
64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
64884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            ((TextView) eqcontainer.findViewById(EQViewElementIds[band][0])).setText(
649f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen                    format("%.0f ", centerFreqHz) + unitPrefix + "Hz");
65084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            mEqualizerSeekBar[band] = (SeekBar) eqcontainer
65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .findViewById(EQViewElementIds[band][1]);
65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setMax(mEqualizerMaxBandLevel - mEqualizerMinBandLevel);
65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setOnSeekBarChangeListener(this);
65466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
65566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Hide the inactive Equalizer bands.
65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = mNumberEqualizerBands; band < EQUALIZER_MAX_BANDS; band++) {
65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // CenterFreq text
65984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][0]).setVisibility(View.GONE);
66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // SeekBar
66184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][1]).setVisibility(View.GONE);
66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
663c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
664c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // TODO: get the actual values from somewhere
665c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        TextView tv = (TextView) findViewById(R.id.maxLevelText);
666c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("+15 dB");
667c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.centerLevelText);
668c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("0 dB");
669c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.minLevelText);
670c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("-15 dB");
67184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen        equalizerUpdateDisplay();
67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
674f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private String format(String format, Object... args) {
675f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatBuilder.setLength(0);
676f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatter.format(format, args);
677f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        return mFormatBuilder.toString();
678f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    }
679f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
68166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * For the EQ Band SeekBars
68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
68366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
68466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
68566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android
68666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar, int, boolean)
68766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
68866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
69066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onProgressChanged(final SeekBar seekbar, final int progress, final boolean fromUser) {
69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int id = seekbar.getId();
69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
69366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
69466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (id == EQViewElementIds[band][1]) {
69566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short level = (short) (progress + mEqualizerMinBandLevel);
69666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (fromUser) {
69766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerBandUpdate(band, level);
69866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStartTrackingTouch(android
70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStartTrackingTouch(final SeekBar seekbar) {
713c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // get current levels
714c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
715c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
716c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // copy current levels to user preset
717c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
718c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            equalizerBandUpdate(band, bandLevels[band]);
719c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
720c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerSetPreset(mEQPresetUserPos);
7219c37307a1e0b59572fc474a77aeeb371477a3e8aMarco Nelissen        ((Spinner)findViewById(R.id.eqSpinner)).setSelection(mEQPresetUserPos);
72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ display when the user stops changing.
72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStopTrackingTouch(android
73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
73266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
73366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
73466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStopTrackingTouch(final SeekBar seekbar) {
73566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        equalizerUpdateDisplay();
73666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
73766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
73866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
73966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ by getting the parameters.
74066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void equalizerUpdateDisplay() {
74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Update and show the active N-Band Equalizer bands.
74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int level = bandLevels[band];
74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int progress = level - mEqualizerMinBandLevel;
74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setProgress(progress);
74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates/sets a given EQ band level.
75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param band
75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            Band id
75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param level
75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ band level
75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
760c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerBandUpdate(final int band, final int level) {
76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_band_level, level, band);
76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given EQ preset.
76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ preset id.
77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
771c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerSetPreset(final int preset) {
77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_current_preset, preset);
774c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerUpdateDisplay();
77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given PR preset.
77966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            PR preset id.
78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
783e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void presetReverbSetPreset(final int preset) {
78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.pr_current_preset, preset);
78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Show msg that headset needs to be plugged.
79066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void showHeadsetMsg() {
79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Context context = getApplicationContext();
79366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int duration = Toast.LENGTH_SHORT;
79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Toast toast = Toast.makeText(context, getString(R.string.headset_plug), duration);
79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2, toast.getYOffset() / 2);
79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.show();
79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
800