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 Nelissen
21709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.app.ActionBar;
2266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Activity;
2366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.AlertDialog;
2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Dialog;
2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothClass;
2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothDevice;
2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.BroadcastReceiver;
2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context;
2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface;
3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface.OnCancelListener;
3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Intent;
3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.IntentFilter;
334fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Triviimport android.media.AudioFormat;
3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.AudioManager;
3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect;
3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect.Descriptor;
374fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Triviimport android.media.audiofx.Virtualizer;
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;
55a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissenimport android.widget.SeekBar;
56a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissenimport android.widget.SeekBar.OnSeekBarChangeListener;
57e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.Spinner;
58709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.widget.Switch;
5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.TextView;
6066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.Toast;
6166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
62f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Formatter;
63f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Locale;
641c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissenimport java.util.UUID;
6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/**
6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ActivityMusic extends Activity implements OnSeekBarChangeListener {
7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String TAG = "MusicFXActivityMusic";
7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Max number of EQ bands supported
7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int EQUALIZER_MAX_BANDS = 32;
7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
789ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia     * Max levels per EQ band in millibels (1 dB = 100 mB)
799ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia     */
809ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia    private final static int EQUALIZER_MAX_LEVEL = 1000;
819ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia
829ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia    /**
839ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia     * Min levels per EQ band in millibels (1 dB = 100 mB)
849ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia     */
859ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia    private final static int EQUALIZER_MIN_LEVEL = -1000;
869ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia
879ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia    /**
8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Virtualizer effect is supported.
8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mVirtualizerSupported;
911c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen    private boolean mVirtualizerIsHeadphoneOnly;
9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if BassBoost effect is supported.
9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mBassBoostSupported;
9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Equalizer effect is supported.
9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mEqualizerSupported;
10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
10166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Indicates if Preset Reverb effect is supported.
10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mPresetReverbSupported;
10466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Equalizer fields
10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS];
10766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mNumberEqualizerBands;
10866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEqualizerMinBandLevel;
10966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetUserPos = 1;
11066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPreset;
11166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mEQPresetPrevious;
11266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int[] mEQPresetUserBandLevelsPrev;
113c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private String[] mEQPresetNames;
11466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
11566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mPRPreset;
116e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private int mPRPresetPrevious;
11766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
11866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private boolean mIsHeadsetOn = false;
119709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen    private CompoundButton mToggleSwitch;
12066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
121f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private StringBuilder mFormatBuilder = new StringBuilder();
122f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
123f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
12466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
12566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Mapping for the EQ widget ids per band
12666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
12766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int[][] EQViewElementIds = {
128c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand0TextView, R.id.EQBand0SeekBar },
129c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand1TextView, R.id.EQBand1SeekBar },
130c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand2TextView, R.id.EQBand2SeekBar },
131c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand3TextView, R.id.EQBand3SeekBar },
132c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand4TextView, R.id.EQBand4SeekBar },
133c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand5TextView, R.id.EQBand5SeekBar },
134c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand6TextView, R.id.EQBand6SeekBar },
135c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand7TextView, R.id.EQBand7SeekBar },
136c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand8TextView, R.id.EQBand8SeekBar },
137c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand9TextView, R.id.EQBand9SeekBar },
138c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand10TextView, R.id.EQBand10SeekBar },
139c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand11TextView, R.id.EQBand11SeekBar },
140c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand12TextView, R.id.EQBand12SeekBar },
141c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand13TextView, R.id.EQBand13SeekBar },
142c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand14TextView, R.id.EQBand14SeekBar },
143c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand15TextView, R.id.EQBand15SeekBar },
144c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand16TextView, R.id.EQBand16SeekBar },
145c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand17TextView, R.id.EQBand17SeekBar },
146c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand18TextView, R.id.EQBand18SeekBar },
147c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand19TextView, R.id.EQBand19SeekBar },
148c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand20TextView, R.id.EQBand20SeekBar },
149c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand21TextView, R.id.EQBand21SeekBar },
150c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand22TextView, R.id.EQBand22SeekBar },
151c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand23TextView, R.id.EQBand23SeekBar },
152c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand24TextView, R.id.EQBand24SeekBar },
153c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand25TextView, R.id.EQBand25SeekBar },
154c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand26TextView, R.id.EQBand26SeekBar },
155c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand27TextView, R.id.EQBand27SeekBar },
156c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand28TextView, R.id.EQBand28SeekBar },
157c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand29TextView, R.id.EQBand29SeekBar },
158c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand30TextView, R.id.EQBand30SeekBar },
159c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            { R.id.EQBand31TextView, R.id.EQBand31SeekBar } };
16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Preset Reverb fields
16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Array containing the PR preset names.
16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final String[] PRESETREVERBPRESETSTRINGS = { "None", "SmallRoom", "MediumRoom",
16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            "LargeRoom", "MediumHall", "LargeHall", "Plate" };
16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Context field
17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private Context mContext;
17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Calling package name field
17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private String mCallingPackageName = "empty";
17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Audio session field
18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
18166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private int mAudioSession = AudioEffect.ERROR_BAD_VALUE;
18266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
18366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Broadcast receiver to handle wired and Bluetooth A2dp headset events
18466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
18566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        @Override
18666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        public void onReceive(final Context context, final Intent intent) {
18766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String action = intent.getAction();
18866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isHeadsetOnPrev = mIsHeadsetOn;
18966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
19066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
19166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1)
19266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || audioManager.isBluetoothA2dpOn();
19366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
19466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
19566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = true;
20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn();
20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int deviceClass = ((BluetoothDevice) intent
20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass()
20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        .getDeviceClass();
20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES)
20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) {
20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mIsHeadsetOn = audioManager.isWiredHeadsetOn();
21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (isHeadsetOnPrev != mIsHeadsetOn) {
21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                updateUIHeadset();
21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    };
21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar
22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * onchange methods on creation.
22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.ActivityGroup#onCreate(android.os.Bundle)
22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onCreate(final Bundle savedInstanceState) {
22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onCreate(savedInstanceState);
22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Init context to be used in listeners
23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mContext = this;
23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Receive intent
23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // get calling intent
23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Intent intent = getIntent();
23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mAudioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION,
23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                AudioEffect.ERROR_BAD_VALUE);
23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "audio session: " + mAudioSession);
23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mCallingPackageName = getCallingPackage();
24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // check for errors
24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mCallingPackageName == null) {
24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "Package name is null");
24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            setResult(RESULT_CANCELED);
24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            finish();
24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setResult(RESULT_OK);
25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, mCallingPackageName + " (" + mAudioSession + ")");
25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.initEffectsPreferences(mContext, mCallingPackageName, mAudioSession);
25466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // query available effects
25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Descriptor[] effects = AudioEffect.queryEffects();
25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Determine available/supported effects
25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Available effects:");
26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (final Descriptor effect : effects) {
26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, effect.name.toString() + ", type: " + effect.type.toString());
26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
26366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (effect.type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) {
26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mVirtualizerSupported = true;
2654fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi                mVirtualizerIsHeadphoneOnly = !isVirtualizerTransauralSupported();
26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) {
26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mBassBoostSupported = true;
26866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) {
26966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mEqualizerSupported = true;
27066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_PRESET_REVERB)) {
27166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mPresetReverbSupported = true;
27266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
27366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
27466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
27566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setContentView(R.layout.music_main);
27666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.contentSoundEffects);
27766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
2789412a204062d411d1e66f03e4d0a28a4d823984fjiabin        // Set accessibility label for bass boost and virtualizer strength seekbars.
2799412a204062d411d1e66f03e4d0a28a4d823984fjiabin        findViewById(R.id.bBStrengthText).setLabelFor(R.id.bBStrengthSeekBar);
2809412a204062d411d1e66f03e4d0a28a4d823984fjiabin        findViewById(R.id.vIStrengthText).setLabelFor(R.id.vIStrengthSeekBar);
2819412a204062d411d1e66f03e4d0a28a4d823984fjiabin
282c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // Fill array with presets from AudioEffects call.
283c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // allocate a space for 2 extra strings (CI Extreme & User)
284c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int numPresets = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
285c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_presets);
286c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames = new String[numPresets + 2];
287c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short i = 0; i < numPresets; i++) {
288c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            mEQPresetNames[i] = ControlPanelEffect.getParameterString(mContext,
289c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                    mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_preset_name, i);
290c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
291c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets] = getString(R.string.ci_extreme);
292c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetNames[numPresets + 1] = getString(R.string.user);
293c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        mEQPresetUserPos = numPresets + 1;
294c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Watch for button clicks and initialization.
29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
29866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the listener for the main enhancements toggle button.
29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Depending on the state enable the supported effects if they were
30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // checked in the setup tab.
301709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch = new Switch(this);
302709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen            mToggleSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                @Override
30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                public void onCheckedChanged(final CompoundButton buttonView,
30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final boolean isChecked) {
30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // set parameter and state
30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mAudioSession, ControlPanelEffect.Key.global_enabled, isChecked);
31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Enable Linear layout (in scroll layout) view with all
31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect contents depending on checked state
31229daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                    setEnabledAllChildren(viewGroup, isChecked);
31366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // update UI according to headset state
31466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    updateUIHeadset();
31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            });
31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Virtualizer elements.
31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mVirtualizerSupported) {
32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.vILayout).setOnTouchListener(new OnTouchListener() {
32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
32684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
32784c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
32884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.vIStrengthSeekBar);
33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.VIRTUALIZER_MAX_STRENGTH
33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.VIRTUALIZER_MIN_STRENGTH);
33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.virt_strength, progress);
34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
35466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, true);
35566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
35666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
35766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
35866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
35966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
36066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
36166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
36266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
36366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.virt_enabled, false);
36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
368bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen
369bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final Switch sw = (Switch) findViewById(R.id.vIStrengthToggle);
370bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setOnCheckedChangeListener(new OnCheckedChangeListener() {
371bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    @Override
372bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    public void onCheckedChanged(final CompoundButton buttonView,
373bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            final boolean isChecked) {
374bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
375bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                                mAudioSession, ControlPanelEffect.Key.virt_enabled, isChecked);
376bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    }
377bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                });
37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Bass Boost elements.
38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set the SeekBar listener.
38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mBassBoostSupported) {
38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Show msg when disabled slider (layout) is touched
38466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                findViewById(R.id.bBLayout).setOnTouchListener(new OnTouchListener() {
38566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public boolean onTouch(final View v, final MotionEvent event) {
38884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        if (event.getAction() == MotionEvent.ACTION_UP) {
38984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                            showHeadsetMsg();
39084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen                        }
39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return false;
39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
39366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
39466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
39566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final SeekBar seekbar = (SeekBar) findViewById(R.id.bBStrengthSeekBar);
39666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setMax(OpenSLESConstants.BASSBOOST_MAX_STRENGTH
39766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        - OpenSLESConstants.BASSBOOST_MIN_STRENGTH);
39866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Update the parameters while SeekBar changes and set the
40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // effect parameter.
40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onProgressChanged(final SeekBar seekBar, final int progress,
40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final boolean fromUser) {
40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // set parameter and state
40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName,
40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mAudioSession, ControlPanelEffect.Key.bb_strength, progress);
40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos was 0 when starting re-enable effect
41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStartTrackingTouch(final SeekBar seekBar) {
41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, true);
41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
41866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
42066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If slider pos = 0 when stopping disable effect
42166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    @Override
42266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    public void onStopTrackingTouch(final SeekBar seekBar) {
42366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (seekBar.getProgress() == 0) {
42466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // disable
42566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName,
42666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mAudioSession, ControlPanelEffect.Key.bb_enabled, false);
42766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
42866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
43066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                });
43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
43266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Equalizer elements.
43466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mEqualizerSupported) {
435e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
436e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.eq_current_preset);
437e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (mEQPreset >= mEQPresetNames.length) {
438e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    mEQPreset = 0;
439e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
440e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = mEQPreset;
441e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner));
442e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                equalizerBandsInit(findViewById(R.id.eqcontainer));
44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
44466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
44566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Initialize the Preset Reverb elements.
44666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set Spinner listeners.
44766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (mPresetReverbSupported) {
448e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
449e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                        mAudioSession, ControlPanelEffect.Key.pr_current_preset);
450e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = mPRPreset;
451e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner));
45266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
45366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
454597c06688c95b72ad4d8da8d027ef466656801f3guojingx            ActionBar ab = getActionBar();
455597c06688c95b72ad4d8da8d027ef466656801f3guojingx            final int padding = getResources().getDimensionPixelSize(
456597c06688c95b72ad4d8da8d027ef466656801f3guojingx                    R.dimen.action_bar_switch_padding);
457597c06688c95b72ad4d8da8d027ef466656801f3guojingx            mToggleSwitch.setPadding(0,0, padding, 0);
458597c06688c95b72ad4d8da8d027ef466656801f3guojingx            ab.setCustomView(mToggleSwitch, new ActionBar.LayoutParams(
459597c06688c95b72ad4d8da8d027ef466656801f3guojingx                    ActionBar.LayoutParams.WRAP_CONTENT,
460597c06688c95b72ad4d8da8d027ef466656801f3guojingx                    ActionBar.LayoutParams.WRAP_CONTENT,
461597c06688c95b72ad4d8da8d027ef466656801f3guojingx                    Gravity.CENTER_VERTICAL | Gravity.RIGHT));
462597c06688c95b72ad4d8da8d027ef466656801f3guojingx            ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM);
463597c06688c95b72ad4d8da8d027ef466656801f3guojingx
46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } else {
46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            viewGroup.setVisibility(View.GONE);
46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE);
46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
46884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen
46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onResume()
47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onResume() {
47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onResume();
47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                || (mPresetReverbSupported)) {
48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Listen for broadcast intents that might affect the onscreen UI for headset.
48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            registerReceiver(mReceiver, intentFilter);
48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Check if wired or Bluetooth headset is connected/on
48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn());
49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn);
49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Update UI
49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            updateUI();
49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
49766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
49866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
49966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
50066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
50166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.app.Activity#onPause()
50266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
50366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
50466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    protected void onPause() {
50566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        super.onPause();
50666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
50766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Unregister for broadcast intents. (These affect the visible UI,
50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // so we only care about them while we're in the foreground.)
509597c06688c95b72ad4d8da8d027ef466656801f3guojingx        if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported)
510597c06688c95b72ad4d8da8d027ef466656801f3guojingx                || (mPresetReverbSupported)) {
511597c06688c95b72ad4d8da8d027ef466656801f3guojingx            unregisterReceiver(mReceiver);
512597c06688c95b72ad4d8da8d027ef466656801f3guojingx        }
51366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
51466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
515e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void reverbSpinnerInit(Spinner spinner) {
516e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
517e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, PRESETREVERBPRESETSTRINGS);
518e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
519e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
520e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
521e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
522e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
523e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
524e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mPRPresetPrevious) {
525e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    presetReverbSetPreset(position);
52666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
527e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mPRPresetPrevious = position;
528e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
52966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
530e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
531e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
532e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
533e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
534e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mPRPreset);
53566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
53666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
537e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerSpinnerInit(Spinner spinner) {
538e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
539e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                android.R.layout.simple_spinner_item, mEQPresetNames);
540e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
541e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setAdapter(adapter);
542e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
543e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
544e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
545e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
546e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                if (position != mEQPresetPrevious) {
547e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                    equalizerSetPreset(position);
548e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                }
549e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                mEQPresetPrevious = position;
550743172011ae03fe3f82759750932c6220a3a50a6Marco Nelissen            }
551e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
552e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            @Override
553e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            public void onNothingSelected(AdapterView<?> parent) {
554e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            }
555e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        });
556e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen        spinner.setSelection(mEQPreset);
55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
559e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen
56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
56129daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * En/disables all children for a given view. For linear and relative layout children do this
56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * recursively
56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
56429daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen     * @param viewGroup
56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param enabled
56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
56729daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen    private void setEnabledAllChildren(final ViewGroup viewGroup, final boolean enabled) {
56866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int count = viewGroup.getChildCount();
56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int i = 0; i < count; i++) {
57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final View view = viewGroup.getChildAt(i);
571a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissen            if ((view instanceof ViewGroup)) {
57266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final ViewGroup vg = (ViewGroup) view;
57329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen                setEnabledAllChildren(vg, enabled);
57466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            view.setEnabled(enabled);
57666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
57766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
57866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
57966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
58066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI (checkbox, seekbars, enabled states) according to the current stored preferences.
58166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
58266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUI() {
58366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final boolean isEnabled = ControlPanelEffect.getParameterBoolean(mContext,
58466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.global_enabled);
585709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        mToggleSwitch.setChecked(isEnabled);
58629daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen        setEnabledAllChildren((ViewGroup) findViewById(R.id.contentSoundEffects), isEnabled);
58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        updateUIHeadset();
58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mVirtualizerSupported) {
590bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            SeekBar bar = (SeekBar) findViewById(R.id.vIStrengthSeekBar);
591bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            Switch sw = (Switch) findViewById(R.id.vIStrengthToggle);
592bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            int strength = ControlPanelEffect
59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
594bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            ControlPanelEffect.Key.virt_strength);
595bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            bar.setProgress(strength);
596bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            boolean hasStrength = ControlPanelEffect.getParameterBoolean(mContext,
597bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    mCallingPackageName, mAudioSession,
598bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    ControlPanelEffect.Key.virt_strength_supported);
599bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            if (hasStrength) {
600bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setVisibility(View.GONE);
601bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            } else {
602bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                bar.setVisibility(View.GONE);
603bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                sw.setChecked(sw.isEnabled() && strength != 0);
604bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            }
60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mBassBoostSupported) {
60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setProgress(ControlPanelEffect
60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .getParameterInt(mContext, mCallingPackageName, mAudioSession,
60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            ControlPanelEffect.Key.bb_strength));
61066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
61166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mEqualizerSupported) {
61284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            equalizerUpdateDisplay();
61366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
61466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (mPresetReverbSupported) {
615e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            int reverb = ControlPanelEffect.getParameterInt(
61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mContext, mCallingPackageName, mAudioSession,
617e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen                                    ControlPanelEffect.Key.pr_current_preset);
618e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen            ((Spinner)findViewById(R.id.prSpinner)).setSelection(reverb);
61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates UI for headset mode. En/disable VI and BB controls depending on headset state
62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (on/off) if effects are on. Do the inverse for their layouts so they can take over
62566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * control/events.
62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void updateUIHeadset() {
628709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen        if (mToggleSwitch.isChecked()) {
6291c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            ((TextView) findViewById(R.id.vIStrengthText)).setEnabled(
6301c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                    mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
6311c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled(
6321c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen                    mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
6331c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen            findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly);
63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn);
63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn);
63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn);
63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Initializes the equalizer elements. Set the SeekBars and Spinner listeners.
64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
643e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void equalizerBandsInit(View eqcontainer) {
64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Initialize the N-Band Equalizer elements.
64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mNumberEqualizerBands = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName,
64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mAudioSession, ControlPanelEffect.Key.eq_num_bands);
64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mEQPresetUserBandLevelsPrev = ControlPanelEffect.getParameterIntArray(mContext,
64866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession,
64966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_preset_user_band_level);
65066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] centerFreqs = ControlPanelEffect.getParameterIntArray(mContext,
65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_center_freq);
65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevelRange = ControlPanelEffect.getParameterIntArray(mContext,
65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_level_range);
6549ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia        mEqualizerMinBandLevel = (int) Math.max(EQUALIZER_MIN_LEVEL, bandLevelRange[0]);
6559ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia        final int mEqualizerMaxBandLevel = (int) Math.min(EQUALIZER_MAX_LEVEL, bandLevelRange[1]);
65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = 0; band < mNumberEqualizerBands; band++) {
65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Unit conversion from mHz to Hz and use k prefix if necessary to display
65966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int centerFreq = centerFreqs[band] / 1000;
66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            float centerFreqHz = centerFreq;
66166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            String unitPrefix = "";
66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (centerFreqHz >= 1000) {
66366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                centerFreqHz = centerFreqHz / 1000;
66466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                unitPrefix = "k";
66566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
66684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            ((TextView) eqcontainer.findViewById(EQViewElementIds[band][0])).setText(
667f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen                    format("%.0f ", centerFreqHz) + unitPrefix + "Hz");
66884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            mEqualizerSeekBar[band] = (SeekBar) eqcontainer
66966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    .findViewById(EQViewElementIds[band][1]);
6709412a204062d411d1e66f03e4d0a28a4d823984fjiabin            eqcontainer.findViewById(EQViewElementIds[band][0])
6719412a204062d411d1e66f03e4d0a28a4d823984fjiabin                    .setLabelFor(EQViewElementIds[band][1]);
67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setMax(mEqualizerMaxBandLevel - mEqualizerMinBandLevel);
67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setOnSeekBarChangeListener(this);
67466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
67566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
67666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Hide the inactive Equalizer bands.
67766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (int band = mNumberEqualizerBands; band < EQUALIZER_MAX_BANDS; band++) {
67866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // CenterFreq text
67984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][0]).setVisibility(View.GONE);
68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // SeekBar
68184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen            eqcontainer.findViewById(EQViewElementIds[band][1]).setVisibility(View.GONE);
68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
683c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen
684c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        TextView tv = (TextView) findViewById(R.id.maxLevelText);
6859ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia        tv.setText(String.format("+%d dB", (int) Math.ceil(mEqualizerMaxBandLevel / 100)));
686c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.centerLevelText);
687c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv.setText("0 dB");
688c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        tv = (TextView) findViewById(R.id.minLevelText);
6899ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia        tv.setText(String.format("%d dB", (int) Math.floor(mEqualizerMinBandLevel / 100)));
69084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen        equalizerUpdateDisplay();
69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
693f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    private String format(String format, Object... args) {
694f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatBuilder.setLength(0);
695f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        mFormatter.format(format, args);
696f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen        return mFormatBuilder.toString();
697f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen    }
698f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen
69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * For the EQ Band SeekBars
70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android
70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar, int, boolean)
70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onProgressChanged(final SeekBar seekbar, final int progress, final boolean fromUser) {
71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int id = seekbar.getId();
71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
71366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (id == EQViewElementIds[band][1]) {
71466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short level = (short) (progress + mEqualizerMinBandLevel);
71566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (fromUser) {
71666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerBandUpdate(band, level);
71766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
71866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
71966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
72066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
72166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStartTrackingTouch(android
72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStartTrackingTouch(final SeekBar seekbar) {
732c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // get current levels
733c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
734c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
735c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        // copy current levels to user preset
736c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
737c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen            equalizerBandUpdate(band, bandLevels[band]);
738c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        }
739c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerSetPreset(mEQPresetUserPos);
7409c37307a1e0b59572fc474a77aeeb371477a3e8aMarco Nelissen        ((Spinner)findViewById(R.id.eqSpinner)).setSelection(mEQPresetUserPos);
74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /*
74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ display when the user stops changing.
74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * (non-Javadoc)
74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @see android.widget.SeekBar.OnSeekBarChangeListener#onStopTrackingTouch(android
74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * .widget.SeekBar)
75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onStopTrackingTouch(final SeekBar seekbar) {
75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        equalizerUpdateDisplay();
75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates the EQ by getting the parameters.
75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
76066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void equalizerUpdateDisplay() {
76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Update and show the active N-Band Equalizer bands.
76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext,
76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level);
76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        for (short band = 0; band < mNumberEqualizerBands; band++) {
76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int level = bandLevels[band];
76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int progress = level - mEqualizerMinBandLevel;
76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            mEqualizerSeekBar[band].setProgress(progress);
76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
77166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Updates/sets a given EQ band level.
77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
77466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param band
77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            Band id
77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param level
77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ band level
77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
779c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerBandUpdate(final int band, final int level) {
78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_band_level, level, band);
78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
78366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given EQ preset.
78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            EQ preset id.
78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
790c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen    private void equalizerSetPreset(final int preset) {
79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.eq_current_preset, preset);
793c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen        equalizerUpdateDisplay();
79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets the given PR preset.
79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param preset
80066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            PR preset id.
80166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
802e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen    private void presetReverbSetPreset(final int preset) {
80366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession,
80466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.Key.pr_current_preset, preset);
80566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
80666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
80766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
80866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Show msg that headset needs to be plugged.
80966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
81066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private void showHeadsetMsg() {
81166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Context context = getApplicationContext();
81266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int duration = Toast.LENGTH_SHORT;
81366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
81466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Toast toast = Toast.makeText(context, getString(R.string.headset_plug), duration);
81566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2, toast.getYOffset() / 2);
81666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        toast.show();
81766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
8184fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi
8194fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi    private static boolean isVirtualizerTransauralSupported() {
8204fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        Virtualizer virt = null;
8214fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        boolean transauralSupported = false;
8224fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        try {
8234fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi            virt = new Virtualizer(0, android.media.AudioSystem.newAudioSessionId());
8244fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi            transauralSupported = virt.canVirtualize(AudioFormat.CHANNEL_OUT_STEREO,
8254fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi                    Virtualizer.VIRTUALIZATION_MODE_TRANSAURAL);
8264fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        } catch (Exception e) {
8274fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        } finally {
8284fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi            if (virt != null) {
8294fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi                virt.release();
8304fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi            }
8314fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        }
8324fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi        return transauralSupported;
8334fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi    }
83466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
835