From 95bd75e97b96a84fd0b141657f70873a53b66ac2 Mon Sep 17 00:00:00 2001 From: timhypeng Date: Fri, 21 Feb 2020 13:54:45 +0800 Subject: [PATCH] Append status to title for the disconnected Bluetooth device -Set gray color for status -Remove status text in subtitle -Add test cases Bug: 149176483 Test: make -j42 RunSettingsRoboTests Change-Id: I5ebb4e080f43d4c0fc00d87a4732ace76c2d806e --- res/values/strings.xml | 2 ++ .../settings/media/MediaOutputSlice.java | 25 ++++++++++++++++--- .../settings/media/MediaOutputSliceTest.java | 21 ++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9b808083c09..7ff33dd550f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11636,6 +11636,8 @@ Switch output Currently playing on %1$s + + %1$s (disconnected) Important information diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java index 3c9999ed3d3..92fa843a8c7 100644 --- a/src/com/android/settings/media/MediaOutputSlice.java +++ b/src/com/android/settings/media/MediaOutputSlice.java @@ -17,6 +17,7 @@ package com.android.settings.media; import static android.app.slice.Slice.EXTRA_RANGE_VALUE; +import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI; @@ -24,9 +25,12 @@ import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.text.SpannableString; import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -162,7 +166,7 @@ public class MediaOutputSlice implements CustomSliceable { } private ListBuilder.RowBuilder getMediaDeviceRow(MediaDevice device) { - final String title = device.getName(); + final String deviceName = device.getName(); final PendingIntent broadcastAction = getBroadcastIntent(mContext, device.getId(), device.hashCode()); final IconCompat deviceIcon = getDeviceIconCompat(device); @@ -170,9 +174,22 @@ public class MediaOutputSlice implements CustomSliceable { final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitleItem(deviceIcon, ListBuilder.ICON_IMAGE) .setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon, - ListBuilder.ICON_IMAGE, title)) - .setTitle(title) - .setSubtitle(device.isConnected() ? null : device.getSummary()); + ListBuilder.ICON_IMAGE, deviceName)); + // Append status to tile only for the disconnected Bluetooth device. + if (device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE + && !device.isConnected()) { + final SpannableString spannableTitle = new SpannableString( + mContext.getString(R.string.media_output_disconnected_status, deviceName)); + spannableTitle.setSpan(new ForegroundColorSpan(Color.GRAY), deviceName.length(), + spannableTitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE); + rowBuilder.setTitle(spannableTitle); + rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon, + ListBuilder.ICON_IMAGE, spannableTitle)); + } else { + rowBuilder.setTitle(deviceName); + rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon, + ListBuilder.ICON_IMAGE, deviceName)); + } return rowBuilder; } diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java index adbd14d66da..f71c090bf9a 100644 --- a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java +++ b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java @@ -44,6 +44,7 @@ import androidx.slice.core.SliceAction; import androidx.slice.core.SliceQuery; import androidx.slice.widget.SliceLiveData; +import com.android.settings.R; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; @@ -155,6 +156,26 @@ public class MediaOutputSliceTest { assertThat(primaryAction.getTitle().toString()).isEqualTo(TEST_DEVICE_1_NAME); } + @Test + public void getSlice_disconnectedBluetooth_verifyTitle() { + mDevices.clear(); + final MediaDevice device = mock(MediaDevice.class); + when(device.getName()).thenReturn(TEST_DEVICE_1_NAME); + when(device.getIcon()).thenReturn(mTestDrawable); + when(device.getMaxVolume()).thenReturn(100); + when(device.isConnected()).thenReturn(false); + + mDevices.add(device); + mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices); + + final Slice mediaSlice = mMediaOutputSlice.getSlice(); + final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice); + + final SliceAction primaryAction = metadata.getPrimaryAction(); + assertThat(primaryAction.getTitle().toString()).isEqualTo(TEST_DEVICE_1_NAME + " (" + + mContext.getText(R.string.media_output_disconnected_status) + ")"); + } + @Test public void onNotifyChange_foundMediaDevice_connect() { mDevices.clear();