From 027d957f92f0972a113c557ee4bc6c1438315d87 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Tue, 27 Apr 2021 15:53:38 +0900 Subject: [PATCH] Check the device type instead of the object reference Also print a log when restore route to default while a bluetooth route is avaialble. Bug: 176386259 Test: build Change-Id: I4a974438040595597fbf4dcb0ec57d49351540ef --- media/java/android/media/MediaRouter.java | 47 ++++++++++++------- .../server/media/AudioPlayerStateMonitor.java | 6 +-- .../server/media/MediaRouterService.java | 2 + 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 480e2eaaf40f5..4c8a8fa4a5544 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -78,6 +78,7 @@ import java.util.concurrent.CopyOnWriteArrayList; public class MediaRouter { private static final String TAG = "MediaRouter"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private static final boolean DEBUG_RESTORE_ROUTE = true; static class Static implements DisplayManager.DisplayListener { final String mPackageName; @@ -261,8 +262,8 @@ public class MediaRouter { if (audioRoutesChanged) { Log.v(TAG, "Audio routes updated: " + newRoutes + ", a2dp=" + isBluetoothA2dpOn()); - if (mSelectedRoute == null || mSelectedRoute == mDefaultAudioVideo - || mSelectedRoute == mBluetoothA2dpRoute) { + if (mSelectedRoute == null || mSelectedRoute.isDefault() + || mSelectedRoute.isBluetooth()) { if (forceUseDefaultRoute || mBluetoothA2dpRoute == null) { selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo, false); } else { @@ -665,12 +666,16 @@ public class MediaRouter { // Skip restoring route if the selected route is not a system audio route, // MediaRouter is initializing, or mClient was changed. if (Client.this != mClient || mSelectedRoute == null - || (mSelectedRoute != mDefaultAudioVideo - && mSelectedRoute != mBluetoothA2dpRoute)) { + || (!mSelectedRoute.isDefault() && !mSelectedRoute.isBluetooth())) { return; } - if (DEBUG) { - Log.d(TAG, "onRestoreRoute() : route=" + mSelectedRoute); + if (DEBUG_RESTORE_ROUTE) { + if (mSelectedRoute.isDefault() && mBluetoothA2dpRoute != null) { + Log.d(TAG, "onRestoreRoute() : selectedRoute=" + mSelectedRoute + + ", a2dpRoute=" + mBluetoothA2dpRoute); + } else { + Log.d(TAG, "onRestoreRoute() : route=" + mSelectedRoute); + } } mSelectedRoute.select(); }); @@ -690,9 +695,12 @@ public class MediaRouter { @Override public void onGlobalA2dpChanged(boolean a2dpOn) { mHandler.post(() -> { - if (mSelectedRoute == mDefaultAudioVideo && a2dpOn) { + if (mSelectedRoute == null) { + return; + } + if (mSelectedRoute.isDefault() && a2dpOn) { setSelectedRoute(mBluetoothA2dpRoute, /*explicit=*/false); - } else if (mSelectedRoute == mBluetoothA2dpRoute && !a2dpOn) { + } else if (mSelectedRoute.isBluetooth() && !a2dpOn) { setSelectedRoute(mDefaultAudioVideo, /*explicit=*/false); } }); @@ -1057,8 +1065,8 @@ public class MediaRouter { final RouteInfo oldRoute = sStatic.mSelectedRoute; final RouteInfo currentSystemRoute = sStatic.isBluetoothA2dpOn() ? sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo; - boolean wasDefaultOrBluetoothRoute = (oldRoute == sStatic.mDefaultAudioVideo - || oldRoute == sStatic.mBluetoothA2dpRoute); + boolean wasDefaultOrBluetoothRoute = (oldRoute != null) + && (oldRoute.isDefault() || oldRoute.isBluetooth()); if (oldRoute == route && (!wasDefaultOrBluetoothRoute || route == currentSystemRoute)) { return; @@ -1070,14 +1078,17 @@ public class MediaRouter { return; } - final RouteInfo btRoute = sStatic.mBluetoothA2dpRoute; - if (sStatic.isPlaybackActive() && btRoute != null && (types & ROUTE_TYPE_LIVE_AUDIO) != 0 - && (route == btRoute || route == sStatic.mDefaultAudioVideo)) { + if (sStatic.isPlaybackActive() && sStatic.mBluetoothA2dpRoute != null + && (types & ROUTE_TYPE_LIVE_AUDIO) != 0 + && (route.isBluetooth() || route.isDefault())) { try { - sStatic.mAudioService.setBluetoothA2dpOn(route == btRoute); + sStatic.mAudioService.setBluetoothA2dpOn(route.isBluetooth()); } catch (RemoteException e) { Log.e(TAG, "Error changing Bluetooth A2DP state", e); } + } else if (DEBUG_RESTORE_ROUTE) { + Log.i(TAG, "Skip setBluetoothA2dpOn(): types=" + types + ", isPlaybackActive()=" + + sStatic.isPlaybackActive() + ", BT route=" + sStatic.mBluetoothA2dpRoute); } final WifiDisplay activeDisplay = @@ -1118,7 +1129,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.isBluetoothA2dpOn() && sStatic.mSelectedRoute != null + && !sStatic.mSelectedRoute.isBluetooth()) { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mBluetoothA2dpRoute, false); } else { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mDefaultAudioVideo, false); @@ -1452,8 +1464,7 @@ public class MediaRouter { final RouteInfo selectedRoute = sStatic.mSelectedRoute; if (selectedRoute == null) return; - if (selectedRoute == sStatic.mBluetoothA2dpRoute || - selectedRoute == sStatic.mDefaultAudioVideo) { + if (selectedRoute.isBluetooth() || selectedRoute.isDefault()) { dispatchRouteVolumeChanged(selectedRoute); } else if (sStatic.mBluetoothA2dpRoute != null) { dispatchRouteVolumeChanged(sStatic.mIsBluetoothA2dpOn @@ -2225,7 +2236,7 @@ public class MediaRouter { /** @hide */ public boolean isBluetooth() { - return this == sStatic.mBluetoothA2dpRoute; + return mDeviceType == RouteInfo.DEVICE_TYPE_BLUETOOTH; } /** @hide */ diff --git a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java index b9822fcb096ac..d285c437a3df3 100644 --- a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java +++ b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java @@ -258,16 +258,16 @@ class AudioPlayerStateMonitor { if (mActiveAudioUids.size() > 0 && !mActiveAudioUids.contains(mSortedAudioPlaybackClientUids.get(0))) { int firstActiveUid = -1; - int firatActiveUidIndex = -1; + int firstActiveUidIndex = -1; for (int i = 1; i < mSortedAudioPlaybackClientUids.size(); ++i) { int uid = mSortedAudioPlaybackClientUids.get(i); if (mActiveAudioUids.contains(uid)) { - firatActiveUidIndex = i; + firstActiveUidIndex = i; firstActiveUid = uid; break; } } - for (int i = firatActiveUidIndex; i > 0; --i) { + for (int i = firstActiveUidIndex; i > 0; --i) { mSortedAudioPlaybackClientUids.set(i, mSortedAudioPlaybackClientUids.get(i - 1)); } diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index 384bc99cb1151..9f02c3caa388d 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -907,6 +907,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub mActiveBluetoothDevice = btDevice; mGlobalBluetoothA2dpOn = btDevice != null; if (wasA2dpOn != mGlobalBluetoothA2dpOn) { + Slog.d(TAG, "GlobalBluetoothA2dpOn is changed to '" + + mGlobalBluetoothA2dpOn + "'"); UserRecord userRecord = mUserRecords.get(mCurrentUserId); if (userRecord != null) { for (ClientRecord cr : userRecord.mClientRecords) {