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