diff --git a/android/res/drawable-hdpi/ic_20px_route_planning_metro.png b/android/res/drawable-hdpi/ic_20px_route_planning_metro.png
new file mode 100644
index 0000000000..9bbc4a8b34
Binary files /dev/null and b/android/res/drawable-hdpi/ic_20px_route_planning_metro.png differ
diff --git a/android/res/drawable-hdpi/ic_20px_route_planning_train.png b/android/res/drawable-hdpi/ic_20px_route_planning_train.png
new file mode 100644
index 0000000000..998da76a25
Binary files /dev/null and b/android/res/drawable-hdpi/ic_20px_route_planning_train.png differ
diff --git a/android/res/drawable-hdpi/ic_20px_route_planning_walk.png b/android/res/drawable-hdpi/ic_20px_route_planning_walk.png
new file mode 100644
index 0000000000..ab84f28ad8
Binary files /dev/null and b/android/res/drawable-hdpi/ic_20px_route_planning_walk.png differ
diff --git a/android/res/drawable-hdpi/ic_24px_route_planning_walk.png b/android/res/drawable-hdpi/ic_24px_route_planning_walk.png
new file mode 100644
index 0000000000..26dc72dc2d
Binary files /dev/null and b/android/res/drawable-hdpi/ic_24px_route_planning_walk.png differ
diff --git a/android/res/drawable-mdpi/ic_20px_route_planning_metro.png b/android/res/drawable-mdpi/ic_20px_route_planning_metro.png
new file mode 100644
index 0000000000..5c09ae250a
Binary files /dev/null and b/android/res/drawable-mdpi/ic_20px_route_planning_metro.png differ
diff --git a/android/res/drawable-mdpi/ic_20px_route_planning_train.png b/android/res/drawable-mdpi/ic_20px_route_planning_train.png
new file mode 100644
index 0000000000..1c28b3b380
Binary files /dev/null and b/android/res/drawable-mdpi/ic_20px_route_planning_train.png differ
diff --git a/android/res/drawable-mdpi/ic_20px_route_planning_walk.png b/android/res/drawable-mdpi/ic_20px_route_planning_walk.png
new file mode 100644
index 0000000000..9b37dabdc5
Binary files /dev/null and b/android/res/drawable-mdpi/ic_20px_route_planning_walk.png differ
diff --git a/android/res/drawable-mdpi/ic_24px_route_planning_walk.png b/android/res/drawable-mdpi/ic_24px_route_planning_walk.png
new file mode 100644
index 0000000000..49f82f81c3
Binary files /dev/null and b/android/res/drawable-mdpi/ic_24px_route_planning_walk.png differ
diff --git a/android/res/drawable-xhdpi/ic_20px_route_planning_metro.png b/android/res/drawable-xhdpi/ic_20px_route_planning_metro.png
new file mode 100644
index 0000000000..fac7d153fd
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_20px_route_planning_metro.png differ
diff --git a/android/res/drawable-xhdpi/ic_20px_route_planning_train.png b/android/res/drawable-xhdpi/ic_20px_route_planning_train.png
new file mode 100644
index 0000000000..82cebf7976
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_20px_route_planning_train.png differ
diff --git a/android/res/drawable-xhdpi/ic_20px_route_planning_walk.png b/android/res/drawable-xhdpi/ic_20px_route_planning_walk.png
new file mode 100644
index 0000000000..a48814ec3b
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_20px_route_planning_walk.png differ
diff --git a/android/res/drawable-xhdpi/ic_24px_route_planning_walk.png b/android/res/drawable-xhdpi/ic_24px_route_planning_walk.png
new file mode 100644
index 0000000000..00b77681a0
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_24px_route_planning_walk.png differ
diff --git a/android/res/drawable-xxhdpi/ic_20px_route_planning_metro.png b/android/res/drawable-xxhdpi/ic_20px_route_planning_metro.png
new file mode 100644
index 0000000000..b27588aaba
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_20px_route_planning_metro.png differ
diff --git a/android/res/drawable-xxhdpi/ic_20px_route_planning_train.png b/android/res/drawable-xxhdpi/ic_20px_route_planning_train.png
new file mode 100644
index 0000000000..835f988f1d
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_20px_route_planning_train.png differ
diff --git a/android/res/drawable-xxhdpi/ic_20px_route_planning_walk.png b/android/res/drawable-xxhdpi/ic_20px_route_planning_walk.png
new file mode 100644
index 0000000000..21e67435a1
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_20px_route_planning_walk.png differ
diff --git a/android/res/drawable-xxhdpi/ic_24px_route_planning_walk.png b/android/res/drawable-xxhdpi/ic_24px_route_planning_walk.png
new file mode 100644
index 0000000000..abc9e3c40a
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_24px_route_planning_walk.png differ
diff --git a/android/res/drawable-xxxhdpi/ic_20px_route_planning_metro.png b/android/res/drawable-xxxhdpi/ic_20px_route_planning_metro.png
new file mode 100644
index 0000000000..ecd65a9f42
Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_20px_route_planning_metro.png differ
diff --git a/android/res/drawable-xxxhdpi/ic_20px_route_planning_train.png b/android/res/drawable-xxxhdpi/ic_20px_route_planning_train.png
new file mode 100644
index 0000000000..5785ecea84
Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_20px_route_planning_train.png differ
diff --git a/android/res/drawable-xxxhdpi/ic_20px_route_planning_walk.png b/android/res/drawable-xxxhdpi/ic_20px_route_planning_walk.png
new file mode 100644
index 0000000000..8aa6703255
Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_20px_route_planning_walk.png differ
diff --git a/android/res/drawable-xxxhdpi/ic_24px_route_planning_walk.png b/android/res/drawable-xxxhdpi/ic_24px_route_planning_walk.png
new file mode 100644
index 0000000000..0101bdefb5
Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_24px_route_planning_walk.png differ
diff --git a/android/res/values/attrs.xml b/android/res/values/attrs.xml
index 4b07eed27c..c8bad67802 100644
--- a/android/res/values/attrs.xml
+++ b/android/res/values/attrs.xml
@@ -41,6 +41,13 @@
+
+
+
+
+
+
+
diff --git a/android/res/values/dimens.xml b/android/res/values/dimens.xml
index 52a75df587..3ad2f8abd4 100644
--- a/android/res/values/dimens.xml
+++ b/android/res/values/dimens.xml
@@ -80,6 +80,7 @@
2dp
4dp
8dp
+ 2dp
48dp
diff --git a/android/src/com/mapswithme/maps/routing/TransitStepInfo.java b/android/src/com/mapswithme/maps/routing/TransitStepInfo.java
index 5409d988ba..0284effe61 100644
--- a/android/src/com/mapswithme/maps/routing/TransitStepInfo.java
+++ b/android/src/com/mapswithme/maps/routing/TransitStepInfo.java
@@ -1,8 +1,8 @@
package com.mapswithme.maps.routing;
import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.annotation.StringDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -12,28 +12,55 @@ import java.lang.annotation.RetentionPolicy;
*/
public class TransitStepInfo
{
- public static final int TRANSIT_TYPE_PEDESTRIAN = 0;
- public static final int TRANSIT_TYPE_SUBWAY = 1;
+ private static final int TRANSIT_TYPE_PEDESTRIAN = 0;
+ private static final int TRANSIT_TYPE_SUBWAY = 1;
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({ TRANSIT_TYPE_PEDESTRIAN, TRANSIT_TYPE_SUBWAY })
- public @interface TransitType {}
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ TRANSIT_TYPE_PEDESTRIAN, TRANSIT_TYPE_SUBWAY })
+ @interface TransitType {}
- @TransitType
- public final int mType;
- public final double mDistance;
- public final double mTime;
- @Nullable
- public final String mNumber;
- public final int mColor;
+ @NonNull
+ private final TransitStepType mType;
+ private final double mDistance;
+ private final double mTime;
+ @Nullable
+ private final String mNumber;
+ private final int mColor;
- public TransitStepInfo(@TransitType int type, double distance, double time,
- @Nullable String number, int color)
- {
- mType = type;
- mDistance = distance;
- mTime = time;
- mNumber = number;
- mColor = color;
- }
+ TransitStepInfo(@TransitType int type, double distance, double time,
+ @Nullable String number, int color)
+ {
+ mType = TransitStepType.values()[type];
+ mDistance = distance;
+ mTime = time;
+ mNumber = number;
+ mColor = color;
+ }
+
+ @NonNull
+ public TransitStepType getType()
+ {
+ return mType;
+ }
+
+ public double getDistance()
+ {
+ return mDistance;
+ }
+
+ public double getTime()
+ {
+ return mTime;
+ }
+
+ @Nullable
+ public String getNumber()
+ {
+ return mNumber;
+ }
+
+ public int getColor()
+ {
+ return mColor;
+ }
}
diff --git a/android/src/com/mapswithme/maps/routing/TransitStepType.java b/android/src/com/mapswithme/maps/routing/TransitStepType.java
new file mode 100644
index 0000000000..321e255c1a
--- /dev/null
+++ b/android/src/com/mapswithme/maps/routing/TransitStepType.java
@@ -0,0 +1,25 @@
+package com.mapswithme.maps.routing;
+
+import android.support.annotation.DrawableRes;
+
+import com.mapswithme.maps.R;
+
+public enum TransitStepType
+{
+ PEDESTRIAN(R.drawable.ic_20px_route_planning_walk),
+ SUBWAY(R.drawable.ic_20px_route_planning_metro);
+
+ @DrawableRes
+ private final int mDrawable;
+
+ TransitStepType(@DrawableRes int drawable)
+ {
+ mDrawable = drawable;
+ }
+
+ @DrawableRes
+ public int getDrawable()
+ {
+ return mDrawable;
+ }
+}
diff --git a/android/src/com/mapswithme/maps/routing/TransitStepView.java b/android/src/com/mapswithme/maps/routing/TransitStepView.java
new file mode 100644
index 0000000000..e54e9fdd9b
--- /dev/null
+++ b/android/src/com/mapswithme/maps/routing/TransitStepView.java
@@ -0,0 +1,164 @@
+package com.mapswithme.maps.routing;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+
+import com.mapswithme.maps.R;
+
+/**
+ * Represents a specific transit step. It displays a transit info, such as a number, color, etc., for
+ * the specific transit type: pedestrian, rail, metro, etc.
+ */
+public class TransitStepView extends View
+{
+ @Nullable
+ private Drawable mDrawable;
+ @NonNull
+ private final RectF mBackgroundBounds = new RectF();
+ @NonNull
+ private final Rect mDrawableBounds = new Rect();
+ @NonNull
+ private final Rect mTextBounds = new Rect();
+ @NonNull
+ private final Paint mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ @NonNull
+ private final Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private int mBackgroundCornerRadius;
+ @Nullable
+ private TransitStepInfo mStepInfo;
+
+ public TransitStepView(Context context, @Nullable AttributeSet attrs)
+ {
+ super(context, attrs);
+ init(attrs);
+ }
+
+ public TransitStepView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
+ {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ public TransitStepView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
+ {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(attrs);
+ }
+
+ private void init(@Nullable AttributeSet attrs)
+ {
+ mBackgroundCornerRadius = getResources().getDimensionPixelSize(R.dimen.routing_transit_step_corner_radius);
+ TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TransitStepView);
+ float textSize = a.getDimensionPixelSize(R.styleable.TransitStepView_android_textSize, 0);
+ @ColorInt
+ int textColor = a.getColor(R.styleable.TransitStepView_android_textColor, Color.BLACK);
+ mTextPaint.setTextSize(textSize);
+ mTextPaint.setColor(textColor);
+ mDrawable = a.getDrawable(R.styleable.TransitStepView_android_drawable);
+ a.recycle();
+ }
+
+ public void setTransitStepInfo(@NonNull TransitStepInfo info)
+ {
+ mStepInfo = info;
+ mDrawable = getResources().getDrawable(mStepInfo.getType().getDrawable());
+ mBackgroundPaint.setColor(mStepInfo.getColor());
+ invalidate();
+ requestLayout();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ int height = getDefaultSize(getSuggestedMinimumHeight(), MeasureSpec.UNSPECIFIED);
+ int width = getPaddingLeft();
+ if (mDrawable != null)
+ {
+ calculateDrawableBounds(height, mDrawable);
+ width += mDrawable.getIntrinsicWidth();
+ }
+
+ if (mStepInfo != null && !TextUtils.isEmpty(mStepInfo.getNumber()))
+ {
+ String text = mStepInfo.getNumber();
+ mTextPaint.getTextBounds(text, 0, text.length(), mTextBounds);
+ width += (mDrawable != null ? getPaddingLeft(): 0) + mTextPaint.measureText(text);
+ if (height == 0)
+ height = getPaddingTop() + mTextBounds.height() + getPaddingBottom();
+ }
+
+ width += getPaddingRight();
+ mBackgroundBounds.set(0, 0, width, height);
+ setMeasuredDimension(width, height);
+ }
+
+ private void calculateDrawableBounds(int height, @NonNull Drawable drawable)
+ {
+ // If the clear view height, i.e. without top/bottom padding, is greater than the drawable height
+ // the drawable should be centered vertically by adding additional vertical top/bottom padding.
+ int clearHeight = height - getPaddingTop() - getPaddingBottom();
+ int vPad = 0;
+ if (clearHeight > drawable.getIntrinsicHeight())
+ vPad = (clearHeight - drawable.getIntrinsicHeight()) / 2;
+ mDrawableBounds.set(getPaddingLeft(), getPaddingTop() + vPad,
+ drawable.getIntrinsicWidth() + getPaddingLeft(),
+ getTop() + vPad + drawable.getIntrinsicHeight());
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas)
+ {
+ if (getBackground() == null && mDrawable != null)
+ {
+ canvas.drawRoundRect(mBackgroundBounds, mBackgroundCornerRadius, mBackgroundCornerRadius,
+ mBackgroundPaint);
+ }
+
+ if (mDrawable != null && mStepInfo != null)
+ drawDrawable(mStepInfo.getType(), mDrawable, canvas);
+
+ if (mStepInfo != null && !TextUtils.isEmpty(mStepInfo.getNumber()))
+ {
+ String text = mStepInfo.getNumber();
+ int yPos = (int) ((canvas.getHeight() / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2)) ;
+ int xPos = mDrawable != null ? mDrawable.getBounds().right + getPaddingLeft()
+ : getPaddingLeft();
+ canvas.drawText(text, xPos, yPos, mTextPaint);
+ }
+ }
+
+ private void drawDrawable(@NonNull TransitStepType type,
+ @NonNull Drawable drawable, @NonNull Canvas canvas)
+ {
+ if (type == TransitStepType.PEDESTRIAN)
+ {
+ TypedValue typedValue = new TypedValue();
+ Resources.Theme theme = getContext().getTheme();
+ if (theme.resolveAttribute(R.attr.iconTint, typedValue, true))
+ {
+ drawable.mutate();
+ DrawableCompat.setTint(drawable, typedValue.data);
+ }
+ }
+ drawable.setBounds(mDrawableBounds);
+ drawable.draw(canvas);
+ }
+}