From 597b10f6db2401f7685191f96e3aaedcbccc56b0 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Fri, 27 Jan 2017 13:31:40 -0800 Subject: [PATCH] Move the logic of batteryMeterDrawable to settingslib In Settings, we also need a BatteryMeterDrawable to show battery meter, that's why I move it to settingslib. In this cl, what I have changed is listed below: 1. Create BatteryMeterDrawableLib that contains logic of battery drawing. 2. Still Keep the battery control logic in systemui. 3. Remove hardcoded battery color by using the color state lists. 4. Move some tests to settingslib Bug: 34771849 Test: make SettingsLibTests Change-Id: I39c0f0e31ca5e1b958467298db1d0590d16c9f6d --- .../res/color/batterymeter_bolt_color.xml | 18 + .../res/color/batterymeter_charge_color.xml | 18 + .../res/color/batterymeter_frame_color.xml | 18 + .../dark_mode_icon_color_dual_tone_background.xml | 18 + .../color/dark_mode_icon_color_dual_tone_fill.xml | 18 + .../light_mode_icon_color_dual_tone_background.xml | 18 + .../color/light_mode_icon_color_dual_tone_fill.xml | 18 + packages/SettingsLib/res/values/arrays.xml | 33 ++ packages/SettingsLib/res/values/dimens.xml | 11 + packages/SettingsLib/res/values/strings.xml | 3 + .../graph/BatteryMeterDrawableBase.java | 468 ++++++++++++++++++++ .../graph/BatteryMeterDrawableBaseTest.java | 51 +++ packages/SystemUI/res/values/arrays.xml | 54 --- packages/SystemUI/res/values/colors.xml | 3 - packages/SystemUI/res/values/dimens.xml | 11 - packages/SystemUI/res/values/strings.xml | 3 - .../com/android/systemui/BatteryMeterDrawable.java | 469 +-------------------- .../android/systemui/tuner/BatteryPreference.java | 2 +- .../com/android/systemui/tuner/TunerService.java | 5 +- .../android/systemui/BatteryMeterDrawableTest.java | 19 - 20 files changed, 713 insertions(+), 545 deletions(-) create mode 100644 packages/SettingsLib/res/color/batterymeter_bolt_color.xml create mode 100644 packages/SettingsLib/res/color/batterymeter_charge_color.xml create mode 100644 packages/SettingsLib/res/color/batterymeter_frame_color.xml create mode 100644 packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_background.xml create mode 100644 packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_fill.xml create mode 100644 packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_background.xml create mode 100644 packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_fill.xml create mode 100755 packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java create mode 100644 packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java delete mode 100644 packages/SystemUI/res/values/arrays.xml mode change 100755 => 100644 packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java diff --git a/packages/SettingsLib/res/color/batterymeter_bolt_color.xml b/packages/SettingsLib/res/color/batterymeter_bolt_color.xml new file mode 100644 index 000000000000..34de5489a28b --- /dev/null +++ b/packages/SettingsLib/res/color/batterymeter_bolt_color.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/batterymeter_charge_color.xml b/packages/SettingsLib/res/color/batterymeter_charge_color.xml new file mode 100644 index 000000000000..15944c3a2a07 --- /dev/null +++ b/packages/SettingsLib/res/color/batterymeter_charge_color.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/batterymeter_frame_color.xml b/packages/SettingsLib/res/color/batterymeter_frame_color.xml new file mode 100644 index 000000000000..34de5489a28b --- /dev/null +++ b/packages/SettingsLib/res/color/batterymeter_frame_color.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_background.xml b/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_background.xml new file mode 100644 index 000000000000..c8a80ac57c00 --- /dev/null +++ b/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_background.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_fill.xml b/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_fill.xml new file mode 100644 index 000000000000..8dcfdbb8cf1e --- /dev/null +++ b/packages/SettingsLib/res/color/dark_mode_icon_color_dual_tone_fill.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_background.xml b/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_background.xml new file mode 100644 index 000000000000..34de5489a28b --- /dev/null +++ b/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_background.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_fill.xml b/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_fill.xml new file mode 100644 index 000000000000..15944c3a2a07 --- /dev/null +++ b/packages/SettingsLib/res/color/light_mode_icon_color_dual_tone_fill.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index 7bbca5edbc85..eb64b3a9bbd9 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -520,4 +520,37 @@ 7 + + + 15 + 100 + + + @*android:color/battery_saver_mode_color + @android:color/white + + + 73 0 + 3920 + 201259 + 442259 + 4 703 + 157334 + 0 334 + + + 30 + 50 + 53 + 83 + 85 + 55 + 58 + 38 + 35 + 05 + 03 + 33 + + diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index 2e8b30fb5abf..b72bcc71f046 100644 --- a/packages/SettingsLib/res/values/dimens.xml +++ b/packages/SettingsLib/res/values/dimens.xml @@ -57,4 +57,15 @@ 300dp 4dp 32dp + + 48dp + 38dp + + + 10.5% + + + 0% + 0% diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 01296327f689..5475b325773f 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -900,4 +900,7 @@ Next Password required + + + ! diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java new file mode 100755 index 000000000000..d25bb2e1b1b7 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java @@ -0,0 +1,468 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.graph; + +import android.animation.ArgbEvaluator; +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.provider.Settings; +import com.android.settingslib.R; +import com.android.settingslib.Utils; + +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 static final boolean SINGLE_DIGIT_PERCENT = false; + + private static final int FULL = 96; + + private static final float BOLT_LEVEL_THRESHOLD = 0.3f; // opaque bolt below this fraction + + private final int[] mColors; + private final int mIntrinsicWidth; + private final int mIntrinsicHeight; + + private float mButtonHeightFraction; + private float mSubpixelSmoothingLeft; + private float mSubpixelSmoothingRight; + private final Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint, + mPlusPaint; + private float mTextHeight, mWarningTextHeight; + private int mIconTint = Color.WHITE; + private float mOldDarkIntensity = 0f; + + private int mHeight; + private int mWidth; + private String mWarningString; + private final int mCriticalLevel; + private int mChargeColor; + private final float[] mBoltPoints; + private final Path mBoltPath = new Path(); + private final float[] mPlusPoints; + private final Path mPlusPath = new Path(); + + private final RectF mFrame = new RectF(); + private final RectF mButtonFrame = new RectF(); + private final RectF mBoltFrame = new RectF(); + private final RectF mPlusFrame = new RectF(); + + private final Path mShapePath = new Path(); + private final Path mClipPath = new Path(); + private final Path mTextPath = new Path(); + + private int mDarkModeBackgroundColor; + private int mDarkModeFillColor; + + private int mLightModeBackgroundColor; + private int mLightModeFillColor; + + public BatteryMeterDrawableBase(Context context, int frameColor) { + mContext = context; + final Resources res = context.getResources(); + TypedArray levels = res.obtainTypedArray(R.array.batterymeter_color_levels); + TypedArray colors = res.obtainTypedArray(R.array.batterymeter_color_values); + + final int N = levels.length(); + mColors = new int[2 * N]; + for (int i = 0; i < N; i++) { + mColors[2 * i] = levels.getInt(i, 0); + mColors[2 * i + 1] = colors.getColor(i, 0); + } + 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); + mButtonHeightFraction = context.getResources().getFraction( + R.fraction.battery_button_height_fraction, 1, 1); + mSubpixelSmoothingLeft = context.getResources().getFraction( + R.fraction.battery_subpixel_smoothing_left, 1, 1); + mSubpixelSmoothingRight = context.getResources().getFraction( + R.fraction.battery_subpixel_smoothing_right, 1, 1); + + mFramePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mFramePaint.setColor(frameColor); + mFramePaint.setDither(true); + mFramePaint.setStrokeWidth(0); + mFramePaint.setStyle(Paint.Style.FILL_AND_STROKE); + + mBatteryPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBatteryPaint.setDither(true); + mBatteryPaint.setStrokeWidth(0); + mBatteryPaint.setStyle(Paint.Style.FILL_AND_STROKE); + + mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + Typeface font = Typeface.create("sans-serif-condensed", Typeface.BOLD); + mTextPaint.setTypeface(font); + mTextPaint.setTextAlign(Paint.Align.CENTER); + + mWarningTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + font = Typeface.create("sans-serif", Typeface.BOLD); + mWarningTextPaint.setTypeface(font); + mWarningTextPaint.setTextAlign(Paint.Align.CENTER); + if (mColors.length > 1) { + mWarningTextPaint.setColor(mColors[1]); + } + + mChargeColor = Utils.getDefaultColor(mContext, R.color.batterymeter_charge_color); + + mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color)); + mBoltPoints = loadBoltPoints(res); + + mPlusPaint = new Paint(mBoltPaint); + mPlusPoints = loadPlusPoints(res); + + mDarkModeBackgroundColor = + Utils.getDefaultColor(mContext, R.color.dark_mode_icon_color_dual_tone_background); + mDarkModeFillColor = + Utils.getDefaultColor(mContext, R.color.dark_mode_icon_color_dual_tone_fill); + mLightModeBackgroundColor = + Utils.getDefaultColor(mContext, R.color.light_mode_icon_color_dual_tone_background); + mLightModeFillColor = + Utils.getDefaultColor(mContext, R.color.light_mode_icon_color_dual_tone_fill); + + mIntrinsicWidth = context.getResources().getDimensionPixelSize(R.dimen.battery_width); + mIntrinsicHeight = context.getResources().getDimensionPixelSize(R.dimen.battery_height); + } + + @Override + public int getIntrinsicHeight() { + return mIntrinsicHeight; + } + + @Override + public int getIntrinsicWidth() { + return mIntrinsicWidth; + } + + public void disableShowPercent() { + mShowPercent = false; + postInvalidate(); + } + + protected void postInvalidate() { + 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); + 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; + } + + @Override + public void setBounds(int left, int top, int right, int bottom) { + super.setBounds(left, top, right, bottom); + mHeight = bottom - top; + mWidth = right - left; + mWarningTextPaint.setTextSize(mHeight * 0.75f); + 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) { + return mColors[mColors.length - 1]; + } + int thresh, color = 0; + for (int i = 0; i < mColors.length; i += 2) { + thresh = mColors[i]; + color = mColors[i + 1]; + if (percent <= thresh) { + + // Respect tinting for "normal" level + if (i == mColors.length - 2) { + return mIconTint; + } else { + return color; + } + } + } + return color; + } + + public void setDarkIntensity(float darkIntensity) { + if (darkIntensity == mOldDarkIntensity) { + return; + } + int backgroundColor = getBackgroundColor(darkIntensity); + int fillColor = getFillColor(darkIntensity); + setColors(fillColor, backgroundColor); + mOldDarkIntensity = darkIntensity; + } + + public void setColors(int fillColor, int backgroundColor) { + mIconTint = fillColor; + mFramePaint.setColor(backgroundColor); + mBoltPaint.setColor(fillColor); + mChargeColor = fillColor; + invalidateSelf(); + } + + private int getBackgroundColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeBackgroundColor, mDarkModeBackgroundColor); + } + + private int getFillColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeFillColor, mDarkModeFillColor); + } + + private int getColorForDarkIntensity(float darkIntensity, int lightColor, int darkColor) { + return (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, lightColor, darkColor); + } + + @Override + public void draw(Canvas c) { + final int level = mLevel; + + if (level == -1) return; + + float drawFrac = (float) level / 100f; + final int height = mHeight; + final int width = (int) (ASPECT_RATIO * mHeight); + int px = (mWidth - width) / 2; + + final int buttonHeight = (int) (height * mButtonHeightFraction); + + mFrame.set(0, 0, width, height); + mFrame.offset(px, 0); + + // button-frame: area above the battery body + mButtonFrame.set( + mFrame.left + Math.round(width * 0.25f), + mFrame.top, + mFrame.right - Math.round(width * 0.25f), + mFrame.top + buttonHeight); + + mButtonFrame.top += mSubpixelSmoothingLeft; + mButtonFrame.left += mSubpixelSmoothingLeft; + mButtonFrame.right -= mSubpixelSmoothingRight; + + // frame: battery body area + mFrame.top += buttonHeight; + mFrame.left += mSubpixelSmoothingLeft; + mFrame.top += mSubpixelSmoothingLeft; + mFrame.right -= mSubpixelSmoothingRight; + mFrame.bottom -= mSubpixelSmoothingRight; + + // set the battery charging color + mBatteryPaint.setColor(mPluggedIn ? mChargeColor : getColorForLevel(level)); + + if (level >= FULL) { + drawFrac = 1f; + } else if (level <= mCriticalLevel) { + drawFrac = 0f; + } + + final float levelTop = drawFrac == 1f ? mButtonFrame.top + : (mFrame.top + (mFrame.height() * (1f - drawFrac))); + + // define the battery shape + mShapePath.reset(); + mShapePath.moveTo(mButtonFrame.left, mButtonFrame.top); + mShapePath.lineTo(mButtonFrame.right, mButtonFrame.top); + mShapePath.lineTo(mButtonFrame.right, mFrame.top); + mShapePath.lineTo(mFrame.right, mFrame.top); + mShapePath.lineTo(mFrame.right, mFrame.bottom); + mShapePath.lineTo(mFrame.left, mFrame.bottom); + mShapePath.lineTo(mFrame.left, mFrame.top); + mShapePath.lineTo(mButtonFrame.left, mFrame.top); + mShapePath.lineTo(mButtonFrame.left, mButtonFrame.top); + + if (mPluggedIn) { + // define the bolt shape + final float bl = mFrame.left + mFrame.width() / 4f; + final float bt = mFrame.top + mFrame.height() / 6f; + final float br = mFrame.right - mFrame.width() / 4f; + final float bb = mFrame.bottom - mFrame.height() / 10f; + if (mBoltFrame.left != bl || mBoltFrame.top != bt + || mBoltFrame.right != br || mBoltFrame.bottom != bb) { + mBoltFrame.set(bl, bt, br, bb); + mBoltPath.reset(); + mBoltPath.moveTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + for (int i = 2; i < mBoltPoints.length; i += 2) { + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[i] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[i + 1] * mBoltFrame.height()); + } + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + } + + float boltPct = (mBoltFrame.bottom - levelTop) / (mBoltFrame.bottom - mBoltFrame.top); + boltPct = Math.min(Math.max(boltPct, 0), 1); + if (boltPct <= BOLT_LEVEL_THRESHOLD) { + // draw the bolt if opaque + c.drawPath(mBoltPath, mBoltPaint); + } else { + // otherwise cut the bolt out of the overall shape + mShapePath.op(mBoltPath, Path.Op.DIFFERENCE); + } + } else if (mPowerSaveEnabled) { + // define the plus shape + final float pw = mFrame.width() * 2 / 3; + final float pl = mFrame.left + (mFrame.width() - pw) / 2; + final float pt = mFrame.top + (mFrame.height() - pw) / 2; + final float pr = mFrame.right - (mFrame.width() - pw) / 2; + final float pb = mFrame.bottom - (mFrame.height() - pw) / 2; + if (mPlusFrame.left != pl || mPlusFrame.top != pt + || mPlusFrame.right != pr || mPlusFrame.bottom != pb) { + mPlusFrame.set(pl, pt, pr, pb); + mPlusPath.reset(); + mPlusPath.moveTo( + mPlusFrame.left + mPlusPoints[0] * mPlusFrame.width(), + mPlusFrame.top + mPlusPoints[1] * mPlusFrame.height()); + for (int i = 2; i < mPlusPoints.length; i += 2) { + mPlusPath.lineTo( + mPlusFrame.left + mPlusPoints[i] * mPlusFrame.width(), + mPlusFrame.top + mPlusPoints[i + 1] * mPlusFrame.height()); + } + mPlusPath.lineTo( + mPlusFrame.left + mPlusPoints[0] * mPlusFrame.width(), + mPlusFrame.top + mPlusPoints[1] * mPlusFrame.height()); + } + + float boltPct = (mPlusFrame.bottom - levelTop) / (mPlusFrame.bottom - mPlusFrame.top); + boltPct = Math.min(Math.max(boltPct, 0), 1); + if (boltPct <= BOLT_LEVEL_THRESHOLD) { + // draw the bolt if opaque + c.drawPath(mPlusPath, mPlusPaint); + } else { + // otherwise cut the bolt out of the overall shape + mShapePath.op(mPlusPath, Path.Op.DIFFERENCE); + } + } + + // compute percentage text + boolean pctOpaque = false; + float pctX = 0, pctY = 0; + String pctText = null; + if (!mPluggedIn && !mPowerSaveEnabled && level > mCriticalLevel && mShowPercent) { + mTextPaint.setColor(getColorForLevel(level)); + mTextPaint.setTextSize(height * + (SINGLE_DIGIT_PERCENT ? 0.75f + : (mLevel == 100 ? 0.38f : 0.5f))); + mTextHeight = -mTextPaint.getFontMetrics().ascent; + pctText = String.valueOf(SINGLE_DIGIT_PERCENT ? (level / 10) : level); + pctX = mWidth * 0.5f; + pctY = (mHeight + mTextHeight) * 0.47f; + pctOpaque = levelTop > pctY; + if (!pctOpaque) { + mTextPath.reset(); + mTextPaint.getTextPath(pctText, 0, pctText.length(), pctX, pctY, mTextPath); + // cut the percentage text out of the overall shape + mShapePath.op(mTextPath, Path.Op.DIFFERENCE); + } + } + + // draw the battery shape background + c.drawPath(mShapePath, mFramePaint); + + // draw the battery shape, clipped to charging level + mFrame.top = levelTop; + mClipPath.reset(); + mClipPath.addRect(mFrame, Path.Direction.CCW); + mShapePath.op(mClipPath, Path.Op.INTERSECT); + c.drawPath(mShapePath, mBatteryPaint); + + if (!mPluggedIn && !mPowerSaveEnabled) { + if (level <= mCriticalLevel) { + // draw the warning text + final float x = mWidth * 0.5f; + final float y = (mHeight + mWarningTextHeight) * 0.48f; + c.drawText(mWarningString, x, y, mWarningTextPaint); + } else if (pctOpaque) { + // draw the percentage text + c.drawText(pctText, pctX, pctY, mTextPaint); + } + } + } + + // Some stuff required by Drawable. + @Override + public void setAlpha(int alpha) { + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + mFramePaint.setColorFilter(colorFilter); + mBatteryPaint.setColorFilter(colorFilter); + mWarningTextPaint.setColorFilter(colorFilter); + mBoltPaint.setColorFilter(colorFilter); + mPlusPaint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return 0; + } +} 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 new file mode 100644 index 000000000000..fab00dab5be7 --- /dev/null +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java @@ -0,0 +1,51 @@ +package com.android.settingslib.graph; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Canvas; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import com.android.settingslib.R; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyFloat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BatteryMeterDrawableBaseTest { + private Context mContext; + private Resources mResources; + private BatteryMeterDrawableBase mBatteryDrawable; + + @Before + public void setUp() throws Exception { + mContext = InstrumentationRegistry.getTargetContext(); + mResources = mContext.getResources(); + mBatteryDrawable = new BatteryMeterDrawableBase(mContext, 0); + } + + @Test + public void testGetIntrinsicSize() { + assertThat(mBatteryDrawable.getIntrinsicWidth()). + isEqualTo(mResources.getDimensionPixelSize(R.dimen.battery_width)); + assertThat(mBatteryDrawable.getIntrinsicHeight()). + isEqualTo(mResources.getDimensionPixelSize(R.dimen.battery_height)); + } + + @Test + public void testDrawNothingBeforeOnBatteryLevelChanged() { + final Canvas canvas = mock(Canvas.class); + mBatteryDrawable.draw(canvas); + verify(canvas, never()).drawPath(any(), any()); + verify(canvas, never()).drawText(anyString(), anyFloat(), anyFloat(), any()); + } +} diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml deleted file mode 100644 index bf0cba22ab0c..000000000000 --- a/packages/SystemUI/res/values/arrays.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - 15 - 100 - - - @*android:color/battery_saver_mode_color - #FFFFFFFF - - - 73 0 - 3920 - 201259 - 442259 - 4 703 - 157334 - 0 334 - - - 30 - 50 - 53 - 83 - 85 - 55 - 58 - 38 - 35 - 05 - 03 - 33 - - diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 1ec611a43b56..aef2d7de371a 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -26,9 +26,6 @@ #ff090909 #80000000 #ff33B5E5 - #4DFFFFFF - #FFFFFFFF - #FFFFFFFF #FF404040 @*android:color/system_error #29ffffff diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index ddcc4baf8350..9193260f911b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -515,14 +515,6 @@ 32dp - - 10.5% - - - 0% - 0% - 0dp Not charging - - ! -