package de.tum.in.tumcampusapp.auxiliary;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import com.google.common.base.Optional;
import com.google.common.primitives.Ints;
/**
* Subclass of drawable that can draw a subway line icon
*/
class MVVSymbolView extends Drawable {
private static final int[] S_LINE_COLOR = {
0xff6db9df, 0xff8db335, 0xff7d187b, 0xffc1003c, 0, 0xff00915e, 0xff7f3229, 0xff1f1e21
};
private static final int[] U_LINE_COLOR = {
0xff44723c, 0xffcc263c, 0xffe4721c, 0xff04a27c, 0xffa4721c, 0xff045ea4
};
private final Paint mBgPaint;
private final RectF mRect;
private final int mTriangle;
private final boolean mRounded;
private final int mTextColor;
/**
* Standard constructor
*
* @param line Line symbol name e.g. U6, S1, T14
*/
public MVVSymbolView(String line) {
mRect = new RectF();
boolean rounded = false;
int textColor = 0xffffffff;
int triangle = 0;
int backgroundColor = 0;
int num;
switch (line.charAt(0)) {
case 'S':
num = Optional.fromNullable(
Ints.tryParse(line.substring(1)))
.or(0);
rounded = true;
if (num <= 8) {
backgroundColor = S_LINE_COLOR[num - 1];
} else if (num == 20) {
backgroundColor = 0xffca536a;
} else if (num == 27) {
backgroundColor = 0xffd99098;
}
textColor = num == 8 ? 0xfff1cb00 : 0xffffffff;
break;
case 'U':
num = Optional.fromNullable(
Ints.tryParse(line.substring(1)))
.or(0);
if (num == 7) {
triangle = 1;
backgroundColor = 0xffc10134;
} else if (num == 8) {
triangle = 2;
backgroundColor = 0xffeb6a27;
} else {
backgroundColor = U_LINE_COLOR[num - 1];
}
textColor = 0xfffcfefc;
break;
case 'N':
backgroundColor = 0xff000000;
textColor = 0xffebd22e;
break;
case 'X':
backgroundColor = 0xff477f70;
break;
default:
num = Optional.fromNullable(
Ints.tryParse(line.substring(1)))
.or(0);
if (num < 50) {
backgroundColor = 0xffdc261c;
textColor = 0xfffcfefc;
} else if (num < 90) {
backgroundColor = 0xfffc6604;
} else {
backgroundColor = 0xff004a5d;
}
break;
}
mBgPaint = new Paint();
mBgPaint.setStyle(Paint.Style.FILL);
mBgPaint.setColor(backgroundColor);
mTriangle = triangle;
mRounded = rounded;
mTextColor = textColor;
}
/**
* Gets the text color that should be used to draw text on top of this drawable
*
* @return Text color
*/
public int getTextColor() {
return mTextColor;
}
public int getBackgroundColor() { return mBgPaint.getColor(); }
@Override
public void draw(Canvas canvas) {
final int width = canvas.getWidth();
final int height = canvas.getHeight();
mRect.top = 0;
mRect.bottom = height;
mRect.left = 0;
mRect.right = width;
if (mRounded) {
canvas.drawRoundRect(mRect, height / 2.0f, height / 2.0f, mBgPaint);
} else if (mTriangle == 1) {
drawTriangle(canvas, 0xff51812e);
} else if (mTriangle == 2) {
drawTriangle(canvas, 0xffc10134);
} else {
canvas.drawRect(mRect, mBgPaint);
}
}
private void drawTriangle(Canvas canvas, int color) {
canvas.drawRect(mRect, mBgPaint);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
Point point1 = new Point(0, 0);
Point point2 = new Point((int) mRect.right, 0);
Point point3 = new Point(0, (int) mRect.bottom);
Path path = new Path();
path.setFillType(Path.FillType.EVEN_ODD);
path.moveTo(point1.x, point1.y);
path.lineTo(point2.x, point2.y);
path.lineTo(point3.x, point3.y);
path.lineTo(point1.x, point1.y);
path.close();
canvas.drawPath(path, paint);
}
@Override
public void setAlpha(int i) {
// Noop
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
// Noop
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
}