/*
* AndFHEM - Open Source Android application to control a FHEM home automation
* server.
*
* Copyright (c) 2012, Matthias Klass or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU GENERAL PUBLICLICENSE, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GENERAL PUBLIC LICENSE
* for more details.
*
* You should have received a copy of the GNU GENERAL PUBLIC LICENSE
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
*/
package li.klass.fhem.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Region;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import li.klass.fhem.util.DisplayUtil;
import li.klass.fhem.util.ValueDescriptionUtil;
import static li.klass.fhem.util.DisplayUtil.dpToPx;
public class LitreContentView extends View {
private static final Paint WHITE_PAINT = new Paint(Paint.ANTI_ALIAS_FLAG);
private static final Paint BORDER_PAINT = new Paint(Paint.ANTI_ALIAS_FLAG);
private static final Paint TEXT_PAINT = new Paint(Paint.ANTI_ALIAS_FLAG);
public static final int DARK_BLUE = 0xFF0808ff;
public static final int LIGHT_BLUE = 0XFFC3E6FF;
public static final int BORDER_WIDTH = 3;
private double fillPercentage;
private int size;
public static final int FONT_SIZE_DP = 15;
static {
WHITE_PAINT.setColor(Color.WHITE);
TEXT_PAINT.setColor(Color.RED);
TEXT_PAINT.setTextSize(dpToPx(FONT_SIZE_DP));
TEXT_PAINT.setTextAlign(Paint.Align.CENTER);
BORDER_PAINT.setStyle(Paint.Style.STROKE);
BORDER_PAINT.setColor(Color.GRAY);
BORDER_PAINT.setStrokeWidth(BORDER_WIDTH);
}
public LitreContentView(Context context, double fillPercentage) {
super(context);
this.fillPercentage = fillPercentage;
init();
}
public LitreContentView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LitreContentView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
size = DisplayUtil.getSmallestDimensionInPx() / 3;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(size, size);
params.rightMargin = 0;
setLayoutParams(params);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int xStart = 0;
int innerCircleYCenter = (int) (size * 0.6);
int innerCircleXCenter = xStart + size / 2;
int innerCircleRadius = size - innerCircleYCenter - BORDER_WIDTH;
int topDimension = size / 10;
drawFillstateCircle(canvas, innerCircleRadius, innerCircleYCenter, innerCircleXCenter, xStart);
drawTop(canvas, innerCircleYCenter, innerCircleXCenter, innerCircleRadius, topDimension);
drawText(canvas, innerCircleYCenter, innerCircleXCenter);
}
private void drawText(Canvas canvas, int innerCircleYCenter, int innerCircleXCenter) {
float fillstate = (int) (fillPercentage * 100);
String fillstateText = ValueDescriptionUtil.appendPercent(fillstate);
canvas.drawText(fillstateText, innerCircleXCenter, innerCircleYCenter, TEXT_PAINT);
}
private void drawTop(Canvas canvas, int innerCircleYCenter, int innerCircleXCenter, int innerCircleRadius, int topDimension) {
canvas.drawCircle(innerCircleXCenter, innerCircleYCenter, innerCircleRadius, BORDER_PAINT);
canvas.drawRect(innerCircleXCenter - topDimension, innerCircleYCenter - innerCircleRadius - topDimension,
innerCircleXCenter + topDimension, innerCircleYCenter - innerCircleRadius, BORDER_PAINT);
canvas.drawRect(innerCircleXCenter - topDimension + 1, innerCircleYCenter - innerCircleRadius - topDimension + 1,
innerCircleXCenter + topDimension - 1, innerCircleYCenter - innerCircleRadius + BORDER_WIDTH, WHITE_PAINT);
}
private void drawFillstateCircle(Canvas canvas, int innerCircleRadius, int innerCircleYCenter, int innerCircleXCenter, int xStart) {
canvas.drawCircle(innerCircleXCenter, innerCircleYCenter, innerCircleRadius, WHITE_PAINT);
canvas.save();
float contentHeight = (float) (2 * innerCircleRadius * fillPercentage);
canvas.clipRect(xStart, innerCircleYCenter + innerCircleRadius - contentHeight, innerCircleXCenter + innerCircleRadius, size, Region.Op.REPLACE);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(new LinearGradient(0, 0, 0, getHeight(), DARK_BLUE, LIGHT_BLUE, Shader.TileMode.MIRROR));
paint.setAntiAlias(true);
canvas.drawCircle(innerCircleXCenter, innerCircleYCenter, innerCircleRadius, paint);
canvas.restore();
}
}