diff options
author | John Spurlock <jspurlock@google.com> | 2013-09-07 12:39:49 -0400 |
---|---|---|
committer | John Spurlock <jspurlock@google.com> | 2013-09-08 10:29:11 -0400 |
commit | fceb7edddeda6962212377cb88391d9affe5967a (patch) | |
tree | c800d6f12790e92bc587f7b3d00fd93cff165548 /packages | |
parent | d57de6afb8981dc1663d41a842ab7cdae93427a1 (diff) | |
download | frameworks_base-fceb7edddeda6962212377cb88391d9affe5967a.zip frameworks_base-fceb7edddeda6962212377cb88391d9affe5967a.tar.gz frameworks_base-fceb7edddeda6962212377cb88391d9affe5967a.tar.bz2 |
Draw status bar battery icon bolt in code.
Use high-res polygon points, punching a hole in the rest of drawing
with PorterDuff.Mode.CLEAR.
Remove the now obsolete lightning.png and associated color filters.
Bug:10640891
Change-Id: I8f2d4dd157f9866f37ed9b3480bb79ee9f109975
Diffstat (limited to 'packages')
-rw-r--r-- | packages/SystemUI/res/drawable-nodpi/lightning.png | bin | 2896 -> 0 bytes | |||
-rw-r--r-- | packages/SystemUI/res/values/arrays.xml | 11 | ||||
-rwxr-xr-x | packages/SystemUI/src/com/android/systemui/BatteryMeterView.java | 113 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java | 1 |
4 files changed, 80 insertions, 45 deletions
diff --git a/packages/SystemUI/res/drawable-nodpi/lightning.png b/packages/SystemUI/res/drawable-nodpi/lightning.png Binary files differdeleted file mode 100644 index 29de308..0000000 --- a/packages/SystemUI/res/drawable-nodpi/lightning.png +++ /dev/null diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index 0812e80..b2c8aee 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -51,5 +51,14 @@ <item>#FFFF3300</item> <item>#FFFFFFFF</item> </array> - + <array name="batterymeter_bolt_points"> + <item>88</item> <item>0</item> + <item>459</item><item>1</item> + <item>238</item><item>333</item> + <item>525</item><item>310</item> + <item>120</item><item>840</item> + <item>82</item> <item>818</item> + <item>246</item><item>373</item> + <item>0</item> <item>408</item> + </array> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index be5c326..2257617 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -23,12 +23,13 @@ import android.content.IntentFilter; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; -import android.graphics.LightingColorFilter; import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; import android.os.BatteryManager; import android.os.Bundle; import android.provider.Settings; @@ -43,26 +44,27 @@ public class BatteryMeterView extends View implements DemoMode { public static final boolean SINGLE_DIGIT_PERCENT = false; public static final boolean SHOW_100_PERCENT = false; - private static final LightingColorFilter LIGHTNING_FILTER_OPAQUE = - new LightingColorFilter(0x00000000, 0x00000000); - private static final LightingColorFilter LIGHTNING_FILTER_TRANS = - new LightingColorFilter(0x00999999, 0x00000000); - public static final int FULL = 96; public static final int EMPTY = 4; int[] mColors; boolean mShowPercent = true; - Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint; + Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint; int mButtonHeight; private float mTextHeight, mWarningTextHeight; - Drawable mLightning; private int mHeight; private int mWidth; private String mWarningString; private final int mChargeColor; + private final float[] mBoltPoints; + private final Path mBoltPath = new Path(); + + private final RectF mFrame = new RectF(); + private final RectF mButtonFrame = new RectF(); + private final RectF mClipFrame = new RectF(); + private final Rect mBoltFrame = new Rect(); private class BatteryTracker extends BroadcastReceiver { // current battery status @@ -175,7 +177,8 @@ public class BatteryMeterView extends View implements DemoMode { mColors[2*i] = levels.getInt(i, 0); mColors[2*i+1] = colors.getColor(i, 0); } - + levels.recycle(); + colors.recycle(); mShowPercent = ENABLE_PERCENT && 0 != Settings.System.getInt( context.getContentResolver(), "status_bar_show_battery_percent", 0); @@ -198,8 +201,28 @@ public class BatteryMeterView extends View implements DemoMode { mWarningTextPaint.setTypeface(font); mWarningTextPaint.setTextAlign(Paint.Align.CENTER); - mLightning = getResources().getDrawable(R.drawable.lightning); mChargeColor = getResources().getColor(R.color.batterymeter_charge_color); + + mBoltPaint = new Paint(); + mBoltPaint.setAntiAlias(true); + mBoltPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); // punch hole + setLayerType(LAYER_TYPE_HARDWARE, null); + mBoltPoints = loadBoltPoints(res); + } + + 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; } @Override @@ -220,15 +243,6 @@ public class BatteryMeterView extends View implements DemoMode { return color; } - // TODO jspurlock - remove once we draw hollow bolt in code - public void setBarTransparent(boolean isTransparent) { - mLightning.setColorFilter(isTransparent ? LIGHTNING_FILTER_TRANS : LIGHTNING_FILTER_OPAQUE); - BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; - if (tracker.plugged) { - postInvalidate(); - } - } - @Override public void draw(Canvas c) { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; @@ -243,22 +257,19 @@ public class BatteryMeterView extends View implements DemoMode { mButtonHeight = (int) (height * 0.12f); - final RectF frame = new RectF(0, 0, width, height); - frame.offset(pl, pt); - - // Log.v("BatteryGauge", String.format("canvas: %dx%d frame: %s", - // c.getWidth(), c.getHeight(), frame.toString())); + mFrame.set(0, 0, width, height); + mFrame.offset(pl, pt); - final RectF buttonframe = new RectF( - frame.left + width * 0.25f, - frame.top, - frame.right - width * 0.25f, - frame.top + mButtonHeight); + mButtonFrame.set( + mFrame.left + width * 0.25f, + mFrame.top, + mFrame.right - width * 0.25f, + mFrame.top + mButtonHeight); - frame.top += mButtonHeight; + mFrame.top += mButtonHeight; // first, draw the battery shape - c.drawRect(frame, mFramePaint); + c.drawRect(mFrame, mFramePaint); // fill 'er up final int pct = tracker.level; @@ -271,15 +282,14 @@ public class BatteryMeterView extends View implements DemoMode { drawFrac = 0f; } - c.drawRect(buttonframe, - drawFrac == 1f ? mBatteryPaint : mFramePaint); + c.drawRect(mButtonFrame, drawFrac == 1f ? mBatteryPaint : mFramePaint); - RectF clip = new RectF(frame); - clip.top += (frame.height() * (1f - drawFrac)); + mClipFrame.set(mFrame); + mClipFrame.top += (mFrame.height() * (1f - drawFrac)); c.save(Canvas.CLIP_SAVE_FLAG); - c.clipRect(clip); - c.drawRect(frame, mBatteryPaint); + c.clipRect(mClipFrame); + c.drawRect(mFrame, mBatteryPaint); c.restore(); if (level <= EMPTY) { @@ -287,11 +297,28 @@ public class BatteryMeterView extends View implements DemoMode { final float y = (mHeight + mWarningTextHeight) * 0.48f; c.drawText(mWarningString, x, y, mWarningTextPaint); } else if (tracker.plugged) { - final Rect r = new Rect( - (int)frame.left + width / 4, (int)frame.top + height / 5, - (int)frame.right - width / 4, (int)frame.bottom - height / 6); - mLightning.setBounds(r); - mLightning.draw(c); + // draw the bolt + final int bl = (int)(mFrame.left + width / 4f); + final int bt = (int)(mFrame.top + height / 6f); + final int br = (int)(mFrame.right - width / 5f); + final int bb = (int)(mFrame.bottom - height / 6f); + 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()); + } + c.drawPath(mBoltPath, mBoltPaint); } else if (mShowPercent && !(tracker.level == 100 && !SHOW_100_PERCENT)) { mTextPaint.setTextSize(height * (SINGLE_DIGIT_PERCENT ? 0.75f diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index f8b6ca6..735b2c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -97,7 +97,6 @@ public class PhoneStatusBarView extends PanelBar { private void applyMode(int mode, boolean animate) { if (mLeftSide == null || mRightSide == null) return; - mBattery.setBarTransparent(isTransparent(mode)); float newAlpha = getAlphaFor(mode); if (animate) { ObjectAnimator lhs = animateTransitionTo(mLeftSide, newAlpha); |