diff --git a/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_off.xml b/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_off.xml index 2dba48cf155dd..17a76116db255 100644 --- a/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_off.xml +++ b/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_off.xml @@ -1,4 +1,5 @@ - - + + + + + + + + + + + + + + + + - + - - + + @@ -48,25 +102,27 @@ - + - + @@ -76,63 +132,13 @@ + android:valueType="floatType"/> - - - - - - - - - - - - - - - - diff --git a/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_on.xml b/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_on.xml index 17a76116db255..2dba48cf155dd 100644 --- a/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_on.xml +++ b/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_on.xml @@ -1,5 +1,4 @@ - - - - - - - - - - - - - - - - - - - - + - - + + @@ -102,27 +48,25 @@ - + - + @@ -132,13 +76,63 @@ + android:valueType="floatType" /> + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index f736231bc22b6..da5202bc3645d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -19,9 +19,7 @@ package com.android.systemui.qs.tiles; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; -import android.content.Context; import android.content.Intent; -import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; import android.os.UserManager; @@ -134,9 +132,10 @@ public class BluetoothTile extends QSTileImpl { state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_bluetooth); state.stateDescription = ""; + if (enabled) { if (connected) { - state.icon = new BluetoothConnectedTileIcon(); + state.icon = ResourceIcon.get(R.drawable.qs_bluetooth_icon_on); if (!TextUtils.isEmpty(mController.getConnectedDeviceName())) { state.label = mController.getConnectedDeviceName(); } @@ -145,21 +144,19 @@ public class BluetoothTile extends QSTileImpl { + ", " + state.secondaryLabel; } else if (state.isTransient) { state.icon = ResourceIcon.get( - com.android.internal.R.drawable.ic_bluetooth_transient_animation); + R.drawable.qs_bluetooth_icon_search); state.stateDescription = state.secondaryLabel; } else { state.icon = - ResourceIcon.get(com.android.internal.R.drawable.ic_qs_bluetooth); + ResourceIcon.get(R.drawable.qs_bluetooth_icon_off); state.stateDescription = mContext.getString(R.string.accessibility_not_connected); } state.state = Tile.STATE_ACTIVE; } else { - state.icon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_bluetooth); + state.icon = ResourceIcon.get(R.drawable.qs_bluetooth_icon_off); state.state = Tile.STATE_INACTIVE; } - state.dualLabelContentDescription = mContext.getResources().getString( - R.string.accessibility_quick_settings_open_settings, getTileLabel()); state.expandedAccessibilityClassName = Switch.class.getName(); } @@ -244,22 +241,4 @@ public class BluetoothTile extends QSTileImpl { refreshState(); } }; - - /** - * Bluetooth icon wrapper (when connected with no battery indicator) for Quick Settings. This is - * used instead of {@link com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon} in order to - * use a context that reflects dark/light theme attributes. - */ - private class BluetoothConnectedTileIcon extends Icon { - - BluetoothConnectedTileIcon() { - // Do nothing. Default constructor to limit visibility. - } - - @Override - public Drawable getDrawable(Context context) { - // This method returns Pair - the first value is the drawable. - return context.getDrawable(R.drawable.ic_bluetooth_connected); - } - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt index cc472481ad8a6..d65901777a739 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt @@ -10,6 +10,7 @@ import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter @@ -18,6 +19,7 @@ import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSTileHost import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.BluetoothController import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -25,6 +27,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @@ -84,6 +87,53 @@ class BluetoothTileTest : SysuiTestCase() { assertThat(tile.restrictionChecked).isEqualTo(UserManager.DISALLOW_BLUETOOTH) } + @Test + fun testIcon_whenDisabled_isOffState() { + val state = QSTile.BooleanState() + disableBluetooth() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_bluetooth_icon_off)) + } + + @Test + fun testIcon_whenDisconnected_isOffState() { + val state = QSTile.BooleanState() + enableBluetooth() + setBluetoothDisconnected() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_bluetooth_icon_off)) + } + + @Test + fun testIcon_whenConnected_isOnState() { + val state = QSTile.BooleanState() + enableBluetooth() + setBluetoothConnected() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_bluetooth_icon_on)) + } + + @Test + fun testIcon_whenConnecting_isSearchState() { + val state = QSTile.BooleanState() + enableBluetooth() + setBluetoothConnecting() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_bluetooth_icon_search)) + } + private class FakeBluetoothTile( qsTileHost: QSTileHost, backgroundLooper: Looper, @@ -114,4 +164,27 @@ class BluetoothTileTest : SysuiTestCase() { restrictionChecked = userRestriction } } + + fun enableBluetooth() { + `when`(bluetoothController.isBluetoothEnabled).thenReturn(true) + } + + fun disableBluetooth() { + `when`(bluetoothController.isBluetoothEnabled).thenReturn(false) + } + + fun setBluetoothDisconnected() { + `when`(bluetoothController.isBluetoothConnecting).thenReturn(false) + `when`(bluetoothController.isBluetoothConnected).thenReturn(false) + } + + fun setBluetoothConnected() { + `when`(bluetoothController.isBluetoothConnecting).thenReturn(false) + `when`(bluetoothController.isBluetoothConnected).thenReturn(true) + } + + fun setBluetoothConnecting() { + `when`(bluetoothController.isBluetoothConnected).thenReturn(false) + `when`(bluetoothController.isBluetoothConnecting).thenReturn(true) + } } \ No newline at end of file