diff --git a/android/res/layout/layout_nav_top.xml b/android/res/layout/layout_nav_top.xml index 08519e5817..e04a4b412c 100644 --- a/android/res/layout/layout_nav_top.xml +++ b/android/res/layout/layout_nav_top.xml @@ -106,12 +106,15 @@ + app:layout_constraintTop_toBottomOf="@+id/street_frame" + android:visibility="gone" + tools:visibility="visible"> diff --git a/android/src/app/organicmaps/routing/LanesAdapter.java b/android/src/app/organicmaps/routing/LanesAdapter.java index eb02b47760..4d8b9b0a0a 100644 --- a/android/src/app/organicmaps/routing/LanesAdapter.java +++ b/android/src/app/organicmaps/routing/LanesAdapter.java @@ -1,5 +1,7 @@ package app.organicmaps.routing; +import android.content.res.ColorStateList; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -64,8 +66,25 @@ public class LanesAdapter extends RecyclerView.Adapter 0); + int imageRes = haveLaneData ? info.mLane[0].mTurnRes : 0; + mArrow.setImageResource(imageRes); + } + void bind(@NonNull SingleLaneInfo info) { + setIconTint(info); + setIcon(info); } } } diff --git a/android/src/app/organicmaps/routing/NavigationController.java b/android/src/app/organicmaps/routing/NavigationController.java index 2110c9bbea..4554e8ead4 100644 --- a/android/src/app/organicmaps/routing/NavigationController.java +++ b/android/src/app/organicmaps/routing/NavigationController.java @@ -53,6 +53,8 @@ public class NavigationController implements Application.ActivityLifecycleCallba private final View mStreetFrame; private final TextView mNextStreet; + @NonNull + private final View mLanesFrame; @NonNull private final RecyclerView mLanes; @NonNull @@ -126,7 +128,8 @@ public class NavigationController implements Application.ActivityLifecycleCallba mStreetFrame = topFrame.findViewById(R.id.street_frame); mNextStreet = mStreetFrame.findViewById(R.id.street); - mLanes = topFrame.findViewById(R.id.lanes); + mLanesFrame = topFrame.findViewById(R.id.lanes_frame); + mLanes = mLanesFrame.findViewById(R.id.lanes); mLanesAdapter = new LanesAdapter(); initLanesRecycler(); @@ -205,9 +208,15 @@ public class NavigationController implements Application.ActivityLifecycleCallba info.nextCarDirection.setNextTurnDrawable(mNextNextTurnImage); if (info.lanes != null) + { + UiUtils.show(mLanesFrame); mLanesAdapter.setItems(Arrays.asList(info.lanes)); + } else + { + UiUtils.hide(mLanesFrame); mLanesAdapter.clearItems(); + } } private void updatePedestrian(RoutingInfo info) diff --git a/android/src/app/organicmaps/routing/RoutingInfo.java b/android/src/app/organicmaps/routing/RoutingInfo.java index 23d0503d26..864317078b 100644 --- a/android/src/app/organicmaps/routing/RoutingInfo.java +++ b/android/src/app/organicmaps/routing/RoutingInfo.java @@ -133,27 +133,6 @@ public class RoutingInfo } } - /** - * IMPORTANT : Order of enum values MUST BE the same - * with native LaneWay enum (see routing/turns.hpp for details). - * Information for every lane is composed of some number values below. - * For example, a lane may have THROUGH and RIGHT values. - */ - public enum LaneWay - { - NONE, - REVERSE, - SHARP_LEFT, - LEFT, - SLIGHT_LEFT, - MERGE_TO_RIGHT, - THROUGH, - MERGE_TO_LEFT, - SLIGHT_RIGHT, - RIGHT, - SHARP_RIGHT - } - public RoutingInfo(String distToTarget, String units, String distTurn, String turnSuffix, String currentStreet, String nextStreet, double completionPercent, int vehicleTurnOrdinal, int vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum, int totalTime, SingleLaneInfo[] lanes, boolean speedLimitExceeded, diff --git a/android/src/app/organicmaps/routing/SingleLaneInfo.java b/android/src/app/organicmaps/routing/SingleLaneInfo.java index 89badcf75d..5d7a54828a 100644 --- a/android/src/app/organicmaps/routing/SingleLaneInfo.java +++ b/android/src/app/organicmaps/routing/SingleLaneInfo.java @@ -1,13 +1,48 @@ package app.organicmaps.routing; +import androidx.annotation.DrawableRes; +import app.organicmaps.R; + public class SingleLaneInfo { - byte[] mLane; + LaneWay[] mLane; boolean mIsActive; - SingleLaneInfo(byte[] lane, boolean isActive) + /** + * IMPORTANT : Order of enum values MUST BE the same + * with native LaneWay enum (see routing/turns.hpp for details). + * Information for every lane is composed of some number values below. + * For example, a lane may have THROUGH and RIGHT values. + */ + public enum LaneWay { - mLane = lane; + NONE(R.drawable.ic_turn_straight), + REVERSE(R.drawable.ic_turn_uleft), + SHARP_LEFT(R.drawable.ic_turn_left_sharp), + LEFT(R.drawable.ic_turn_left), + SLIGHT_LEFT(R.drawable.ic_turn_left_slight), + MERGE_TO_RIGHT(R.drawable.ic_turn_right_slight), + THROUGH(R.drawable.ic_turn_straight), + MERGE_TO_LEFT(R.drawable.ic_turn_left_slight), + SLIGHT_RIGHT(R.drawable.ic_turn_right_slight), + RIGHT(R.drawable.ic_turn_right), + SHARP_RIGHT(R.drawable.ic_turn_right_sharp); + + public final int mTurnRes; + + LaneWay(@DrawableRes int turnRes) + { + mTurnRes = turnRes; + } + } + + SingleLaneInfo(byte[] laneOrdinals, boolean isActive) + { + mLane = new LaneWay[laneOrdinals.length]; + final LaneWay[] values = LaneWay.values(); + for (int i = 0; i < mLane.length; i++) + mLane[i] = values[laneOrdinals[i]]; + mIsActive = isActive; } @@ -17,8 +52,8 @@ public class SingleLaneInfo final int initialCapacity = 32; StringBuilder sb = new StringBuilder(initialCapacity); sb.append("Is the lane active? ").append(mIsActive).append(". The lane directions IDs are"); - for (byte i : mLane) - sb.append(" ").append(i); + for (LaneWay i : mLane) + sb.append(" ").append(i.ordinal()); return sb.toString(); } }