diff options
| -rw-r--r-- | media/java/android/media/MediaRouter.java | 51 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/BluetoothRouteProvider.java | 1 |
2 files changed, 32 insertions, 20 deletions
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 36f7bed03bcd..d0304f262917 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -23,6 +23,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; import android.app.ActivityThread; +import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHearingAid; import android.compat.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.Context; @@ -99,6 +102,7 @@ public class MediaRouter { RouteInfo mDefaultAudioVideo; RouteInfo mBluetoothA2dpRoute; + volatile boolean mHasActiveBluetoothDevices; RouteInfo mSelectedRoute; @@ -172,14 +176,20 @@ public class MediaRouter { new IntentFilter(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)); appContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED); + intentFilter.addAction(BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED); + appContext.registerReceiver(new BluetoothStateChangedReceiver(), intentFilter); mDisplayService.registerDisplayListener(this, mHandler); AudioRoutesInfo newAudioRoutes = null; try { newAudioRoutes = mAudioService.startWatchingRoutes(mAudioRoutesObserver); + mHasActiveBluetoothDevices = mAudioService.isBluetoothA2dpOn(); } catch (RemoteException e) { } + if (newAudioRoutes != null) { // This will select the active BT route if there is one and the current // selected route is the default system route, or if there is no selected @@ -253,7 +263,8 @@ public class MediaRouter { } if (audioRoutesChanged) { - Log.v(TAG, "Audio routes updated: " + newRoutes + ", a2dp=" + isBluetoothA2dpOn()); + Log.v(TAG, "Audio routes updated: " + newRoutes + ", hasActiveBTDevices=" + + mHasActiveBluetoothDevices); if (mSelectedRoute == null || mSelectedRoute == mDefaultAudioVideo || mSelectedRoute == mBluetoothA2dpRoute) { if (forceUseDefaultRoute || mBluetoothA2dpRoute == null) { @@ -277,15 +288,6 @@ public class MediaRouter { return mStreamVolume.get(streamType); } - boolean isBluetoothA2dpOn() { - try { - return mBluetoothA2dpRoute != null && mAudioService.isBluetoothA2dpOn(); - } catch (RemoteException e) { - Log.e(TAG, "Error querying Bluetooth A2DP state", e); - return false; - } - } - void updateDiscoveryRequest() { // What are we looking for today? int routeTypes = 0; @@ -394,7 +396,7 @@ public class MediaRouter { } void updateSelectedRouteForId(String routeId) { - RouteInfo selectedRoute = isBluetoothA2dpOn() + RouteInfo selectedRoute = sStatic.mHasActiveBluetoothDevices ? mBluetoothA2dpRoute : mDefaultAudioVideo; final int count = mRoutes.size(); for (int i = 0; i < count; i++) { @@ -1043,7 +1045,7 @@ public class MediaRouter { Log.v(TAG, "Selecting route: " + route); assert(route != null); final RouteInfo oldRoute = sStatic.mSelectedRoute; - final RouteInfo currentSystemRoute = sStatic.isBluetoothA2dpOn() + final RouteInfo currentSystemRoute = sStatic.mHasActiveBluetoothDevices ? sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo; boolean wasDefaultOrBluetoothRoute = (oldRoute == sStatic.mDefaultAudioVideo || oldRoute == sStatic.mBluetoothA2dpRoute); @@ -1106,7 +1108,8 @@ public class MediaRouter { static void selectDefaultRouteStatic() { // TODO: Be smarter about the route types here; this selects for all valid. - if (sStatic.mSelectedRoute != sStatic.mBluetoothA2dpRoute && sStatic.isBluetoothA2dpOn()) { + if (sStatic.mSelectedRoute != sStatic.mBluetoothA2dpRoute + && sStatic.mHasActiveBluetoothDevices) { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mBluetoothA2dpRoute, false); } else { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mDefaultAudioVideo, false); @@ -1443,13 +1446,8 @@ public class MediaRouter { if (selectedRoute == sStatic.mBluetoothA2dpRoute || selectedRoute == sStatic.mDefaultAudioVideo) { dispatchRouteVolumeChanged(selectedRoute); - } else if (sStatic.mBluetoothA2dpRoute != null) { - try { - dispatchRouteVolumeChanged(sStatic.mAudioService.isBluetoothA2dpOn() ? - sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo); - } catch (RemoteException e) { - Log.e(TAG, "Error checking Bluetooth A2DP state to report volume change", e); - } + } else if (sStatic.mHasActiveBluetoothDevices) { + dispatchRouteVolumeChanged(sStatic.mBluetoothA2dpRoute); } else { dispatchRouteVolumeChanged(sStatic.mDefaultAudioVideo); } @@ -3172,4 +3170,17 @@ public class MediaRouter { } } } + + static class BluetoothStateChangedReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + switch (intent.getAction()) { + case BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED: + case BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED: + sStatic.mHasActiveBluetoothDevices = + intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) != null; + break; + } + } + } } diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 7afa81aa047d..8a13969c16c6 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -439,6 +439,7 @@ class BluetoothRouteProvider { } } } + private class BluetoothBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { |