From cb8d26b40f25e1e7f1c03da535f851e45fd75d49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B0=D1=86=D0=B5=D0=BF=D0=B8=D0=BD?= Date: Fri, 13 Mar 2020 14:32:02 +0300 Subject: [PATCH] [android] Added displaying the elevation profile properties from elevation info data structure --- .../maps/bookmarks/data/ElevationInfo.java | 111 ++++++++++++++++-- .../ElevationProfileViewRenderer.java | 48 ++++++-- .../placepage/PlacePageViewRenderer.java | 4 +- .../placepage/RichPlacePageController.java | 5 +- .../placepage/SimplePlacePageController.java | 25 ++-- 5 files changed, 154 insertions(+), 39 deletions(-) diff --git a/android/src/com/mapswithme/maps/bookmarks/data/ElevationInfo.java b/android/src/com/mapswithme/maps/bookmarks/data/ElevationInfo.java index 3244a33756..ee21782c20 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/ElevationInfo.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/ElevationInfo.java @@ -1,12 +1,17 @@ package com.mapswithme.maps.bookmarks.data; -import androidx.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.NonNull; +import com.mapswithme.maps.widget.placepage.UserMarkInterface; + +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class ElevationInfo +public class ElevationInfo implements Parcelable, UserMarkInterface { private final long mId; @NonNull @@ -18,7 +23,7 @@ public class ElevationInfo private final int mMinAltitude; private final int mMaxAltitude; private final int mDifficulty; - private final long m_duration; + private final long mDuration; public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points, int ascent, int descent, int minAltitude, int maxAltitude, int difficulty, @@ -32,7 +37,28 @@ public class ElevationInfo mMinAltitude = minAltitude; mMaxAltitude = maxAltitude; mDifficulty = difficulty; - this.m_duration = m_duration; + this.mDuration = m_duration; + } + + protected ElevationInfo(Parcel in) + { + mId = in.readLong(); + mName = in.readString(); + mAscent = in.readInt(); + mDescent = in.readInt(); + mMinAltitude = in.readInt(); + mMaxAltitude = in.readInt(); + mDifficulty = in.readInt(); + mDuration = in.readLong(); + mPoints = readPoints(in); + } + + @NonNull + private static List readPoints(@NonNull Parcel in) + { + List points = new ArrayList<>(); + in.readTypedList(points, Point.CREATOR); + return points; } public long getId() @@ -77,12 +103,34 @@ public class ElevationInfo return mDifficulty; } - public long getM_duration() + public long getDuration() { - return m_duration; + return mDuration; } - public static class Point + @Override + public int describeContents() + { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) + { + dest.writeLong(mId); + dest.writeString(mName); + dest.writeInt(mAscent); + dest.writeInt(mDescent); + dest.writeInt(mMinAltitude); + dest.writeInt(mMaxAltitude); + dest.writeInt(mDifficulty); + dest.writeLong(mDuration); + // All collections are deserialized AFTER non-collection and primitive type objects, + // so collections must be always serialized at the end. + dest.writeList(mPoints); + } + + public static class Point implements Parcelable { private final double mDistance; private final int mAltitude; @@ -93,6 +141,27 @@ public class ElevationInfo mAltitude = altitude; } + protected Point(Parcel in) + { + mDistance = in.readDouble(); + mAltitude = in.readInt(); + } + + public static final Creator CREATOR = new Creator() + { + @Override + public Point createFromParcel(Parcel in) + { + return new Point(in); + } + + @Override + public Point[] newArray(int size) + { + return new Point[size]; + } + }; + public double getDistance() { return mDistance; @@ -102,5 +171,33 @@ public class ElevationInfo { return mAltitude; } + + @Override + public int describeContents() + { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) + { + dest.writeDouble(mDistance); + dest.writeInt(mAltitude); + } } + + public static final Creator CREATOR = new Creator() + { + @Override + public ElevationInfo createFromParcel(Parcel in) + { + return new ElevationInfo(in); + } + + @Override + public ElevationInfo[] newArray(int size) + { + return new ElevationInfo[size]; + } + }; } diff --git a/android/src/com/mapswithme/maps/widget/placepage/ElevationProfileViewRenderer.java b/android/src/com/mapswithme/maps/widget/placepage/ElevationProfileViewRenderer.java index 6a3088e457..a5c9e8e685 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/ElevationProfileViewRenderer.java +++ b/android/src/com/mapswithme/maps/widget/placepage/ElevationProfileViewRenderer.java @@ -1,17 +1,22 @@ package com.mapswithme.maps.widget.placepage; +import android.annotation.SuppressLint; +import android.content.res.Resources; +import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.mapswithme.maps.R; -import com.mapswithme.maps.bookmarks.data.MapObject; +import com.mapswithme.maps.bookmarks.data.ElevationInfo; +import com.mapswithme.maps.routing.RoutingController; import java.util.Objects; -public class ElevationProfileViewRenderer implements PlacePageViewRenderer +public class ElevationProfileViewRenderer implements PlacePageViewRenderer { + private static final String EXTRA_ELEVATION_INFO = "extra_elevation_info"; private static final int MAX_DIFFICULTY_LEVEL = 3; @SuppressWarnings("NullableProblems") @@ -34,18 +39,25 @@ public class ElevationProfileViewRenderer implements PlacePageViewRenderer extends Initializable +public interface PlacePageViewRenderer extends Initializable, Savable { void render(@NonNull Data data); } diff --git a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java index 01a16ab939..61e9f86ec0 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java @@ -567,9 +567,8 @@ public class RichPlacePageController implements PlacePageController, LocationLis } @Override - public boolean support(@NonNull UserMarkInterface object) + public boolean support(@NonNull UserMarkInterface userMark) { - // TODO: only for tests. - return !((MapObject) object).getTitle().equals("Петровский Путевой Дворец"); + return userMark instanceof MapObject; } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java index 9f793e7d74..9133384815 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java @@ -12,7 +12,7 @@ import androidx.annotation.Nullable; import androidx.core.view.GestureDetectorCompat; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; -import com.mapswithme.maps.bookmarks.data.MapObject; +import com.mapswithme.maps.bookmarks.data.ElevationInfo; import com.mapswithme.util.UiUtils; import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; @@ -33,10 +33,8 @@ public class SimplePlacePageController implements PlacePageController private final SlideListener mSlideListener; private int mViewportMinHeight; private int mViewPortMinWidth; - @Nullable - private MapObject mMapObject; @NonNull - private final PlacePageViewRenderer mViewRenderer; + private final PlacePageViewRenderer mViewRenderer; @NonNull private final BottomSheetChangedListener mBottomSheetChangedListener = new BottomSheetChangedListener() @@ -95,17 +93,16 @@ public class SimplePlacePageController implements PlacePageController private boolean mDeactivateMapSelection = true; SimplePlacePageController(@NonNull SlideListener slideListener, - @NonNull PlacePageViewRenderer renderer) + @NonNull PlacePageViewRenderer renderer) { mSlideListener = slideListener; mViewRenderer = renderer; } @Override - public void openFor(@NonNull UserMarkInterface object) + public void openFor(@NonNull UserMarkInterface userMark) { - mMapObject = (MapObject) object; - mViewRenderer.render(mMapObject); + mViewRenderer.render(userMark); if (mSheetBehavior.getSkipCollapsed()) mSheetBehavior.setState(AnchorBottomSheetBehavior.STATE_EXPANDED); else @@ -194,7 +191,7 @@ public class SimplePlacePageController implements PlacePageController @Override public void onSave(@NonNull Bundle outState) { - outState.putParcelable(PlacePageUtils.EXTRA_MAP_OBJECT, mMapObject); + mViewRenderer.onSave(outState); } @Override @@ -209,12 +206,7 @@ public class SimplePlacePageController implements PlacePageController return; } - MapObject object = inState.getParcelable(PlacePageUtils.EXTRA_MAP_OBJECT); - if (object == null) - return; - - mMapObject = object; - mViewRenderer.render(object); + mViewRenderer.onRestore(inState); if (UiUtils.isLandscape(mApplication)) { // In case when bottom sheet was collapsed for vertical orientation then after rotation @@ -246,8 +238,7 @@ public class SimplePlacePageController implements PlacePageController @Override public boolean support(@NonNull UserMarkInterface object) { - // TODO: only for tests. - return ((MapObject) object).getTitle().equals("Петровский Путевой Дворец"); + return object instanceof ElevationInfo; } private static class SimplePlacePageGestureListener extends PlacePageGestureListener