summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/res/values/strings.xml9
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java84
2 files changed, 79 insertions, 14 deletions
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index dde4dcfb23fe..310c3af8ea3a 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -673,6 +673,15 @@
<string name="quick_settings_bluetooth_off_label">Bluetooth Off</string>
<!-- QuickSettings: Bluetooth detail panel, text when there are no items [CHAR LIMIT=NONE] -->
<string name="quick_settings_bluetooth_detail_empty_text">No paired devices available</string>
+ <!-- QuickSettings: Bluetooth secondary label for the battery level of a connected device [CHAR LIMIT=20]-->
+ <string name="quick_settings_bluetooth_secondary_label_battery_level"><xliff:g id="battery_level_as_percentage">%s</xliff:g> battery</string>
+ <!-- QuickSettings: Bluetooth secondary label for an audio device being connected [CHAR LIMIT=20]-->
+ <string name="quick_settings_bluetooth_secondary_label_audio">Audio</string>
+ <!-- QuickSettings: Bluetooth secondary label for a headset being connected [CHAR LIMIT=20]-->
+ <string name="quick_settings_bluetooth_secondary_label_headset">Headset</string>
+ <!-- QuickSettings: Bluetooth secondary label for an input/IO device being connected [CHAR LIMIT=20]-->
+ <string name="quick_settings_bluetooth_secondary_label_input">Input</string>
+
<!-- QuickSettings: Brightness [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_label">Brightness</string>
<!-- QuickSettings: Rotation Unlocked [CHAR LIMIT=NONE] -->
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 fff9f8e7e038..2607ebbb72ea 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -18,7 +18,9 @@ package com.android.systemui.qs.tiles;
import static com.android.settingslib.graph.BluetoothDeviceLayerDrawable.createLayerDrawable;
+import android.annotation.Nullable;
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
@@ -26,7 +28,6 @@ import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.service.quicksettings.Tile;
-import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
@@ -35,6 +36,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.graph.BluetoothDeviceLayerDrawable;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
@@ -126,21 +128,25 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
}
state.slash.isSlashed = !enabled;
state.label = mContext.getString(R.string.quick_settings_bluetooth_label);
+
if (enabled) {
if (connected) {
state.icon = ResourceIcon.get(R.drawable.ic_qs_bluetooth_connected);
- state.secondaryLabel = mController.getLastDeviceName();
- CachedBluetoothDevice lastDevice = mController.getLastDevice();
+ state.contentDescription = mContext.getString(
+ R.string.accessibility_bluetooth_name, state.label);
+
+ final CachedBluetoothDevice lastDevice = mController.getLastDevice();
if (lastDevice != null) {
- int batteryLevel = lastDevice.getBatteryLevel();
+ final int batteryLevel = lastDevice.getBatteryLevel();
if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
- state.icon = new BluetoothBatteryTileIcon(lastDevice,
+ state.icon = new BluetoothBatteryTileIcon(
+ batteryLevel,
mContext.getResources().getFraction(
R.fraction.bt_battery_scale_fraction, 1, 1));
}
}
- state.contentDescription = mContext.getString(
- R.string.accessibility_bluetooth_name, state.secondaryLabel);
+
+ state.label = mController.getLastDeviceName();
} else if (state.isTransient) {
state.icon = ResourceIcon.get(R.drawable.ic_bluetooth_transient_animation);
state.contentDescription = mContext.getString(
@@ -159,11 +165,53 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
state.state = Tile.STATE_INACTIVE;
}
+ state.secondaryLabel = getSecondaryLabel(enabled, connected);
+
state.dualLabelContentDescription = mContext.getResources().getString(
R.string.accessibility_quick_settings_open_settings, getTileLabel());
state.expandedAccessibilityClassName = Switch.class.getName();
}
+ /**
+ * Returns the secondary label to use for the given bluetooth connection in the form of the
+ * battery level or bluetooth profile name. If the bluetooth is disabled, there's no connected
+ * devices, or we can't map the bluetooth class to a profile, this instead returns {@code null}.
+ *
+ * @param enabled whether bluetooth is enabled
+ * @param connected whether there's a device connected via bluetooth
+ */
+ @Nullable
+ private String getSecondaryLabel(boolean enabled, boolean connected) {
+ final CachedBluetoothDevice lastDevice = mController.getLastDevice();
+
+ if (enabled && connected && lastDevice != null) {
+ final int batteryLevel = lastDevice.getBatteryLevel();
+
+ if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
+ return mContext.getString(
+ R.string.quick_settings_bluetooth_secondary_label_battery_level,
+ Utils.formatPercentage(batteryLevel));
+
+ } else {
+ final BluetoothClass bluetoothClass = lastDevice.getBtClass();
+ if (bluetoothClass != null) {
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
+ return mContext.getString(
+ R.string.quick_settings_bluetooth_secondary_label_audio);
+ } else if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
+ return mContext.getString(
+ R.string.quick_settings_bluetooth_secondary_label_headset);
+ } else if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HID)) {
+ return mContext.getString(
+ R.string.quick_settings_bluetooth_secondary_label_input);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
@Override
public int getMetricsCategory() {
return MetricsEvent.QS_BLUETOOTH;
@@ -207,20 +255,29 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
return new BluetoothDetailAdapter();
}
+ /**
+ * Bluetooth icon wrapper for Quick Settings with a battery indicator that reflects the
+ * connected device's battery level. 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 BluetoothBatteryTileIcon extends Icon {
+ private int mBatteryLevel;
private float mIconScale;
- private CachedBluetoothDevice mDevice;
- BluetoothBatteryTileIcon(CachedBluetoothDevice device, float iconScale) {
+ BluetoothBatteryTileIcon(int batteryLevel, float iconScale) {
+ mBatteryLevel = batteryLevel;
mIconScale = iconScale;
- mDevice = device;
}
@Override
public Drawable getDrawable(Context context) {
// This method returns Pair<Drawable, String> while first value is the drawable
- return com.android.settingslib.bluetooth.Utils.getBtClassDrawableWithDescription(
- context, mDevice, mIconScale).first;
+ return BluetoothDeviceLayerDrawable.createLayerDrawable(
+ context,
+ R.drawable.ic_qs_bluetooth_connected,
+ mBatteryLevel,
+ mIconScale);
}
}
@@ -302,8 +359,7 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
item.iconResId = R.drawable.ic_qs_bluetooth_connected;
int batteryLevel = device.getBatteryLevel();
if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
- item.icon = new BluetoothBatteryTileIcon(device,
- 1 /* iconScale */);
+ item.icon = new BluetoothBatteryTileIcon(batteryLevel,1 /* iconScale */);
item.line2 = mContext.getString(
R.string.quick_settings_connected_battery_level,
Utils.formatPercentage(batteryLevel));