From 2942e4b58430f63c016c79e34ba768021220eada Mon Sep 17 00:00:00 2001 From: Hyundo Moon Date: Wed, 13 Oct 2021 16:55:03 +0900 Subject: [PATCH] MediaRouter: Route setBluetoothA2dpOn() via MediaRouterService The direct binder usage of AudioService.setBluetoothA2dpOn() is now blocked by permission for security reasons. This CL routes the usage to the MediaRouterService. Bug: 181962322, Bug: 189176702 Test: GMM can play navigation sound when BT is connected Change-Id: Ib13c224a0d412ef6d802eeaadd246649c819c26f --- .../android/media/IMediaRouterService.aidl | 1 + media/java/android/media/MediaRouter.java | 3 ++- .../server/media/MediaRouterService.java | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index 48289ecde9e0e..25b582d2fc8df 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -39,6 +39,7 @@ interface IMediaRouterService { MediaRouterClientState getState(IMediaRouterClient client); boolean isPlaybackActive(IMediaRouterClient client); + void setBluetoothA2dpOn(IMediaRouterClient client, boolean on); void setDiscoveryRequest(IMediaRouterClient client, int routeTypes, boolean activeScan); void setSelectedRoute(IMediaRouterClient client, String routeId, boolean explicit); void requestSetVolume(IMediaRouterClient client, String routeId, int volume); diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 2986f7c75f4df..dfdfeacb065ac 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -1070,7 +1070,8 @@ public class MediaRouter { && (types & ROUTE_TYPE_LIVE_AUDIO) != 0 && (route.isBluetooth() || route.isDefault())) { try { - sStatic.mAudioService.setBluetoothA2dpOn(route.isBluetooth()); + sStatic.mMediaRouterService.setBluetoothA2dpOn(sStatic.mClient, + route.isBluetooth()); } catch (RemoteException e) { Log.e(TAG, "Error changing Bluetooth A2DP state", e); } diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index a57d7db0ec54f..7502afc8cd824 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -336,6 +336,25 @@ public final class MediaRouterService extends IMediaRouterService.Stub } } + // Binder call + @Override + public void setBluetoothA2dpOn(IMediaRouterClient client, boolean on) { + if (client == null) { + throw new IllegalArgumentException("client must not be null"); + } + + final long token = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + mAudioService.setBluetoothA2dpOn(on); + } + } catch (RemoteException ex) { + Slog.w(TAG, "RemoteException while calling setBluetoothA2dpOn. on=" + on); + } finally { + Binder.restoreCallingIdentity(token); + } + } + // Binder call @Override public void setDiscoveryRequest(IMediaRouterClient client,