diff options
| author | 2022-12-29 10:59:07 +0000 | |
|---|---|---|
| committer | 2023-01-09 08:44:10 +0000 | |
| commit | 21f94dee0a5f85a149b3524a66f24b7869467afc (patch) | |
| tree | 4f3901cd08823eab37e70f6acb53c1285af4e0f1 | |
| parent | 798dc06b5c3119433b0e2a60e309a5219c763c23 (diff) | |
[Output Switcher] Add RouteListingPreference.Item in MediaDevice
Attach Preference Item in MediaDevice, used for check if device is
suggested device and device status in future.
Bug: 258141461
Test: make RunSettingsLibRoboTests -j40
Change-Id: Ibe94056228c3b67b814eca8a1e28abef0d691ae1
6 files changed, 82 insertions, 13 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java index 39034047d6eb..cd6609ec463e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java @@ -39,7 +39,7 @@ public class BluetoothMediaDevice extends MediaDevice { BluetoothMediaDevice(Context context, CachedBluetoothDevice device, MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName) { - super(context, routerManager, info, packageName); + super(context, routerManager, info, packageName, null); mCachedDevice = device; mAudioManager = context.getSystemService(AudioManager.class); initDeviceRecord(); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index 1b5ce8fee5c3..6fb5555bb50e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -25,6 +25,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import android.media.RouteListingPreference; import androidx.annotation.VisibleForTesting; @@ -40,11 +41,16 @@ public class InfoMediaDevice extends MediaDevice { private static final String TAG = "InfoMediaDevice"; InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, - String packageName) { - super(context, routerManager, info, packageName); + String packageName, RouteListingPreference.Item item) { + super(context, routerManager, info, packageName, item); initDeviceRecord(); } + InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, + String packageName) { + this(context, routerManager, info, packageName, null); + } + @Override public String getName() { return mRouteInfo.getName().toString(); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index c7bfe12b3838..2bdbb16238e6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -58,7 +58,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -82,6 +84,8 @@ public class InfoMediaManager extends MediaManager { private MediaDevice mCurrentConnectedDevice; private LocalBluetoothManager mBluetoothManager; + private final Map<String, RouteListingPreference.Item> mPreferenceItemMap = + new ConcurrentHashMap<>(); public InfoMediaManager(Context context, String packageName, Notification notification, LocalBluetoothManager localBluetoothManager) { @@ -248,7 +252,7 @@ public class InfoMediaManager extends MediaManager { if (info != null) { for (MediaRoute2Info route : mRouterManager.getSelectableRoutes(info)) { deviceList.add(new InfoMediaDevice(mContext, mRouterManager, - route, mPackageName)); + route, mPackageName, mPreferenceItemMap.get(route.getId()))); } return deviceList; } @@ -275,7 +279,7 @@ public class InfoMediaManager extends MediaManager { if (info != null) { for (MediaRoute2Info route : mRouterManager.getDeselectableRoutes(info)) { deviceList.add(new InfoMediaDevice(mContext, mRouterManager, - route, mPackageName)); + route, mPackageName, mPreferenceItemMap.get(route.getId()))); Log.d(TAG, route.getName() + " is deselectable for " + mPackageName); } return deviceList; @@ -302,7 +306,7 @@ public class InfoMediaManager extends MediaManager { if (info != null) { for (MediaRoute2Info route : mRouterManager.getSelectedRoutes(info)) { deviceList.add(new InfoMediaDevice(mContext, mRouterManager, - route, mPackageName)); + route, mPackageName, mPreferenceItemMap.get(route.getId()))); } return deviceList; } @@ -510,7 +514,7 @@ public class InfoMediaManager extends MediaManager { case TYPE_GROUP: //TODO(b/148765806): use correct device type once api is ready. mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route, - mPackageName); + mPackageName, mPreferenceItemMap.get(route.getId())); if (!TextUtils.isEmpty(mPackageName) && getRoutingSessionInfo().getSelectedRoutes().contains(route.getId())) { mediaDevice.setState(STATE_SELECTED); @@ -601,6 +605,16 @@ public class InfoMediaManager extends MediaManager { public void onSessionUpdated(RoutingSessionInfo sessionInfo) { refreshDevices(); } + + @Override + public void onRouteListingPreferenceUpdated( + String packageName, + RouteListingPreference routeListingPreference) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + Api34Impl.onRouteListingPreferenceUpdated(packageName, routeListingPreference, + mPreferenceItemMap); + } + } } @RequiresApi(34) @@ -666,5 +680,18 @@ public class InfoMediaManager extends MediaManager { return routeListingPreference != null && !routeListingPreference.getUseSystemOrdering(); } + + @DoNotInline + static void onRouteListingPreferenceUpdated( + String packageName, + RouteListingPreference routeListingPreference, + Map<String, RouteListingPreference.Item> preferenceItemMap) { + preferenceItemMap.clear(); + if (routeListingPreference != null) { + routeListingPreference.getItems().forEach((item) -> { + preferenceItemMap.put(item.getRouteId(), item); + }); + } + } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 3ba51d2a2602..b73e7a3628db 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -30,6 +30,7 @@ import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; +import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE; import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_SELECTED; @@ -39,10 +40,14 @@ import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; import android.media.NearbyDevice; +import android.media.RouteListingPreference; +import android.os.Build; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.DoNotInline; import androidx.annotation.IntDef; +import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; import java.lang.annotation.Retention; @@ -87,14 +92,16 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { protected final Context mContext; protected final MediaRoute2Info mRouteInfo; protected final MediaRouter2Manager mRouterManager; + protected final RouteListingPreference.Item mItem; protected final String mPackageName; MediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, - String packageName) { + String packageName, RouteListingPreference.Item item) { mContext = context; mRouteInfo = info; mRouterManager = routerManager; mPackageName = packageName; + mItem = item; setType(info); } @@ -180,10 +187,21 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { /** * Get unique ID that represent MediaDevice + * * @return unique id of MediaDevice */ public abstract String getId(); + /** + * Checks if device is suggested device from application + * + * @return true if device is suggested device + */ + public boolean isSuggestedDevice() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE + && Api34Impl.isSuggestedDevice(mItem); + } + void setConnectedRecord() { mConnectedRecord++; ConnectionRecordManager.getInstance().setConnectionRecord(mContext, getId(), @@ -466,4 +484,12 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { final MediaDevice otherDevice = (MediaDevice) obj; return otherDevice.getId().equals(getId()); } + + @RequiresApi(34) + private static class Api34Impl { + @DoNotInline + static boolean isSuggestedDevice(RouteListingPreference.Item item) { + return item != null && item.getFlags() == FLAG_SUGGESTED_ROUTE; + } + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index 921c24526445..de16d4add0ea 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -51,7 +51,7 @@ public class PhoneMediaDevice extends MediaDevice { PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName) { - super(context, routerManager, info, packageName); + super(context, routerManager, info, packageName, null); mDeviceIconUtil = new DeviceIconUtil(); initDeviceRecord(); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 92600131b076..2c8aa2636699 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -257,14 +257,17 @@ public class InfoMediaManagerTest { Build.VERSION_CODES.UPSIDE_DOWN_CAKE); final List<RouteListingPreference.Item> preferenceItemList = new ArrayList<>(); RouteListingPreference.Item item1 = new RouteListingPreference.Item.Builder( - TEST_ID_4).build(); + TEST_ID_4).setFlags(RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE).build(); RouteListingPreference.Item item2 = new RouteListingPreference.Item.Builder( TEST_ID_3).build(); preferenceItemList.add(item1); preferenceItemList.add(item2); + + RouteListingPreference routeListingPreference = + new RouteListingPreference.Builder().setItems( + preferenceItemList).setUseSystemOrdering(false).build(); when(mRouterManager.getRouteListingPreference(TEST_PACKAGE_NAME)) - .thenReturn(new RouteListingPreference.Builder().setItems( - preferenceItemList).setUseSystemOrdering(false).build()); + .thenReturn(routeListingPreference); final List<MediaRoute2Info> selectedRoutes = new ArrayList<>(); final MediaRoute2Info info = mock(MediaRoute2Info.class); @@ -284,11 +287,13 @@ public class InfoMediaManagerTest { setTransferableRoutesList(); mInfoMediaManager.mRouterManager = mRouterManager; - + mInfoMediaManager.mMediaRouterCallback.onRouteListingPreferenceUpdated(TEST_PACKAGE_NAME, + routeListingPreference); mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated(); assertThat(mInfoMediaManager.mMediaDevices.get(0).getId()).isEqualTo(TEST_ID); assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_4); + assertThat(mInfoMediaManager.mMediaDevices.get(1).isSuggestedDevice()).isTrue(); assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_3); assertThat(mInfoMediaManager.mMediaDevices).hasSize(3); } @@ -620,6 +625,7 @@ public class InfoMediaManagerTest { mShadowRouter2Manager.setRoutingSessions(routingSessionInfos); mShadowRouter2Manager.setDeselectableRoutes(mediaRoute2Infos); when(mediaRoute2Info.getName()).thenReturn(TEST_NAME); + when(mediaRoute2Info.getId()).thenReturn(TEST_ID); final List<MediaDevice> mediaDevices = mInfoMediaManager.getDeselectableMediaDevice(); @@ -873,21 +879,25 @@ public class InfoMediaManagerTest { final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER); + when(route2Info.getId()).thenReturn(TEST_ID); mInfoMediaManager.addMediaDevice(route2Info); assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof InfoMediaDevice).isTrue(); when(route2Info.getType()).thenReturn(TYPE_USB_DEVICE); + when(route2Info.getId()).thenReturn(TEST_ID); mInfoMediaManager.mMediaDevices.clear(); mInfoMediaManager.addMediaDevice(route2Info); assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); when(route2Info.getType()).thenReturn(TYPE_WIRED_HEADSET); + when(route2Info.getId()).thenReturn(TEST_ID); mInfoMediaManager.mMediaDevices.clear(); mInfoMediaManager.addMediaDevice(route2Info); assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP); when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00"); + when(route2Info.getId()).thenReturn(TEST_ID); when(mLocalBluetoothManager.getCachedDeviceManager()) .thenReturn(cachedBluetoothDeviceManager); when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))) |