diff --git a/android/res/drawable/ic_my_location.xml b/android/res/drawable/ic_my_location.xml
new file mode 100644
index 0000000000..3bb45c9a66
--- /dev/null
+++ b/android/res/drawable/ic_my_location.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/android/res/layout/fragment_routing.xml b/android/res/layout/fragment_routing.xml
index 7de5276355..390573b2de 100644
--- a/android/res/layout/fragment_routing.xml
+++ b/android/res/layout/fragment_routing.xml
@@ -18,6 +18,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
+
+
+
+
diff --git a/android/res/layout/routing_action_panel.xml b/android/res/layout/routing_action_panel.xml
new file mode 100644
index 0000000000..adecd15015
--- /dev/null
+++ b/android/res/layout/routing_action_panel.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
diff --git a/android/res/values/dimens.xml b/android/res/values/dimens.xml
index ba530841e0..9599661c0f 100644
--- a/android/res/values/dimens.xml
+++ b/android/res/values/dimens.xml
@@ -152,6 +152,9 @@
40dp
232dp
+
+ 14dp
+
100dp
150dp
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index a6dbcfefaf..b746857216 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -1140,4 +1140,7 @@
If a street or an object doesn\'t have a name in your language, it will be spelt using the Latin alphabet.
Learn more
Exit
+ Add start point to plan a route.
+ Add finish to plan a route.
+ Use
diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java
index 19af8d699b..f3e7e731ce 100644
--- a/android/src/com/mapswithme/maps/MwmActivity.java
+++ b/android/src/com/mapswithme/maps/MwmActivity.java
@@ -56,7 +56,6 @@ import com.mapswithme.maps.editor.ReportFragment;
import com.mapswithme.maps.location.CompassData;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.routing.NavigationController;
-import com.mapswithme.maps.routing.RoutePointInfo;
import com.mapswithme.maps.routing.RoutingController;
import com.mapswithme.maps.routing.RoutingPlanController;
import com.mapswithme.maps.routing.RoutingPlanFragment;
@@ -1596,14 +1595,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (controller.isBuilt() || controller.isUberRequestHandled())
{
- showLineFrame(true, new Runnable()
- {
- @Override
- public void run()
- {
- adjustRuler(0, 0);
- }
- });
+ showLineFrame();
if (completion != null)
completion.run();
@@ -1612,6 +1604,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (controller.isPlanning() || controller.isBuilding() || controller.isErrorEncountered())
{
+ if (showAddStartOrFinishFrame(controller, true))
+ return;
+
showLineFrame(false, new Runnable()
{
@Override
@@ -1627,6 +1622,75 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
+ hideRoutingActionFrame();
+ showLineFrame();
+
+ if (completion != null)
+ completion.run();
+ }
+
+ private boolean showAddStartOrFinishFrame(@NonNull RoutingController controller,
+ boolean showFrame)
+ {
+ if (!controller.hasStartPoint())
+ {
+ showAddStartFrame();
+ if (showFrame)
+ showLineFrame();
+ return true;
+ }
+ if (!controller.hasEndPoint())
+ {
+ showAddFinishFrame();
+ if (showFrame)
+ showLineFrame();
+ return true;
+ }
+
+ return false;
+ }
+
+ private void showAddStartFrame()
+ {
+ if (!mIsFragmentContainer)
+ {
+ mRoutingPlanInplaceController.showAddStartFrame();
+ return;
+ }
+
+ RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
+ if (fragment != null)
+ fragment.showAddStartFrame();
+ }
+
+ private void showAddFinishFrame()
+ {
+ if (!mIsFragmentContainer)
+ {
+ mRoutingPlanInplaceController.showAddFinishFrame();
+ return;
+ }
+
+ RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
+ if (fragment != null)
+ fragment.showAddFinishFrame();
+ }
+
+ private void hideRoutingActionFrame()
+ {
+ if (!mIsFragmentContainer)
+ {
+ mRoutingPlanInplaceController.hideActionFrame();
+ return;
+ }
+
+ RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
+ if (fragment != null)
+ fragment.hideActionFrame();
+ }
+
+ private void showLineFrame()
+ {
showLineFrame(true, new Runnable()
{
@Override
@@ -1635,9 +1699,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
adjustRuler(0, 0);
}
});
-
- if (completion != null)
- completion.run();
}
private void showLineFrame(boolean show, @Nullable Runnable completion)
@@ -1674,6 +1735,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (mIsFragmentContainer)
{
replaceFragment(RoutingPlanFragment.class, null, completionListener);
+ showAddStartOrFinishFrame(RoutingController.get(), false);
adjustTraffic(UiUtils.dimen(R.dimen.panel_width), UiUtils.getStatusBarHeight(getApplicationContext()));
}
else
diff --git a/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java b/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java
new file mode 100644
index 0000000000..0ae1f17a9d
--- /dev/null
+++ b/android/src/com/mapswithme/maps/routing/RoutingBottomMenuController.java
@@ -0,0 +1,347 @@
+package com.mapswithme.maps.routing;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.location.Location;
+import android.os.Bundle;
+import android.support.annotation.IdRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+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.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.mapswithme.maps.Framework;
+import com.mapswithme.maps.MwmActivity;
+import com.mapswithme.maps.R;
+import com.mapswithme.maps.bookmarks.data.MapObject;
+import com.mapswithme.maps.location.LocationHelper;
+import com.mapswithme.maps.uber.UberAdapter;
+import com.mapswithme.maps.uber.UberInfo;
+import com.mapswithme.maps.uber.UberLinks;
+import com.mapswithme.maps.widget.DotPager;
+import com.mapswithme.util.Graphics;
+import com.mapswithme.util.UiUtils;
+import com.mapswithme.util.Utils;
+import com.mapswithme.util.statistics.AlohaHelper;
+import com.mapswithme.util.statistics.Statistics;
+
+import java.util.List;
+import java.util.Locale;
+
+final class RoutingBottomMenuController implements View.OnClickListener
+{
+ private static final String STATE_ALTITUDE_CHART_SHOWN = "altitude_chart_shown";
+ private static final String STATE_TAXI_INFO = "taxi_info";
+
+ @NonNull
+ private final Activity mContext;
+ @NonNull
+ private final View mAltitudeChartFrame;
+ @NonNull
+ private final View mUberFrame;
+ @NonNull
+ private final TextView mError;
+ @NonNull
+ private final Button mStart;
+ @NonNull
+ private final ImageView mAltitudeChart;
+ @NonNull
+ private final TextView mAltitudeDifference;
+ @NonNull
+ private final View mNumbersFrame;
+ @NonNull
+ private final View mActionFrame;
+ @NonNull
+ private final TextView mActionMessage;
+ @NonNull
+ private final View mActionButton;
+ @NonNull
+ private final ImageView mActionIcon;
+
+ @Nullable
+ private UberInfo mUberInfo;
+ @Nullable
+ private UberInfo.Product mUberProduct;
+
+ @NonNull
+ static RoutingBottomMenuController newInstance(@NonNull Activity activity, @NonNull View frame)
+ {
+ View altitudeChartFrame = getViewById(activity, frame, R.id.altitude_chart_panel);
+ View uberFrame = getViewById(activity, frame, R.id.uber_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 altitudeDifference = (TextView) getViewById(activity, frame, R.id.altitude_difference);
+ View numbersFrame = getViewById(activity, frame, R.id.numbers);
+ View actionFrame = getViewById(activity, frame, R.id.routing_action_frame);
+
+ return new RoutingBottomMenuController(activity, altitudeChartFrame,
+ uberFrame, error, start,
+ altitudeChart,
+ altitudeDifference,
+ numbersFrame, actionFrame);
+ }
+
+ @NonNull
+ private static View getViewById(@NonNull Activity activity, @NonNull View frame,
+ @IdRes int resourceId)
+ {
+ View view = frame.findViewById(resourceId);
+ return view == null ? activity.findViewById(resourceId) : view;
+ }
+
+ private RoutingBottomMenuController(@NonNull Activity context,
+ @NonNull View altitudeChartFrame,
+ @NonNull View uberFrame,
+ @NonNull TextView error,
+ @NonNull Button start,
+ @NonNull ImageView altitudeChart,
+ @NonNull TextView altitudeDifference,
+ @NonNull View numbersFrame,
+ @NonNull View actionFrame)
+ {
+ mContext = context;
+ mAltitudeChartFrame = altitudeChartFrame;
+ mUberFrame = uberFrame;
+ mError = error;
+ mStart = start;
+ mAltitudeChart = altitudeChart;
+ mAltitudeDifference = altitudeDifference;
+ mNumbersFrame = numbersFrame;
+ mActionFrame = actionFrame;
+ mActionMessage = (TextView) actionFrame.findViewById(R.id.tv__message);
+ mActionButton = actionFrame.findViewById(R.id.btn__my_position_use);
+ mActionIcon = (ImageView) mActionButton.findViewById(R.id.iv__icon);
+ mActionButton.setOnClickListener(this);
+ mActionFrame.setOnTouchListener(new View.OnTouchListener()
+ {
+ @Override
+ public boolean onTouch(View v, MotionEvent event)
+ {
+ return !(UiUtils.isVisible(mActionButton) && UiUtils.isViewTouched(event, mActionButton));
+ }
+ });
+ UiUtils.hide(mAltitudeChartFrame, mUberFrame, mActionFrame);
+ }
+
+ void showAltitudeChartAndRoutingDetails()
+ {
+ UiUtils.hide(mError, mUberFrame, mActionFrame);
+
+ showRouteAltitudeChart();
+ showRoutingDetails();
+ UiUtils.show(mAltitudeChartFrame);
+ }
+
+ void hideAltitudeChartAndRoutingDetails()
+ {
+ if (UiUtils.isHidden(mAltitudeChartFrame))
+ return;
+
+ UiUtils.hide(mAltitudeChartFrame);
+ }
+
+ void showUberInfo(@NonNull UberInfo info)
+ {
+ UiUtils.hide(mError, mAltitudeChartFrame);
+
+ final List products = info.getProducts();
+ mUberInfo = info;
+ mUberProduct = products.get(0);
+ final PagerAdapter adapter = new UberAdapter(mContext, products);
+ DotPager pager = new DotPager.Builder(mContext, (ViewPager) mUberFrame.findViewById(R.id.pager),
+ adapter)
+ .setIndicatorContainer((ViewGroup) mUberFrame.findViewById(R.id.indicator))
+ .setPageChangedListener(new DotPager.OnPageChangedListener()
+ {
+ @Override
+ public void onPageChanged(int position)
+ {
+ mUberProduct = products.get(position);
+ }
+ }).build();
+ pager.show();
+
+ setStartButton();
+ UiUtils.show(mUberFrame);
+ }
+
+ void showAddStartFrame()
+ {
+ UiUtils.show(mActionFrame, mActionButton);
+ mActionMessage.setText(R.string.routing_add_start_point);
+ Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_my_location);
+ int colorAccent = ContextCompat.getColor(mContext,
+ UiUtils.getStyledResourceId(mContext, R.attr.colorAccent));
+ mActionIcon.setImageDrawable(Graphics.tint(icon, colorAccent));
+ }
+
+ void showAddFinishFrame()
+ {
+ UiUtils.show(mActionFrame);
+ mActionMessage.setText(R.string.routing_add_finish_point);
+ UiUtils.hide(mActionButton);
+ }
+
+ void hideActionFrame()
+ {
+ UiUtils.hide(mActionFrame);
+ }
+
+ void setStartButton()
+ {
+ if (RoutingController.get().isTaxiRouterType())
+ {
+ final boolean isUberInstalled = Utils.isUberInstalled(mContext);
+ mStart.setText(isUberInstalled ? R.string.taxi_order : R.string.install_app);
+ mStart.setOnClickListener(new View.OnClickListener()
+ {
+ @Override
+ public void onClick(View v)
+ {
+ if (mUberProduct != null)
+ {
+ UberLinks links = RoutingController.get().getUberLink(mUberProduct.getProductId());
+ if (links != null)
+ {
+ Utils.launchUber(mContext, links);
+ trackUberStatistics(isUberInstalled);
+ }
+ }
+ }
+ });
+ } else
+ {
+ mStart.setText(mContext.getText(R.string.p2p_start));
+ mStart.setOnClickListener(new View.OnClickListener()
+ {
+ @Override
+ public void onClick(View v)
+ {
+ ((MwmActivity)mContext).closeMenu(Statistics.EventName.ROUTING_START, AlohaHelper.ROUTING_START, new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ RoutingController.get().start();
+ }
+ });
+ }
+ });
+ }
+
+ UiUtils.updateAccentButton(mStart);
+ showStartButton(true);
+ }
+
+ void showError(@StringRes int message)
+ {
+ UiUtils.hide(mUberFrame, mAltitudeChartFrame);
+ mError.setText(message);
+ mError.setVisibility(View.VISIBLE);
+ showStartButton(false);
+ }
+
+ void showStartButton(boolean show)
+ {
+ UiUtils.showIf(show, mStart);
+ }
+
+ void saveRoutingPanelState(@NonNull Bundle outState)
+ {
+ outState.putBoolean(STATE_ALTITUDE_CHART_SHOWN, UiUtils.isVisible(mAltitudeChartFrame));
+ outState.putParcelable(STATE_TAXI_INFO, mUberInfo);
+ }
+
+ void restoreRoutingPanelState(@NonNull Bundle state)
+ {
+ if (state.getBoolean(STATE_ALTITUDE_CHART_SHOWN))
+ showAltitudeChartAndRoutingDetails();
+
+ UberInfo info = state.getParcelable(STATE_TAXI_INFO);
+ if (info != null)
+ showUberInfo(info);
+ }
+
+ private void showRouteAltitudeChart()
+ {
+ if (RoutingController.get().isVehicleRouterType())
+ {
+ UiUtils.hide(mAltitudeChart, mAltitudeDifference);
+ return;
+ }
+
+ int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width);
+ int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height);
+ Framework.RouteAltitudeLimits limits = new Framework.RouteAltitudeLimits();
+ Bitmap bm = Framework.generateRouteAltitudeChart(chartWidth, chartHeight, limits);
+ if (bm != null)
+ {
+ mAltitudeChart.setImageBitmap(bm);
+ UiUtils.show(mAltitudeChart);
+ String meter = mAltitudeDifference.getResources().getString(R.string.meter);
+ String foot = mAltitudeDifference.getResources().getString(R.string.foot);
+ mAltitudeDifference.setText(String.format(Locale.getDefault(), "%d %s",
+ limits.maxRouteAltitude - limits.minRouteAltitude,
+ limits.isMetricUnits ? meter : foot));
+ Drawable icon = ContextCompat.getDrawable(mContext,
+ R.drawable.ic_altitude_difference);
+ int colorAccent = ContextCompat.getColor(mContext,
+ UiUtils.getStyledResourceId(mContext, R.attr.colorAccent));
+ mAltitudeDifference.setCompoundDrawablesWithIntrinsicBounds(Graphics.tint(icon, colorAccent),
+ null, null, null);
+ UiUtils.show(mAltitudeDifference);
+ }
+ }
+
+ private void showRoutingDetails()
+ {
+ final RoutingInfo rinfo = RoutingController.get().getCachedRoutingInfo();
+ if (rinfo == null)
+ {
+ UiUtils.hide(mNumbersFrame);
+ return;
+ }
+
+ TextView numbersTime = (TextView) mNumbersFrame.findViewById(R.id.time);
+ TextView numbersDistance = (TextView) mNumbersFrame.findViewById(R.id.distance);
+ TextView numbersArrival = (TextView) mNumbersFrame.findViewById(R.id.arrival);
+ numbersTime.setText(RoutingController.formatRoutingTime(mContext, rinfo.totalTimeInSeconds,
+ R.dimen.text_size_routing_number));
+ numbersDistance.setText(rinfo.distToTarget + " " + rinfo.targetUnits);
+
+ if (numbersArrival != null)
+ {
+ String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds);
+ numbersArrival.setText(arrivalTime);
+ }
+ }
+
+ private static void trackUberStatistics(boolean isUberInstalled)
+ {
+ MapObject from = RoutingController.get().getStartPoint();
+ MapObject to = RoutingController.get().getEndPoint();
+ Location location = LocationHelper.INSTANCE.getLastKnownLocation();
+ Statistics.INSTANCE.trackUber(from, to, location, isUberInstalled);
+ }
+
+ @Override
+ public void onClick(View v)
+ {
+ switch (v.getId())
+ {
+ case R.id.btn__my_position_use:
+ RoutingController.get().setStartPoint(LocationHelper.INSTANCE.getMyPosition());
+ break;
+ }
+ }
+}
diff --git a/android/src/com/mapswithme/maps/routing/RoutingController.java b/android/src/com/mapswithme/maps/routing/RoutingController.java
index 547947baa7..3dba3c21ee 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingController.java
@@ -641,6 +641,16 @@ public class RoutingController
return mEndPoint;
}
+ public boolean hasStartPoint()
+ {
+ return mStartPoint != null;
+ }
+
+ public boolean hasEndPoint()
+ {
+ return mEndPoint != null;
+ }
+
@Nullable
RoutingInfo getCachedRoutingInfo()
{
@@ -803,6 +813,8 @@ public class RoutingController
setPointsInternal();
checkAndBuildRoute();
+ if (mContainer != null)
+ mContainer.updateMenu();
}
public void setRouterType(@Framework.RouterType int router)
diff --git a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
index 395fa3f66d..6f745e5b2c 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingPlanController.java
@@ -3,58 +3,36 @@ package com.mapswithme.maps.routing;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
-import android.graphics.Bitmap;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.location.Location;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.view.View;
import android.view.ViewGroup;
-import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
-import android.widget.TextView;
import com.mapswithme.maps.Framework;
-import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
-import com.mapswithme.maps.bookmarks.data.MapObject;
-import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.uber.Uber;
-import com.mapswithme.maps.uber.UberAdapter;
import com.mapswithme.maps.uber.UberInfo;
-import com.mapswithme.maps.uber.UberLinks;
-import com.mapswithme.maps.widget.DotPager;
import com.mapswithme.maps.widget.RotateDrawable;
import com.mapswithme.maps.widget.RoutingToolbarButton;
import com.mapswithme.maps.widget.ToolbarController;
import com.mapswithme.maps.widget.WheelProgressView;
-import com.mapswithme.util.Graphics;
import com.mapswithme.util.UiUtils;
-import com.mapswithme.util.Utils;
import com.mapswithme.util.statistics.AlohaHelper;
import com.mapswithme.util.statistics.Statistics;
-import java.util.List;
-import java.util.Locale;
-
public class RoutingPlanController extends ToolbarController implements SlotFrame.SlotClickListener
{
static final int ANIM_TOGGLE = MwmApplication.get().getResources().getInteger(R.integer.anim_slots_toggle);
- private static final String STATE_ALTITUDE_CHART_SHOWN = "altitude_chart_shown";
- private static final String STATE_TAXI_INFO = "taxi_info";
-
protected final View mFrame;
private final ImageView mToggle;
@@ -65,18 +43,13 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
private final WheelProgressView mProgressBicycle;
private final WheelProgressView mProgressTaxi;
- private final View mAltitudeChartFrame;
- private final View mUberFrame;
+ @NonNull
+ private final RoutingBottomMenuController mRoutingBottomMenuController;
private final RotateDrawable mToggleImage = new RotateDrawable(R.drawable.ic_down);
int mFrameHeight;
private int mToolbarHeight;
private boolean mOpen;
- @Nullable
- private UberInfo mUberInfo;
-
- @Nullable
- private UberInfo.Product mUberProduct;
@Nullable
private OnToggleListener mToggleListener;
@@ -178,11 +151,7 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
mProgressBicycle = (WheelProgressView) progressFrame.findViewById(R.id.progress_bicycle);
mProgressTaxi = (WheelProgressView) progressFrame.findViewById(R.id.progress_taxi);
- mAltitudeChartFrame = getViewById(R.id.altitude_chart_panel);
- UiUtils.hide(mAltitudeChartFrame);
-
- mUberFrame = getViewById(R.id.uber_panel);
- UiUtils.hide(mUberFrame);
+ mRoutingBottomMenuController = RoutingBottomMenuController.newInstance(mActivity, mFrame);
mToggle.setImageDrawable(mToggleImage);
mToggle.setOnClickListener(new View.OnClickListener()
@@ -258,58 +227,15 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
if (!ready)
{
- hideAltitudeChartAndRoutingDetails();
+ mRoutingBottomMenuController.hideAltitudeChartAndRoutingDetails();
return;
}
if (!isTaxiRouterType())
- setStartButton();
- showAltitudeChartAndRoutingDetails();
- }
-
- private void showAltitudeChartAndRoutingDetails()
- {
- if (isTaxiRouterType())
- return;
-
- UiUtils.hide(getViewById(R.id.error));
- UiUtils.hide(mUberFrame);
-
- showRouteAltitudeChart();
- showRoutingDetails();
- UiUtils.show(mAltitudeChartFrame);
- }
-
- private void showRoutingDetails()
- {
- final View numbersFrame = mAltitudeChartFrame.findViewById(R.id.numbers);
- final RoutingInfo rinfo = RoutingController.get().getCachedRoutingInfo();
- if (rinfo == null)
{
- UiUtils.hide(numbersFrame);
- return;
+ mRoutingBottomMenuController.setStartButton();
+ mRoutingBottomMenuController.showAltitudeChartAndRoutingDetails();
}
-
- TextView numbersTime = (TextView) numbersFrame.findViewById(R.id.time);
- TextView numbersDistance = (TextView) numbersFrame.findViewById(R.id.distance);
- TextView numbersArrival = (TextView) numbersFrame.findViewById(R.id.arrival);
- numbersTime.setText(RoutingController.formatRoutingTime(mFrame.getContext(), rinfo.totalTimeInSeconds,
- R.dimen.text_size_routing_number));
- numbersDistance.setText(rinfo.distToTarget + " " + rinfo.targetUnits);
-
- if (numbersArrival != null)
- {
- String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds);
- numbersArrival.setText(arrivalTime);
- }
- }
-
- private void hideAltitudeChartAndRoutingDetails()
- {
- if (UiUtils.isHidden(mAltitudeChartFrame))
- return;
-
- UiUtils.hide(mAltitudeChartFrame);
}
public void updateBuildProgress(int progress, @Framework.RouterType int router)
@@ -433,11 +359,6 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
}
}
- private boolean isVehicleRouterType()
- {
- return RoutingController.get().isVehicleRouterType();
- }
-
private boolean isTaxiRouterType()
{
return RoutingController.get().isTaxiRouterType();
@@ -454,68 +375,9 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
return mOpen;
}
- public void showRouteAltitudeChart()
- {
- ImageView altitudeChart = (ImageView) mFrame.findViewById(R.id.altitude_chart);
- TextView altitudeDifference = (TextView) mAltitudeChartFrame.findViewById(R.id.altitude_difference);
- showRouteAltitudeChartInternal(altitudeChart, altitudeDifference);
- }
-
- void showRouteAltitudeChartInternal(@NonNull ImageView altitudeChart,
- @NonNull TextView altitudeDifference)
- {
- if (isVehicleRouterType())
- {
- UiUtils.hide(altitudeChart);
- UiUtils.hide(altitudeDifference);
- return;
- }
-
- int chartWidth = UiUtils.dimen(mActivity, R.dimen.altitude_chart_image_width);
- int chartHeight = UiUtils.dimen(mActivity, R.dimen.altitude_chart_image_height);
- Framework.RouteAltitudeLimits limits = new Framework.RouteAltitudeLimits();
- Bitmap bm = Framework.generateRouteAltitudeChart(chartWidth, chartHeight, limits);
- if (bm != null)
- {
- altitudeChart.setImageBitmap(bm);
- UiUtils.show(altitudeChart);
- String meter = altitudeDifference.getResources().getString(R.string.meter);
- String foot = altitudeDifference.getResources().getString(R.string.foot);
- altitudeDifference.setText(String.format(Locale.getDefault(), "%d %s",
- limits.maxRouteAltitude - limits.minRouteAltitude,
- limits.isMetricUnits ? meter : foot));
- Drawable icon = ContextCompat.getDrawable(altitudeDifference.getContext(),
- R.drawable.ic_altitude_difference);
- int colorAccent = ContextCompat.getColor(altitudeDifference.getContext(),
- UiUtils.getStyledResourceId(altitudeDifference.getContext(), R.attr.colorAccent));
- altitudeDifference.setCompoundDrawablesWithIntrinsicBounds(Graphics.tint(icon,colorAccent),
- null, null, null);
- UiUtils.show(altitudeDifference);
- }
- }
-
public void showUberInfo(@NonNull UberInfo info)
{
- UiUtils.hide(getViewById(R.id.error), mAltitudeChartFrame);
-
- final List products = info.getProducts();
- mUberInfo = info;
- mUberProduct = products.get(0);
- final PagerAdapter adapter = new UberAdapter(mActivity, products);
- DotPager pager = new DotPager.Builder(mActivity, (ViewPager) mUberFrame.findViewById(R.id.pager), adapter)
- .setIndicatorContainer((ViewGroup) mUberFrame.findViewById(R.id.indicator))
- .setPageChangedListener(new DotPager.OnPageChangedListener()
- {
- @Override
- public void onPageChanged(int position)
- {
- mUberProduct = products.get(position);
- }
- }).build();
- pager.show();
-
- setStartButton();
- UiUtils.show(mUberFrame);
+ mRoutingBottomMenuController.showUberInfo(info);
}
public void showUberError(@NonNull Uber.ErrorCode code)
@@ -544,100 +406,22 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
private void showError(@StringRes int message)
{
- UiUtils.hide(mUberFrame, mAltitudeChartFrame);
- TextView error = (TextView) getViewById(R.id.error);
- error.setText(message);
- error.setVisibility(View.VISIBLE);
- showStartButton(false);
+ mRoutingBottomMenuController.showError(message);
}
void showStartButton(boolean show)
{
- if (show)
- UiUtils.show(getViewById(R.id.start));
- else
- UiUtils.hide(getViewById(R.id.start));
- }
-
- @NonNull
- private View getViewById(@IdRes int resourceId)
- {
- View view = mFrame.findViewById(resourceId);
- if (view == null)
- view = mActivity.findViewById(resourceId);
- return view;
+ mRoutingBottomMenuController.showStartButton(show);
}
void saveRoutingPanelState(@NonNull Bundle outState)
{
- outState.putBoolean(STATE_ALTITUDE_CHART_SHOWN, UiUtils.isVisible(mAltitudeChartFrame));
- outState.putParcelable(STATE_TAXI_INFO, mUberInfo);
+ mRoutingBottomMenuController.saveRoutingPanelState(outState);
}
void restoreRoutingPanelState(@NonNull Bundle state)
{
- if (state.getBoolean(STATE_ALTITUDE_CHART_SHOWN))
- showRouteAltitudeChart();
-
- UberInfo info = state.getParcelable(STATE_TAXI_INFO);
- if (info != null)
- showUberInfo(info);
- }
-
- private void setStartButton()
- {
- Button start = (Button) getViewById(R.id.start);
-
- if (isTaxiRouterType())
- {
- final boolean isUberInstalled = Utils.isUberInstalled(mActivity);
- start.setText(isUberInstalled ? R.string.taxi_order : R.string.install_app);
- start.setOnClickListener(new View.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- if (mUberProduct != null)
- {
- UberLinks links = RoutingController.get().getUberLink(mUberProduct.getProductId());
- if (links != null)
- {
- Utils.launchUber(mActivity, links);
- trackUberStatistics(isUberInstalled);
- }
- }
- }
- });
- } else
- {
- start.setText(mActivity.getText(R.string.p2p_start));
- start.setOnClickListener(new View.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- ((MwmActivity)mActivity).closeMenu(Statistics.EventName.ROUTING_START, AlohaHelper.ROUTING_START, new Runnable()
- {
- @Override
- public void run()
- {
- RoutingController.get().start();
- }
- });
- }
- });
- }
-
- UiUtils.updateAccentButton(start);
- showStartButton(true);
- }
-
- private static void trackUberStatistics(boolean isUberInstalled)
- {
- MapObject from = RoutingController.get().getStartPoint();
- MapObject to = RoutingController.get().getEndPoint();
- Location location = LocationHelper.INSTANCE.getLastKnownLocation();
- Statistics.INSTANCE.trackUber(from, to, location, isUberInstalled);
+ mRoutingBottomMenuController.restoreRoutingPanelState(state);
}
public int getHeight()
@@ -649,4 +433,19 @@ public class RoutingPlanController extends ToolbarController implements SlotFram
{
mToggleListener = listener;
}
+
+ public void showAddStartFrame()
+ {
+ mRoutingBottomMenuController.showAddStartFrame();
+ }
+
+ public void showAddFinishFrame()
+ {
+ mRoutingBottomMenuController.showAddFinishFrame();
+ }
+
+ public void hideActionFrame()
+ {
+ mRoutingBottomMenuController.hideActionFrame();
+ }
}
diff --git a/android/src/com/mapswithme/maps/routing/RoutingPlanFragment.java b/android/src/com/mapswithme/maps/routing/RoutingPlanFragment.java
index 7ef06fef5b..cc40a6de85 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingPlanFragment.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingPlanFragment.java
@@ -77,4 +77,19 @@ public class RoutingPlanFragment extends BaseMwmFragment
{
mPlanController.saveRoutingPanelState(outState);
}
+
+ public void showAddStartFrame()
+ {
+ mPlanController.showAddStartFrame();
+ }
+
+ public void showAddFinishFrame()
+ {
+ mPlanController.showAddFinishFrame();
+ }
+
+ public void hideActionFrame()
+ {
+ mPlanController.hideActionFrame();
+ }
}
diff --git a/android/src/com/mapswithme/maps/routing/RoutingPlanInplaceController.java b/android/src/com/mapswithme/maps/routing/RoutingPlanInplaceController.java
index 6d63834e87..b53da103bf 100644
--- a/android/src/com/mapswithme/maps/routing/RoutingPlanInplaceController.java
+++ b/android/src/com/mapswithme/maps/routing/RoutingPlanInplaceController.java
@@ -5,8 +5,6 @@ import android.animation.ValueAnimator;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.widget.ImageView;
-import android.widget.TextView;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
@@ -71,14 +69,6 @@ public class RoutingPlanInplaceController extends RoutingPlanController
restoreRoutingPanelState(state);
}
- @Override
- public void showRouteAltitudeChart()
- {
- ImageView altitudeChart = (ImageView) mActivity.findViewById(R.id.altitude_chart);
- TextView altitudeDifference = (TextView) mActivity.findViewById(R.id.altitude_difference);
- showRouteAltitudeChartInternal(altitudeChart, altitudeDifference);
- }
-
private void animateFrame(final boolean show, final @Nullable Runnable completion)
{
if (!checkFrameHeight())
diff --git a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
index 6206edd0fa..97bef97754 100644
--- a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
index 16f0511957..55c23b7cab 100644
--- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
index 99d80f4409..5608dccc7f 100644
--- a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
index 0e5512804c..0b7ed2ee49 100644
--- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
index c907268d9c..4bd2b7a605 100644
--- a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
index 96b6434836..66774df201 100644
--- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
index 38c130064f..cb45874ff1 100644
--- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
index 6d3f9de2de..87fd0d9ce1 100644
--- a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
index 819d0b8f2c..a47a854a9d 100644
--- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
index 871a2519ef..ad34c11052 100644
--- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
index d7f5a54657..9508e95aa9 100644
--- a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
index 9837380e52..6fbdc68900 100644
--- a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
index 7b98ba870e..7283be78db 100644
--- a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
index 21357e4160..56b6bb95a5 100644
--- a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
index 3701f3187d..06b9c3e4e4 100644
--- a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
index 5a2c5f5cfb..6089924425 100644
--- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
index d4c9d47473..96382d0ccd 100644
--- a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
index af6cce9e5c..96db5ce69e 100644
--- a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
index f85654942d..7568428689 100644
--- a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
index 2d9797e781..b5fbc714be 100644
--- a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
index 777b0874f6..7aa6b87ab2 100644
--- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Узнать больше";
"exit" = "Выход";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
index ec1721591a..3d5b07ced9 100644
--- a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
index e634ada139..f32d1a2135 100644
--- a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
index 728a9694f9..3488e4b3bb 100644
--- a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
index 20686a6640..1d1b019c43 100644
--- a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
index 88ca67b4f9..7678b3de05 100644
--- a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
index c80c6a34ae..49181b1f4f 100644
--- a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
index 47069d1c69..a601fd2bb0 100644
--- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
index d0fc269228..e9d2444dd6 100644
--- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
@@ -1936,3 +1936,9 @@
"learn_more" = "Learn more";
"exit" = "Exit";
+
+"routing_add_start_point" = "Add start point to plan a route.";
+
+"routing_add_finish_point" = "Add finish to plan a route.";
+
+"use" = "Use";
diff --git a/strings.txt b/strings.txt
index 9c5d4d9764..e07f7d53a2 100644
--- a/strings.txt
+++ b/strings.txt
@@ -24569,3 +24569,12 @@
[exit]
en = Exit
ru = Выход
+
+ [routing_add_start_point]
+ en = Add start point to plan a route.
+
+ [routing_add_finish_point]
+ en = Add finish to plan a route.
+
+ [use]
+ en = Use