/*******************************************************************************
* Copyright 2013-2015 alladin-IT GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package at.alladin.rmbt.android.test;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import at.alladin.openrmbt.android.R;
import at.alladin.rmbt.android.graphview.GraphService;
import at.alladin.rmbt.android.graphview.GraphView;
import at.alladin.rmbt.android.util.net.NetworkUtil.MinMax;
public class SimpleGraphView extends View implements GraphView
{
private boolean recycled;
final List<GraphService> graphs = new ArrayList<GraphService>();
final int width;
final int height;
private float scale = 1f;
private final int relW = 593;
private final int relH = 237;
private final Paint bitmapPaint;
private final Paint signalTextPaint;
private final String signalText;
final int graphWidth;
final int graphHeight;
final float graphStrokeWidth;
final Bitmap genBackgroundBitmap;
final Bitmap gridBitmap;
final float gridX;
final float gridY;
final float graphX;
final float graphY;
private Integer signalMin;
private Integer signalMax;
public SimpleGraphView(final Context context, final AttributeSet attrs, final int defStyle)
{
super(context, attrs, defStyle);
final Resources res = context.getResources();
bitmapPaint = new Paint();
bitmapPaint.setFilterBitmap(true);
final Bitmap backgroundBitmap = BitmapFactory.decodeResource(res, R.drawable.test_box_small);
width = backgroundBitmap.getWidth();
height = backgroundBitmap.getHeight();
genBackgroundBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(genBackgroundBitmap);
//canvas.drawBitmap(backgroundBitmap, 0, 0, bitmapPaint);
if (! isInEditMode())
backgroundBitmap.recycle();
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(coordFH(15, relH));
paint.setColor(Color.parseColor("#C8ffffff"));
paint.setTextAlign(Align.LEFT);
canvas.drawText("0", coordFW(88, relW), coordFH(220, relH), paint);
paint.setTextAlign(Align.RIGHT);
canvas.drawText("8", coordFW(567, relW), coordFH(220, relH), paint);
paint.setTextAlign(Align.CENTER);
canvas.drawText("s", coordFW(326, relW), coordFH(220, relH), paint);
paint.setTextAlign(Align.LEFT);
paint.setColor(Color.parseColor("#C800f940"));
canvas.drawText(String.format("– %s", res.getString(R.string.test_mbps)), coordFW(9, relW), coordFH(110, relH),
paint);
paint.setTextAlign(Align.RIGHT);
canvas.drawText("0", coordFW(72, relW), coordFH(220, relH), paint);
canvas.drawText("100", coordFW(72, relW), coordFH(38, relH), paint);
gridBitmap = BitmapFactory.decodeResource(res, R.drawable.test_grid);
gridX = coordFW(55, relW);
gridY = coordFH(16, relH);
graphX = coordFW(80, relW);
graphY = coordFH(16, relH);
graphWidth = coordW(493, relW);
graphHeight = coordH(183, relH);
graphStrokeWidth = coordFW(4, relW);
signalTextPaint = new Paint();
signalTextPaint.setAntiAlias(true);
signalTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
signalTextPaint.setTextSize(coordFH(15, relH));
signalTextPaint.setColor(Color.parseColor("#C8f8a000"));
signalText = res.getString(R.string.test_dbm);
}
public SimpleGraphView(final Context context, final AttributeSet attrs)
{
this(context, attrs, 0);
}
public SimpleGraphView(final Context context)
{
this(context, null, 0);
}
protected float coordFW(final int x, final int y)
{
return (float) x / y * width;
}
protected float coordFH(final int x, final int y)
{
return (float) x / y * height;
}
protected int coordW(final int x, final int y)
{
return Math.round((float) x / y * width);
}
protected int coordH(final int x, final int y)
{
return Math.round((float) x / y * height);
}
public int getGraphWidth()
{
return graphWidth;
}
public int getGraphHeight()
{
return graphHeight;
}
public float getGraphStrokeWidth()
{
return graphStrokeWidth;
}
public void setSignalRange(int min, int max)
{
signalMin = min;
signalMax = max;
}
public void removeSignalRange()
{
signalMin = null;
signalMax = null;
}
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)
{
final int paddingH = getPaddingLeft() + getPaddingRight();
final int paddingW = getPaddingTop() + getPaddingBottom();
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int w = MeasureSpec.getSize(widthMeasureSpec);
final int newW = width + paddingH;
switch (MeasureSpec.getMode(widthMeasureSpec))
{
case MeasureSpec.AT_MOST:
if (newW < w)
w = newW;
break;
case MeasureSpec.EXACTLY:
break;
case MeasureSpec.UNSPECIFIED:
w = newW;
break;
}
scale = (float) (w - getPaddingLeft() - getPaddingRight()) / width;
int h = MeasureSpec.getSize(heightMeasureSpec);
final int newH = Math.round(height * scale) + paddingW;
switch (MeasureSpec.getMode(heightMeasureSpec))
{
case MeasureSpec.AT_MOST:
if (newH < h)
h = newH;
break;
case MeasureSpec.EXACTLY:
break;
case MeasureSpec.UNSPECIFIED:
h = newH;
break;
}
setMeasuredDimension(w, h);
}
@Override
protected void onDraw(final Canvas canvas)
{
if (recycled)
return;
final int canvasSave = canvas.save();
canvas.translate(getPaddingLeft(), getPaddingTop());
canvas.scale(scale, scale);
canvas.drawBitmap(genBackgroundBitmap, 0, 0, bitmapPaint);
final boolean drawSignal = signalMin != null && signalMax != null;
if (drawSignal)
{
signalTextPaint.setTextAlign(Align.LEFT);
canvas.drawText(String.format("– %s", signalText), coordFW(9, relW), coordFH(130, relH),
signalTextPaint);
signalTextPaint.setTextAlign(Align.RIGHT);
canvas.drawText(Integer.toString(signalMin), coordFW(72, relW), coordFH(195, relH), signalTextPaint);
canvas.drawText(Integer.toString(signalMax), coordFW(72, relW), coordFH(58, relH), signalTextPaint);
}
canvas.drawBitmap(gridBitmap, gridX, gridY, bitmapPaint);
final int canvasSave2 = canvas.save();
canvas.translate(graphX, graphY);
for (final GraphService graph : graphs)
graph.draw(canvas);
canvas.restoreToCount(canvasSave2);
canvas.restoreToCount(canvasSave);
}
public void addGraph(final GraphService graph)
{
graphs.add(graph);
}
public void recycle()
{
recycled = true;
genBackgroundBitmap.recycle();
gridBitmap.recycle();
}
@Override
public MinMax<Integer> getSignalRange() {
return new MinMax<Integer>(signalMin, signalMax);
}
@Override
public List<GraphLabel> getLabelInfoVerticalList() {
final ArrayList<GraphLabel> graphLabelList = new ArrayList<GraphView.GraphLabel>();
graphLabelList.add(new GraphLabel(signalText, GraphLabel.colorToHex(signalTextPaint.getColor())));
return graphLabelList;
}
@Override
public void setLabelInfoVerticalList(List<GraphLabel> labelInfoVerticalList) {
//not supported by this view
}
@Override
public void updateGrid(int cells, float rows) {
//not supported by this view
}
@Override
public List<GraphLabel> getRowLinesLabelList() {
//not supported by this view
return null;
}
@Override
public void setRowLinesLabelList(List<GraphLabel> rowLabelList) {
//not supported by this view
}
}