diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-03-31 01:08:01 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-03-31 01:08:01 +0000 |
commit | cfd060486152864fc79e8c4a9b68f73fe43a7e77 (patch) | |
tree | 74206a35f9d4ac0a153b0ec10b6a32cdb41ebb3c | |
parent | 8bb8413261ba52ed3d91ca67c45e442e6e8e36b7 (diff) | |
parent | 8553181dec49a2a2fb7ff5778b34ca2ec950cf7c (diff) | |
download | MusicFX-cfd060486152864fc79e8c4a9b68f73fe43a7e77.tar.gz |
Snap for 7246408 from 8553181dec49a2a2fb7ff5778b34ca2ec950cf7c to sc-releaseandroid-vts-12.0_r9android-vts-12.0_r8android-vts-12.0_r7android-vts-12.0_r6android-vts-12.0_r5android-vts-12.0_r4android-vts-12.0_r3android-vts-12.0_r2android-vts-12.0_r12android-vts-12.0_r11android-vts-12.0_r10android-vts-12.0_r1android-security-12.0.0_r59android-security-12.0.0_r58android-security-12.0.0_r57android-security-12.0.0_r56android-security-12.0.0_r55android-security-12.0.0_r54android-security-12.0.0_r53android-security-12.0.0_r52android-security-12.0.0_r51android-security-12.0.0_r50android-security-12.0.0_r49android-security-12.0.0_r48android-security-12.0.0_r47android-security-12.0.0_r46android-security-12.0.0_r45android-security-12.0.0_r44android-security-12.0.0_r43android-security-12.0.0_r42android-security-12.0.0_r41android-security-12.0.0_r40android-security-12.0.0_r39android-security-12.0.0_r38android-security-12.0.0_r37android-security-12.0.0_r36android-security-12.0.0_r35android-security-12.0.0_r34android-platform-12.0.0_r1android-cts-12.0_r9android-cts-12.0_r8android-cts-12.0_r7android-cts-12.0_r6android-cts-12.0_r5android-cts-12.0_r4android-cts-12.0_r3android-cts-12.0_r2android-cts-12.0_r12android-cts-12.0_r11android-cts-12.0_r10android-cts-12.0_r1android-12.0.0_r9android-12.0.0_r8android-12.0.0_r34android-12.0.0_r33android-12.0.0_r31android-12.0.0_r30android-12.0.0_r3android-12.0.0_r25android-12.0.0_r2android-12.0.0_r11android-12.0.0_r10android-12.0.0_r1android12-tests-releaseandroid12-security-releaseandroid12-s5-releaseandroid12-s4-releaseandroid12-s3-releaseandroid12-s2-releaseandroid12-s1-releaseandroid12-release
Change-Id: I95a13e801d9181047e07f3ff67f0c30f0b3416e7
-rw-r--r-- | AndroidManifest.xml | 3 | ||||
-rw-r--r-- | src/com/android/musicfx/ActivityMusic.java | 102 |
2 files changed, 59 insertions, 46 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 19a09be..4642aa7 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -23,8 +23,7 @@ android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> - <uses-permission - android:name="android.permission.BLUETOOTH"></uses-permission> + <application android:icon="@drawable/icon" android:label="@string/app_name" diff --git a/src/com/android/musicfx/ActivityMusic.java b/src/com/android/musicfx/ActivityMusic.java index 3fb58d4..5222b48 100644 --- a/src/com/android/musicfx/ActivityMusic.java +++ b/src/com/android/musicfx/ActivityMusic.java @@ -30,8 +30,12 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.content.IntentFilter; +import android.media.AudioAttributes; +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; @@ -61,8 +65,11 @@ import android.widget.Toast; import java.util.Formatter; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.UUID; /** @@ -199,42 +206,56 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { */ private int mAudioSession = AudioEffect.ERROR_BAD_VALUE; - // Broadcast receiver to handle wired and Bluetooth A2dp headset events - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + // Audio Playback monitoring Callback to determine if a headset is used for music playback + private final AudioPlaybackCallback mMyAudioPlaybackCallback = new AudioPlaybackCallback() { @Override - public void onReceive(final Context context, final Intent intent) { - final String action = intent.getAction(); - final boolean isHeadsetOnPrev = mIsHeadsetOn; - final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); - if (action.equals(Intent.ACTION_HEADSET_PLUG)) { - mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1) - || audioManager.isBluetoothA2dpOn(); - } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) { - final int deviceClass = ((BluetoothDevice) intent - .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() - .getDeviceClass(); - if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) - || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { - mIsHeadsetOn = true; - } - } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { - mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn(); - } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) { - final int deviceClass = ((BluetoothDevice) intent - .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() - .getDeviceClass(); - if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) - || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { - mIsHeadsetOn = audioManager.isWiredHeadsetOn(); - } - } - if (isHeadsetOnPrev != mIsHeadsetOn) { + 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; + } + + public static final Set<Integer> HEADSET_DEVICE_TYPES = new HashSet<>(); + static { + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_WIRED_HEADSET); + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_WIRED_HEADPHONES); + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP); + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_BLUETOOTH_SCO); + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_USB_HEADSET); + HEADSET_DEVICE_TYPES.add(AudioDeviceInfo.TYPE_HEARING_AID); + 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)) { + return true; + } + } + return false; + } + /* * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar * onchange methods on creation. * @@ -483,7 +504,6 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT)); ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); - } else { viewGroup.setVisibility(View.GONE); ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE); @@ -501,18 +521,11 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { super.onResume(); if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) || (mPresetReverbSupported)) { - // Listen for broadcast intents that might affect the onscreen UI for headset. - final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); - intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); - intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); - intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); - registerReceiver(mReceiver, intentFilter); - - // Check if wired or Bluetooth headset is connected/on - final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); - mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn()); + // 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()); Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn); - // Update UI updateUI(); } @@ -527,11 +540,12 @@ public class ActivityMusic extends Activity implements OnSeekBarChangeListener { protected void onPause() { super.onPause(); - // Unregister for broadcast intents. (These affect the visible UI, + // 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) || (mPresetReverbSupported)) { - unregisterReceiver(mReceiver); + final AudioManager audioManager = (AudioManager) getSystemService(AudioManager.class); + audioManager.unregisterAudioPlaybackCallback(mMyAudioPlaybackCallback); } } |