Added pedestrian route proposal card
This commit is contained in:
parent
ae0c12902c
commit
ea63ffcf4f
5 changed files with 196 additions and 4 deletions
108
OsmAnd/res/layout/route_ped_info.xml
Normal file
108
OsmAnd/res/layout/route_ped_info.xml
Normal file
|
@ -0,0 +1,108 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/route_info_details_card"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/card_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<include layout="@layout/list_item_divider" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/top_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?attr/divider_color_basic"
|
||||
android:focusable="false" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/card_and_list_background_basic"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/list_content_padding"
|
||||
android:layout_marginLeft="@dimen/list_content_padding"
|
||||
android:layout_marginTop="@dimen/context_menu_padding_margin_large"
|
||||
android:layout_marginEnd="@dimen/favorites_icon_right_margin"
|
||||
android:layout_marginRight="@dimen/favorites_icon_right_margin"
|
||||
android:src="@drawable/ic_action_pedestrian_dark"
|
||||
android:tint="@color/description_font_and_bottom_sheet_icons" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/context_menu_padding_margin_large"
|
||||
android:layout_marginEnd="@dimen/route_info_settings_buttons_height"
|
||||
android:layout_marginRight="@dimen/route_info_settings_buttons_height"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/content_padding"
|
||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||
android:textColor="@color/description_font_and_bottom_sheet_icons"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:ignore="UnusedAttribute"
|
||||
tools:text="@string/public_transport_ped_route_title" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/route_info_buttons_height"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="@dimen/route_info_buttons_padding_top_bottom"
|
||||
android:layout_marginTop="@dimen/route_info_details_padding"
|
||||
android:layout_marginRight="@dimen/route_info_buttons_padding_top_bottom"
|
||||
android:layout_marginBottom="@dimen/route_info_details_padding"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/button_descr"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center"
|
||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||
android:maxLines="1"
|
||||
android:text="@string/public_transport_calc_pedestrian"
|
||||
android:textColor="?attr/active_color_basic"
|
||||
android:textSize="@dimen/text_button_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium"
|
||||
tools:ignore="UnusedAttribute" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/shadow"
|
||||
layout="@layout/card_bottom_divider"
|
||||
android:visibility="visible" />
|
||||
|
||||
</LinearLayout>
|
|
@ -11,6 +11,7 @@
|
|||
Thx - Hardy
|
||||
|
||||
-->
|
||||
<string name="public_transport_ped_route_title">The route by foot is approximately %1$s and it could be faster than by public transport</string>
|
||||
<string name="public_transport_no_route_title">Unfortunately, OsmAnd could not find a route suitable for your settings.</string>
|
||||
<string name="public_transport_try_ped">Try the pedestrian navigation.</string>
|
||||
<string name="public_transport_try_change_settings">Try changing the settings.</string>
|
||||
|
|
|
@ -73,6 +73,7 @@ import net.osmand.plus.routepreparationmenu.cards.HistoryCard;
|
|||
import net.osmand.plus.routepreparationmenu.cards.HomeWorkCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.LongDistanceWarningCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.MapMarkersCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.PedestrianRouteCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.PreviousRouteCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.PublicTransportBetaWarningCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard;
|
||||
|
@ -90,6 +91,7 @@ import net.osmand.router.GeneralRouter.RoutingParameter;
|
|||
import net.osmand.router.TransportRoutePlanner.TransportRouteResult;
|
||||
import net.osmand.search.SearchUICore.SearchResultCollection;
|
||||
import net.osmand.search.core.SearchResult;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
@ -106,6 +108,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
|
||||
private static final int BUTTON_ANIMATION_DELAY = 2000;
|
||||
public static final int DEFAULT_MENU_STATE = 0;
|
||||
private static final int MAX_PEDESTRIAN_ROUTE_DURATION = 30 * 60;
|
||||
|
||||
public static int directionInfo = -1;
|
||||
public static boolean chooseRoutesVisible = false;
|
||||
|
@ -507,14 +510,28 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
|
||||
List<TransportRouteResult> routes = transportRoutingHelper.getRoutes();
|
||||
if (routes != null && routes.size() > 0) {
|
||||
TransportRouteResult route = routes.get(0);
|
||||
int walkTimeReal = transportRoutingHelper.getWalkingTime(route.getSegments());
|
||||
int walkTimePT = (int) route.getWalkTime();
|
||||
int walkTime = walkTimeReal > 0 ? walkTimeReal : walkTimePT;
|
||||
int travelTime = (int) route.getTravelTime() + walkTime;
|
||||
LatLon startLocation = transportRoutingHelper.getStartLocation();
|
||||
LatLon endLocation = transportRoutingHelper.getEndLocation();
|
||||
int approxPedestrianTime = (int) MapUtils.getDistance(startLocation, endLocation);
|
||||
boolean showPedestrianCard = approxPedestrianTime < travelTime + 60 && approxPedestrianTime < MAX_PEDESTRIAN_ROUTE_DURATION;
|
||||
for (int i = 0; i < routes.size(); i++) {
|
||||
PublicTransportCard card = new PublicTransportCard(mapActivity, transportRoutingHelper.getStartLocation(),
|
||||
transportRoutingHelper.getEndLocation(), routes.get(i), i);
|
||||
card.setShowBottomShadow(i == routes.size() - 1);
|
||||
route = routes.get(i);
|
||||
PublicTransportCard card = new PublicTransportCard(mapActivity, startLocation, endLocation, route, i);
|
||||
card.setShowBottomShadow(i == routes.size() - 1 && !showPedestrianCard);
|
||||
card.setShowTopShadow(i != 0);
|
||||
card.setListener(this);
|
||||
menuCards.add(card);
|
||||
}
|
||||
if (showPedestrianCard) {
|
||||
PedestrianRouteCard pedestrianRouteCard = new PedestrianRouteCard(mapActivity, approxPedestrianTime);
|
||||
pedestrianRouteCard.setListener(this);
|
||||
menuCards.add(pedestrianRouteCard);
|
||||
}
|
||||
bottomShadowVisible = routes.size() == 0;
|
||||
} else {
|
||||
RouteMenuAppModes mode = app.getRoutingOptionsHelper().modes.get(routingHelper.getAppMode());
|
||||
|
@ -659,6 +676,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
} else if (card instanceof PublicTransportNotFoundSettingsWarningCard) {
|
||||
AvoidRoadsBottomSheetDialogFragment avoidRoadsFragment = new AvoidRoadsBottomSheetDialogFragment(true);
|
||||
avoidRoadsFragment.show(mapActivity.getSupportFragmentManager(), AvoidRoadsBottomSheetDialogFragment.TAG);
|
||||
} else if (card instanceof PedestrianRouteCard) {
|
||||
updateApplicationMode(null, ApplicationMode.PEDESTRIAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,7 +35,6 @@ import com.github.mikephil.charting.charts.LineChart;
|
|||
import com.github.mikephil.charting.data.Entry;
|
||||
import com.github.mikephil.charting.highlight.Highlight;
|
||||
import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider;
|
||||
import com.github.mikephil.charting.listener.ChartTouchListener;
|
||||
import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture;
|
||||
import com.github.mikephil.charting.renderer.HorizontalBarChartRenderer;
|
||||
import com.github.mikephil.charting.utils.ViewPortHandler;
|
||||
|
@ -214,6 +213,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT
|
|||
mapActivity.findViewById(R.id.bottom_controls_container).setVisibility(View.VISIBLE);
|
||||
if (routeDetailsMenu != null) {
|
||||
routeDetailsMenu.setMapActivity(null);
|
||||
mapActivity.getMapLayers().getMapInfoLayer().setTrackChartPoints(null);
|
||||
}
|
||||
}
|
||||
super.onPause();
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
package net.osmand.plus.routepreparationmenu.cards;
|
||||
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
|
||||
public class PedestrianRouteCard extends BaseCard {
|
||||
|
||||
private int approxPedestrianTime;
|
||||
|
||||
public PedestrianRouteCard(@NonNull MapActivity mapActivity, int approxPedestrianTime) {
|
||||
super(mapActivity);
|
||||
this.approxPedestrianTime = approxPedestrianTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCardLayoutId() {
|
||||
return R.layout.route_ped_info;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateContent() {
|
||||
TextView titleView = (TextView) view.findViewById(R.id.title);
|
||||
String text = app.getString(R.string.public_transport_ped_route_title);
|
||||
String formattedDuration = OsmAndFormatter.getFormattedDuration(approxPedestrianTime, app);
|
||||
int start = text.indexOf("%1$s");
|
||||
int end = start + formattedDuration.length();
|
||||
text = text.replace("%1$s", formattedDuration);
|
||||
SpannableString spannable = new SpannableString(text);
|
||||
spannable.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
titleView.setText(spannable);
|
||||
|
||||
FrameLayout button = view.findViewById(R.id.button);
|
||||
View buttonDescr = view.findViewById(R.id.button_descr);
|
||||
button.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CardListener listener = getListener();
|
||||
if (listener != null) {
|
||||
listener.onCardButtonPressed(PedestrianRouteCard.this, 0);
|
||||
}
|
||||
}
|
||||
});
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
|
||||
AndroidUtils.setBackground(app, button, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark);
|
||||
AndroidUtils.setBackground(app, buttonDescr, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark);
|
||||
} else {
|
||||
AndroidUtils.setBackground(app, buttonDescr, nightMode, R.drawable.btn_border_trans_light, R.drawable.btn_border_trans_dark);
|
||||
}
|
||||
view.findViewById(R.id.card_divider).setVisibility(View.VISIBLE);
|
||||
view.findViewById(R.id.top_divider).setVisibility(View.GONE);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue