From 1b65e52344090a324e2f7472da25f5e5320ac235 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Mon, 31 Oct 2022 20:01:52 +0000 Subject: [PATCH 1/5] [Dock Defend] Add an optional shield to the status bar battery drawable. The shield will be displayed when the battery is marked as overheated. Bug: 255625888 Test: manual: issue `adb shell am broadcast -a com.android.systemui.demo -e command battery -e overheated true` and verify the battery icon displays a shield Test: See bug for manual demo video Test: statusbar.battery tests Change-Id: I6b3036ae47ad7b5ae8dc78f83d019130935c9b50 --- .../graph/ThemedBatteryDrawable.kt | 7 +- packages/SystemUI/res/values/config.xml | 6 + .../battery/AccessorizedBatteryDrawable.kt | 202 ++++++++++++++++++ .../systemui/battery/BatteryMeterView.java | 44 +++- .../battery/BatteryMeterViewController.java | 9 + .../android/systemui/battery/BatterySpecs.kt | 109 ++++++++++ .../src/com/android/systemui/flags/Flags.kt | 3 + .../phone/dagger/StatusBarViewModule.java | 2 + .../statusbar/policy/BatteryController.java | 3 + .../policy/BatteryControllerImpl.java | 30 +++ .../AccessorizedBatteryDrawableTest.kt | 52 +++++ .../BatteryMeterViewControllerTest.java | 50 ++++- .../systemui/battery/BatteryMeterViewTest.kt | 42 +++- .../systemui/battery/BatterySpecsTest.kt | 101 +++++++++ .../policy/BatteryControllerTest.java | 29 +++ 15 files changed, 669 insertions(+), 20 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt create mode 100644 packages/SystemUI/src/com/android/systemui/battery/BatterySpecs.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/battery/AccessorizedBatteryDrawableTest.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/battery/BatterySpecsTest.kt diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt index 5fa04f93e993a..faea5b2c3e715 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt +++ b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt @@ -412,14 +412,13 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) } companion object { - private const val TAG = "ThemedBatteryDrawable" - private const val WIDTH = 12f - private const val HEIGHT = 20f + const val WIDTH = 12f + const val HEIGHT = 20f private const val CRITICAL_LEVEL = 15 // On a 12x20 grid, how wide to make the fill protection stroke. // Scales when our size changes private const val PROTECTION_STROKE_WIDTH = 3f // Arbitrarily chosen for visibility at small sizes - private const val PROTECTION_MIN_STROKE_WIDTH = 6f + const val PROTECTION_MIN_STROKE_WIDTH = 6f } } diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index ce9829b318cd7..55d637916d0cd 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -485,6 +485,12 @@ false + + + M5 0L0 1.88V6.19C0 9.35 2.13 12.29 5 13.01C7.87 12.29 10 9.35 10 6.19V1.88L5 0Z + + 7.8dp + + 1dp + 14sp diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index d301858505b9f..4c16566fff8fc 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -378,14 +378,26 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { float fullBatteryIconWidth = BatterySpecs.getFullBatteryWidth(mainBatteryWidth, displayShield); - // TODO(b/255625888): Add some marginTop so that, even when the battery icon has the shield, - // the bottom of the main icon is still aligned with the bottom of all the other icons. + int marginTop; + if (displayShield) { + // If the shield is displayed, we need some extra marginTop so that the bottom of the + // main icon is still aligned with the bottom of all the other system icons. + int shieldHeightAddition = Math.round(fullBatteryIconHeight - mainBatteryHeight); + // However, the other system icons have some embedded bottom padding that the battery + // doesn't have, so we shouldn't move the battery icon down by the full amount. + // See b/258672854. + marginTop = shieldHeightAddition + - res.getDimensionPixelSize(R.dimen.status_bar_battery_extra_vertical_spacing); + } else { + marginTop = 0; + } + int marginBottom = res.getDimensionPixelSize(R.dimen.battery_margin_bottom); LinearLayout.LayoutParams scaledLayoutParams = new LinearLayout.LayoutParams( Math.round(fullBatteryIconWidth), Math.round(fullBatteryIconHeight)); - scaledLayoutParams.setMargins(0, 0, 0, marginBottom); + scaledLayoutParams.setMargins(0, marginTop, 0, marginBottom); mDrawable.setDisplayShield(displayShield); mBatteryIconView.setLayoutParams(scaledLayoutParams); From 29eb2d12768cbb165cede10e864c57dacd04b060 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Fri, 11 Nov 2022 17:00:47 +0000 Subject: [PATCH 3/5] [Battery] Ensure we always update the text and content description when necessary. When writing some tests for the new dock defend icon, I came across some existing issues when we don't correctly update the text or content description. This CL adds tests that would've been failing, and updates BatteryMeterView to make them pass. Bug: 255625888 Test: atest BatteryMeterViewTest Change-Id: I3485a50c6471dd75dce64a3daf414208afa8d25e --- packages/SystemUI/res/values/strings.xml | 2 +- .../systemui/battery/BatteryMeterView.java | 54 ++++++++++----- .../systemui/battery/BatteryMeterViewTest.kt | 66 +++++++++++++++++++ 3 files changed, 103 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index dc84435f40818..53cd059288e31 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -439,7 +439,7 @@ Battery %d percent. - Battery %1$s percent, about %2$s left based on your usage + Battery %1$d percent, about %2$s left based on your usage Battery charging, %d percent. diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 4c16566fff8fc..b918655dbbb6c 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -76,6 +76,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { private int mLevel; private int mShowPercentMode = MODE_DEFAULT; private boolean mShowPercentAvailable; + private String mEstimateText = null; private boolean mCharging; private boolean mDisplayShield; private boolean mDisplayShieldEnabled; @@ -171,6 +172,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { if (mode == mShowPercentMode) return; mShowPercentMode = mode; updateShowPercent(); + updatePercentText(); } @Override @@ -247,11 +249,11 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { void updatePercentText() { if (mBatteryStateUnknown) { - setContentDescription(getContext().getString(R.string.accessibility_battery_unknown)); return; } if (mBatteryEstimateFetcher == null) { + setPercentTextAtCurrentLevel(); return; } @@ -263,10 +265,9 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { return; } if (estimate != null && mShowPercentMode == MODE_ESTIMATE) { + mEstimateText = estimate; mBatteryPercentView.setText(estimate); - setContentDescription(getContext().getString( - R.string.accessibility_battery_level_with_estimate, - mLevel, estimate)); + updateContentDescription(); } else { setPercentTextAtCurrentLevel(); } @@ -275,28 +276,44 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { setPercentTextAtCurrentLevel(); } } else { - setContentDescription( - getContext().getString(mCharging ? R.string.accessibility_battery_level_charging - : R.string.accessibility_battery_level, mLevel)); + updateContentDescription(); } } private void setPercentTextAtCurrentLevel() { - if (mBatteryPercentView == null) { - return; + if (mBatteryPercentView != null) { + mEstimateText = null; + String percentText = NumberFormat.getPercentInstance().format(mLevel / 100f); + // Setting text actually triggers a layout pass (because the text view is set to + // wrap_content width and TextView always relayouts for this). Avoid needless + // relayout if the text didn't actually change. + if (!TextUtils.equals(mBatteryPercentView.getText(), percentText)) { + mBatteryPercentView.setText(percentText); + } } - String percentText = NumberFormat.getPercentInstance().format(mLevel / 100f); - // Setting text actually triggers a layout pass (because the text view is set to - // wrap_content width and TextView always relayouts for this). Avoid needless - // relayout if the text didn't actually change. - if (!TextUtils.equals(mBatteryPercentView.getText(), percentText)) { - mBatteryPercentView.setText(percentText); + updateContentDescription(); + } + + private void updateContentDescription() { + Context context = getContext(); + + String contentDescription; + if (mBatteryStateUnknown) { + contentDescription = context.getString(R.string.accessibility_battery_unknown); + } else if (mShowPercentMode == MODE_ESTIMATE && !TextUtils.isEmpty(mEstimateText)) { + contentDescription = context.getString( + R.string.accessibility_battery_level_with_estimate, + mLevel, + mEstimateText); + } else if (mCharging) { + contentDescription = + context.getString(R.string.accessibility_battery_level_charging, mLevel); + } else { + contentDescription = context.getString(R.string.accessibility_battery_level, mLevel); } - setContentDescription( - getContext().getString(mCharging ? R.string.accessibility_battery_level_charging - : R.string.accessibility_battery_level, mLevel)); + setContentDescription(contentDescription); } void updateShowPercent() { @@ -347,6 +364,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { } mBatteryStateUnknown = isUnknown; + updateContentDescription(); if (mBatteryStateUnknown) { mBatteryIconView.setImageDrawable(getUnknownStateDrawable()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt index 851b5408a4e00..b38d0b787dbc8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt @@ -19,6 +19,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import android.widget.ImageView import androidx.test.filters.SmallTest +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.battery.BatteryMeterView.BatteryEstimateFetcher import com.android.systemui.statusbar.policy.BatteryController.EstimateFetchCompletion @@ -59,6 +60,71 @@ class BatteryMeterViewTest : SysuiTestCase() { // No assert needed } + @Test + fun contentDescription_unknown() { + mBatteryMeterView.onBatteryUnknownStateChanged(true) + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_unknown) + ) + } + + @Test + fun contentDescription_estimate() { + mBatteryMeterView.onBatteryLevelChanged(15, false) + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) + mBatteryMeterView.setBatteryEstimateFetcher(Fetcher()) + + mBatteryMeterView.updatePercentText() + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString( + R.string.accessibility_battery_level_with_estimate, 15, ESTIMATE + ) + ) + } + + @Test + fun contentDescription_charging() { + mBatteryMeterView.onBatteryLevelChanged(45, true) + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level_charging, 45) + ) + } + + @Test + fun contentDescription_notCharging() { + mBatteryMeterView.onBatteryLevelChanged(45, false) + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level, 45) + ) + } + + @Test + fun changesFromEstimateToPercent_textAndContentDescriptionChanges() { + mBatteryMeterView.onBatteryLevelChanged(15, false) + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) + mBatteryMeterView.setBatteryEstimateFetcher(Fetcher()) + + mBatteryMeterView.updatePercentText() + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString( + R.string.accessibility_battery_level_with_estimate, 15, ESTIMATE + ) + ) + + // Update the show mode from estimate to percent + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ON) + + assertThat(mBatteryMeterView.batteryPercentViewText).isEqualTo("15%") + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level, 15) + ) + } + @Test fun isOverheatedChanged_true_drawableGetsTrue() { mBatteryMeterView.setDisplayShieldEnabled(true) From aced6da68798c9fe9fc145a6fe070ea5f8a31304 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Thu, 10 Nov 2022 20:38:34 +0000 Subject: [PATCH 4/5] [Dock Defend] Udpate the content description to account for dock defend if needed. Bug: 255625888 Test: manual: Verify battery content description in all states Test: atest BatteryMeterViewTest Change-Id: I497c14096da2693cc35bf01d76287c021ddc3bf8 --- packages/SystemUI/res/values/strings.xml | 6 ++ .../systemui/battery/BatteryMeterView.java | 27 ++++--- .../systemui/battery/BatteryMeterViewTest.kt | 72 +++++++++++++++++++ 3 files changed, 94 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 53cd059288e31..72641cc55497d 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -444,6 +444,12 @@ Battery charging, %d percent. + + Battery %d percent. Charging paused for battery protection. + + + Battery %1$d percent, about %2$s left based on your usage. Charging paused for battery protection. + See all notifications diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index b918655dbbb6c..1ab8453c61157 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -78,7 +78,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { private boolean mShowPercentAvailable; private String mEstimateText = null; private boolean mCharging; - private boolean mDisplayShield; + private boolean mIsOverheated; private boolean mDisplayShieldEnabled; // Error state where we know nothing about the current battery state private boolean mBatteryStateUnknown; @@ -207,16 +207,14 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { } void onIsOverheatedChanged(boolean isOverheated) { - // The battery drawable is a different size depending on whether it's currently overheated - // or not, so we need to re-scale the view when overheated changes. - boolean requiresScaling = mDisplayShield != isOverheated; - // If the battery is marked as overheated, we should display a shield indicating that the - // battery is being "defended". - mDisplayShield = isOverheated; - if (requiresScaling) { + boolean valueChanged = mIsOverheated != isOverheated; + mIsOverheated = isOverheated; + if (valueChanged) { + updateContentDescription(); + // The battery drawable is a different size depending on whether it's currently + // overheated or not, so we need to re-scale the view when overheated changes. scaleBatteryMeterViews(); } - // TODO(b/255625888): We should also update the content description. } private TextView loadPercentView() { @@ -303,9 +301,14 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { contentDescription = context.getString(R.string.accessibility_battery_unknown); } else if (mShowPercentMode == MODE_ESTIMATE && !TextUtils.isEmpty(mEstimateText)) { contentDescription = context.getString( - R.string.accessibility_battery_level_with_estimate, + mIsOverheated + ? R.string.accessibility_battery_level_charging_paused_with_estimate + : R.string.accessibility_battery_level_with_estimate, mLevel, mEstimateText); + } else if (mIsOverheated) { + contentDescription = + context.getString(R.string.accessibility_battery_level_charging_paused, mLevel); } else if (mCharging) { contentDescription = context.getString(R.string.accessibility_battery_level_charging, mLevel); @@ -390,7 +393,9 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { float mainBatteryWidth = res.getDimensionPixelSize(R.dimen.status_bar_battery_icon_width) * iconScaleFactor; - boolean displayShield = mDisplayShieldEnabled && mDisplayShield; + // If the battery is marked as overheated, we should display a shield indicating that the + // battery is being "defended". + boolean displayShield = mDisplayShieldEnabled && mIsOverheated; float fullBatteryIconHeight = BatterySpecs.getFullBatteryHeight(mainBatteryHeight, displayShield); float fullBatteryIconWidth = diff --git a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt index b38d0b787dbc8..eb7d9c3900f10 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt @@ -84,6 +84,34 @@ class BatteryMeterViewTest : SysuiTestCase() { ) } + @Test + fun contentDescription_estimateAndOverheated() { + mBatteryMeterView.onBatteryLevelChanged(17, false) + mBatteryMeterView.onIsOverheatedChanged(true) + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) + mBatteryMeterView.setBatteryEstimateFetcher(Fetcher()) + + mBatteryMeterView.updatePercentText() + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString( + R.string.accessibility_battery_level_charging_paused_with_estimate, + 17, + ESTIMATE, + ) + ) + } + + @Test + fun contentDescription_overheated() { + mBatteryMeterView.onBatteryLevelChanged(90, false) + mBatteryMeterView.onIsOverheatedChanged(true) + + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level_charging_paused, 90) + ) + } + @Test fun contentDescription_charging() { mBatteryMeterView.onBatteryLevelChanged(45, true) @@ -125,6 +153,50 @@ class BatteryMeterViewTest : SysuiTestCase() { ) } + @Test + fun contentDescription_manyUpdates_alwaysUpdated() { + // Overheated + mBatteryMeterView.onBatteryLevelChanged(90, false) + mBatteryMeterView.onIsOverheatedChanged(true) + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level_charging_paused, 90) + ) + + // Overheated & estimate + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) + mBatteryMeterView.setBatteryEstimateFetcher(Fetcher()) + mBatteryMeterView.updatePercentText() + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString( + R.string.accessibility_battery_level_charging_paused_with_estimate, + 90, + ESTIMATE, + ) + ) + + // Just estimate + mBatteryMeterView.onIsOverheatedChanged(false) + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString( + R.string.accessibility_battery_level_with_estimate, + 90, + ESTIMATE, + ) + ) + + // Just percent + mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ON) + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level, 90) + ) + + // Charging + mBatteryMeterView.onBatteryLevelChanged(90, true) + assertThat(mBatteryMeterView.contentDescription).isEqualTo( + context.getString(R.string.accessibility_battery_level_charging, 90) + ) + } + @Test fun isOverheatedChanged_true_drawableGetsTrue() { mBatteryMeterView.setDisplayShieldEnabled(true) From c181e3d04cea546919d27363b9b6b8cecb0aa7ae Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Fri, 11 Nov 2022 19:33:08 +0000 Subject: [PATCH 5/5] [Dock Defend] Cache the density in the drawable so we don't re-fetch it constantly. Bug: 255625888 Test: verified density got updated each time display size changed Change-Id: I8cbb9ffe0e3ef18dc43fe13749b7584eb83640e1 --- .../systemui/battery/AccessorizedBatteryDrawable.kt | 13 +++++++++---- .../android/systemui/battery/BatteryMeterView.java | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt index a91100a8856e4..b52ddc1dbc42a 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt @@ -57,6 +57,8 @@ class AccessorizedBatteryDrawable( private var shieldLeftOffsetScaled = SHIELD_LEFT_OFFSET private var shieldTopOffsetScaled = SHIELD_TOP_OFFSET + private var density = context.resources.displayMetrics.density + private val dualTone = context.resources.getBoolean(com.android.internal.R.bool.config_batterymeterDualTone) @@ -126,8 +128,7 @@ class AccessorizedBatteryDrawable( } else { BATTERY_HEIGHT } - // TODO(b/255625888): Cache the density so we don't have to re-fetch. - return (height * context.resources.displayMetrics.density).toInt() + return (height * density).toInt() } override fun getIntrinsicWidth(): Int { @@ -137,8 +138,7 @@ class AccessorizedBatteryDrawable( } else { BATTERY_WIDTH } - // TODO(b/255625888): Cache the density so we don't have to re-fetch. - return (width * context.resources.displayMetrics.density).toInt() + return (width * density).toInt() } override fun draw(c: Canvas) { @@ -195,6 +195,11 @@ class AccessorizedBatteryDrawable( mainBatteryDrawable.setColors(fgColor, bgColor, singleToneColor) } + /** Notifies this drawable that the density might have changed. */ + fun notifyDensityChanged() { + density = context.resources.displayMetrics.density + } + private fun loadPaths() { val shieldPathString = context.resources.getString(R.string.config_batterymeterShieldPath) shieldPath.set(PathParser.createPathFromPathData(shieldPathString)) diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 1ab8453c61157..03d999f697d07 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -179,6 +179,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); updatePercentView(); + mDrawable.notifyDensityChanged(); } public void setColorsFromContext(Context context) {