From 6aa6e6e640ddaea3272144aee68762dd17674773 Mon Sep 17 00:00:00 2001 From: Dan Sandler Date: Tue, 7 Feb 2017 19:12:25 -0800 Subject: [PATCH 1/2] Clean up BatteryMeterDrawable internal api. Bug: 32539932 Test: runtest -x frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java Test: runtest -x frameworks/base/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java Change-Id: Ifdc3368b930abcf248b60ee99f6f9139ad804f91 --- .../graph/BatteryMeterDrawableBase.java | 59 +++++++++---------- .../graph/BatteryMeterDrawableBaseTest.java | 20 +++++++ .../systemui/BatteryMeterDrawable.java | 18 +++--- .../systemui/qs/tiles/BatteryTile.java | 2 +- .../systemui/tuner/BatteryPreference.java | 2 +- .../android/systemui/tuner/TunerService.java | 6 +- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java index d25bb2e1b1b7f..fd2e7cad5c86f 100755 --- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java @@ -37,14 +37,13 @@ public class BatteryMeterDrawableBase extends Drawable { private static final float ASPECT_RATIO = 9.5f / 14.5f; public static final String TAG = BatteryMeterDrawableBase.class.getSimpleName(); - public static final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent"; protected final Context mContext; - protected int mLevel = -1; - protected boolean mPluggedIn; - protected boolean mPowerSaveEnabled; - protected boolean mShowPercent; + private int mLevel = -1; + private boolean mPluggedIn; + private boolean mPowerSaveEnabled; + private boolean mShowPercent; private static final boolean SINGLE_DIGIT_PERCENT = false; @@ -104,7 +103,7 @@ public class BatteryMeterDrawableBase extends Drawable { } levels.recycle(); colors.recycle(); - updateShowPercent(); + mWarningString = context.getString(R.string.battery_meter_very_low_overlay_symbol); mCriticalLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_criticalBatteryWarningLevel); @@ -143,10 +142,10 @@ public class BatteryMeterDrawableBase extends Drawable { mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color)); - mBoltPoints = loadBoltPoints(res); + mBoltPoints = loadPoints(res, R.array.batterymeter_bolt_points); mPlusPaint = new Paint(mBoltPaint); - mPlusPoints = loadPlusPoints(res); + mPlusPoints = loadPoints(res, R.array.batterymeter_plus_points); mDarkModeBackgroundColor = Utils.getDefaultColor(mContext, R.color.dark_mode_icon_color_dual_tone_background); @@ -171,32 +170,34 @@ public class BatteryMeterDrawableBase extends Drawable { return mIntrinsicWidth; } - public void disableShowPercent() { - mShowPercent = false; + public void setShowPercent(boolean show) { + mShowPercent = show; postInvalidate(); } + public void setPluggedIn(boolean val) { + mPluggedIn = val; + postInvalidate(); + } + + public void setBatteryLevel(int val) { + mLevel = val; + postInvalidate(); + } + + public void setPowerSave(boolean val) { + mPowerSaveEnabled = val; + postInvalidate(); + } + + // an approximation of View.postInvalidate() protected void postInvalidate() { + unscheduleSelf(this::invalidateSelf); scheduleSelf(this::invalidateSelf, 0); } - private static float[] loadBoltPoints(Resources res) { - final int[] pts = res.getIntArray(R.array.batterymeter_bolt_points); - int maxX = 0, maxY = 0; - for (int i = 0; i < pts.length; i += 2) { - maxX = Math.max(maxX, pts[i]); - maxY = Math.max(maxY, pts[i + 1]); - } - final float[] ptsF = new float[pts.length]; - for (int i = 0; i < pts.length; i += 2) { - ptsF[i] = (float) pts[i] / maxX; - ptsF[i + 1] = (float) pts[i + 1] / maxY; - } - return ptsF; - } - - private static float[] loadPlusPoints(Resources res) { - final int[] pts = res.getIntArray(R.array.batterymeter_plus_points); + private static float[] loadPoints(Resources res, int pointArrayRes) { + final int[] pts = res.getIntArray(pointArrayRes); int maxX = 0, maxY = 0; for (int i = 0; i < pts.length; i += 2) { maxX = Math.max(maxX, pts[i]); @@ -219,10 +220,6 @@ public class BatteryMeterDrawableBase extends Drawable { mWarningTextHeight = -mWarningTextPaint.getFontMetrics().ascent; } - protected void updateShowPercent() { - mShowPercent = true; - } - private int getColorForLevel(int percent) { // If we are in power save mode, always use the normal color. if (mPowerSaveEnabled) { diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java index fab00dab5be71..4de2c1249241a 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java @@ -48,4 +48,24 @@ public class BatteryMeterDrawableBaseTest { verify(canvas, never()).drawPath(any(), any()); verify(canvas, never()).drawText(anyString(), anyFloat(), anyFloat(), any()); } + + @Test + public void testDrawingForTypicalValues() { + final Canvas canvas = mock(Canvas.class); + final int levels[] = { 0, 1, 5, 10, 25, 50, 75, 90, 95, 99, 100 }; + final boolean bools[] = { false, true }; + for (int l : levels) { + for (boolean plugged : bools) { + for (boolean saver : bools) { + for (boolean percent : bools) { + mBatteryDrawable.setBatteryLevel(l); + mBatteryDrawable.setPowerSave(saver); + mBatteryDrawable.setPluggedIn(plugged); + mBatteryDrawable.setShowPercent(percent); + mBatteryDrawable.draw(canvas); + } + } + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java index 2bdb2f33a37e6..9068079fd6cf5 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java @@ -27,6 +27,8 @@ import com.android.systemui.statusbar.policy.BatteryController; public class BatteryMeterDrawable extends BatteryMeterDrawableBase implements BatteryController.BatteryStateChangeCallback { + public static final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent"; + private BatteryController mBatteryController; private SettingObserver mSettingObserver; @@ -38,16 +40,13 @@ public class BatteryMeterDrawable extends BatteryMeterDrawableBase implements @Override public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { - mLevel = level; - mPluggedIn = pluggedIn; - - postInvalidate(); + setBatteryLevel(level); + setPluggedIn(pluggedIn); } @Override public void onPowerSaveChanged(boolean isPowerSave) { - mPowerSaveEnabled = isPowerSave; - invalidateSelf(); + setPowerSave(isPowerSave); } public void startListening() { @@ -62,15 +61,14 @@ public class BatteryMeterDrawable extends BatteryMeterDrawableBase implements mBatteryController.removeCallback(this); } - @Override protected void updateShowPercent() { - mShowPercent = 0 != Settings.System.getInt(mContext.getContentResolver(), - SHOW_PERCENT_SETTING, 0); + setShowPercent(0 != Settings.System.getInt(mContext.getContentResolver(), + SHOW_PERCENT_SETTING, 0)); } public void setBatteryController(BatteryController batteryController) { mBatteryController = batteryController; - mPowerSaveEnabled = mBatteryController.isPowerSave(); + setPowerSave(mBatteryController.isPowerSave()); } private final class SettingObserver extends ContentObserver { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java index 6f1f9774a9c16..fff830560c149 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java @@ -197,7 +197,7 @@ public class BatteryTile extends QSTile implements BatteryControll } mDrawable.onBatteryLevelChanged(100, false, false); mDrawable.onPowerSaveChanged(true); - mDrawable.disableShowPercent(); + mDrawable.setShowPercent(false); ((ImageView) mCurrentView.findViewById(android.R.id.icon)).setImageDrawable(mDrawable); Checkable checkbox = (Checkable) mCurrentView.findViewById(android.R.id.toggle); checkbox.setChecked(mPowerSave); diff --git a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java index ee0116ec7dc6d..3058c0a1e739a 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java @@ -25,7 +25,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.statusbar.phone.StatusBarIconController; -import static com.android.settingslib.graph.BatteryMeterDrawableBase.SHOW_PERCENT_SETTING; +import static com.android.systemui.BatteryMeterDrawable.SHOW_PERCENT_SETTING; public class BatteryPreference extends DropDownPreference implements TunerService.Tunable { diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java index 7acd888483abb..489c05bcbe957 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java @@ -38,12 +38,10 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; -import com.android.settingslib.graph.BatteryMeterDrawableBase; +import static com.android.systemui.BatteryMeterDrawable.SHOW_PERCENT_SETTING; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; import com.android.systemui.R; -import com.android.systemui.SystemUI; -import com.android.systemui.SystemUIApplication; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -201,7 +199,7 @@ public class TunerService { // A couple special cases. Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null); Settings.System.putString(mContentResolver, - BatteryMeterDrawableBase.SHOW_PERCENT_SETTING, null); + SHOW_PERCENT_SETTING, null); Intent intent = new Intent(DemoMode.ACTION_DEMO); intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_EXIT); mContext.sendBroadcast(intent); From 6cfde402343c091dd5e988a6d7b1a39dc7a83d82 Mon Sep 17 00:00:00 2001 From: Dan Sandler Date: Tue, 7 Feb 2017 21:21:32 -0800 Subject: [PATCH 2/2] Fix regression in battery size. The aspect ratio of the intrinsic dimensions resulted in a too-short battery. Test: visual Change-Id: I31cc36d1efad5cc9b086b90eb857a08eee181677 --- packages/SettingsLib/res/values/dimens.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index b72bcc71f0466..aa3661707130c 100644 --- a/packages/SettingsLib/res/values/dimens.xml +++ b/packages/SettingsLib/res/values/dimens.xml @@ -58,8 +58,8 @@ 4dp 32dp - 48dp - 38dp + 14.5dp + 9.5dp 10.5%