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); + } +}