From fceb7edddeda6962212377cb88391d9affe5967a Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Sat, 7 Sep 2013 12:39:49 -0400 Subject: [PATCH] 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 --- .../SystemUI/res/drawable-nodpi/lightning.png | Bin 2896 -> 0 bytes packages/SystemUI/res/values/arrays.xml | 11 +- .../android/systemui/BatteryMeterView.java | 113 +++++++++++------- .../statusbar/phone/PhoneStatusBarView.java | 1 - 4 files changed, 80 insertions(+), 45 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-nodpi/lightning.png diff --git a/packages/SystemUI/res/drawable-nodpi/lightning.png b/packages/SystemUI/res/drawable-nodpi/lightning.png deleted file mode 100644 index 29de3085a53364df2aa0a56dcf777f979eab0243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2896 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 MV>^v}aa%a=->lj3TmS$7 diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index 0812e80f67f59..b2c8aee4aaf65 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -51,5 +51,14 @@ #FFFF3300 #FFFFFFFF - + + 88 0 + 4591 + 238333 + 525310 + 120840 + 82 818 + 246373 + 0 408 + diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index be5c3267bab46..2257617b54294 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); + mFrame.set(0, 0, width, height); + mFrame.offset(pl, pt); - // Log.v("BatteryGauge", String.format("canvas: %dx%d frame: %s", - // c.getWidth(), c.getHeight(), frame.toString())); + mButtonFrame.set( + mFrame.left + width * 0.25f, + mFrame.top, + mFrame.right - width * 0.25f, + mFrame.top + mButtonHeight); - final RectF buttonframe = new RectF( - frame.left + width * 0.25f, - frame.top, - frame.right - width * 0.25f, - frame.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 f8b6ca6d21037..735b2c55a2813 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);