From 1001614b141989b8aca099d4ff40801df54632e2 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 26 Apr 2021 11:53:38 +0800 Subject: [PATCH] Draw percentage information into BatteryChartView manually screen: https://screenshot.googleplex.com/Bw4Whpzff5pCT5J Bug: 183921876 Test: make SettingsRoboTests Test: make SettingsGoogleRoboTests Change-Id: I61c0f73e27dc2980d0812e00c2fdfda9a628b696 --- res/layout/battery_chart_graph.xml | 11 +- res/values/dimens.xml | 1 + .../settings/fuelgauge/BatteryChartView.java | 100 +++++++++++++++--- .../fuelgauge/BatteryHistoryPreference.java | 2 + 4 files changed, 95 insertions(+), 19 deletions(-) diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml index 6187d07b66c..2984f43d5bc 100644 --- a/res/layout/battery_chart_graph.xml +++ b/res/layout/battery_chart_graph.xml @@ -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 @@ + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 0aaf930e112..b471d0fb559 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -441,6 +441,7 @@ 24dp + 3dp 1dp 4dp 3dp diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java index 366946e12e2..d56cbd45bec 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/BatteryChartView.java @@ -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(); @@ -249,8 +315,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick // Configures the trapezoid paint color. mTrapezoidPaint.setColor( mSelectedIndex == index || mSelectedIndex == SELECTED_INDEX_ALL - ? mTrapezoidSolidColor - : mTrapezoidColor); + ? mTrapezoidSolidColor + : mTrapezoidColor); final float leftTop = round(trapezoidBottom - mLevels[index] * unitHeight); final float rightTop = round(trapezoidBottom - mLevels[index + 1] * unitHeight); trapezoidPath.reset(); diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java index 94e35cb3966..b2818bf601d 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java +++ b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java @@ -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); }