Loading media/java/android/media/MediaRouter2.java +8 −5 Original line number Diff line number Diff line Loading @@ -471,7 +471,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { addedRoutes.add(route); } } Loading @@ -487,7 +488,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.remove(route.getId()); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { removedRoutes.add(route); } } Loading @@ -503,7 +505,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { changedRoutes.add(route); } } Loading Loading @@ -643,8 +646,8 @@ public class MediaRouter2 { private List<MediaRoute2Info> filterRoutes(List<MediaRoute2Info> routes, RouteDiscoveryPreference discoveryRequest) { return routes.stream() .filter( route -> route.hasAnyFeatures(discoveryRequest.getPreferredFeatures())) .filter(route -> route.isSystemRoute() || route.hasAnyFeatures(discoveryRequest.getPreferredFeatures())) .collect(Collectors.toList()); } Loading services/core/java/com/android/server/media/BluetoothRouteProvider.java +19 −3 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.MediaRoute2Info; import android.text.TextUtils; import android.util.Slog; Loading Loading @@ -55,6 +56,7 @@ class BluetoothRouteProvider { private final Context mContext; private final BluetoothAdapter mBluetoothAdapter; private final BluetoothRoutesUpdatedListener mListener; private final AudioManager mAudioManager; private final Map<String, BluetoothEventReceiver> mEventReceiverMap = new HashMap<>(); private final IntentFilter mIntentFilter = new IntentFilter(); private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver(); Loading Loading @@ -82,6 +84,7 @@ class BluetoothRouteProvider { mContext = context; mBluetoothAdapter = btAdapter; mListener = listener; mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); buildBluetoothRoutes(); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); Loading Loading @@ -181,12 +184,15 @@ class BluetoothRouteProvider { private BluetoothRouteInfo createBluetoothRoute(BluetoothDevice device) { BluetoothRouteInfo newBtRoute = new BluetoothRouteInfo(); newBtRoute.btDevice = device; // Current / Max volume will be set when connected. // TODO: Is there any BT device which has fixed volume? newBtRoute.route = new MediaRoute2Info.Builder(device.getAddress(), device.getName()) .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) .setDescription(mContext.getResources().getText( R.string.bluetooth_a2dp_audio_route_name).toString()) .setDeviceType(MediaRoute2Info.DEVICE_TYPE_BLUETOOTH) .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) .build(); newBtRoute.connectedProfiles = new SparseBooleanArray(); return newBtRoute; Loading @@ -203,10 +209,20 @@ class BluetoothRouteProvider { Slog.w(TAG, "setRouteConnectionStateForDevice: route shouldn't be null"); return; } if (btRoute.route.getConnectionState() != state) { btRoute.route = new MediaRoute2Info.Builder(btRoute.route) .setConnectionState(state).build(); if (btRoute.route.getConnectionState() == state) { return; } // Update volume when the connection state is changed. MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.route) .setConnectionState(state); if (state == MediaRoute2Info.CONNECTION_STATE_CONNECTED) { int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); builder.setVolumeMax(maxVolume).setVolume(currentVolume); } btRoute.route = builder.build(); } interface BluetoothRoutesUpdatedListener { Loading services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +45 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,11 @@ import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO; import static android.media.MediaRoute2Info.FEATURE_LIVE_VIDEO; import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.AudioRoutesInfo; import android.media.IAudioRoutesObserver; Loading Loading @@ -107,6 +109,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } }); initializeSessionInfo(); mContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); } @Override Loading Loading @@ -278,4 +283,44 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } mCallback.onSessionUpdated(this, sessionInfo); } private class VolumeChangeReceiver extends BroadcastReceiver { // This will be called in the main thread. @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals(AudioManager.VOLUME_CHANGED_ACTION)) { return; } final int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (streamType != AudioManager.STREAM_MUSIC) { return; } final int newVolume = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0); final int oldVolume = intent.getIntExtra( AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0); if (newVolume != oldVolume) { String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress(); if (!TextUtils.isEmpty(activeBtDeviceAddress)) { for (int i = mBluetoothRoutes.size() - 1; i >= 0; i--) { MediaRoute2Info route = mBluetoothRoutes.get(i); if (TextUtils.equals(activeBtDeviceAddress, route.getId())) { mBluetoothRoutes.set(i, new MediaRoute2Info.Builder(route) .setVolume(newVolume) .build()); break; } } } else { mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute) .setVolume(newVolume) .build(); } publishRoutes(); } } } } Loading
media/java/android/media/MediaRouter2.java +8 −5 Original line number Diff line number Diff line Loading @@ -471,7 +471,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { addedRoutes.add(route); } } Loading @@ -487,7 +488,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.remove(route.getId()); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { removedRoutes.add(route); } } Loading @@ -503,7 +505,8 @@ public class MediaRouter2 { synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { if (route.isSystemRoute() || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { changedRoutes.add(route); } } Loading Loading @@ -643,8 +646,8 @@ public class MediaRouter2 { private List<MediaRoute2Info> filterRoutes(List<MediaRoute2Info> routes, RouteDiscoveryPreference discoveryRequest) { return routes.stream() .filter( route -> route.hasAnyFeatures(discoveryRequest.getPreferredFeatures())) .filter(route -> route.isSystemRoute() || route.hasAnyFeatures(discoveryRequest.getPreferredFeatures())) .collect(Collectors.toList()); } Loading
services/core/java/com/android/server/media/BluetoothRouteProvider.java +19 −3 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.MediaRoute2Info; import android.text.TextUtils; import android.util.Slog; Loading Loading @@ -55,6 +56,7 @@ class BluetoothRouteProvider { private final Context mContext; private final BluetoothAdapter mBluetoothAdapter; private final BluetoothRoutesUpdatedListener mListener; private final AudioManager mAudioManager; private final Map<String, BluetoothEventReceiver> mEventReceiverMap = new HashMap<>(); private final IntentFilter mIntentFilter = new IntentFilter(); private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver(); Loading Loading @@ -82,6 +84,7 @@ class BluetoothRouteProvider { mContext = context; mBluetoothAdapter = btAdapter; mListener = listener; mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); buildBluetoothRoutes(); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); Loading Loading @@ -181,12 +184,15 @@ class BluetoothRouteProvider { private BluetoothRouteInfo createBluetoothRoute(BluetoothDevice device) { BluetoothRouteInfo newBtRoute = new BluetoothRouteInfo(); newBtRoute.btDevice = device; // Current / Max volume will be set when connected. // TODO: Is there any BT device which has fixed volume? newBtRoute.route = new MediaRoute2Info.Builder(device.getAddress(), device.getName()) .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) .setDescription(mContext.getResources().getText( R.string.bluetooth_a2dp_audio_route_name).toString()) .setDeviceType(MediaRoute2Info.DEVICE_TYPE_BLUETOOTH) .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) .build(); newBtRoute.connectedProfiles = new SparseBooleanArray(); return newBtRoute; Loading @@ -203,10 +209,20 @@ class BluetoothRouteProvider { Slog.w(TAG, "setRouteConnectionStateForDevice: route shouldn't be null"); return; } if (btRoute.route.getConnectionState() != state) { btRoute.route = new MediaRoute2Info.Builder(btRoute.route) .setConnectionState(state).build(); if (btRoute.route.getConnectionState() == state) { return; } // Update volume when the connection state is changed. MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.route) .setConnectionState(state); if (state == MediaRoute2Info.CONNECTION_STATE_CONNECTED) { int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); builder.setVolumeMax(maxVolume).setVolume(currentVolume); } btRoute.route = builder.build(); } interface BluetoothRoutesUpdatedListener { Loading
services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +45 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,11 @@ import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO; import static android.media.MediaRoute2Info.FEATURE_LIVE_VIDEO; import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.AudioRoutesInfo; import android.media.IAudioRoutesObserver; Loading Loading @@ -107,6 +109,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } }); initializeSessionInfo(); mContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); } @Override Loading Loading @@ -278,4 +283,44 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } mCallback.onSessionUpdated(this, sessionInfo); } private class VolumeChangeReceiver extends BroadcastReceiver { // This will be called in the main thread. @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals(AudioManager.VOLUME_CHANGED_ACTION)) { return; } final int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (streamType != AudioManager.STREAM_MUSIC) { return; } final int newVolume = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0); final int oldVolume = intent.getIntExtra( AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0); if (newVolume != oldVolume) { String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress(); if (!TextUtils.isEmpty(activeBtDeviceAddress)) { for (int i = mBluetoothRoutes.size() - 1; i >= 0; i--) { MediaRoute2Info route = mBluetoothRoutes.get(i); if (TextUtils.equals(activeBtDeviceAddress, route.getId())) { mBluetoothRoutes.set(i, new MediaRoute2Info.Builder(route) .setVolume(newVolume) .build()); break; } } } else { mDefaultRoute = new MediaRoute2Info.Builder(mDefaultRoute) .setVolume(newVolume) .build(); } publishRoutes(); } } } }