From b552048fd7e900e209df11adc828aab0d1f2e1e9 Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Wed, 4 Aug 2021 08:01:24 +0000 Subject: [PATCH] Paired BT devices are not displaying in volume control panel -Add selected device into list -getTransferableRoutes() logic is changed at ag/15426495 Bug: 195266049 Test: make -j50 RunSettingsLibRoboTests ROBOTEST_FILTER=InfoMediaManagerTest Change-Id: I127bf7fabf42bbbd7e90a9193bf1f4ff5a35dc6f --- .../settingslib/media/InfoMediaManager.java | 67 +++++++++++-------- .../settingslib/media/LocalMediaManager.java | 3 + 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 79446e430d4fd..ed8d524b01326 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -44,6 +44,8 @@ import android.os.Build; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.RequiresApi; + import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -56,6 +58,7 @@ import java.util.concurrent.Executors; /** * InfoMediaManager provide interface to get InfoMediaDevice list. */ +@RequiresApi(Build.VERSION_CODES.R) public class InfoMediaManager extends MediaManager { private static final String TAG = "InfoMediaManager"; @@ -145,9 +148,16 @@ public class InfoMediaManager extends MediaManager { } private RoutingSessionInfo getRoutingSessionInfo() { - final List sessionInfos = - mRouterManager.getRoutingSessions(mPackageName); + return getRoutingSessionInfo(mPackageName); + } + private RoutingSessionInfo getRoutingSessionInfo(String packageName) { + final List sessionInfos = + mRouterManager.getRoutingSessions(packageName); + + if (sessionInfos == null || sessionInfos.isEmpty()) { + return null; + } return sessionInfos.get(sessionInfos.size() - 1); } @@ -367,33 +377,13 @@ public class InfoMediaManager extends MediaManager { } boolean shouldDisableMediaOutput(String packageName) { - boolean shouldDisableMediaOutput = false; if (TextUtils.isEmpty(packageName)) { Log.w(TAG, "shouldDisableMediaOutput() package name is null or empty!"); - return false; + return true; } - final List infos = mRouterManager.getTransferableRoutes(packageName); - if (infos.size() == 1) { - final MediaRoute2Info info = infos.get(0); - final int deviceType = info.getType(); - switch (deviceType) { - case TYPE_UNKNOWN: - case TYPE_REMOTE_TV: - case TYPE_REMOTE_SPEAKER: - case TYPE_GROUP: - shouldDisableMediaOutput = true; - break; - default: - shouldDisableMediaOutput = false; - break; - } - } - if (DEBUG) { - Log.d(TAG, "shouldDisableMediaOutput() MediaRoute2Info size : " + infos.size() - + ", package name : " + packageName + ", shouldDisableMediaOutput : " - + shouldDisableMediaOutput); - } - return shouldDisableMediaOutput; + + // Disable when there is no transferable route + return mRouterManager.getTransferableRoutes(packageName).isEmpty(); } @TargetApi(Build.VERSION_CODES.R) @@ -456,7 +446,7 @@ public class InfoMediaManager extends MediaManager { } private void buildAvailableRoutes() { - for (MediaRoute2Info route : mRouterManager.getTransferableRoutes(mPackageName)) { + for (MediaRoute2Info route : getAvailableRoutes(mPackageName)) { if (DEBUG) { Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : " + route.getVolume() + ", type : " + route.getType()); @@ -465,6 +455,29 @@ public class InfoMediaManager extends MediaManager { } } + private List getAvailableRoutes(String packageName) { + final List infos = new ArrayList<>(); + RoutingSessionInfo routingSessionInfo = getRoutingSessionInfo(packageName); + if (routingSessionInfo != null) { + infos.addAll(mRouterManager.getSelectedRoutes(routingSessionInfo)); + } + final List transferableRoutes = + mRouterManager.getTransferableRoutes(packageName); + for (MediaRoute2Info transferableRoute : transferableRoutes) { + boolean alreadyAdded = false; + for (MediaRoute2Info mediaRoute2Info : infos) { + if (TextUtils.equals(transferableRoute.getId(), mediaRoute2Info.getId())) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + infos.add(transferableRoute); + } + } + return infos; + } + @VisibleForTesting void addMediaDevice(MediaRoute2Info route) { final int deviceType = route.getType(); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index a8da2c0ba269a..22001c9c925a8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -22,11 +22,13 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.RoutingSessionInfo; +import android.os.Build; import android.text.TextUtils; import android.util.Log; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.bluetooth.A2dpProfile; @@ -49,6 +51,7 @@ import java.util.concurrent.CopyOnWriteArrayList; /** * LocalMediaManager provide interface to get MediaDevice list and transfer media to MediaDevice. */ +@RequiresApi(Build.VERSION_CODES.R) public class LocalMediaManager implements BluetoothCallback { private static final Comparator COMPARATOR = Comparator.naturalOrder(); private static final String TAG = "LocalMediaManager";