Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bda77ab1 authored by Danny Baumann's avatar Danny Baumann Committed by Gerrit Code Review
Browse files

Merge "systemui: Add text plain battery style" into cm-11.0

parents 2eaa47c1 a6dab51d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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
         */
+186 −9
Original line number Diff line number Diff line
@@ -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 {
@@ -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 {
@@ -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() {
@@ -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);

@@ -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);
        }
@@ -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) {
@@ -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);
            }
        }
    }

@@ -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

@@ -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);
            }
        }
    }
}
+13 −4
Original line number Diff line number Diff line
@@ -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 {
@@ -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();
    }

@@ -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);

@@ -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);
        }
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -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;
        }