diff --git a/core/java/com/android/internal/app/MediaRouteControllerDialog.java b/core/java/com/android/internal/app/MediaRouteControllerDialog.java index 5ce3e54561ce1..635a868d359a3 100644 --- a/core/java/com/android/internal/app/MediaRouteControllerDialog.java +++ b/core/java/com/android/internal/app/MediaRouteControllerDialog.java @@ -142,7 +142,11 @@ public class MediaRouteControllerDialog extends AlertDialog { @Override public void onClick(DialogInterface dialogInterface, int id) { if (mRoute.isSelected()) { - mRouter.getDefaultRoute().select(); + if (mRoute.isBluetooth()) { + mRouter.getDefaultRoute().select(); + } else { + mRouter.getFallbackRoute().select(); + } } dismiss(); } diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index d5509c14e09b4..8caba81c09cbf 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -731,6 +731,15 @@ public class MediaRouter { return sStatic.mDefaultAudioVideo; } + /** + * Returns a Bluetooth route if available, otherwise the default route. + * @hide + */ + public RouteInfo getFallbackRoute() { + return (sStatic.mBluetoothA2dpRoute != null) + ? sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo; + } + /** * @hide for use by framework routing UI */ @@ -913,6 +922,19 @@ public class MediaRouter { (route == btRoute || route == sStatic.mDefaultAudioVideo)) { try { sStatic.mAudioService.setBluetoothA2dpOn(route == btRoute); + // TODO: Remove the following logging when no longer needed. + if (route != btRoute) { + StackTraceElement[] callStack = Thread.currentThread().getStackTrace(); + StringBuffer sb = new StringBuffer(); + // callStack[3] is the caller of this method. + for (int i = 3; i < callStack.length; i++) { + StackTraceElement caller = callStack[i]; + sb.append(caller.getClassName() + "." + caller.getMethodName() + + ":" + caller.getLineNumber()).append(" "); + } + Log.w(TAG, "Default route is selected while a BT route is available: pkgName=" + + sStatic.mPackageName + ", callers=" + sb.toString()); + } } catch (RemoteException e) { Log.e(TAG, "Error changing Bluetooth A2DP state", e); } @@ -1998,6 +2020,11 @@ public class MediaRouter { return this == sStatic.mDefaultAudioVideo; } + /** @hide */ + public boolean isBluetooth() { + return this == sStatic.mBluetoothA2dpRoute; + } + /** @hide */ public void select() { selectRouteStatic(mSupportedTypes, this, true); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java index b89a77b0b3d62..2bf62bb043187 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java @@ -182,7 +182,7 @@ public class CastControllerImpl implements CastController { Log.w(TAG, "Projection is no longer active: " + projection); } } else { - mMediaRouter.getDefaultRoute().select(); + mMediaRouter.getFallbackRoute().select(); } } diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java index 9d92cbcb2d03e..a6ea6b2e1aeb3 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -111,7 +111,7 @@ public final class MediaProjectionManagerService extends SystemService mProjectionGrant.stop(); } if (mMediaRouteInfo != null) { - mMediaRouter.getDefaultRoute().select(); + mMediaRouter.getFallbackRoute().select(); } mProjectionToken = projection.asBinder(); mProjectionGrant = projection;