diff options
author | Shunkai Yao <yaoshunkai@google.com> | 2023-03-22 22:56:58 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-03-22 22:56:58 +0000 |
commit | fe4ae070a1389401643fff61ffdb4aaed5210858 (patch) | |
tree | 43cbe1a2cfafcb6e770c3de0d357bdb98d651ee3 | |
parent | ae18bbca79e08c7404d367cac9a566f0b96e6bdb (diff) | |
parent | e30838778ef5655d5bae7e465477d2ef01223ee1 (diff) | |
download | MusicFX-fe4ae070a1389401643fff61ffdb4aaed5210858.tar.gz |
Replace PlaybackActivityMonitor with AudioDeviceCallback am: e30838778e
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/MusicFX/+/22168604
Change-Id: I450e24316f451797169e436fd40f9c6c6cc2dd2f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | src/com/android/musicfx/ActivityMusic.java | 185 |
1 files changed, 109 insertions, 76 deletions
diff --git a/src/com/android/musicfx/ActivityMusic.java b/src/com/android/musicfx/ActivityMusic.java index 3b56ed1..1f46aed 100644 --- a/src/com/android/musicfx/ActivityMusic.java +++ b/src/com/android/musicfx/ActivityMusic.java @@ -16,36 +16,22 @@ package com.android.musicfx; -import com.android.audiofx.OpenSLESConstants; - import android.app.ActionBar; import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.bluetooth.BluetoothClass; -import android.bluetooth.BluetoothDevice; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; import android.content.Intent; -import android.content.IntentFilter; -import android.media.AudioAttributes; +import android.media.AudioDeviceCallback; import android.media.AudioDeviceInfo; import android.media.AudioFormat; import android.media.AudioManager; -import android.media.AudioManager.AudioPlaybackCallback; -import android.media.AudioPlaybackConfiguration; import android.media.audiofx.AudioEffect; import android.media.audiofx.AudioEffect.Descriptor; import android.media.audiofx.Virtualizer; import android.os.Bundle; import android.util.Log; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.AdapterView; @@ -53,9 +39,6 @@ import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Spinner; @@ -63,13 +46,13 @@ import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; +import com.android.audiofx.OpenSLESConstants; + import java.util.Formatter; import java.util.HashSet; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.UUID; /** * @@ -95,20 +78,20 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { /** * Indicates if Virtualizer effect is supported. */ - private boolean mVirtualizerSupported; - private boolean mVirtualizerIsHeadphoneOnly; + private boolean mVirtualizerSupported = false; + private boolean mVirtualizerIsHeadphoneOnly = false; /** * Indicates if BassBoost effect is supported. */ - private boolean mBassBoostSupported; + private boolean mBassBoostSupported = false; /** * Indicates if Equalizer effect is supported. */ - private boolean mEqualizerSupported; + private boolean mEqualizerSupported = false; /** * Indicates if Preset Reverb effect is supported. */ - private boolean mPresetReverbSupported; + private boolean mPresetReverbSupported = false; // Equalizer fields private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS]; @@ -198,27 +181,51 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { */ private String mCallingPackageName = "empty"; - // Audio Playback monitoring Callback to determine if a headset is used for music playback - private final AudioPlaybackCallback mMyAudioPlaybackCallback = new AudioPlaybackCallback() { - @Override - public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) { - boolean isHeadsetOn = isHeadsetUsedForMedia(configs); - if (isHeadsetOn != mIsHeadsetOn) { - mIsHeadsetOn = isHeadsetOn; - updateUIHeadset(); - } - } - }; - - private static boolean isConfigForMedia(AudioPlaybackConfiguration apc) { - AudioAttributes attr = apc.getAudioAttributes(); - if (attr.getUsage() == AudioAttributes.USAGE_MEDIA - || attr.getUsage() == AudioAttributes.USAGE_GAME - || attr.getUsage() == AudioAttributes.USAGE_UNKNOWN) { - return true; - } - return false; - } + // Listen to AudioDeviceCallback to determine if a headset is connected + private final AudioDeviceCallback mMyAudioDeviceCallback = + new AudioDeviceCallback() { + + /** + * Called by the {@link AudioManager} to indicate that one or more audio devices + * have been connected. + * + * @see AudioDeviceCallback. + */ + @Override + public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) { + // do nothing if mIsHeadsetOn is true and new devices added + if (mIsHeadsetOn) { + return; + } + final boolean isHeadsetOn = isHeadSetDeviceConnected(); + if (isHeadsetOn) { + Log.v(TAG, " HeadSet connected"); + mIsHeadsetOn = true; + updateUIHeadset(); + } + } + + /** + * Called by the {@link AudioManager} to indicate that one or more audio devices + * have been disconnected. + * + * @param removedDevices An array of {@link AudioDeviceInfo} objects corresponding + * to any newly removed audio devices. + */ + @Override + public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) { + // do nothing if mIsHeadsetOn is false and some devices removed + if (!mIsHeadsetOn) { + return; + } + final boolean isHeadsetOn = isHeadSetDeviceConnected(); + if (!isHeadsetOn) { + Log.v(TAG, " HeadSet disconnected"); + mIsHeadsetOn = false; + updateUIHeadset(); + } + } + }; public static final Set<Integer> HEADSET_DEVICE_TYPES = new HashSet<>(); static { @@ -231,23 +238,26 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_BLE_HEADSET); } - private static boolean isConfigForHeadset(AudioPlaybackConfiguration apc) { - AudioDeviceInfo device = apc.getAudioDeviceInfo(); - if (device == null) { - return false; - } - return HEADSET_DEVICE_TYPES.contains(device.getType()); - } - - private static boolean isHeadsetUsedForMedia(List<AudioPlaybackConfiguration> configs) { - for (AudioPlaybackConfiguration config : configs) { - if (config.isActive() && isConfigForMedia(config) && isConfigForHeadset(config)) { + private boolean isHeadSetDeviceConnected() { + final AudioManager audioManager = getSystemService(AudioManager.class); + final AudioDeviceInfo[] deviceInfos = + audioManager.getDevicesStatic(AudioManager.GET_DEVICES_OUTPUTS); + for (AudioDeviceInfo deviceInfo : deviceInfos) { + if (deviceInfo == null) { + continue; + } + final int type = deviceInfo.getType(); + if (HEADSET_DEVICE_TYPES.contains(deviceInfo.getType())) { + Log.v(TAG, " at least a HeadSet device type " + type + " connected"); return true; } } + + Log.v(TAG, " no HeadSet device type connected"); return false; } - /* + + /* * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar * onchange methods on creation. * @@ -415,6 +425,8 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { ControlPanelEffect.Key.virt_enabled, isChecked); } }); + } else { + findViewById(R.id.vILayout).setVisibility(View.GONE); } // Initialize the Bass Boost elements. @@ -465,9 +477,10 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, ControlPanelEffect.Key.bb_enabled, false); } - } }); + } else { + findViewById(R.id.bBLayout).setVisibility(View.GONE); } // Initialize the Equalizer elements. @@ -480,6 +493,8 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { mEQPresetPrevious = mEQPreset; equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner)); equalizerBandsInit(findViewById(R.id.eqcontainer)); + } else { + findViewById(R.id.eqSpinner).setVisibility(View.GONE); } // Initialize the Preset Reverb elements. @@ -489,6 +504,8 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { ControlPanelEffect.Key.pr_current_preset); mPRPresetPrevious = mPRPreset; reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner)); + } else { + findViewById(R.id.prSpinner).setVisibility(View.GONE); } ActionBar ab = getActionBar(); @@ -517,10 +534,10 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { super.onResume(); if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) || (mPresetReverbSupported)) { - // Monitor active playback configurations used for media and playing on a headset. - final AudioManager audioManager = (AudioManager) getSystemService(AudioManager.class); - audioManager.registerAudioPlaybackCallback(mMyAudioPlaybackCallback, null); - mIsHeadsetOn = isHeadsetUsedForMedia(audioManager.getActivePlaybackConfigurations()); + // Monitor AudioDeviceCallback for device change + final AudioManager audioManager = getSystemService(AudioManager.class); + audioManager.registerAudioDeviceCallback(mMyAudioDeviceCallback, null); + mIsHeadsetOn = isHeadSetDeviceConnected(); Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn); // Update UI updateUI(); @@ -536,12 +553,14 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { protected void onPause() { super.onPause(); - // Stop monitoring active playback configurations. (These affect the visible UI, - // so we only care about them while we're in the foreground.) - if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) + // Stop monitoring AudioDeviceCallback, (these affect the visible UI, so we only care about + // them while we're in the foreground). + if ((mVirtualizerSupported) + || (mBassBoostSupported) + || (mEqualizerSupported) || (mPresetReverbSupported)) { - final AudioManager audioManager = (AudioManager) getSystemService(AudioManager.class); - audioManager.unregisterAudioPlaybackCallback(mMyAudioPlaybackCallback); + final AudioManager audioManager = getSystemService(AudioManager.class); + audioManager.unregisterAudioDeviceCallback(mMyAudioDeviceCallback); } } @@ -658,14 +677,28 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { */ private void updateUIHeadset() { if (mToggleSwitch.isChecked()) { - ((TextView) findViewById(R.id.vIStrengthText)).setEnabled( - mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); - ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled( - mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); - findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); - ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn); - ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn); - findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn); + if (mVirtualizerSupported) { + // virtualizer is on if headset is on or transaural virtualizer supported + final boolean isVirtualizerOn = mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly; + ControlPanelEffect.setParameterBoolean( + mContext, + mCallingPackageName, + ControlPanelEffect.Key.virt_enabled, + isVirtualizerOn); + ((TextView) findViewById(R.id.vIStrengthText)).setEnabled(isVirtualizerOn); + ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled(isVirtualizerOn); + findViewById(R.id.vILayout).setEnabled(!isVirtualizerOn); + } + if (mBassBoostSupported) { + ControlPanelEffect.setParameterBoolean( + mContext, + mCallingPackageName, + ControlPanelEffect.Key.bb_enabled, + mIsHeadsetOn); + ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn); + ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn); + findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn); + } } } |