Merge "Support updates to the data usage graph" into nyc-dev

This commit is contained in:
Jason Monk
2016-03-09 15:40:54 +00:00
committed by Android (Google) Code Review
4 changed files with 63 additions and 11 deletions

View File

@@ -22,7 +22,8 @@
<LinearLayout
android:id="@+id/graph_label_group"
android:layout_width="match_parent"
android:layout_height="@dimen/usage_graph_area_height"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:clipChildren="false"
android:clipToPadding="false">
@@ -37,6 +38,7 @@
layout="@layout/usage_side_label" />
<Space
android:id="@+id/space1"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
@@ -45,6 +47,7 @@
layout="@layout/usage_side_label" />
<Space
android:id="@+id/space2"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />

View File

@@ -43,6 +43,7 @@ public class UsageGraph extends View {
private final Paint mDottedPaint;
private final Drawable mDivider;
private final Drawable mTintedDivider;
private final int mDividerSize;
private final Path mPath = new Path();
@@ -51,6 +52,7 @@ public class UsageGraph extends View {
private final SparseIntArray mPaths = new SparseIntArray();
// Paths in local coordinates for drawing.
private final SparseIntArray mLocalPaths = new SparseIntArray();
private final int mCornerRadius;
private int mAccentColor;
private boolean mShowProjection;
@@ -59,6 +61,10 @@ public class UsageGraph extends View {
private float mMaxX = 100;
private float mMaxY = 100;
private float mMiddleDividerLoc = .5f;
private int mMiddleDividerTint = -1;
private int mTopDividerTint = -1;
public UsageGraph(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
final Resources resources = context.getResources();
@@ -68,8 +74,8 @@ public class UsageGraph extends View {
mLinePaint.setStrokeCap(Cap.ROUND);
mLinePaint.setStrokeJoin(Join.ROUND);
mLinePaint.setAntiAlias(true);
mLinePaint.setPathEffect(new CornerPathEffect(resources.getDimensionPixelSize(
R.dimen.usage_graph_line_corner_radius)));
mCornerRadius = resources.getDimensionPixelSize(R.dimen.usage_graph_line_corner_radius);
mLinePaint.setPathEffect(new CornerPathEffect(mCornerRadius));
mLinePaint.setStrokeWidth(resources.getDimensionPixelSize(R.dimen.usage_graph_line_width));
mFillPaint = new Paint(mLinePaint);
@@ -86,6 +92,7 @@ public class UsageGraph extends View {
TypedValue v = new TypedValue();
context.getTheme().resolveAttribute(com.android.internal.R.attr.listDivider, v, true);
mDivider = context.getDrawable(v.resourceId);
mTintedDivider = context.getDrawable(v.resourceId);
mDividerSize = resources.getDimensionPixelSize(R.dimen.usage_graph_divider_size);
}
@@ -98,6 +105,15 @@ public class UsageGraph extends View {
mMaxY = maxY;
}
void setDividerLoc(int height) {
mMiddleDividerLoc = 1 - height / mMaxY;
}
void setDividerColors(int middleColor, int topColor) {
mMiddleDividerTint = middleColor;
mTopDividerTint = topColor;
}
public void addPath(SparseIntArray points) {
for (int i = 0; i < points.size(); i++) {
mPaths.put(points.keyAt(i), points.valueAt(i));
@@ -150,7 +166,7 @@ public class UsageGraph extends View {
if (mLocalPaths.size() > 0) {
int lastX = mLocalPaths.keyAt(mLocalPaths.size() - 1);
int lastY = mLocalPaths.valueAt(mLocalPaths.size() - 1);
if (lastY != PATH_DELIM && (lastX == lx || lastY == ly)) {
if (lastY != PATH_DELIM && !hasDiff(lastX, lx) && !hasDiff(lastY, ly)) {
pendingYLoc = ly;
continue;
}
@@ -160,6 +176,10 @@ public class UsageGraph extends View {
}
}
private boolean hasDiff(int x1, int x2) {
return Math.abs(x2 - x1) >= mCornerRadius;
}
private int getX(float x) {
return (int) (x / mMaxX * getWidth());
}
@@ -180,9 +200,12 @@ public class UsageGraph extends View {
@Override
protected void onDraw(Canvas canvas) {
// Draw lines across the top, middle, and bottom.
drawDivider(0, canvas);
drawDivider((canvas.getHeight() - mDividerSize) / 2, canvas);
drawDivider(canvas.getHeight() - mDividerSize, canvas);
if (mMiddleDividerLoc != 0) {
drawDivider(0, canvas, mTopDividerTint);
}
drawDivider((int) ((canvas.getHeight() - mDividerSize) * mMiddleDividerLoc), canvas,
mMiddleDividerTint);
drawDivider(canvas.getHeight() - mDividerSize, canvas, -1);
if (mLocalPaths.size() == 0) {
return;
@@ -242,8 +265,13 @@ public class UsageGraph extends View {
canvas.drawPath(mPath, mFillPaint);
}
private void drawDivider(int y, Canvas canvas) {
mDivider.setBounds(0, y, canvas.getWidth(), y + mDividerSize);
mDivider.draw(canvas);
private void drawDivider(int y, Canvas canvas, int tintColor) {
Drawable d = mDivider;
if (tintColor != -1) {
mTintedDivider.setTint(tintColor);
d = mTintedDivider;
}
d.setBounds(0, y, canvas.getWidth(), y + mDividerSize);
d.draw(canvas);
}
}

View File

@@ -20,6 +20,7 @@ import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -98,6 +99,26 @@ public class UsageView extends FrameLayout {
mUsageGraph.setAccentColor(color);
}
public void setDividerLoc(int dividerLoc) {
mUsageGraph.setDividerLoc(dividerLoc);
}
public void setDividerColors(int middleColor, int topColor) {
mUsageGraph.setDividerColors(middleColor, topColor);
}
public void setSideLabelWeights(float before, float after) {
setWeight(R.id.space1, before);
setWeight(R.id.space2, after);
}
private void setWeight(int id, float weight) {
View v = findViewById(id);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
params.weight = weight;
v.setLayoutParams(params);
}
public void setSideLabels(CharSequence[] labels) {
if (labels.length != mLabels.length) {
throw new IllegalArgumentException("Invalid number of labels");

View File

@@ -33,7 +33,7 @@
<com.android.settingslib.graph.UsageView
android:id="@+id/battery_usage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="141dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="24dp"
systemui:sideLabels="@array/battery_labels"