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

Commit f634831d authored by YUKAI HUNG's avatar YUKAI HUNG Committed by Android (Google) Code Review
Browse files

Merge "Draw percentage information into BatteryChartView manually" into sc-dev

parents 921c6773 1001614b
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
        android:id="@+id/chart_summary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="45dp"
        android:layout_marginBottom="30dp"
        android:textAppearance="?android:attr/textAppearanceSmall"
        settings:textColor="?android:attr/textColorSecondary"
        android:text="@string/battery_usage_chart_graph_hint" />
@@ -34,9 +34,16 @@
    <com.android.settings.fuelgauge.BatteryChartView
        android:id="@+id/battery_chart"
        android:layout_width="match_parent"
        android:layout_height="141dp"
        android:layout_height="150dp"
        android:layout_marginBottom="16dp"
        android:textAppearance="?android:attr/textAppearanceSmall"
        settings:textColor="?android:attr/textColorSecondary" />
    <TextView
        android:id="@+id/companion_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="?android:attr/textColorSecondary"/>

</LinearLayout>
+1 −0
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@
    <dimen name="subtitle_bottom_padding">24dp</dimen>

    <!-- Battery usage chart view component -->
    <dimen name="chartview_text_padding">3dp</dimen>
    <dimen name="chartview_divider_width">1dp</dimen>
    <dimen name="chartview_divider_height">4dp</dimen>
    <dimen name="chartview_trapezoid_radius">3dp</dimen>
+83 −17
Original line number Diff line number Diff line
@@ -22,11 +22,13 @@ import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.widget.AppCompatImageView;

@@ -38,6 +40,8 @@ import java.util.Locale;
/** A widget component to draw chart graph. */
public class BatteryChartView extends AppCompatImageView implements View.OnClickListener {
    private static final String TAG = "BatteryChartView";
    // For drawing the percentage information.
    private static final String[] PERCENTAGES = new String[] {"100%", "50%", "0%"};
    private static final int DEFAULT_TRAPEZOID_COUNT = 12;
    /** Selects all trapezoid shapes. */
    public static final int SELECTED_INDEX_ALL = -1;
@@ -58,8 +62,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
    private int mTrapezoidColor;
    private int mTrapezoidSolidColor;
    private final int mDividerColor = Color.parseColor("#CDCCC5");
    // For drawing the percentage information.
    private int mTextPadding;
    private final Rect mIndent = new Rect();
    private final Rect[] mPercentageBound =
        new Rect[] {new Rect(), new Rect(), new Rect()};

