Merge "Draw vertical dividers with different colors if it has a timestamp label" into udc-dev
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
package com.android.settings.fuelgauge.batteryusage;
|
package com.android.settings.fuelgauge.batteryusage;
|
||||||
|
|
||||||
import static com.android.settings.Utils.formatPercentage;
|
import static com.android.settings.Utils.formatPercentage;
|
||||||
|
import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS;
|
||||||
|
|
||||||
import static java.lang.Math.round;
|
import static java.lang.Math.round;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
@@ -29,6 +30,7 @@ import android.graphics.Paint;
|
|||||||
import android.graphics.Path;
|
import android.graphics.Path;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.ArraySet;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.HapticFeedbackConstants;
|
import android.view.HapticFeedbackConstants;
|
||||||
@@ -52,13 +54,13 @@ import com.android.settingslib.Utils;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/** A widget component to draw chart graph. */
|
/** A widget component to draw chart graph. */
|
||||||
public class BatteryChartView extends AppCompatImageView implements View.OnClickListener {
|
public class BatteryChartView extends AppCompatImageView implements View.OnClickListener {
|
||||||
private static final String TAG = "BatteryChartView";
|
private static final String TAG = "BatteryChartView";
|
||||||
|
|
||||||
private static final int DIVIDER_COLOR = Color.parseColor("#CDCCC5");
|
private static final int DIVIDER_COLOR = Color.parseColor("#CDCCC5");
|
||||||
private static final long UPDATE_STATE_DELAYED_TIME = 500L;
|
|
||||||
|
|
||||||
/** A callback listener for selected group index is updated. */
|
/** A callback listener for selected group index is updated. */
|
||||||
public interface OnSelectListener {
|
public interface OnSelectListener {
|
||||||
@@ -70,6 +72,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
private final Rect mIndent = new Rect();
|
private final Rect mIndent = new Rect();
|
||||||
private final Rect[] mPercentageBounds = new Rect[]{new Rect(), new Rect(), new Rect()};
|
private final Rect[] mPercentageBounds = new Rect[]{new Rect(), new Rect(), new Rect()};
|
||||||
private final List<Rect> mAxisLabelsBounds = new ArrayList<>();
|
private final List<Rect> mAxisLabelsBounds = new ArrayList<>();
|
||||||
|
private final Set<Integer> mLabelDrawnIndexes = new ArraySet<>();
|
||||||
|
|
||||||
private BatteryChartViewModel mViewModel;
|
private BatteryChartViewModel mViewModel;
|
||||||
private int mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
|
private int mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
|
||||||
@@ -80,6 +83,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
private int mTrapezoidColor;
|
private int mTrapezoidColor;
|
||||||
private int mTrapezoidSolidColor;
|
private int mTrapezoidSolidColor;
|
||||||
private int mTrapezoidHoverColor;
|
private int mTrapezoidHoverColor;
|
||||||
|
private int mDefaultTextColor;
|
||||||
private int mTextPadding;
|
private int mTextPadding;
|
||||||
private Paint mDividerPaint;
|
private Paint mDividerPaint;
|
||||||
private Paint mTrapezoidPaint;
|
private Paint mTrapezoidPaint;
|
||||||
@@ -134,6 +138,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
// Pre-draws the view first to load style atttributions into paint.
|
// Pre-draws the view first to load style atttributions into paint.
|
||||||
textView.draw(new Canvas());
|
textView.draw(new Canvas());
|
||||||
mTextPaint = textView.getPaint();
|
mTextPaint = textView.getPaint();
|
||||||
|
mDefaultTextColor = mTextPaint.getColor();
|
||||||
} else {
|
} else {
|
||||||
mTextPaint = null;
|
mTextPaint = null;
|
||||||
}
|
}
|
||||||
@@ -332,6 +337,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
final int height = getHeight() - mIndent.top - mIndent.bottom;
|
final int height = getHeight() - mIndent.top - mIndent.bottom;
|
||||||
// Draws the top divider line for 100% curve.
|
// Draws the top divider line for 100% curve.
|
||||||
float offsetY = mIndent.top + mDividerWidth * .5f;
|
float offsetY = mIndent.top + mDividerWidth * .5f;
|
||||||
|
mDividerPaint.setColor(DIVIDER_COLOR);
|
||||||
canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
|
canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
|
||||||
drawPercentage(canvas, /*index=*/ 0, offsetY);
|
drawPercentage(canvas, /*index=*/ 0, offsetY);
|
||||||
|
|
||||||
@@ -351,6 +357,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
private void drawPercentage(Canvas canvas, int index, float offsetY) {
|
private void drawPercentage(Canvas canvas, int index, float offsetY) {
|
||||||
if (mTextPaint != null) {
|
if (mTextPaint != null) {
|
||||||
mTextPaint.setTextAlign(Paint.Align.RIGHT);
|
mTextPaint.setTextAlign(Paint.Align.RIGHT);
|
||||||
|
mTextPaint.setColor(mDefaultTextColor);
|
||||||
canvas.drawText(
|
canvas.drawText(
|
||||||
mPercentages[index],
|
mPercentages[index],
|
||||||
getWidth(),
|
getWidth(),
|
||||||
@@ -367,18 +374,6 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
final float bottomY = getHeight() - mIndent.bottom;
|
final float bottomY = getHeight() - mIndent.bottom;
|
||||||
final float startY = bottomY - mDividerHeight;
|
final float startY = bottomY - mDividerHeight;
|
||||||
final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * .5f;
|
final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * .5f;
|
||||||
// Draws each vertical dividers.
|
|
||||||
float startX = mDividerWidth * .5f;
|
|
||||||
for (int index = 0; index < dividerCount; index++) {
|
|
||||||
canvas.drawLine(startX, startY, startX, bottomY, mDividerPaint);
|
|
||||||
final float nextX = startX + mDividerWidth + unitWidth;
|
|
||||||
// Updates the trapezoid slots for drawing.
|
|
||||||
if (index < mTrapezoidSlots.length) {
|
|
||||||
mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset);
|
|
||||||
mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset);
|
|
||||||
}
|
|
||||||
startX = nextX;
|
|
||||||
}
|
|
||||||
// Draws the axis label slot information.
|
// Draws the axis label slot information.
|
||||||
if (mViewModel != null) {
|
if (mViewModel != null) {
|
||||||
final float baselineY = getHeight() - mTextPadding;
|
final float baselineY = getHeight() - mTextPadding;
|
||||||
@@ -404,6 +399,26 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
}
|
}
|
||||||
drawAxisLabels(canvas, axisLabelDisplayAreas, baselineY);
|
drawAxisLabels(canvas, axisLabelDisplayAreas, baselineY);
|
||||||
}
|
}
|
||||||
|
// Draws each vertical dividers.
|
||||||
|
float startX = mDividerWidth * .5f;
|
||||||
|
for (int index = 0; index < dividerCount; index++) {
|
||||||
|
float dividerY = bottomY;
|
||||||
|
if (mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS
|
||||||
|
&& mLabelDrawnIndexes.contains(index)) {
|
||||||
|
mDividerPaint.setColor(mTrapezoidSolidColor);
|
||||||
|
dividerY += mDividerHeight / 4f;
|
||||||
|
} else {
|
||||||
|
mDividerPaint.setColor(DIVIDER_COLOR);
|
||||||
|
}
|
||||||
|
canvas.drawLine(startX, startY, startX, dividerY, mDividerPaint);
|
||||||
|
final float nextX = startX + mDividerWidth + unitWidth;
|
||||||
|
// Updates the trapezoid slots for drawing.
|
||||||
|
if (index < mTrapezoidSlots.length) {
|
||||||
|
mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset);
|
||||||
|
mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset);
|
||||||
|
}
|
||||||
|
startX = nextX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets all the axis label texts displaying area positions if they are shown. */
|
/** Gets all the axis label texts displaying area positions if they are shown. */
|
||||||
@@ -432,9 +447,12 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
|
|
||||||
private void drawAxisLabels(Canvas canvas, final Rect[] displayAreas, final float baselineY) {
|
private void drawAxisLabels(Canvas canvas, final Rect[] displayAreas, final float baselineY) {
|
||||||
final int lastIndex = displayAreas.length - 1;
|
final int lastIndex = displayAreas.length - 1;
|
||||||
|
mLabelDrawnIndexes.clear();
|
||||||
// Suppose first and last labels are always able to draw.
|
// Suppose first and last labels are always able to draw.
|
||||||
drawAxisLabelText(canvas, 0, displayAreas[0], baselineY);
|
drawAxisLabelText(canvas, 0, displayAreas[0], baselineY);
|
||||||
|
mLabelDrawnIndexes.add(0);
|
||||||
drawAxisLabelText(canvas, lastIndex, displayAreas[lastIndex], baselineY);
|
drawAxisLabelText(canvas, lastIndex, displayAreas[lastIndex], baselineY);
|
||||||
|
mLabelDrawnIndexes.add(lastIndex);
|
||||||
drawAxisLabelsBetweenStartIndexAndEndIndex(canvas, displayAreas, 0, lastIndex, baselineY);
|
drawAxisLabelsBetweenStartIndexAndEndIndex(canvas, displayAreas, 0, lastIndex, baselineY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,6 +476,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
drawAxisLabelText(canvas, middleIndex, displayAreas[middleIndex], baselineY);
|
drawAxisLabelText(canvas, middleIndex, displayAreas[middleIndex], baselineY);
|
||||||
|
mLabelDrawnIndexes.add(middleIndex);
|
||||||
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
canvas, displayAreas, startIndex, middleIndex, baselineY);
|
canvas, displayAreas, startIndex, middleIndex, baselineY);
|
||||||
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
@@ -471,7 +490,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
drawAxisLabelText(canvas, middleIndex1, displayAreas[middleIndex1], baselineY);
|
drawAxisLabelText(canvas, middleIndex1, displayAreas[middleIndex1], baselineY);
|
||||||
|
mLabelDrawnIndexes.add(middleIndex1);
|
||||||
drawAxisLabelText(canvas, middleIndex2, displayAreas[middleIndex2], baselineY);
|
drawAxisLabelText(canvas, middleIndex2, displayAreas[middleIndex2], baselineY);
|
||||||
|
mLabelDrawnIndexes.add(middleIndex2);
|
||||||
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
canvas, displayAreas, startIndex, middleIndex1, baselineY);
|
canvas, displayAreas, startIndex, middleIndex1, baselineY);
|
||||||
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
drawAxisLabelsBetweenStartIndexAndEndIndex(
|
||||||
@@ -488,12 +509,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
|
|||||||
|
|
||||||
private void drawAxisLabelText(
|
private void drawAxisLabelText(
|
||||||
Canvas canvas, final int index, final Rect displayArea, final float baselineY) {
|
Canvas canvas, final int index, final Rect displayArea, final float baselineY) {
|
||||||
|
mTextPaint.setColor(mTrapezoidSolidColor);
|
||||||
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
||||||
canvas.drawText(
|
canvas.drawText(
|
||||||
mViewModel.getText(index),
|
mViewModel.getText(index),
|
||||||
displayArea.centerX(),
|
displayArea.centerX(),
|
||||||
baselineY,
|
baselineY,
|
||||||
mTextPaint);
|
mTextPaint);
|
||||||
|
mLabelDrawnIndexes.add(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTrapezoids(Canvas canvas) {
|
private void drawTrapezoids(Canvas canvas) {
|
||||||
|
Reference in New Issue
Block a user