DO NOT MERGE: Downbranch merge conflict[Output Switcher] Add support for device disabled reason am: 63e26b3c75
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20895033 Change-Id: I99d44bb2d01b1b1910bf28a97915df8e21f936d6 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -184,6 +184,24 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
|
|||||||
*/
|
*/
|
||||||
public abstract String getId();
|
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
|
* Checks if device is suggested device from application
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -2428,6 +2428,8 @@
|
|||||||
<string name="media_output_group_title_speakers_and_displays">Speakers & Displays</string>
|
<string name="media_output_group_title_speakers_and_displays">Speakers & Displays</string>
|
||||||
<!-- Title for Suggested Devices group. [CHAR LIMIT=NONE] -->
|
<!-- Title for Suggested Devices group. [CHAR LIMIT=NONE] -->
|
||||||
<string name="media_output_group_title_suggested_device">Suggested Devices</string>
|
<string name="media_output_group_title_suggested_device">Suggested Devices</string>
|
||||||
|
<!-- Sub status indicates device need premium account. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="media_output_status_require_premium">Requires premium account</string>
|
||||||
|
|
||||||
<!-- Media Output Broadcast Dialog -->
|
<!-- Media Output Broadcast Dialog -->
|
||||||
<!-- Title for Broadcast First Notify Dialog [CHAR LIMIT=60] -->
|
<!-- Title for Broadcast First Notify Dialog [CHAR LIMIT=60] -->
|
||||||
|
|||||||
@@ -16,17 +16,21 @@
|
|||||||
|
|
||||||
package com.android.systemui.media.dialog;
|
package com.android.systemui.media.dialog;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.DoNotInline;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.core.widget.CompoundButtonCompat;
|
import androidx.core.widget.CompoundButtonCompat;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
@@ -186,6 +190,17 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
|||||||
mCurrentActivePosition = position;
|
mCurrentActivePosition = position;
|
||||||
updateFullItemClickListener(v -> onItemClick(v, device));
|
updateFullItemClickListener(v -> onItemClick(v, device));
|
||||||
setSingleLineLayout(getItemTitle(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) {
|
} else if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) {
|
||||||
setUpDeviceIcon(device);
|
setUpDeviceIcon(device);
|
||||||
updateConnectionFailedStatusIcon();
|
updateConnectionFailedStatusIcon();
|
||||||
@@ -389,4 +404,12 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
|||||||
mTitleText.setText(groupDividerTitle);
|
mTitleText.setText(groupDividerTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiresApi(34)
|
||||||
|
private static class Api34Impl {
|
||||||
|
@DoNotInline
|
||||||
|
static String composeDisabledReason(int reason, Context context) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -757,6 +757,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
|||||||
return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_ROUTES_PROCESSING);
|
return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_ROUTES_PROCESSING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSubStatusSupported() {
|
||||||
|
return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_DEVICE_STATUS);
|
||||||
|
}
|
||||||
|
|
||||||
List<MediaDevice> getGroupMediaDevices() {
|
List<MediaDevice> getGroupMediaDevices() {
|
||||||
final List<MediaDevice> selectedDevices = getSelectedMediaDevice();
|
final List<MediaDevice> selectedDevices = getSelectedMediaDevice();
|
||||||
final List<MediaDevice> selectableDevices = getSelectableMediaDevice();
|
final List<MediaDevice> selectableDevices = getSelectableMediaDevice();
|
||||||
|
|||||||
@@ -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_1 = "test_device_id_1";
|
||||||
private static final String TEST_DEVICE_ID_2 = "test_device_id_2";
|
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 String TEST_SESSION_NAME = "test_session_name";
|
||||||
|
|
||||||
private static final int TEST_MAX_VOLUME = 20;
|
private static final int TEST_MAX_VOLUME = 20;
|
||||||
private static final int TEST_CURRENT_VOLUME = 10;
|
private static final int TEST_CURRENT_VOLUME = 10;
|
||||||
|
|
||||||
@@ -78,6 +79,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(false);
|
when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(false);
|
||||||
|
when(mMediaOutputController.isSubStatusSupported()).thenReturn(false);
|
||||||
when(mMediaOutputController.getMediaItemList()).thenReturn(mMediaItems);
|
when(mMediaOutputController.getMediaItemList()).thenReturn(mMediaItems);
|
||||||
when(mMediaOutputController.getMediaDevices()).thenReturn(mMediaDevices);
|
when(mMediaOutputController.getMediaDevices()).thenReturn(mMediaDevices);
|
||||||
when(mMediaOutputController.hasAdjustVolumeUserRestriction()).thenReturn(false);
|
when(mMediaOutputController.hasAdjustVolumeUserRestriction()).thenReturn(false);
|
||||||
@@ -403,6 +405,24 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
|
|||||||
assertThat(mViewHolder.mTwoLineTitleText.getText()).isEqualTo(TEST_DEVICE_NAME_2);
|
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
|
@Test
|
||||||
public void onBindViewHolder_inTransferring_bindTransferringDevice_verifyView() {
|
public void onBindViewHolder_inTransferring_bindTransferringDevice_verifyView() {
|
||||||
when(mMediaOutputController.isAnyDeviceTransferring()).thenReturn(true);
|
when(mMediaOutputController.isAnyDeviceTransferring()).thenReturn(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user