Loading core/java/android/provider/Settings.java +2 −1 Original line number Diff line number Diff line Loading @@ -2918,6 +2918,7 @@ public final class Settings { * 2: Display the battery as a circle * 4: Hide the battery status information * 5: Display the battery an icon in landscape mode * 6: Display the battery as plain text * default: 0 * @hide */ Loading packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +186 −9 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; public class BatteryMeterView extends View implements DemoMode { Loading @@ -47,7 +48,8 @@ public class BatteryMeterView extends View implements DemoMode { BATTERY_METER_GONE, BATTERY_METER_ICON_PORTRAIT, BATTERY_METER_ICON_LANDSCAPE, BATTERY_METER_CIRCLE BATTERY_METER_CIRCLE, BATTERY_METER_TEXT } protected class BatteryTracker extends BroadcastReceiver { Loading Loading @@ -89,10 +91,12 @@ public class BatteryMeterView extends View implements DemoMode { setContentDescription( context.getString(R.string.accessibility_battery_level, level)); synchronized (mLock) { if (mBatteryMeterDrawable != null) { setVisibility(View.VISIBLE); invalidateIfVisible(); } } } else if (action.equals(ACTION_LEVEL_TEST)) { testmode = true; post(new Runnable() { Loading Loading @@ -232,6 +236,9 @@ public class BatteryMeterView extends View implements DemoMode { case BATTERY_METER_CIRCLE: return new CircleBatteryMeterDrawable(res); case BATTERY_METER_TEXT: return new TextBatteryMeterDrawable(res); case BATTERY_METER_ICON_LANDSCAPE: return new NormalBatteryMeterDrawable(res, true); Loading @@ -247,6 +254,9 @@ public class BatteryMeterView extends View implements DemoMode { if (mMeterMode == BatteryMeterMode.BATTERY_METER_CIRCLE) { height += (CircleBatteryMeterDrawable.STROKE_WITH / 3); width = height; } else if (mMeterMode == BatteryMeterMode.BATTERY_METER_TEXT) { width = (int)((TextBatteryMeterDrawable) mBatteryMeterDrawable).calculateMeasureWidth(); onSizeChanged(width, height, 0, 0); // Force a size changed event } else if (mMeterMode.compareTo(BatteryMeterMode.BATTERY_METER_ICON_LANDSCAPE) == 0) { width = (int)(height * 1.2f); } Loading Loading @@ -297,6 +307,7 @@ public class BatteryMeterView extends View implements DemoMode { } mMeterMode = mode; BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; if (mode == BatteryMeterMode.BATTERY_METER_GONE) { setVisibility(View.GONE); synchronized (mLock) { Loading @@ -314,9 +325,13 @@ public class BatteryMeterView extends View implements DemoMode { ((NormalBatteryMeterDrawable)mBatteryMeterDrawable).loadBoltPoints( mContext.getResources()); } if (tracker.present) { setVisibility(View.VISIBLE); postInvalidate(); requestLayout(); } else { setVisibility(View.GONE); } } } Loading Loading @@ -597,8 +612,7 @@ public class BatteryMeterView extends View implements DemoMode { private boolean mDisposed; // state variables private int mAnimOffset; // current level of charging animation private int mAnimOffset; private boolean mIsAnimating; // stores charge-animation status to reliably //remove callbacks Loading Loading @@ -801,4 +815,167 @@ public class BatteryMeterView extends View implements DemoMode { - strokeWidth / 2.0f + getResources().getDisplayMetrics().density; } } protected class TextBatteryMeterDrawable implements BatteryMeterDrawable { private static final boolean DRAW_LEVEL = false; public static final int FULL = 96; public static final int EMPTY = 4; private boolean mDisposed; private float mTextX; private float mTextY; private boolean mOldPlugged = false; private int mOldLevel = -1; private boolean mIsAnimating; private int mAnimOffset; private Paint mBackPaint; private Paint mFrontPaint; public TextBatteryMeterDrawable(Resources res) { super(); mDisposed = false; mIsAnimating = false; DisplayMetrics dm = res.getDisplayMetrics(); mBackPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBackPaint.setTextAlign(Paint.Align.RIGHT); mBackPaint.setColor(res.getColor(R.color.batterymeter_frame_color)); mBackPaint.setTextSize(16.0f * dm.density); mFrontPaint = new Paint(mBackPaint); } @Override public void onDraw(Canvas c, BatteryTracker tracker) { if (mDisposed) return; int level = tracker.level; boolean plugged = tracker.plugged; boolean unknownStatus = tracker.status == BatteryManager.BATTERY_STATUS_UNKNOWN; if (mOldLevel != level || mOldPlugged != plugged) { mOldLevel = level; mOldPlugged = plugged; postInvalidate(); requestLayout(); return; } if (unknownStatus) { c.drawText("?", mTextX, mTextY, mBackPaint); Resources res = mContext.getResources(); mFrontPaint.setColor(res.getColor(R.color.batterymeter_frame_color)); drawWithoutLevel(c, "?"); return; } mFrontPaint.setColor(getColorForLevel(level)); // Is plugged? Then use the animation status if (tracker.shouldIndicateCharging() && level != 100) { updateChargeAnimation(tracker); drawWithLevel(c, tracker, mAnimOffset, getLevel(level)); } else { resetChargeAnimation(); if (DRAW_LEVEL) { drawWithLevel(c, tracker, level, getLevel(level)); } else { drawWithoutLevel(c, getLevel(level)); } } } private void drawWithLevel(Canvas c, BatteryTracker tracker, int level, String levelTxt) { Rect bounds = getBounds(tracker, level); // Draw the background c.drawText(levelTxt, mTextX, mTextY, mBackPaint); // Draw the foreground c.save(); c.clipRect(0.0f, mTextY - ((level * bounds.height()) / 100.0f), mTextX, mTextY); c.drawText(levelTxt, mTextX, mTextY, mFrontPaint); c.restore(); } private void drawWithoutLevel(Canvas c, String levelTxt) { // We need to draw the overlay back paint to get the proper color c.drawText(levelTxt, mTextX, mTextY, mBackPaint); c.drawText(levelTxt, mTextX, mTextY, mFrontPaint); } @Override public void onDispose() { mHandler.removeCallbacks(mInvalidate); mDisposed = true; } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; Rect bounds = getBounds(tracker, tracker.level); float onedp = mContext.getResources().getDisplayMetrics().density * 0.5f; float height = h - getPaddingBottom() - getPaddingTop(); mTextX = w; mTextY = h - getPaddingBottom() - (height / 2 - bounds.height() /2) + onedp; } protected float calculateMeasureWidth() { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; Rect bounds = getBounds(tracker, tracker.level); float onedp = mContext.getResources().getDisplayMetrics().density; return bounds.width() + getPaddingStart() + getPaddingEnd() + onedp; } private Rect getBounds(BatteryTracker tracker, int level) { Rect bounds = new Rect(); boolean unknownStatus = tracker.status == BatteryManager.BATTERY_STATUS_UNKNOWN; String levelTxt = getLevel(unknownStatus ? -1 : level); mBackPaint.getTextBounds(levelTxt, 0, levelTxt.length(), bounds); return bounds; } private String getLevel(int level) { if (level == -1) { return String.format("?", level); } return String.format("%s%%", level); } private void updateChargeAnimation(BatteryTracker tracker) { if (!tracker.shouldIndicateCharging()) { resetChargeAnimation(); return; } mIsAnimating = true; if (mAnimOffset > 100) { mAnimOffset = 0; } else { mAnimOffset += 5; } mHandler.removeCallbacks(mInvalidate); mHandler.postDelayed(mInvalidate, 100); } private void resetChargeAnimation() { if (mIsAnimating) { mIsAnimating = false; mAnimOffset = 0; mHandler.removeCallbacks(mInvalidate); } } } } packages/SystemUI/src/com/android/systemui/DockBatteryMeterView.java +13 −4 Original line number Diff line number Diff line Loading @@ -60,10 +60,9 @@ public class DockBatteryMeterView extends BatteryMeterView { voltage = intent.getIntExtra(BatteryManager.EXTRA_DOCK_VOLTAGE, 0); temperature = intent.getIntExtra(BatteryManager.EXTRA_DOCK_TEMPERATURE, 0); if (present) { setContentDescription( context.getString(R.string.accessibility_dock_battery_level, level)); if (present && mMeterMode != BatteryMeterMode.BATTERY_METER_GONE) { setContentDescription(context.getString( R.string.accessibility_dock_battery_level, level)); invalidateIfVisible(); setVisibility(View.VISIBLE); } else { Loading Loading @@ -124,6 +123,7 @@ public class DockBatteryMeterView extends BatteryMeterView { public DockBatteryMeterView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mBatteryService = ((BatteryManager) context.getSystemService(Context.BATTERY_SERVICE)); mDemoTracker = new DockBatteryTracker(); mTracker = new DockBatteryTracker(); } Loading @@ -143,6 +143,9 @@ public class DockBatteryMeterView extends BatteryMeterView { case BATTERY_METER_CIRCLE: return new DockCircleBatteryMeterDrawable(res); case BATTERY_METER_TEXT: return new DockTextBatteryMeterDrawable(res); case BATTERY_METER_ICON_LANDSCAPE: return new DockNormalBatteryMeterDrawable(res, true); Loading Loading @@ -175,4 +178,10 @@ public class DockBatteryMeterView extends BatteryMeterView { return R.array.dockbatterymeter_bold_points; } } protected class DockTextBatteryMeterDrawable extends TextBatteryMeterDrawable { public DockTextBatteryMeterDrawable(Resources res) { super(res); } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +4 −0 Original line number Diff line number Diff line Loading @@ -2902,6 +2902,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mode = BatteryMeterMode.BATTERY_METER_ICON_LANDSCAPE; break; case 6: mode = BatteryMeterMode.BATTERY_METER_TEXT; break; default: break; } Loading Loading
core/java/android/provider/Settings.java +2 −1 Original line number Diff line number Diff line Loading @@ -2918,6 +2918,7 @@ public final class Settings { * 2: Display the battery as a circle * 4: Hide the battery status information * 5: Display the battery an icon in landscape mode * 6: Display the battery as plain text * default: 0 * @hide */ Loading
packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +186 −9 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; public class BatteryMeterView extends View implements DemoMode { Loading @@ -47,7 +48,8 @@ public class BatteryMeterView extends View implements DemoMode { BATTERY_METER_GONE, BATTERY_METER_ICON_PORTRAIT, BATTERY_METER_ICON_LANDSCAPE, BATTERY_METER_CIRCLE BATTERY_METER_CIRCLE, BATTERY_METER_TEXT } protected class BatteryTracker extends BroadcastReceiver { Loading Loading @@ -89,10 +91,12 @@ public class BatteryMeterView extends View implements DemoMode { setContentDescription( context.getString(R.string.accessibility_battery_level, level)); synchronized (mLock) { if (mBatteryMeterDrawable != null) { setVisibility(View.VISIBLE); invalidateIfVisible(); } } } else if (action.equals(ACTION_LEVEL_TEST)) { testmode = true; post(new Runnable() { Loading Loading @@ -232,6 +236,9 @@ public class BatteryMeterView extends View implements DemoMode { case BATTERY_METER_CIRCLE: return new CircleBatteryMeterDrawable(res); case BATTERY_METER_TEXT: return new TextBatteryMeterDrawable(res); case BATTERY_METER_ICON_LANDSCAPE: return new NormalBatteryMeterDrawable(res, true); Loading @@ -247,6 +254,9 @@ public class BatteryMeterView extends View implements DemoMode { if (mMeterMode == BatteryMeterMode.BATTERY_METER_CIRCLE) { height += (CircleBatteryMeterDrawable.STROKE_WITH / 3); width = height; } else if (mMeterMode == BatteryMeterMode.BATTERY_METER_TEXT) { width = (int)((TextBatteryMeterDrawable) mBatteryMeterDrawable).calculateMeasureWidth(); onSizeChanged(width, height, 0, 0); // Force a size changed event } else if (mMeterMode.compareTo(BatteryMeterMode.BATTERY_METER_ICON_LANDSCAPE) == 0) { width = (int)(height * 1.2f); } Loading Loading @@ -297,6 +307,7 @@ public class BatteryMeterView extends View implements DemoMode { } mMeterMode = mode; BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; if (mode == BatteryMeterMode.BATTERY_METER_GONE) { setVisibility(View.GONE); synchronized (mLock) { Loading @@ -314,9 +325,13 @@ public class BatteryMeterView extends View implements DemoMode { ((NormalBatteryMeterDrawable)mBatteryMeterDrawable).loadBoltPoints( mContext.getResources()); } if (tracker.present) { setVisibility(View.VISIBLE); postInvalidate(); requestLayout(); } else { setVisibility(View.GONE); } } } Loading Loading @@ -597,8 +612,7 @@ public class BatteryMeterView extends View implements DemoMode { private boolean mDisposed; // state variables private int mAnimOffset; // current level of charging animation private int mAnimOffset; private boolean mIsAnimating; // stores charge-animation status to reliably //remove callbacks Loading Loading @@ -801,4 +815,167 @@ public class BatteryMeterView extends View implements DemoMode { - strokeWidth / 2.0f + getResources().getDisplayMetrics().density; } } protected class TextBatteryMeterDrawable implements BatteryMeterDrawable { private static final boolean DRAW_LEVEL = false; public static final int FULL = 96; public static final int EMPTY = 4; private boolean mDisposed; private float mTextX; private float mTextY; private boolean mOldPlugged = false; private int mOldLevel = -1; private boolean mIsAnimating; private int mAnimOffset; private Paint mBackPaint; private Paint mFrontPaint; public TextBatteryMeterDrawable(Resources res) { super(); mDisposed = false; mIsAnimating = false; DisplayMetrics dm = res.getDisplayMetrics(); mBackPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBackPaint.setTextAlign(Paint.Align.RIGHT); mBackPaint.setColor(res.getColor(R.color.batterymeter_frame_color)); mBackPaint.setTextSize(16.0f * dm.density); mFrontPaint = new Paint(mBackPaint); } @Override public void onDraw(Canvas c, BatteryTracker tracker) { if (mDisposed) return; int level = tracker.level; boolean plugged = tracker.plugged; boolean unknownStatus = tracker.status == BatteryManager.BATTERY_STATUS_UNKNOWN; if (mOldLevel != level || mOldPlugged != plugged) { mOldLevel = level; mOldPlugged = plugged; postInvalidate(); requestLayout(); return; } if (unknownStatus) { c.drawText("?", mTextX, mTextY, mBackPaint); Resources res = mContext.getResources(); mFrontPaint.setColor(res.getColor(R.color.batterymeter_frame_color)); drawWithoutLevel(c, "?"); return; } mFrontPaint.setColor(getColorForLevel(level)); // Is plugged? Then use the animation status if (tracker.shouldIndicateCharging() && level != 100) { updateChargeAnimation(tracker); drawWithLevel(c, tracker, mAnimOffset, getLevel(level)); } else { resetChargeAnimation(); if (DRAW_LEVEL) { drawWithLevel(c, tracker, level, getLevel(level)); } else { drawWithoutLevel(c, getLevel(level)); } } } private void drawWithLevel(Canvas c, BatteryTracker tracker, int level, String levelTxt) { Rect bounds = getBounds(tracker, level); // Draw the background c.drawText(levelTxt, mTextX, mTextY, mBackPaint); // Draw the foreground c.save(); c.clipRect(0.0f, mTextY - ((level * bounds.height()) / 100.0f), mTextX, mTextY); c.drawText(levelTxt, mTextX, mTextY, mFrontPaint); c.restore(); } private void drawWithoutLevel(Canvas c, String levelTxt) { // We need to draw the overlay back paint to get the proper color c.drawText(levelTxt, mTextX, mTextY, mBackPaint); c.drawText(levelTxt, mTextX, mTextY, mFrontPaint); } @Override public void onDispose() { mHandler.removeCallbacks(mInvalidate); mDisposed = true; } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; Rect bounds = getBounds(tracker, tracker.level); float onedp = mContext.getResources().getDisplayMetrics().density * 0.5f; float height = h - getPaddingBottom() - getPaddingTop(); mTextX = w; mTextY = h - getPaddingBottom() - (height / 2 - bounds.height() /2) + onedp; } protected float calculateMeasureWidth() { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; Rect bounds = getBounds(tracker, tracker.level); float onedp = mContext.getResources().getDisplayMetrics().density; return bounds.width() + getPaddingStart() + getPaddingEnd() + onedp; } private Rect getBounds(BatteryTracker tracker, int level) { Rect bounds = new Rect(); boolean unknownStatus = tracker.status == BatteryManager.BATTERY_STATUS_UNKNOWN; String levelTxt = getLevel(unknownStatus ? -1 : level); mBackPaint.getTextBounds(levelTxt, 0, levelTxt.length(), bounds); return bounds; } private String getLevel(int level) { if (level == -1) { return String.format("?", level); } return String.format("%s%%", level); } private void updateChargeAnimation(BatteryTracker tracker) { if (!tracker.shouldIndicateCharging()) { resetChargeAnimation(); return; } mIsAnimating = true; if (mAnimOffset > 100) { mAnimOffset = 0; } else { mAnimOffset += 5; } mHandler.removeCallbacks(mInvalidate); mHandler.postDelayed(mInvalidate, 100); } private void resetChargeAnimation() { if (mIsAnimating) { mIsAnimating = false; mAnimOffset = 0; mHandler.removeCallbacks(mInvalidate); } } } }
packages/SystemUI/src/com/android/systemui/DockBatteryMeterView.java +13 −4 Original line number Diff line number Diff line Loading @@ -60,10 +60,9 @@ public class DockBatteryMeterView extends BatteryMeterView { voltage = intent.getIntExtra(BatteryManager.EXTRA_DOCK_VOLTAGE, 0); temperature = intent.getIntExtra(BatteryManager.EXTRA_DOCK_TEMPERATURE, 0); if (present) { setContentDescription( context.getString(R.string.accessibility_dock_battery_level, level)); if (present && mMeterMode != BatteryMeterMode.BATTERY_METER_GONE) { setContentDescription(context.getString( R.string.accessibility_dock_battery_level, level)); invalidateIfVisible(); setVisibility(View.VISIBLE); } else { Loading Loading @@ -124,6 +123,7 @@ public class DockBatteryMeterView extends BatteryMeterView { public DockBatteryMeterView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mBatteryService = ((BatteryManager) context.getSystemService(Context.BATTERY_SERVICE)); mDemoTracker = new DockBatteryTracker(); mTracker = new DockBatteryTracker(); } Loading @@ -143,6 +143,9 @@ public class DockBatteryMeterView extends BatteryMeterView { case BATTERY_METER_CIRCLE: return new DockCircleBatteryMeterDrawable(res); case BATTERY_METER_TEXT: return new DockTextBatteryMeterDrawable(res); case BATTERY_METER_ICON_LANDSCAPE: return new DockNormalBatteryMeterDrawable(res, true); Loading Loading @@ -175,4 +178,10 @@ public class DockBatteryMeterView extends BatteryMeterView { return R.array.dockbatterymeter_bold_points; } } protected class DockTextBatteryMeterDrawable extends TextBatteryMeterDrawable { public DockTextBatteryMeterDrawable(Resources res) { super(res); } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +4 −0 Original line number Diff line number Diff line Loading @@ -2902,6 +2902,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mode = BatteryMeterMode.BATTERY_METER_ICON_LANDSCAPE; break; case 6: mode = BatteryMeterMode.BATTERY_METER_TEXT; break; default: break; } Loading