diff --git a/android/res/layout/fragment_routing.xml b/android/res/layout/fragment_routing.xml
index ac7d2610ac..55fdf1d04d 100644
--- a/android/res/layout/fragment_routing.xml
+++ b/android/res/layout/fragment_routing.xml
@@ -13,6 +13,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
+
+
+
+
-
\ No newline at end of file
+
diff --git a/android/res/layout/routing_transit_step_view.xml b/android/res/layout/routing_transit_step_view.xml
new file mode 100644
index 0000000000..afa970b809
--- /dev/null
+++ b/android/res/layout/routing_transit_step_view.xml
@@ -0,0 +1,12 @@
+
+
diff --git a/android/res/values/dimens.xml b/android/res/values/dimens.xml
index 3ad2f8abd4..0f04326714 100644
--- a/android/res/values/dimens.xml
+++ b/android/res/values/dimens.xml
@@ -81,6 +81,7 @@
4dp
8dp
2dp
+ 20dp
48dp
diff --git a/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java b/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java
index 8e42f75795..0854b3149e 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java
@@ -12,6 +12,7 @@ import android.support.annotation.StringRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
+import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -22,7 +23,6 @@ import android.widget.TextView;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
-import com.mapswithme.maps.api.RoutePoint;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.taxi.TaxiAdapter;
@@ -30,6 +30,7 @@ import com.mapswithme.maps.taxi.TaxiInfo;
import com.mapswithme.maps.taxi.TaxiLinks;
import com.mapswithme.maps.taxi.TaxiManager;
import com.mapswithme.maps.widget.DotPager;
+import com.mapswithme.maps.widget.recycler.TagLayoutManager;
import com.mapswithme.util.Graphics;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
@@ -50,6 +51,8 @@ final class RoutingBottomMenuController implements View.OnClickListener
@NonNull
private final View mAltitudeChartFrame;
@NonNull
+ private final View mTransitFrame;
+ @NonNull
private final View mTaxiFrame;
@NonNull
private final TextView mError;
@@ -83,6 +86,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
@Nullable RoutingBottomMenuListener listener)
{
View altitudeChartFrame = getViewById(activity, frame, R.id.altitude_chart_panel);
+ View transitFrame = getViewById(activity, frame, R.id.transit_panel);
View taxiFrame = getViewById(activity, frame, R.id.taxi_panel);
TextView error = (TextView) getViewById(activity, frame, R.id.error);
Button start = (Button) getViewById(activity, frame, R.id.start);
@@ -91,9 +95,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
View numbersFrame = getViewById(activity, frame, R.id.numbers);
View actionFrame = getViewById(activity, frame, R.id.routing_action_frame);
- return new RoutingBottomMenuController(activity, altitudeChartFrame, taxiFrame, error, start,
- altitudeChart, altitudeDifference, numbersFrame,
- actionFrame, listener);
+ return new RoutingBottomMenuController(activity, altitudeChartFrame, transitFrame, taxiFrame,
+ error, start, altitudeChart, altitudeDifference,
+ numbersFrame, actionFrame, listener);
}
@NonNull
@@ -106,6 +110,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
private RoutingBottomMenuController(@NonNull Activity context,
@NonNull View altitudeChartFrame,
+ @NonNull View transitFrame,
@NonNull View taxiFrame,
@NonNull TextView error,
@NonNull Button start,
@@ -117,6 +122,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
{
mContext = context;
mAltitudeChartFrame = altitudeChartFrame;
+ mTransitFrame = transitFrame;
mTaxiFrame = taxiFrame;
mError = error;
mStart = start;
@@ -136,7 +142,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
void showAltitudeChartAndRoutingDetails()
{
- UiUtils.hide(mError, mTaxiFrame, mActionFrame);
+ UiUtils.hide(mError, mTaxiFrame, mActionFrame, mTransitFrame);
showRouteAltitudeChart();
showRoutingDetails();
@@ -153,7 +159,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
void showTaxiInfo(@NonNull TaxiInfo info)
{
- UiUtils.hide(mError, mAltitudeChartFrame, mActionFrame);
+ UiUtils.hide(mError, mAltitudeChartFrame, mActionFrame, mTransitFrame);
UiUtils.showTaxiIcon((ImageView) mTaxiFrame.findViewById(R.id.iv__logo), info.getType());
final List products = info.getProducts();
mTaxiInfo = info;
@@ -176,9 +182,27 @@ final class RoutingBottomMenuController implements View.OnClickListener
UiUtils.show(mTaxiFrame);
}
+ void showTransitInfo(@NonNull TransitRouteInfo info)
+ {
+ UiUtils.hide(mError, mAltitudeChartFrame, mActionFrame, mAltitudeChartFrame, mTaxiFrame);
+ UiUtils.show(mTransitFrame);
+ RecyclerView rv = (RecyclerView) mTransitFrame.findViewById(R.id.transit_recycler_view);
+ TransitStepAdapter adapter = new TransitStepAdapter();
+ rv.setLayoutManager(new TagLayoutManager());
+ rv.setNestedScrollingEnabled(false);
+ // TODO: make dot decorator.
+ rv.setAdapter(adapter);
+ adapter.setItems(info.getTransitSteps());
+
+ TextView totalTimeView = (TextView) mTransitFrame.findViewById(R.id.total_time);
+ totalTimeView.setText(RoutingController.formatRoutingTime(mContext, (int) info.getTotalTime(),
+ R.dimen.text_size_routing_number));
+ // TODO: set pedestrian total distance.
+ }
+
void showAddStartFrame()
{
- UiUtils.hide(mTaxiFrame, mError);
+ UiUtils.hide(mTaxiFrame, mError, mTransitFrame);
UiUtils.show(mActionFrame);
mActionMessage.setText(R.string.routing_add_start_point);
mActionMessage.setTag(RoutePointInfo.ROUTE_MARK_START);
@@ -198,7 +222,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
void showAddFinishFrame()
{
- UiUtils.hide(mTaxiFrame, mError);
+ UiUtils.hide(mTaxiFrame, mError, mTransitFrame);
UiUtils.show(mActionFrame);
mActionMessage.setText(R.string.routing_add_finish_point);
mActionMessage.setTag(RoutePointInfo.ROUTE_MARK_FINISH);
@@ -272,7 +296,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
private void showError(@NonNull String message)
{
- UiUtils.hide(mTaxiFrame, mAltitudeChartFrame, mActionFrame);
+ UiUtils.hide(mTaxiFrame, mAltitudeChartFrame, mActionFrame, mTransitFrame);
mError.setText(message);
mError.setVisibility(View.VISIBLE);
showStartButton(false);
diff --git a/android/src/com/mapswithme/maps/routing/RoutingController.java b/android/src/com/mapswithme/maps/routing/RoutingController.java
index 9e9ea0abed..d09b0a2264 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingController.java
@@ -694,6 +694,11 @@ public class RoutingController implements TaxiManager.TaxiListener
return mLastRouterType == Framework.ROUTER_TYPE_TAXI;
}
+ boolean isTransitType()
+ {
+ return mLastRouterType == Framework.ROUTER_TYPE_TRANSIT;
+ }
+
boolean isVehicleRouterType()
{
return mLastRouterType == Framework.ROUTER_TYPE_VEHICLE;
@@ -799,6 +804,12 @@ public class RoutingController implements TaxiManager.TaxiListener
return mCachedRoutingInfo;
}
+ @Nullable
+ TransitRouteInfo getCachedTransitInfo()
+ {
+ return mCachedTransitRouteInfo;
+ }
+
private void setPointsInternal(@Nullable MapObject startPoint, @Nullable MapObject endPoint)
{
if (startPoint != null)
diff --git a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
index b2b5acae18..b209e8bf19 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
@@ -171,6 +171,14 @@ public class RoutingPlanController extends ToolbarController
return;
}
+ if (isTransitType())
+ {
+ TransitRouteInfo info = RoutingController.get().getCachedTransitInfo();
+ if (info != null)
+ mRoutingBottomMenuController.showTransitInfo(info);
+ return;
+ }
+
if (!isTaxiRouterType())
{
mRoutingBottomMenuController.setStartButton();
@@ -243,11 +251,21 @@ public class RoutingPlanController extends ToolbarController
return RoutingController.get().isTaxiRouterType();
}
+ private boolean isTransitType()
+ {
+ return RoutingController.get().isTransitType();
+ }
+
public void showTaxiInfo(@NonNull TaxiInfo info)
{
mRoutingBottomMenuController.showTaxiInfo(info);
}
+ public void showTransitInfo(@NonNull TransitRouteInfo info)
+ {
+ mRoutingBottomMenuController.showTransitInfo(info);
+ }
+
public void showTaxiError(@NonNull TaxiManager.ErrorCode code)
{
switch (code)
diff --git a/android/src/com/mapswithme/maps/routing/TransitRouteInfo.java b/android/src/com/mapswithme/maps/routing/TransitRouteInfo.java
index 32edd6c38e..50f093d358 100644
--- a/android/src/com/mapswithme/maps/routing/TransitRouteInfo.java
+++ b/android/src/com/mapswithme/maps/routing/TransitRouteInfo.java
@@ -2,23 +2,27 @@ package com.mapswithme.maps.routing;
import android.support.annotation.NonNull;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Represents TransitRouteInfo from core.
*/
public class TransitRouteInfo
{
@NonNull
- public final String mTotalDistance;
+ private final String mTotalDistance;
@NonNull
- public final String mTotalDistanceUnits;
- public final int mTotalTimeInSec;
+ private final String mTotalDistanceUnits;
+ private final int mTotalTimeInSec;
@NonNull
- public final String mTotalPedestrianDistance;
+ private final String mTotalPedestrianDistance;
@NonNull
- public final String mTotalPedestrianDistanceUnits;
- public final int mTotalPedestrianTimeInSec;
+ private final String mTotalPedestrianDistanceUnits;
+ private final int mTotalPedestrianTimeInSec;
@NonNull
- public final TransitStepInfo[] mSteps;
+ private final TransitStepInfo[] mSteps;
public TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits, int totalTimeInSec,
@NonNull String totalPedestrianDistance, @NonNull String totalPedestrianDistanceUnits,
@@ -32,4 +36,15 @@ public class TransitRouteInfo
mTotalPedestrianTimeInSec = totalPedestrianTimeInSec;
mSteps = steps;
}
-}
+
+ int getTotalTime()
+ {
+ return mTotalTimeInSec;
+ }
+
+ @NonNull
+ List getTransitSteps()
+ {
+ return new ArrayList<>(Arrays.asList(mSteps));
+ }
+}
\ No newline at end of file
diff --git a/android/src/com/mapswithme/maps/routing/TransitStepAdapter.java b/android/src/com/mapswithme/maps/routing/TransitStepAdapter.java
new file mode 100644
index 0000000000..2954067d1d
--- /dev/null
+++ b/android/src/com/mapswithme/maps/routing/TransitStepAdapter.java
@@ -0,0 +1,61 @@
+package com.mapswithme.maps.routing;
+
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.mapswithme.maps.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TransitStepAdapter extends RecyclerView.Adapter
+{
+ @NonNull
+ private List mItems = new ArrayList<>();
+
+ @Override
+ public TransitStepViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
+ {
+ return new TransitStepViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.routing_transit_step_view, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(TransitStepViewHolder holder, int position)
+ {
+ holder.bind(mItems.get(position));
+ }
+
+ @Override
+ public int getItemCount()
+ {
+ return mItems.size();
+ }
+
+ public void setItems(@NonNull List items)
+ {
+ mItems.clear();
+ mItems.addAll(items);
+ notifyDataSetChanged();
+ }
+
+ static class TransitStepViewHolder extends RecyclerView.ViewHolder
+ {
+ @NonNull
+ private TransitStepView mView;
+
+ TransitStepViewHolder(@NonNull View itemView)
+ {
+ super(itemView);
+ mView = (TransitStepView) itemView;
+ }
+
+ void bind(@NonNull TransitStepInfo info)
+ {
+ mView.setTransitStepInfo(info);
+ }
+ }
+}
diff --git a/android/src/com/mapswithme/util/UiUtils.java b/android/src/com/mapswithme/util/UiUtils.java
index 14e0ee6a95..8ddd91734e 100644
--- a/android/src/com/mapswithme/util/UiUtils.java
+++ b/android/src/com/mapswithme/util/UiUtils.java
@@ -116,12 +116,12 @@ public final class UiUtils
});
}
- public static void hide(View view)
+ public static void hide(@NonNull View view)
{
view.setVisibility(View.GONE);
}
- public static void hide(View... views)
+ public static void hide(@NonNull View... views)
{
for (final View v : views)
v.setVisibility(View.GONE);