    private int[] mLevels;
    private Paint mTextPaint;
    private Paint mDividerPaint;
    private Paint mTrapezoidPaint;
    private TrapezoidSlot[] mTrapezoidSlot;
@@ -128,6 +138,37 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
        mOnSelectListener = listener;
    }

    /** Sets the companion {@link TextView} for percentage information. */
    public void setCompanionTextView(TextView textView) {
        requestLayout();
        if (textView != null) {
            // Pre-draws the view first to load style atttributions into paint.
            textView.draw(new Canvas());
            mTextPaint = textView.getPaint();
        } else {
            mTextPaint = null;
        }
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // Measures text bounds and updates indent configuration.
        if (mTextPaint != null) {
            for (int index = 0; index < PERCENTAGES.length; index++) {
                mTextPaint.getTextBounds(
                    PERCENTAGES[index], 0, PERCENTAGES[index].length(),
                    mPercentageBound[index]);
            }
            // Updates the indent configurations.
            mIndent.top = mPercentageBound[0].height();
            mIndent.right = mPercentageBound[0].width() + mTextPadding * 2;
            Log.d(TAG, "setIndent:" + mPercentageBound[0]);
        } else {
            mIndent.set(0, 0, 0, 0);
        }
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
@@ -194,32 +235,56 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
        mTrapezoidPaint.setPathEffect(
            new CornerPathEffect(
                resources.getDimensionPixelSize(R.dimen.chartview_trapezoid_radius)));
        // Initializes for drawing text information.
        mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
    }

    private void drawHorizontalDividers(Canvas canvas) {
        final int width = getWidth() - mIndent.right;
        final int height = getHeight() - mIndent.top - mIndent.bottom;
        // Draws the top divider line for 100% curve.
        float offsetY = mDividerWidth * 0.5f;
        canvas.drawLine(0, offsetY, getWidth(), offsetY, mDividerPaint);
        float offsetY = mIndent.top + mDividerWidth * .5f;
        canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
        if (mTextPaint != null) {
            canvas.drawText(
                PERCENTAGES[0],
                getWidth() - mPercentageBound[0].width(),
                offsetY + mPercentageBound[0].height() *.5f , mTextPaint);
        }
        // Draws the center divider line for 50% curve.
        final float availableSpace =
                getHeight() - mDividerWidth * 2 - mTrapezoidVOffset - mDividerHeight;
        offsetY = mDividerWidth + availableSpace * 0.5f;
        canvas.drawLine(0, offsetY, getWidth(), offsetY, mDividerPaint);
        // Draws the center divider line for 0% curve.
        offsetY = getHeight() - mDividerHeight - mDividerWidth * 0.5f;
        canvas.drawLine(0, offsetY, getWidth(), offsetY, mDividerPaint);
            height - mDividerWidth * 2 - mTrapezoidVOffset - mDividerHeight;
        offsetY = mIndent.top + mDividerWidth + availableSpace * .5f;
        canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
        if (mTextPaint != null) {
            canvas.drawText(
                PERCENTAGES[1],
                    getWidth() - mPercentageBound[1].width(),
                    offsetY + mPercentageBound[1].height() *.5f , mTextPaint);
        }
        // Draws the bottom divider line for 0% curve.
        offsetY = mIndent.top + (height - mDividerHeight - mDividerWidth * .5f);
        canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
        if (mTextPaint != null) {
            canvas.drawText(
                PERCENTAGES[2],
                getWidth() - mPercentageBound[2].width(),
                offsetY + mPercentageBound[2].height() *.5f , mTextPaint);
        }
    }

    private void drawVerticalDividers(Canvas canvas) {
        final int width = getWidth() - mIndent.right;
        final int dividerCount = mTrapezoidCount + 1;
        final float dividerSpace = dividerCount * mDividerWidth;
        final float unitWidth = (getWidth() - dividerSpace) / (float) mTrapezoidCount;
        final float startY = getHeight() - mDividerHeight;
        final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * 0.5f;
        final float unitWidth = (width - dividerSpace) / (float) mTrapezoidCount;
        final float bottomY = getHeight() - mIndent.bottom;
        final float startY = bottomY - mDividerHeight;
        final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * .5f;
        // Draws each vertical dividers.
        float startX = mDividerWidth * 0.5f;
        float startX = mDividerWidth * .5f;
        for (int index = 0; index < dividerCount; index++) {
            canvas.drawLine(startX, startY, startX, getHeight(), mDividerPaint);
            canvas.drawLine(startX, startY, startX, bottomY, mDividerPaint);
            final float nextX = startX + mDividerWidth + unitWidth;
            // Updates the trapezoid slots for drawing.
            if (index < mTrapezoidSlot.length) {
@@ -236,8 +301,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
            return;
        }
        final float trapezoidBottom =
            getHeight() - mDividerHeight - mDividerWidth - mTrapezoidVOffset;
        final float availableSpace = trapezoidBottom - mDividerWidth;
            getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
                - mTrapezoidVOffset;
        final float availableSpace = trapezoidBottom - mDividerWidth * .5f - mIndent.top;
        final float unitHeight = availableSpace / 100f;
        // Draws all trapezoid shapes into the canvas.
        final Path trapezoidPath = new Path();
+2 −0
Original line number Diff line number Diff line
@@ -100,6 +100,8 @@ public class BatteryHistoryPreference extends Preference {
        }
        if (mIsChartGraphEnabled) {
            mBatteryChartView = (BatteryChartView) view.findViewById(R.id.battery_chart);
            mBatteryChartView.setCompanionTextView(
                (TextView) view.findViewById(R.id.companion_text));
            if (mChartPreferenceController != null) {
                mChartPreferenceController.setBatteryChartView(mBatteryChartView);
            }