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

Commit 5953be01 authored by d34d's avatar d34d Committed by Clark Scheff
Browse files

SysUI: Allow styling of battery text/charge blend mode

Not all battery meter modes are created equally and sometimes you
need to draw the text or charge indicator using a different blend
mode than XOR.  This patch adds a new attribute to the battery
meter style which allows the blend mode to be defined per battery
style.

Change-Id: I3d2eb38828abc7e5d93337fa815a414675df43a1
TICKET: NIGHTLIES-2981
parent 936f7e26
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -33,6 +33,43 @@

    <declare-styleable name="BatteryMeterViewDrawable">
        <attr name="android:gravity"/>
        <!-- Blending mode used for drawing charging bolt and percentage text -->
        <attr name="blendMode">
            <!-- [0, 0] -->
            <enum name="clear" value="0" />
            <!-- [Sa, Sc] -->
            <enum name="src" value="1" />
            <!-- [Da, Dc] -->
            <enum name="dst" value="2" />
            <!-- [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] -->
            <enum name="src_over" value="3" />
            <!-- [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] -->
            <enum name="dst_over" value="4" />
            <!-- [Sa * Da, Sc * Da] -->
            <enum name="src_in" value="5" />
            <!-- [Sa * Da, Sa * Dc] -->
            <enum name="dst_in" value="6" />
            <!-- [Sa * (1 - Da), Sc * (1 - Da)] -->
            <enum name="src_out" value="7" />
            <!-- [Da * (1 - Sa), Dc * (1 - Sa)] -->
            <enum name="dst_out" value="8" />
            <!-- [Da, Sc * Da + (1 - Sa) * Dc] -->
            <enum name="src_atop" value="9" />
            <!-- [Sa, Sa * Dc + Sc * (1 - Da)] -->
            <enum name="dst_atop" value="10" />
            <!-- [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] -->
            <enum name="xor" value="11" />
            <!-- Saturate(S + D) -->
            <enum name="add" value="12" />
            <!-- [Sa * Da, Sc * Dc] -->
            <enum name="multiply" value="13" />
            <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
            <enum name="screen" value="14" />
            <!-- Draw on top without any blending operations performed -->
            <enum name="overlay" value="15" />
            <!-- [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] -->
            <enum name="darken" value="16" />
        </attr>
    </declare-styleable>
</resources>
+4 −1
Original line number Diff line number Diff line
@@ -45,10 +45,13 @@
    <style name="BatteryMeterViewDrawable">
        <!-- gravity used for positioning text within the battery meter -->
        <item name="android:gravity">center</item>
        <item name="blendMode">clear</item>
    </style>
    <!-- Battery meter drawable styles -->
    <style name="BatteryMeterViewDrawable.Portrait"/>
    <style name="BatteryMeterViewDrawable.Landscape"/>
    <style name="BatteryMeterViewDrawable.Circle"/>
    <style name="BatteryMeterViewDrawable.Circle">
        <item name="blendMode">overlay</item>
    </style>

</resources>
+26 −8
Original line number Diff line number Diff line
@@ -473,6 +473,7 @@ public class BatteryMeterView extends View implements DemoMode,

        private Paint mTextAndBoltPaint;
        private Paint mWarningTextPaint;
        private Paint mClearPaint;

        private LayerDrawable mBatteryDrawable;
        private Drawable mFrameDrawable;
@@ -490,13 +491,16 @@ public class BatteryMeterView extends View implements DemoMode,
            mMode = mode;
            mDisposed = false;

            // load text gravity
            int[] textGravityAttr = new int[] {android.R.attr.gravity};
            // load text gravity and blend mode
            int[] attrs = new int[] {android.R.attr.gravity, R.attr.blendMode};
            int resId = getBatteryDrawableStyleResourceForMode(mode);
            PorterDuff.Mode xferMode = PorterDuff.Mode.XOR;
            if (resId != 0) {
                TypedArray a = getContext().obtainStyledAttributes(
                        getBatteryDrawableStyleResourceForMode(mode), textGravityAttr);
                        getBatteryDrawableStyleResourceForMode(mode), attrs);
                mTextGravity = a.getInt(0, Gravity.CENTER);
                xferMode = PorterDuff.intToMode(a.getInt(1,
                        PorterDuff.modeToInt(PorterDuff.Mode.XOR)));
            } else {
                mTextGravity = Gravity.CENTER;
            }
@@ -506,13 +510,16 @@ public class BatteryMeterView extends View implements DemoMode,
            Typeface font = Typeface.create("sans-serif-condensed", Typeface.BOLD);
            mTextAndBoltPaint.setTypeface(font);
            mTextAndBoltPaint.setTextAlign(getPaintAlignmentFromGravity(mTextGravity));
            mTextAndBoltPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
            mTextAndBoltPaint.setXfermode(new PorterDuffXfermode(xferMode));

            mWarningTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mWarningTextPaint.setColor(mColors[1]);
            font = Typeface.create("sans-serif", Typeface.BOLD);
            mWarningTextPaint.setTypeface(font);
            mWarningTextPaint.setTextAlign(getPaintAlignmentFromGravity(mTextGravity));

            mClearPaint = new Paint();
            mClearPaint.setColor(0);
        }

        @Override
@@ -635,12 +642,24 @@ public class BatteryMeterView extends View implements DemoMode,
                level = 100;
            }

            mTextAndBoltPaint.setColor(getColorForLevel(level));

            // Make sure we don't draw the charge indicator if not plugged in
            Drawable d = mBatteryDrawable.findDrawableByLayerId(R.id.battery_charge_indicator);
            if (d instanceof BitmapDrawable) {
                // In case we are using a BitmapDrawable, which we should be unless something bad
                // happened, we need to change the paint rather than the alpha in case the blendMode
                // has been set to clear.  Clear always clears regardless of alpha level ;)
                BitmapDrawable bd = (BitmapDrawable) d;
                bd.getPaint().set(tracker.plugged ? mTextAndBoltPaint : mClearPaint);
            } else {
                d.setAlpha(tracker.plugged ? 255 : 0);
            }

            // Now draw the level indicator
            // set the level and tint color of the fill drawable
            mLevelDrawable.setCurrentFraction(level / 100f);
            mLevelDrawable.setTint(getColorForLevel(level));
            mBatteryDrawable.findDrawableByLayerId(R.id.battery_charge_indicator)
                    .setAlpha(tracker.plugged ? 255 : 0);
            mBatteryDrawable.draw(canvas);

            // if chosen by options, draw percentage text in the middle
@@ -774,8 +793,7 @@ public class BatteryMeterView extends View implements DemoMode,
                newBoltDrawable = new BitmapDrawable(getResources(), boltBitmap);
                newBoltDrawable.setBounds(bounds);
            }
            newBoltDrawable.getPaint().setXfermode(new PorterDuffXfermode(
                    PorterDuff.Mode.XOR));
            newBoltDrawable.getPaint().set(mTextAndBoltPaint);
            batteryDrawable.setDrawableByLayerId(R.id.battery_charge_indicator, newBoltDrawable);
        }