From 63e26b3c75f8f3e51496961a7d01799460cbe1fa Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Thu, 5 Jan 2023 11:13:01 +0000 Subject: [PATCH] DO NOT MERGE: Downbranch merge conflict[Output Switcher] Add support for device disabled reason Add support in MediaDevice for device status, which used for showing under subtext. **The change will be guarded by flag and only enable in master branch. Test: atest MediaOutputAdapterTest MediaOutputControllerTest MediaOutputBaseDialogTest MediaOutputDialogTest Bug:260021954 Change-Id: Ia6e8fd4f7ca066e85c4afcc688ff1875c9e60964 Merged-In: Ia6e8fd4f7ca066e85c4afcc688ff1875c9e60964 --- .../settingslib/media/MediaDevice.java | 18 +++++++++++++++ packages/SystemUI/res/values/strings.xml | 2 ++ .../media/dialog/MediaOutputAdapter.java | 23 +++++++++++++++++++ .../media/dialog/MediaOutputController.java | 4 ++++ .../media/dialog/MediaOutputAdapterTest.java | 20 ++++++++++++++++ 5 files changed, 67 insertions(+) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index d6586db1b50aa..d9d7cc9085fa2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -184,6 +184,24 @@ public abstract class MediaDevice implements Comparable { */ public abstract String getId(); + /** + * Get disabled reason of device + * + * @return disabled reason of device + */ + public int getDisableReason() { + return -1; + } + + /** + * Checks if device is has disabled reason + * + * @return true if device has disabled reason + */ + public boolean hasDisabledReason() { + return false; + } + /** * Checks if device is suggested device from application * diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index e60835cc5ea42..5607c6366309c 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2428,6 +2428,8 @@ Speakers & Displays Suggested Devices + + Requires premium account 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 51b5a3d1a08c0..769e0c8ab3c2d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java @@ -16,17 +16,21 @@ package com.android.systemui.media.dialog; +import android.content.Context; import android.content.res.ColorStateList; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; +import android.os.Build; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; +import androidx.annotation.DoNotInline; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.core.widget.CompoundButtonCompat; import androidx.recyclerview.widget.RecyclerView; @@ -186,6 +190,17 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { mCurrentActivePosition = position; updateFullItemClickListener(v -> onItemClick(v, device)); setSingleLineLayout(getItemTitle(device)); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + && mController.isSubStatusSupported() && device.hasDisabledReason()) { + //update to subtext with device status + setUpDeviceIcon(device); + mSubTitleText.setText( + Api34Impl.composeDisabledReason(device.getDisableReason(), mContext)); + updateConnectionFailedStatusIcon(); + updateFullItemClickListener(null); + setTwoLineLayout(device, false /* bFocused */, false /* showSeekBar */, + false /* showProgressBar */, true /* showSubtitle */, + true /* showStatus */); } else if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) { setUpDeviceIcon(device); updateConnectionFailedStatusIcon(); @@ -389,4 +404,12 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { mTitleText.setText(groupDividerTitle); } } + + @RequiresApi(34) + private static class Api34Impl { + @DoNotInline + static String composeDisabledReason(int reason, Context context) { + return ""; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index f95da273fae60..1587e6248595c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -757,6 +757,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_ROUTES_PROCESSING); } + public boolean isSubStatusSupported() { + return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_DEVICE_STATUS); + } + List getGroupMediaDevices() { final List selectedDevices = getSelectedMediaDevice(); final List selectableDevices = getSelectableMediaDevice(); 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 7c3c9d2a1bb18..ee8469df45cca 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 @@ -57,6 +57,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { private static final String TEST_DEVICE_ID_1 = "test_device_id_1"; private static final String TEST_DEVICE_ID_2 = "test_device_id_2"; private static final String TEST_SESSION_NAME = "test_session_name"; + private static final int TEST_MAX_VOLUME = 20; private static final int TEST_CURRENT_VOLUME = 10; @@ -78,6 +79,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Before public void setUp() { when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(false); + when(mMediaOutputController.isSubStatusSupported()).thenReturn(false); when(mMediaOutputController.getMediaItemList()).thenReturn(mMediaItems); when(mMediaOutputController.getMediaDevices()).thenReturn(mMediaDevices); when(mMediaOutputController.hasAdjustVolumeUserRestriction()).thenReturn(false); @@ -403,6 +405,24 @@ public class MediaOutputAdapterTest extends SysuiTestCase { assertThat(mViewHolder.mTwoLineTitleText.getText()).isEqualTo(TEST_DEVICE_NAME_2); } + @Test + public void subStatusSupported_onBindViewHolder_bindFailedStateDevice_verifyView() { + String deviceStatus = ""; + when(mMediaOutputController.isSubStatusSupported()).thenReturn(true); + when(mMediaDevice2.hasDisabledReason()).thenReturn(true); + when(mMediaDevice2.getDisableReason()).thenReturn(-1); + mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1); + + assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mSubTitleText.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mTwoLineTitleText.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mSubTitleText.getText()).isEqualTo(deviceStatus); + assertThat(mViewHolder.mTwoLineTitleText.getText()).isEqualTo(TEST_DEVICE_NAME_2); + } + @Test public void onBindViewHolder_inTransferring_bindTransferringDevice_verifyView() { when(mMediaOutputController.isAnyDeviceTransferring()).thenReturn(true);