diff --git a/android/app/src/main/cpp/app/organicmaps/Framework.cpp b/android/app/src/main/cpp/app/organicmaps/Framework.cpp index d749e7a390..8fc342f8c1 100644 --- a/android/app/src/main/cpp/app/organicmaps/Framework.cpp +++ b/android/app/src/main/cpp/app/organicmaps/Framework.cpp @@ -1608,13 +1608,15 @@ Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass) // Java signature : RouteMarkData(String title, String subtitle, // @RoutePointInfo.RouteMarkType int pointType, // int intermediateIndex, boolean isVisible, boolean isMyPosition, - // boolean isPassed, double lat, double lon) + // boolean isPassed, double lat, double lon, long timeSec, + // String distanceString) static jmethodID const pointConstructor = jni::GetConstructorID(env, pointClazz, - "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V"); + "(Ljava/lang/String;Ljava/lang/String;IIZZZDDJLjava/lang/String;)V"); return jni::ToJavaArray(env, pointClazz, points, [&](JNIEnv * jEnv, RouteMarkData const & data) { jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title)); jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle)); + jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, data.m_distance)); return env->NewObject(pointClazz, pointConstructor, title.get(), subtitle.get(), static_cast(data.m_pointType), @@ -1623,7 +1625,9 @@ Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass) static_cast(data.m_isMyPosition), static_cast(data.m_isPassed), mercator::YToLat(data.m_position.y), - mercator::XToLon(data.m_position.x)); + mercator::XToLon(data.m_position.x), + static_cast(data.m_timeSec), + distance.get()); }); } diff --git a/android/app/src/main/java/app/organicmaps/routing/RouteMarkData.java b/android/app/src/main/java/app/organicmaps/routing/RouteMarkData.java index 8004267f80..3471e17d09 100644 --- a/android/app/src/main/java/app/organicmaps/routing/RouteMarkData.java +++ b/android/app/src/main/java/app/organicmaps/routing/RouteMarkData.java @@ -3,6 +3,8 @@ package app.organicmaps.routing; import androidx.annotation.Keep; import androidx.annotation.Nullable; +import app.organicmaps.util.Distance; + /** * Represents RouteMarkData from core. */ @@ -23,11 +25,14 @@ public class RouteMarkData public final boolean mIsPassed; public final double mLat; public final double mLon; + public final long mTimeSec; + public final String mDistance; public RouteMarkData(@Nullable String title, @Nullable String subtitle, @RoutePointInfo.RouteMarkType int pointType, int intermediateIndex, boolean isVisible, boolean isMyPosition, - boolean isPassed, double lat, double lon) + boolean isPassed, double lat, double lon, long timeSec, + String distance) { mTitle = title; mSubtitle = subtitle; @@ -38,5 +43,7 @@ public class RouteMarkData mIsPassed = isPassed; mLat = lat; mLon = lon; + mTimeSec = timeSec; + mDistance = distance; } } diff --git a/android/app/src/main/java/app/organicmaps/routing/RoutePlanAdapter.java b/android/app/src/main/java/app/organicmaps/routing/RoutePlanAdapter.java new file mode 100644 index 0000000000..ed4fa25517 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/routing/RoutePlanAdapter.java @@ -0,0 +1,125 @@ +package app.organicmaps.routing; + +import android.content.Context; +import android.content.res.TypedArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.recyclerview.widget.RecyclerView; + +import app.organicmaps.R; +import app.organicmaps.util.DateUtils; +import app.organicmaps.util.UiUtils; + +public class RoutePlanAdapter extends RecyclerView.Adapter +{ + Context mContext; + RouteMarkData[] mRouteMarkData; + + public RoutePlanAdapter(Context context, RouteMarkData[] routeMarkData) + { + mContext = context; + + // Copy all route points, except the first one (starting point). + mRouteMarkData = new RouteMarkData[routeMarkData.length - 1]; + System.arraycopy(routeMarkData, 1, mRouteMarkData, 0, routeMarkData.length - 1); + } + + @NonNull + @Override + public RoutePlanViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) + { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.route_plan_list_item, + parent, false); + + return new RoutePlanViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull RoutePlanViewHolder holder, int position) + { + int markPos = mRouteMarkData.length - 1 - position; + int iconId; + + if (mRouteMarkData[markPos].mPointType == 0) + { + // Start point. + iconId = R.drawable.route_point_start; + } + else if (mRouteMarkData[markPos].mPointType == 1) + { + // Intermediate stop. + TypedArray iconArray = mContext.getResources().obtainTypedArray(R.array.route_stop_icons); + iconId = iconArray.getResourceId(mRouteMarkData[markPos].mIntermediateIndex, + R.drawable.route_point_01); + } + else + { + // Finish point. + iconId = R.drawable.route_point_finish; + } + + holder.mImageViewIcon.setImageDrawable(AppCompatResources.getDrawable(mContext, iconId)); + + holder.mTextViewEta.setText(DateUtils.getEstimateTimeString(mContext, + mRouteMarkData[markPos].mTimeSec)); + + if (mRouteMarkData[markPos].mPointType == 0) + { + UiUtils.hide(holder.mTextViewSeparator1); + UiUtils.hide(holder.mTextViewTime); + UiUtils.hide(holder.mTextViewSeparator2); + UiUtils.hide(holder.mTextViewDistance); + } + else + { + holder.mTextViewTime.setText(DateUtils.getRemainingTimeString(mContext, + mRouteMarkData[markPos].mTimeSec)); + + holder.mTextViewDistance.setText(mRouteMarkData[markPos].mDistance); + } + } + + @Override + public int getItemCount() + { + return mRouteMarkData.length; + } + + static class RoutePlanViewHolder extends RecyclerView.ViewHolder + { + @NonNull + public final ImageView mImageViewIcon; + + @NonNull + public final TextView mTextViewEta; + + @NonNull + public final TextView mTextViewSeparator1; + + @NonNull + public final TextView mTextViewTime; + + @NonNull + public final TextView mTextViewSeparator2; + + @NonNull + public final TextView mTextViewDistance; + + RoutePlanViewHolder(@NonNull View itemView) + { + super(itemView); + mImageViewIcon = itemView.findViewById(R.id.icon); + mTextViewEta = itemView.findViewById(R.id.eta); + mTextViewSeparator1 = itemView.findViewById(R.id.separator1); + mTextViewTime = itemView.findViewById(R.id.time); + mTextViewSeparator2 = itemView.findViewById(R.id.separator2); + mTextViewDistance = itemView.findViewById(R.id.distance); + } + } +} diff --git a/android/app/src/main/java/app/organicmaps/routing/RoutingBottomMenuController.java b/android/app/src/main/java/app/organicmaps/routing/RoutingBottomMenuController.java index 748cb17855..0fc8d23c67 100644 --- a/android/app/src/main/java/app/organicmaps/routing/RoutingBottomMenuController.java +++ b/android/app/src/main/java/app/organicmaps/routing/RoutingBottomMenuController.java @@ -17,6 +17,8 @@ import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.text.style.TypefaceSpan; import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.ImageView; import android.widget.ScrollView; @@ -26,14 +28,17 @@ import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import app.organicmaps.Framework; import app.organicmaps.R; import app.organicmaps.bookmarks.data.DistanceAndAzimut; import app.organicmaps.location.LocationHelper; +import app.organicmaps.util.DateUtils; import app.organicmaps.util.Distance; import app.organicmaps.util.Graphics; +import app.organicmaps.util.StringUtils; import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.UiUtils; import app.organicmaps.widget.recycler.DotDividerItemDecoration; @@ -50,7 +55,7 @@ final class RoutingBottomMenuController implements View.OnClickListener @NonNull private final Activity mContext; @NonNull - private final View mTimeElevationLine; + private final View mAltitudeLine; @NonNull private final View mAltitudeChartFrame; @NonNull @@ -62,13 +67,9 @@ final class RoutingBottomMenuController implements View.OnClickListener @NonNull private final ImageView mAltitudeChart; @NonNull - private final TextView mTime; + private final TextView mAltitudeDiffAscent; @NonNull - private final TextView mAltitudeDifference; - @NonNull - private final TextView mTimeVehicle; - @Nullable - private final TextView mArrival; + private final TextView mAltitudeDiffDescent; @NonNull private final View mActionFrame; @NonNull @@ -79,6 +80,8 @@ final class RoutingBottomMenuController implements View.OnClickListener private final ImageView mActionIcon; @NonNull private final DotDividerItemDecoration mTransitViewDecorator; + @NonNull + private final RecyclerView mRoutePlanList; @Nullable private final RoutingBottomMenuListener mListener; @@ -88,20 +91,19 @@ final class RoutingBottomMenuController implements View.OnClickListener @Nullable RoutingBottomMenuListener listener) { View altitudeChartFrame = getViewById(activity, frame, R.id.altitude_chart_panel); - View timeElevationLine = getViewById(activity, frame, R.id.time_elevation_line); + View altitudeLine = getViewById(activity, frame, R.id.altitude_line); View transitFrame = getViewById(activity, frame, R.id.transit_panel); TextView error = (TextView) getViewById(activity, frame, R.id.error); Button start = (Button) getViewById(activity, frame, R.id.start); ImageView altitudeChart = (ImageView) getViewById(activity, frame, R.id.altitude_chart); - TextView time = (TextView) getViewById(activity, frame, R.id.time); - TextView timeVehicle = (TextView) getViewById(activity, frame, R.id.time_vehicle); - TextView altitudeDifference = (TextView) getViewById(activity, frame, R.id.altitude_difference); - TextView arrival = (TextView) getViewById(activity, frame, R.id.arrival); + TextView altitudeDiffAscent = (TextView) getViewById(activity, frame, R.id.altitude_diff_ascent); + TextView altitudeDiffDescent = (TextView) getViewById(activity, frame, R.id.altitude_diff_descent); View actionFrame = getViewById(activity, frame, R.id.routing_action_frame); + RecyclerView routePlanList = (RecyclerView) getViewById(activity, frame, R.id.route_plan_list); - return new RoutingBottomMenuController(activity, altitudeChartFrame, timeElevationLine, transitFrame, - error, start, altitudeChart, time, altitudeDifference, - timeVehicle, arrival, actionFrame, listener); + return new RoutingBottomMenuController(activity, altitudeChartFrame, altitudeLine, transitFrame, + error, start, altitudeChart, altitudeDiffAscent, + altitudeDiffDescent, actionFrame, routePlanList, listener); } @NonNull @@ -114,29 +116,26 @@ final class RoutingBottomMenuController implements View.OnClickListener private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame, - @NonNull View timeElevationLine, + @NonNull View altitudeLine, @NonNull View transitFrame, @NonNull TextView error, @NonNull Button start, @NonNull ImageView altitudeChart, - @NonNull TextView time, - @NonNull TextView altitudeDifference, - @NonNull TextView timeVehicle, - @Nullable TextView arrival, + @NonNull TextView altitudeDiffAscent, + @NonNull TextView altitudeDiffDescent, @NonNull View actionFrame, + @NonNull RecyclerView routePlanList, @Nullable RoutingBottomMenuListener listener) { mContext = context; mAltitudeChartFrame = altitudeChartFrame; - mTimeElevationLine = timeElevationLine; + mAltitudeLine = altitudeLine; mTransitFrame = transitFrame; mError = error; mStart = start; mAltitudeChart = altitudeChart; - mTime = time; - mAltitudeDifference = altitudeDifference; - mTimeVehicle = timeVehicle; - mArrival = arrival; + mAltitudeDiffAscent = altitudeDiffAscent; + mAltitudeDiffDescent = altitudeDiffDescent; mActionFrame = actionFrame; mActionMessage = actionFrame.findViewById(R.id.tv__message); mActionButton = actionFrame.findViewById(R.id.btn__my_position_use); @@ -149,13 +148,16 @@ final class RoutingBottomMenuController implements View.OnClickListener int dividerRes = ThemeUtils.getResource(mContext, R.attr.transitStepDivider); Drawable dividerDrawable = ContextCompat.getDrawable(mContext, dividerRes); Resources res = mContext.getResources(); - mTransitViewDecorator = new DotDividerItemDecoration(dividerDrawable, res.getDimensionPixelSize(R.dimen.margin_base), + mTransitViewDecorator = new DotDividerItemDecoration(dividerDrawable, + res.getDimensionPixelSize(R.dimen.margin_base), res.getDimensionPixelSize(R.dimen.margin_half)); + mRoutePlanList = routePlanList; + mRoutePlanList.setLayoutManager(new LinearLayoutManager(mContext)); } void showAltitudeChartAndRoutingDetails() { - UiUtils.hide(mError, mActionFrame, mAltitudeChart, mTimeElevationLine, mTransitFrame); + UiUtils.hide(mError, mActionFrame, mAltitudeChart, mAltitudeLine, mTransitFrame); if (!RoutingController.get().isVehicleRouterType() && !RoutingController.get().isRulerRouterType()) showRouteAltitudeChart(); @@ -185,13 +187,19 @@ final class RoutingBottomMenuController implements View.OnClickListener scrollToBottom(rv); + TextView estimatedTimeOfArrivalView = mTransitFrame.findViewById(R.id.estimated_time_of_arrival); + estimatedTimeOfArrivalView.setText(DateUtils.getEstimateTimeString(mContext, info.getTotalTime())); + UiUtils.show(mTransitFrame, estimatedTimeOfArrivalView); + + UiUtils.show(mTransitFrame, R.id.dot1); + TextView totalTimeView = mTransitFrame.findViewById(R.id.total_time); totalTimeView.setText(RoutingController.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number)); - View dotView = mTransitFrame.findViewById(R.id.dot); + View dot2View = mTransitFrame.findViewById(R.id.dot2); View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon); TextView distanceView = mTransitFrame.findViewById(R.id.total_distance); - UiUtils.showIf(info.getTotalPedestrianTimeInSec() > 0, dotView, pedestrianIcon, distanceView); + UiUtils.showIf(info.getTotalPedestrianTimeInSec() > 0, dot2View, pedestrianIcon, distanceView); distanceView.setText(info.getTotalPedestrianDistance() + " " + info.getTotalPedestrianDistanceUnits()); } @@ -216,13 +224,15 @@ final class RoutingBottomMenuController implements View.OnClickListener scrollToBottom(rv); } else - UiUtils.hide(rv); // Show only distance between start and finish + UiUtils.hide(rv); // Show only distance between start and finish. TextView totalTimeView = mTransitFrame.findViewById(R.id.total_time); totalTimeView.setText(mContext.getString(R.string.placepage_distance) + ": " + totalLength.mDistanceStr + " " + totalLength.getUnitsStr(mContext)); - UiUtils.hide(mTransitFrame, R.id.dot); + UiUtils.hide(mTransitFrame, R.id.estimated_time_of_arrival); + UiUtils.hide(mTransitFrame, R.id.dot1); + UiUtils.hide(mTransitFrame, R.id.dot2); UiUtils.hide(mTransitFrame, R.id.pedestrian_icon); UiUtils.hide(mTransitFrame, R.id.total_distance); } @@ -330,11 +340,11 @@ final class RoutingBottomMenuController implements View.OnClickListener { if (RoutingController.get().isVehicleRouterType()) { - UiUtils.hide(mTimeElevationLine, mAltitudeChart); + UiUtils.hide(mAltitudeLine, mAltitudeChart); return; } - UiUtils.hide(mTimeVehicle); + UiUtils.show(mAltitudeLine, mAltitudeChart); int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width); int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height); @@ -344,39 +354,23 @@ final class RoutingBottomMenuController implements View.OnClickListener { mAltitudeChart.setImageBitmap(bm); UiUtils.show(mAltitudeChart); - final String unit = limits.isMetricUnits ? mAltitudeDifference.getResources().getString(R.string.m) : mAltitudeDifference.getResources().getString(R.string.ft); - mAltitudeDifference.setText("↗ " + limits.totalAscentString + " " + unit + - " ↘ " + limits.totalDescentString + " " + unit); - UiUtils.show(mAltitudeDifference); + final String unit = limits.isMetricUnits ? mAltitudeDiffAscent.getResources().getString(R.string.m) : + mAltitudeDiffAscent.getResources().getString(R.string.ft); + mAltitudeDiffAscent.setText(limits.totalAscentString + StringUtils.kNarrowNonBreakingSpace + unit); + mAltitudeDiffDescent.setText(limits.totalDescentString + StringUtils.kNarrowNonBreakingSpace + unit); + + UiUtils.show(mAltitudeDiffAscent, mAltitudeDiffDescent); } } private void showRoutingDetails() { + // Show route plan info. + mRoutePlanList.setAdapter(new RoutePlanAdapter(mContext, Framework.nativeGetRoutePoints())); + final RoutingInfo rinfo = RoutingController.get().getCachedRoutingInfo(); if (rinfo == null) - { - UiUtils.hide(mTimeElevationLine, mTimeVehicle); - return; - } - - Spanned spanned = makeSpannedRoutingDetails(mContext, rinfo); - if (RoutingController.get().isVehicleRouterType()) - { - UiUtils.show(mTimeVehicle); - mTimeVehicle.setText(spanned); - } - else - { - UiUtils.show(mTimeElevationLine); - mTime.setText(spanned); - } - - if (mArrival != null) - { - String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds); - mArrival.setText(arrivalTime); - } + UiUtils.hide(mAltitudeLine); } // Scroll RecyclerView to bottom using parent ScrollView. @@ -389,7 +383,6 @@ final class RoutingBottomMenuController implements View.OnClickListener @NonNull private static Spanned makeSpannedRoutingDetails(@NonNull Context context, @NonNull RoutingInfo routingInfo) - { CharSequence time = RoutingController.formatRoutingTime(context, routingInfo.totalTimeInSeconds, diff --git a/android/app/src/main/java/app/organicmaps/util/DateUtils.java b/android/app/src/main/java/app/organicmaps/util/DateUtils.java index 82a8c47752..d4aebff79d 100644 --- a/android/app/src/main/java/app/organicmaps/util/DateUtils.java +++ b/android/app/src/main/java/app/organicmaps/util/DateUtils.java @@ -6,7 +6,12 @@ import androidx.annotation.Keep; import androidx.annotation.NonNull; import java.text.DateFormat; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import app.organicmaps.R; public final class DateUtils { @@ -27,4 +32,28 @@ public final class DateUtils { return android.text.format.DateFormat.is24HourFormat(context); } + + public static String getEstimateTimeString(@NonNull Context context, long seconds) + { + final String format = android.text.format.DateFormat.is24HourFormat(context)? "HH:mm" : "h:mm a"; + final LocalTime localTime = LocalTime.now().plusSeconds(seconds); + return localTime.format(DateTimeFormatter.ofPattern(format)); + } + + public static String getRemainingTimeString(@NonNull Context context, long seconds) + { + final long hours = TimeUnit.SECONDS.toHours(seconds); + final long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60; + + String timeString = ""; + + if (hours != 0) + timeString = String.valueOf(hours) + StringUtils.kNarrowNonBreakingSpace + + context.getResources().getString(R.string.hour) + " "; + + timeString += String.valueOf(minutes) + StringUtils.kNarrowNonBreakingSpace + + context.getResources().getString(R.string.minute); + + return timeString; + } } diff --git a/android/app/src/main/java/app/organicmaps/util/StringUtils.java b/android/app/src/main/java/app/organicmaps/util/StringUtils.java index d82b80a092..2c6f29089e 100644 --- a/android/app/src/main/java/app/organicmaps/util/StringUtils.java +++ b/android/app/src/main/java/app/organicmaps/util/StringUtils.java @@ -14,6 +14,8 @@ import java.util.Locale; public class StringUtils { + final public static String kNarrowNonBreakingSpace = "\u202F"; + public static String formatUsingUsLocale(String pattern, Object... args) { return String.format(Locale.US, pattern, args); diff --git a/android/app/src/main/java/app/organicmaps/util/UiUtils.java b/android/app/src/main/java/app/organicmaps/util/UiUtils.java index 3bd2609007..8fc4d69723 100644 --- a/android/app/src/main/java/app/organicmaps/util/UiUtils.java +++ b/android/app/src/main/java/app/organicmaps/util/UiUtils.java @@ -114,6 +114,21 @@ public final class UiUtils v.setVisibility(View.VISIBLE); } + public static void show(View frame, @IdRes int viewId) + { + View view = frame.findViewById(viewId); + if (view == null) + return; + + show(view); + } + + public static void show(View frame, @IdRes int... viewIds) + { + for (final int id : viewIds) + show(frame, id); + } + public static void invisible(View... views) { for (final View v : views) diff --git a/android/app/src/main/java/app/organicmaps/widget/menu/NavMenu.java b/android/app/src/main/java/app/organicmaps/widget/menu/NavMenu.java index 9e2b8612b7..c856b0cbc7 100644 --- a/android/app/src/main/java/app/organicmaps/widget/menu/NavMenu.java +++ b/android/app/src/main/java/app/organicmaps/widget/menu/NavMenu.java @@ -16,6 +16,7 @@ import app.organicmaps.R; import app.organicmaps.location.LocationHelper; import app.organicmaps.routing.RoutingInfo; import app.organicmaps.sound.TtsPlayer; +import app.organicmaps.util.DateUtils; import app.organicmaps.util.Graphics; import app.organicmaps.util.StringUtils; import app.organicmaps.util.ThemeUtils; @@ -200,10 +201,8 @@ public class NavMenu private void updateTimeEstimate(int seconds) { - final String format = android.text.format.DateFormat.is24HourFormat(mTimeMinuteValue.getContext()) - ? "HH:mm" : "h:mm a"; - final LocalTime localTime = LocalTime.now().plusSeconds(seconds); - mTimeEstimate.setText(localTime.format(DateTimeFormatter.ofPattern(format))); + mTimeEstimate.setText(DateUtils.getEstimateTimeString(mTimeMinuteValue.getContext(), + seconds)); } private void updateSpeedView(@NonNull RoutingInfo info) diff --git a/android/app/src/main/res/drawable/route_point_01.xml b/android/app/src/main/res/drawable/route_point_01.xml new file mode 100644 index 0000000000..f61bca62be --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_01.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_02.xml b/android/app/src/main/res/drawable/route_point_02.xml new file mode 100644 index 0000000000..d945fc7573 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_02.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_03.xml b/android/app/src/main/res/drawable/route_point_03.xml new file mode 100644 index 0000000000..1bd922d612 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_03.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_04.xml b/android/app/src/main/res/drawable/route_point_04.xml new file mode 100644 index 0000000000..5eb2839fac --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_04.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_05.xml b/android/app/src/main/res/drawable/route_point_05.xml new file mode 100644 index 0000000000..8c87e652f9 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_05.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_06.xml b/android/app/src/main/res/drawable/route_point_06.xml new file mode 100644 index 0000000000..f42b79c893 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_06.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_07.xml b/android/app/src/main/res/drawable/route_point_07.xml new file mode 100644 index 0000000000..003e621640 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_07.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_08.xml b/android/app/src/main/res/drawable/route_point_08.xml new file mode 100644 index 0000000000..0517fce861 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_08.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_09.xml b/android/app/src/main/res/drawable/route_point_09.xml new file mode 100644 index 0000000000..6cf968bf54 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_09.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_10.xml b/android/app/src/main/res/drawable/route_point_10.xml new file mode 100644 index 0000000000..9b0dd4ac00 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_10.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_11.xml b/android/app/src/main/res/drawable/route_point_11.xml new file mode 100644 index 0000000000..011e29d3a1 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_11.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_12.xml b/android/app/src/main/res/drawable/route_point_12.xml new file mode 100644 index 0000000000..dc49d8702a --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_12.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_13.xml b/android/app/src/main/res/drawable/route_point_13.xml new file mode 100644 index 0000000000..53a78161c6 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_13.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_14.xml b/android/app/src/main/res/drawable/route_point_14.xml new file mode 100644 index 0000000000..596445aa6b --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_14.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_15.xml b/android/app/src/main/res/drawable/route_point_15.xml new file mode 100644 index 0000000000..3d4285f9b3 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_15.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_16.xml b/android/app/src/main/res/drawable/route_point_16.xml new file mode 100644 index 0000000000..e98de508d7 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_16.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_17.xml b/android/app/src/main/res/drawable/route_point_17.xml new file mode 100644 index 0000000000..30836bb004 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_17.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_18.xml b/android/app/src/main/res/drawable/route_point_18.xml new file mode 100644 index 0000000000..ac0edc0523 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_18.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_19.xml b/android/app/src/main/res/drawable/route_point_19.xml new file mode 100644 index 0000000000..d2f55877df --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_19.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_20.xml b/android/app/src/main/res/drawable/route_point_20.xml new file mode 100644 index 0000000000..c9a25476c6 --- /dev/null +++ b/android/app/src/main/res/drawable/route_point_20.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/android/app/src/main/res/drawable/route_point_finish.png b/android/app/src/main/res/drawable/route_point_finish.png new file mode 100644 index 0000000000..46b0adf6d6 Binary files /dev/null and b/android/app/src/main/res/drawable/route_point_finish.png differ diff --git a/android/app/src/main/res/drawable/route_point_start.png b/android/app/src/main/res/drawable/route_point_start.png new file mode 100644 index 0000000000..f928ba045d Binary files /dev/null and b/android/app/src/main/res/drawable/route_point_start.png differ diff --git a/android/app/src/main/res/layout-land/altitude_chart_panel.xml b/android/app/src/main/res/layout-land/altitude_chart_panel.xml index d1080a5e53..56c6576bd9 100644 --- a/android/app/src/main/res/layout-land/altitude_chart_panel.xml +++ b/android/app/src/main/res/layout-land/altitude_chart_panel.xml @@ -1,77 +1,139 @@ - + + + + + + + + + - + android:id="@+id/altitude_line" + android:layout_marginStart="6dp" + android:layout_weight="1" + android:layout_width="0dp" + android:layout_height="match_parent" + android:orientation="horizontal" + tools:visibility="visible"> + + + + + + + + + + + + + tools:text="1043 m"/> + + + + + - +