From 08ca09161449745903f49e2464226dc05cde0370 Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Fri, 3 Feb 2023 15:29:03 +0000 Subject: [PATCH 1/2] [Output Switcher] Add new support for AVR device Add placeholder method for isHost in MediaDevice. Test: verified on device Bug: 262013662 Change-Id: I10b145ce9519f2d7960314084861d63bb81eedfe --- .../res/drawable/ic_media_avr_device.xml | 40 +++++++++++ .../settingslib/media/ComplexMediaDevice.java | 71 +++++++++++++++++++ .../settingslib/media/InfoMediaManager.java | 4 ++ .../settingslib/media/MediaDevice.java | 18 +++++ 4 files changed, 133 insertions(+) create mode 100644 packages/SettingsLib/res/drawable/ic_media_avr_device.xml create mode 100644 packages/SettingsLib/src/com/android/settingslib/media/ComplexMediaDevice.java diff --git a/packages/SettingsLib/res/drawable/ic_media_avr_device.xml b/packages/SettingsLib/res/drawable/ic_media_avr_device.xml new file mode 100644 index 0000000000000..3de0d8443eb62 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_media_avr_device.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/src/com/android/settingslib/media/ComplexMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/ComplexMediaDevice.java new file mode 100644 index 0000000000000..c38dfe3cca1fb --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/media/ComplexMediaDevice.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.media; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.media.MediaRoute2Info; +import android.media.MediaRouter2Manager; +import android.media.RouteListingPreference; + +import com.android.settingslib.R; + +/** + * ComplexMediaDevice extends MediaDevice to represents device with signals from a number of + * sources. + */ +public class ComplexMediaDevice extends MediaDevice { + + private final String mSummary = ""; + + ComplexMediaDevice(Context context, MediaRouter2Manager routerManager, + MediaRoute2Info info, String packageName, + RouteListingPreference.Item item) { + super(context, routerManager, info, packageName, item); + } + + // MediaRoute2Info.getName was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") + @Override + public String getName() { + return mRouteInfo.getName().toString(); + } + + @Override + public String getSummary() { + return mSummary; + } + + @Override + public Drawable getIcon() { + return mContext.getDrawable(R.drawable.ic_media_avr_device); + } + + @Override + public Drawable getIconWithoutBackground() { + return mContext.getDrawable(R.drawable.ic_media_avr_device); + } + + @Override + public String getId() { + return MediaDeviceUtils.getId(mRouteInfo); + } + + public boolean isConnected() { + return true; + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 77e514f7e0378..85d4fab4170ed 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -22,6 +22,7 @@ import static android.media.MediaRoute2Info.TYPE_DOCK; import static android.media.MediaRoute2Info.TYPE_GROUP; import static android.media.MediaRoute2Info.TYPE_HDMI; import static android.media.MediaRoute2Info.TYPE_HEARING_AID; +import static android.media.MediaRoute2Info.TYPE_REMOTE_AUDIO_VIDEO_RECEIVER; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; import static android.media.MediaRoute2Info.TYPE_UNKNOWN; @@ -562,6 +563,9 @@ public class InfoMediaManager extends MediaManager { route, mPackageName); } break; + case TYPE_REMOTE_AUDIO_VIDEO_RECEIVER: + mediaDevice = new ComplexMediaDevice(mContext, mRouterManager, route, + mPackageName, mPreferenceItemMap.get(route.getId())); default: Log.w(TAG, "addMediaDevice() unknown device type : " + deviceType); break; diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index d24219817ad4f..38387f1de779f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -31,6 +31,7 @@ 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_ONGOING_SESSION; +import static android.media.RouteListingPreference.Item.FLAG_ONGOING_SESSION_MANAGED; import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED; import static android.media.RouteListingPreference.Item.SELECTION_BEHAVIOR_TRANSFER; import static android.media.RouteListingPreference.Item.SUBTEXT_AD_ROUTING_DISALLOWED; @@ -256,6 +257,16 @@ public abstract class MediaDevice implements Comparable { && Api34Impl.hasOngoingSession(mItem); } + /** + * Checks if device is the host for ongoing shared session, which allow user to adjust volume + * + * @return true if device is the host for ongoing shared session + */ + public boolean isHostForOngoingSession() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE + && Api34Impl.isHostForOngoingSession(mItem); + } + /** * Checks if device is suggested device from application * @@ -553,6 +564,13 @@ public abstract class MediaDevice implements Comparable { @RequiresApi(34) private static class Api34Impl { + @DoNotInline + static boolean isHostForOngoingSession(RouteListingPreference.Item item) { + int flags = item != null ? item.getFlags() : 0; + return (flags & FLAG_ONGOING_SESSION) != 0 + && (flags & FLAG_ONGOING_SESSION_MANAGED) != 0; + } + @DoNotInline static boolean isSuggestedDevice(RouteListingPreference.Item item) { return item != null && (item.getFlags() & FLAG_SUGGESTED) != 0; From 8991125562f85ec1a52790fc43f95fd7e646abbd Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Mon, 6 Feb 2023 13:02:33 +0000 Subject: [PATCH 2/2] [Output Switcher] Update isHost check for device use updated method to check if device is isHost. Test: atest MediaOutputAdapterTest MediaOutputControllerTest MediaOutputBaseDialogTest MediaOutputDialogTest Bug: 262013662 Change-Id: I89c0b5eba29051de7d59d8407d453981f5910ce6 --- .../com/android/systemui/media/dialog/MediaOutputAdapter.java | 2 +- .../android/systemui/media/dialog/MediaOutputAdapterTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java index 3b456156507ec..ffcb8c68527dd 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java @@ -204,7 +204,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { && mController.isAdvancedLayoutSupported() && device.hasSubtext()) { boolean isActiveWithOngoingSession = (device.hasOngoingSession() && currentlyConnected); - boolean isHost = mController.isVolumeControlEnabled(device) + boolean isHost = device.isHostForOngoingSession() && isActiveWithOngoingSession; if (isHost) { mCurrentActivePosition = position; diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java index f779845721b38..56e060d25850e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java @@ -440,6 +440,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { when(mMediaOutputController.isSubStatusSupported()).thenReturn(true); when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true); when(mMediaOutputController.isVolumeControlEnabled(mMediaDevice1)).thenReturn(true); + when(mMediaDevice1.isHostForOngoingSession()).thenReturn(true); when(mMediaDevice1.hasSubtext()).thenReturn(true); when(mMediaDevice1.getSubtext()).thenReturn(SUBTEXT_CUSTOM); when(mMediaDevice1.getSubtextString()).thenReturn(TEST_CUSTOM_SUBTEXT);