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

Commit 6f4179c3 authored by Evan Laird's avatar Evan Laird
Browse files

Use BatteryMeterDrawableBase as QS icon for Battery Saver

This ensures that QS, Settings, and Status bar all use the same drawable
base so they will always look the same. Battery saver is essentially a
full battery that always shows the power saver iconography.

Test: visual; runtest -x
frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
Bug: 62668861
Change-Id: I8a9d5e59c9bb38c0ef794a0ed591195809521f70
parent 088f2754
Loading
Loading
Loading
Loading
+39 −6
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.Path.FillType;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
@@ -82,6 +83,7 @@ public class BatteryMeterDrawableBase extends Drawable {
    private final float[] mPlusPoints;
    private final Path mPlusPath = new Path();

    private final Rect mPadding = new Rect();
    private final RectF mFrame = new RectF();
    private final RectF mButtonFrame = new RectF();
    private final RectF mBoltFrame = new RectF();
@@ -219,12 +221,40 @@ public class BatteryMeterDrawableBase extends Drawable {
    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        mHeight = bottom - top;
        mWidth = right - left;
        updateSize();
    }

    private void updateSize() {
        final Rect bounds = getBounds();

        mHeight = (bounds.bottom - mPadding.bottom) - (bounds.top + mPadding.top);
        mWidth = (bounds.right - mPadding.right) - (bounds.left + mPadding.left);
        mWarningTextPaint.setTextSize(mHeight * 0.75f);
        mWarningTextHeight = -mWarningTextPaint.getFontMetrics().ascent;
    }

    @Override
    public boolean getPadding(Rect padding) {
        if (mPadding.left == 0
            && mPadding.top == 0
            && mPadding.right == 0
            && mPadding.bottom == 0) {
            return super.getPadding(padding);
        }

        padding.set(mPadding);
        return true;
    }

    public void setPadding(int left, int top, int right, int bottom) {
        mPadding.left = left;
        mPadding.top = top;
        mPadding.right = right;
        mPadding.bottom = bottom;

        updateSize();
    }

    private int getColorForLevel(int percent) {
        // If we are in power save mode, always use the normal color.
        if (mPowerSaveEnabled) {
@@ -255,6 +285,10 @@ public class BatteryMeterDrawableBase extends Drawable {
        invalidateSelf();
    }

    protected int batteryColorForLevel(int level) {
        return mCharging ? mChargeColor : getColorForLevel(level);
    }

    @Override
    public void draw(Canvas c) {
        final int level = mLevel;
@@ -264,11 +298,10 @@ public class BatteryMeterDrawableBase extends Drawable {
        float drawFrac = (float) level / 100f;
        final int height = mHeight;
        final int width = (int) (ASPECT_RATIO * mHeight);
        int px = (mWidth - width) / 2;

        final int px = (mWidth - width) / 2;
        final int buttonHeight = Math.round(height * mButtonHeightFraction);

        mFrame.set(0, 0, width, height);
        mFrame.set(mPadding.left, mPadding.top, width + mPadding.left, height + mPadding.top);
        mFrame.offset(px, 0);

        // button-frame: area above the battery body
@@ -282,7 +315,7 @@ public class BatteryMeterDrawableBase extends Drawable {
        mFrame.top += buttonHeight;

        // set the battery charging color
        mBatteryPaint.setColor(mCharging ? mChargeColor : getColorForLevel(level));
        mBatteryPaint.setColor(batteryColorForLevel(level));

        if (level >= FULL) {
            drawFrac = 1f;
+33 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package com.android.settingslib.graph;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -68,4 +69,36 @@ public class BatteryMeterDrawableBaseTest {
            }
        }
    }

    @Test
    public void testPadding_returnsCorrectValues() {
        // different pads on each side to differentiate
        final int left = 1;
        final int top = 2;
        final int right = 3;
        final int bottom = 4;

        final Rect expected = new Rect(left, top, right, bottom);
        final Rect padding = new Rect();

        mBatteryDrawable.setPadding(left, top, right, bottom);

        assertThat(mBatteryDrawable.getPadding(padding)).isEqualTo(true);
        assertThat(padding).isEqualTo(expected);
    }

    @Test
    public void testPadding_falseIfUnsetOrZero() {
        final Rect padding = new Rect();
        assertThat(mBatteryDrawable.getPadding(padding)).isEqualTo(false);
        assertThat(isRectZero(padding)).isEqualTo(true);

        mBatteryDrawable.setPadding(0, 0, 0, 0);
        assertThat(mBatteryDrawable.getPadding(padding)).isEqualTo(false);
        assertThat(isRectZero(padding)).isEqualTo(true);
    }

    private boolean isRectZero(Rect r) {
        return r.left == 0 && r.top == 0 && r.right == 0 && r.bottom == 0;
    }
}
+44 −2
Original line number Diff line number Diff line
@@ -15,10 +15,13 @@
 */
package com.android.systemui.qs.tiles;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.service.quicksettings.Tile;
import android.widget.Switch;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.graph.BatteryMeterDrawableBase;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
@@ -79,7 +82,9 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
    protected void handleUpdateState(BooleanState state, Object arg) {
        state.state = mCharging ? Tile.STATE_UNAVAILABLE
                : mPowerSave ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
        state.icon = ResourceIcon.get(R.drawable.ic_qs_battery_saver);
        BatterySaverIcon bsi = new BatterySaverIcon();
        bsi.mState = state.state;
        state.icon = bsi;
        state.label = mContext.getString(R.string.battery_detail_switch_title);
        state.contentDescription = state.label;
        state.value = mPowerSave;
@@ -99,4 +104,41 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
        mPowerSave = isPowerSave;
        refreshState(null);
    }

    public static class BatterySaverIcon extends Icon {
        private int mState;

        @Override
        public Drawable getDrawable(Context context) {
            BatterySaverDrawable b = new BatterySaverDrawable(context, 0);
            b.mState = mState;
            final int pad = context.getResources()
                    .getDimensionPixelSize(R.dimen.qs_tile_divider_height);
            b.setPadding(pad, pad, pad, pad);
            return b;
        }
    }

    private static class BatterySaverDrawable extends BatteryMeterDrawableBase {
        private int mState;
        private static final int MAX_BATTERY = 100;

        BatterySaverDrawable(Context context, int frameColor) {
            super(context, frameColor);
            // Show as full so it's always uniform color
            super.setBatteryLevel(MAX_BATTERY);
            setPowerSave(true);
            setCharging(false);
        }

        @Override
        protected int batteryColorForLevel(int level) {
            return QSTileImpl.getColorForState(mContext, mState);
        }

        @Override
        public void setBatteryLevel(int val) {
            // Don't change the actual level, otherwise this won't draw correctly
        }
    }
}