Merge branch 'r3.3' of github.com:osmandapp/Osmand into r3.3
This commit is contained in:
commit
a0b6e40c1f
7 changed files with 187 additions and 108 deletions
|
@ -495,7 +495,11 @@ public class TransportRoutePlanner {
|
|||
public double getWalkTime() {
|
||||
return getWalkDist() / cfg.walkSpeed;
|
||||
}
|
||||
|
||||
|
||||
public double getChangeTime() {
|
||||
return cfg.getChangeTime();
|
||||
}
|
||||
|
||||
public int getChanges() {
|
||||
return segments.size() - 1;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
- For wording and consistency, please note https://osmand.net/help-online?id=technical-articles#Creating_a_Consistent_User_Experience
|
||||
Thx - Hardy
|
||||
|
||||
-->
|
||||
--> <string name="save_poi_value_exceed_length">Value of tag \"%s\" cannot exceed 255 chars. \nPlease edit it before continue.</string>
|
||||
<string name="save_poi_value_exceed_length_title">Length of \"%s\" value</string>
|
||||
<string name="public_transport_warning_descr_blog">Learn more about how OsmAnd calculates routes in our blog.</string>
|
||||
<string name="public_transport_warning_title">Public transport navigation is currently in beta testing, errors and inaccuracies may occur.</string>
|
||||
<string name="add_intermediate">Add intermediate point</string>
|
||||
|
|
|
@ -60,6 +60,12 @@ public class OsmAndFormatter {
|
|||
return hours + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (sec < 10 ? "0" + sec : sec);
|
||||
}
|
||||
|
||||
public static String getFormattedDurationShortMinutes(int seconds) {
|
||||
int hours = seconds / (60 * 60);
|
||||
int minutes = (seconds / 60) % 60;
|
||||
return hours + ":" + (minutes < 10 ? "0" + minutes : minutes);
|
||||
}
|
||||
|
||||
public static String getFormattedTime(long seconds, boolean useCurrentTime) {
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
if (useCurrentTime) {
|
||||
|
|
|
@ -3,6 +3,7 @@ package net.osmand.plus.osmedit;
|
|||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
|
@ -108,7 +109,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
|
|||
private View view;
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
public void onAttach(Context activity) {
|
||||
super.onAttach(activity);
|
||||
OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class);
|
||||
if (getSettings().OFFLINE_EDITION.get()
|
||||
|
@ -400,7 +401,14 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
|
|||
}
|
||||
|
||||
private void trySave() {
|
||||
if (TextUtils.isEmpty(poiTypeEditText.getText())) {
|
||||
String tagWithExceedingValue = isTextLengthInRange();
|
||||
if (!Algorithms.isEmpty(tagWithExceedingValue)){
|
||||
ValueExceedLimitDialogFragment f = new ValueExceedLimitDialogFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putString("tag", tagWithExceedingValue);
|
||||
f.setArguments(args);
|
||||
f.show(getChildFragmentManager(), "exceedDialog");
|
||||
} else if (TextUtils.isEmpty(poiTypeEditText.getText())) {
|
||||
HashSet<String> tagsCopy = new HashSet<>();
|
||||
tagsCopy.addAll(editPoiData.getTagValues().keySet());
|
||||
if (Algorithms.isEmpty(editPoiData.getTag(OSMSettings.OSMTagKey.ADDR_HOUSE_NUMBER.getValue()))) {
|
||||
|
@ -422,12 +430,22 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
|
|||
} else if (editPoiData.getPoiCategory() == getMyApplication().getPoiTypes().getOtherPoiCategory()) {
|
||||
poiTypeEditText.setError(getResources().getString(R.string.please_specify_poi_type));
|
||||
} else if (editPoiData.getPoiTypeDefined() == null) {
|
||||
poiTypeEditText.setError(getResources().getString(R.string.please_specify_poi_type_only_from_list));
|
||||
poiTypeEditText.setError(
|
||||
getResources().getString(R.string.please_specify_poi_type_only_from_list));
|
||||
} else {
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
private String isTextLengthInRange() {
|
||||
for (String s: editPoiData.getChangedTags()) {
|
||||
if (editPoiData.getTag(s).length() > 255) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private boolean testTooManyCapitalLetters(String name) {
|
||||
if(name == null) {
|
||||
return false;
|
||||
|
@ -889,6 +907,23 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
|
|||
}
|
||||
}
|
||||
|
||||
public static class ValueExceedLimitDialogFragment extends DialogFragment {
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
String msg = getString(R.string.save_poi_value_exceed_length);
|
||||
String fieldTag = getArguments().getString("tag", "");
|
||||
if(!Algorithms.isEmpty(fieldTag)) {
|
||||
msg = String.format(msg, fieldTag);
|
||||
}
|
||||
builder.setTitle(String.format(getResources().getString(R.string.save_poi_value_exceed_length_title), fieldTag))
|
||||
.setMessage(msg)
|
||||
.setNegativeButton(R.string.shared_string_ok, null);
|
||||
return builder.create();
|
||||
}
|
||||
}
|
||||
|
||||
private TextView.OnEditorActionListener mOnEditorActionListener =
|
||||
new TextView.OnEditorActionListener() {
|
||||
@Override
|
||||
|
|
|
@ -607,7 +607,8 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
!nightMode ? R.color.ctx_menu_collapse_icon_color_light : R.color.ctx_menu_collapse_icon_color_dark);
|
||||
}
|
||||
|
||||
private void buildSegmentItem(View view, final TransportRouteResultSegment segment, long startTime) {
|
||||
private void buildSegmentItem(View view, final TransportRouteResultSegment segment,
|
||||
final TransportRouteResultSegment nextSegment, int[] startTime, double walkSpeed, double changeTime) {
|
||||
TransportRoute transportRoute = segment.route;
|
||||
List<TransportStop> stops = segment.getTravelStops();
|
||||
final TransportStop startStop = stops.get(0);
|
||||
|
@ -632,7 +633,7 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
Drawable icon = getContentIcon(drawableResId);
|
||||
|
||||
Typeface typeface = FontCache.getRobotoMedium(app);
|
||||
String timeText = OsmAndFormatter.getFormattedTime(startTime, false);
|
||||
String timeText = OsmAndFormatter.getFormattedDurationShortMinutes(startTime[0]);
|
||||
|
||||
SpannableString secondaryText = new SpannableString(getString(R.string.sit_on_the_stop));
|
||||
secondaryText.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)), 0, secondaryText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
@ -695,11 +696,13 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
buildCollapsableRow(stopsContainer, spannable, textType, true, collapsableView, null);
|
||||
|
||||
final TransportStop endStop = stops.get(stops.size() - 1);
|
||||
long depTime = segment.depTime + arrivalTime;
|
||||
int depTime = segment.depTime + arrivalTime;
|
||||
if (depTime <= 0) {
|
||||
depTime = startTime + arrivalTime;
|
||||
depTime = startTime[0] + arrivalTime;
|
||||
}
|
||||
String textTime = OsmAndFormatter.getFormattedTime(depTime, false);
|
||||
// TODO: fix later for schedule
|
||||
startTime[0] += (int) segment.travelTime + (nextSegment != null ? changeTime / 2 : 0);
|
||||
String textTime = OsmAndFormatter.getFormattedDurationShortMinutes(startTime[0]);
|
||||
|
||||
secondaryText = new SpannableString(getString(R.string.exit_at));
|
||||
secondaryText.setSpan(new CustomTypefaceSpan(typeface), 0, secondaryText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
@ -719,6 +722,33 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
});
|
||||
|
||||
((ViewGroup) view).addView(baseContainer);
|
||||
|
||||
if (nextSegment != null) {
|
||||
double walkDist = (long) getWalkDistance(segment, nextSegment, segment.walkDist);
|
||||
if (walkDist > 0) {
|
||||
int walkTime = (int) getWalkTime(segment, nextSegment, walkDist, walkSpeed);
|
||||
if (walkTime < 60) {
|
||||
walkTime = 60;
|
||||
}
|
||||
spannable = new SpannableStringBuilder("~");
|
||||
spannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
startIndex = spannable.length();
|
||||
spannable.append(OsmAndFormatter.getFormattedDuration(walkTime, app)).append(" ");
|
||||
spannable.setSpan(new CustomTypefaceSpan(typeface), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
startIndex = spannable.length();
|
||||
spannable.append(getString(R.string.on_foot)).append(", ").append(OsmAndFormatter.getFormattedDistance((float) walkDist, app));
|
||||
spannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
buildRowDivider(view, true);
|
||||
buildWalkRow(view, spannable, null, new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
showWalkingRouteOnMap(segment, nextSegment);
|
||||
}
|
||||
});
|
||||
startTime[0] += walkTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private View createImagesContainer() {
|
||||
|
@ -739,93 +769,29 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
}
|
||||
|
||||
private void buildTransportRouteRow(ViewGroup parent, TransportRouteResult routeResult, boolean showDivider) {
|
||||
Typeface typeface = FontCache.getRobotoMedium(app);
|
||||
TargetPointsHelper targetPointsHelper = app.getTargetPointsHelper();
|
||||
TargetPoint startPoint = targetPointsHelper.getPointToStart();
|
||||
TargetPoint endPoint = targetPointsHelper.getPointToNavigate();
|
||||
long startTime = System.currentTimeMillis() / 1000;
|
||||
|
||||
int[] startTime = { 0 };
|
||||
List<TransportRouteResultSegment> segments = routeResult.getSegments();
|
||||
boolean previousWalkItemUsed = false;
|
||||
|
||||
for (int i = 0; i < segments.size(); i++) {
|
||||
boolean first = i == 0;
|
||||
boolean last = i == segments.size() - 1;
|
||||
final TransportRouteResultSegment segment = segments.get(i);
|
||||
final TransportRouteResultSegment nextSegment = segments.size() > i + 1 ? segments.get(i + 1) : null;
|
||||
long walkTime = (long) getWalkTime(segment.walkDist, routeResult.getWalkSpeed());
|
||||
if (walkTime < 60) {
|
||||
walkTime = 60;
|
||||
}
|
||||
if (i == 0) {
|
||||
if (first) {
|
||||
buildStartItem(parent, startPoint, startTime, segment, routeResult.getWalkSpeed());
|
||||
startTime += walkTime;
|
||||
} else if (segment.walkDist > 0 && !previousWalkItemUsed) {
|
||||
SpannableStringBuilder spannable = new SpannableStringBuilder("~");
|
||||
int startIndex = spannable.length();
|
||||
spannable.append(OsmAndFormatter.getFormattedDuration((int) walkTime, app)).append(" ");
|
||||
spannable.setSpan(new CustomTypefaceSpan(typeface), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
spannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
spannable.append(getString(R.string.on_foot)).append(" ").append(", ").append(OsmAndFormatter.getFormattedDistance((float) segment.walkDist, app));
|
||||
|
||||
buildWalkRow(parent, spannable, null, new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
showWalkingRouteOnMap(segment, nextSegment);
|
||||
}
|
||||
});
|
||||
buildRowDivider(parent, true);
|
||||
startTime += walkTime;
|
||||
}
|
||||
|
||||
buildSegmentItem(parent, segment, startTime);
|
||||
|
||||
double finishWalkDist = routeResult.getFinishWalkDist();
|
||||
if (i == segments.size() - 1) {
|
||||
buildSegmentItem(parent, segment, !last ? segments.get(i + 1) : null, startTime, routeResult.getWalkSpeed(), routeResult.getChangeTime());
|
||||
if (last) {
|
||||
buildDestinationItem(parent, endPoint, startTime, segment, routeResult.getWalkSpeed());
|
||||
} else if (finishWalkDist > 0) {
|
||||
walkTime = (long) getWalkTime(finishWalkDist, routeResult.getWalkSpeed());
|
||||
startTime += walkTime;
|
||||
if (nextSegment != null) {
|
||||
if (nextSegment.walkDist > 0) {
|
||||
finishWalkDist += nextSegment.walkDist;
|
||||
walkTime += getWalkTime(nextSegment.walkDist, routeResult.getWalkSpeed());
|
||||
previousWalkItemUsed = true;
|
||||
} else {
|
||||
previousWalkItemUsed = false;
|
||||
}
|
||||
}
|
||||
buildRowDivider(parent, true);
|
||||
|
||||
Spannable title = getWalkTitle(finishWalkDist, walkTime);
|
||||
buildWalkRow(parent, title, null, new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
showWalkingRouteOnMap(segment, nextSegment);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (showDivider && i != segments.size() - 1) {
|
||||
if (showDivider && !last) {
|
||||
buildRowDivider(parent, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Spannable getWalkTitle(double finishWalkDist, double walkTime) {
|
||||
if (walkTime < 60) {
|
||||
walkTime = 60;
|
||||
}
|
||||
Typeface typeface = FontCache.getRobotoMedium(app);
|
||||
SpannableStringBuilder title = new SpannableStringBuilder("~");
|
||||
int startIndex = title.length();
|
||||
title.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
title.append(OsmAndFormatter.getFormattedDuration((int) walkTime, app)).append(" ");
|
||||
title.setSpan(new CustomTypefaceSpan(typeface), startIndex, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
startIndex = title.length();
|
||||
title.append(getString(R.string.on_foot)).append(", ").append(OsmAndFormatter.getFormattedDistance((float) finishWalkDist, app));
|
||||
title.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), startIndex, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
return title;
|
||||
}
|
||||
|
||||
private void buildStartItem(View view, final TargetPoint start, long startTime,
|
||||
private void buildStartItem(View view, final TargetPoint start, int[] startTime,
|
||||
final TransportRouteResultSegment segment, double walkSpeed) {
|
||||
FrameLayout baseItemView = new FrameLayout(view.getContext());
|
||||
|
||||
|
@ -843,7 +809,7 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
name = getString(R.string.shared_string_my_location);
|
||||
}
|
||||
Spannable startTitle = new SpannableString(name);
|
||||
String text = OsmAndFormatter.getFormattedTime(startTime, false);
|
||||
String text = OsmAndFormatter.getFormattedDurationShortMinutes(startTime[0]);
|
||||
|
||||
int drawableId = start == null ? R.drawable.ic_action_location_color : R.drawable.list_startpoint;
|
||||
Drawable icon = app.getUIUtilities().getIcon(drawableId);
|
||||
|
@ -857,17 +823,19 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
addWalkRouteIcon(imagesContainer);
|
||||
buildRowDivider(infoContainer, true);
|
||||
|
||||
long walkTime = (long) getWalkTime(segment.walkDist, walkSpeed);
|
||||
double walkDist = (long) getWalkDistance(null, segment, segment.walkDist);
|
||||
int walkTime = (int) getWalkTime(null, segment, walkDist, walkSpeed);
|
||||
if (walkTime < 60) {
|
||||
walkTime = 60;
|
||||
}
|
||||
startTime[0] += walkTime;
|
||||
SpannableStringBuilder title = new SpannableStringBuilder(Algorithms.capitalizeFirstLetter(getString(R.string.on_foot)));
|
||||
title.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
int startIndex = title.length();
|
||||
title.append(" ").append(OsmAndFormatter.getFormattedDuration((int) walkTime, app));
|
||||
title.append(" ").append(OsmAndFormatter.getFormattedDuration(walkTime, app));
|
||||
title.setSpan(new CustomTypefaceSpan(FontCache.getRobotoMedium(app)), startIndex, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
startIndex = title.length();
|
||||
title.append(", ").append(OsmAndFormatter.getFormattedDistance((float) segment.walkDist, app));
|
||||
title.append(", ").append(OsmAndFormatter.getFormattedDistance((float) walkDist, app));
|
||||
title.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), startIndex, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
buildWalkRow(infoContainer, title, imagesContainer, new OnClickListener() {
|
||||
|
@ -882,9 +850,9 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
}
|
||||
|
||||
public void showLocationOnMap(LatLon latLon) {
|
||||
OsmandSettings settings = app.getSettings();
|
||||
if (latLon == null) {
|
||||
latLon = settings.isLastKnownMapLocation() ? settings.getLastKnownMapLocation() : null;
|
||||
Location lastLocation = app.getLocationProvider().getLastKnownLocation();
|
||||
if (latLon == null && lastLocation != null) {
|
||||
latLon = new LatLon(lastLocation.getLatitude(), lastLocation.getLongitude());
|
||||
}
|
||||
if (latLon != null) {
|
||||
openMenuHeaderOnly();
|
||||
|
@ -934,7 +902,8 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
container.addView(walkLineImage);
|
||||
}
|
||||
|
||||
private void buildDestinationItem(View view, final TargetPoint destination, long startTime, final TransportRouteResultSegment segment, double walkSpeed) {
|
||||
private void buildDestinationItem(View view, final TargetPoint destination, int[] startTime,
|
||||
final TransportRouteResultSegment segment, double walkSpeed) {
|
||||
Typeface typeface = FontCache.getRobotoMedium(app);
|
||||
FrameLayout baseItemView = new FrameLayout(view.getContext());
|
||||
|
||||
|
@ -946,17 +915,18 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
|
||||
buildRowDivider(infoContainer, true);
|
||||
|
||||
long walkTime = (long) getWalkTime(segment.walkDist, walkSpeed);
|
||||
double walkDist = (long) getWalkDistance(segment, null, segment.walkDist);
|
||||
int walkTime = (int) getWalkTime(segment, null, walkDist, walkSpeed);
|
||||
if (walkTime < 60) {
|
||||
walkTime = 60;
|
||||
}
|
||||
SpannableStringBuilder spannable = new SpannableStringBuilder("~");
|
||||
spannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
int startIndex = spannable.length();
|
||||
spannable.append(OsmAndFormatter.getFormattedDuration((int) walkTime, app)).append(" ");
|
||||
spannable.append(OsmAndFormatter.getFormattedDuration(walkTime, app)).append(" ");
|
||||
spannable.setSpan(new CustomTypefaceSpan(typeface), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
startIndex = spannable.length();
|
||||
spannable.append(getString(R.string.on_foot)).append(", ").append(OsmAndFormatter.getFormattedDistance((float) segment.walkDist, app));
|
||||
spannable.append(getString(R.string.on_foot)).append(", ").append(OsmAndFormatter.getFormattedDistance((float) walkDist, app));
|
||||
spannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.secondary_text_dark : R.color.secondary_text_light)), startIndex, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
buildWalkRow(infoContainer, spannable, imagesContainer, new OnClickListener() {
|
||||
|
@ -968,7 +938,7 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
buildRowDivider(infoContainer, true);
|
||||
addWalkRouteIcon(imagesContainer);
|
||||
|
||||
String timeStr = OsmAndFormatter.getFormattedTime(startTime + walkTime, false);
|
||||
String timeStr = OsmAndFormatter.getFormattedDurationShortMinutes(startTime[0] + walkTime);
|
||||
String name = getRoutePointDescription(destination.point, destination.getOnlyName());
|
||||
SpannableString title = new SpannableString(name);
|
||||
title.setSpan(new CustomTypefaceSpan(typeface), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
@ -1650,8 +1620,22 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment implements P
|
|||
return "";
|
||||
}
|
||||
|
||||
private double getWalkTime(double walkDist, double walkSpeed) {
|
||||
return walkDist / walkSpeed;
|
||||
private double getWalkTime(@Nullable TransportRouteResultSegment segment,
|
||||
@Nullable TransportRouteResultSegment nextSegment, double walkDistPT, double walkSpeedPT) {
|
||||
RouteCalculationResult walkingRouteSegment = app.getTransportRoutingHelper().getWalkingRouteSegment(segment, nextSegment);
|
||||
if (walkingRouteSegment != null) {
|
||||
return walkingRouteSegment.getRoutingTime();
|
||||
}
|
||||
return walkDistPT / walkSpeedPT;
|
||||
}
|
||||
|
||||
private double getWalkDistance(@Nullable TransportRouteResultSegment segment,
|
||||
@Nullable TransportRouteResultSegment nextSegment, double walkDistPT) {
|
||||
RouteCalculationResult walkingRouteSegment = app.getTransportRoutingHelper().getWalkingRouteSegment(segment, nextSegment);
|
||||
if (walkingRouteSegment != null) {
|
||||
return walkingRouteSegment.getWholeDistance();
|
||||
}
|
||||
return walkDistPT;
|
||||
}
|
||||
|
||||
public void buildRowDivider(View view, boolean needMargin) {
|
||||
|
|
|
@ -85,7 +85,7 @@ public class PublicTransportCard extends BaseCard {
|
|||
TextView wayLine = (TextView) view.findViewById(R.id.way_line);
|
||||
|
||||
fromLine.setText(getFirstLineDescrSpan());
|
||||
wayLine.setText(getSecondLineDescrSpan());
|
||||
wayLine.setText(getSecondLineDescrSpan(segments));
|
||||
|
||||
FrameLayout detailsButton = (FrameLayout) view.findViewById(R.id.details_button);
|
||||
TextView detailsButtonDescr = (TextView) view.findViewById(R.id.details_button_descr);
|
||||
|
@ -171,27 +171,32 @@ public class PublicTransportCard extends BaseCard {
|
|||
return firstLineDesc;
|
||||
}
|
||||
|
||||
private SpannableString getSecondLineDescrSpan() {
|
||||
private SpannableString getSecondLineDescrSpan(List<TransportRouteResultSegment> segments) {
|
||||
TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
|
||||
Typeface typeface = FontCache.getRobotoMedium(app);
|
||||
String travelTime = OsmAndFormatter.getFormattedDuration((int) routeResult.getTravelTime(), app);
|
||||
String walkTime = OsmAndFormatter.getFormattedDuration((int) routeResult.getWalkTime(), app);
|
||||
String walkDistance = OsmAndFormatter.getFormattedDistance((int) routeResult.getWalkDist(), app);
|
||||
String travelTimeStr = OsmAndFormatter.getFormattedDuration((int) routeResult.getTravelTime(), app);
|
||||
int walkTimeReal = transportRoutingHelper.getWalkingTime(segments);
|
||||
int walkTimePT = (int) routeResult.getWalkTime();
|
||||
String walkTimeStr = OsmAndFormatter.getFormattedDuration(walkTimeReal > 0 ? walkTimeReal : walkTimePT, app);
|
||||
int walkDistanceReal = transportRoutingHelper.getWalkingDistance(segments);
|
||||
int walkDistancePT = (int) routeResult.getWalkDist();
|
||||
String walkDistanceStr = OsmAndFormatter.getFormattedDistance(walkDistanceReal > 0 ? walkDistanceReal : walkDistancePT, app);
|
||||
|
||||
String secondLine = travelTime + " • " + app.getString(R.string.on_foot) + " " + walkTime + ", " + walkDistance;
|
||||
String secondLine = travelTimeStr + " • " + app.getString(R.string.on_foot) + " " + walkTimeStr + ", " + walkDistanceStr;
|
||||
|
||||
SpannableString secondLineDesc = new SpannableString(secondLine);
|
||||
|
||||
int startTravelTime = secondLine.indexOf(travelTime);
|
||||
int startTravelTime = secondLine.indexOf(travelTimeStr);
|
||||
secondLineDesc.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)),
|
||||
startTravelTime, startTravelTime + travelTime.length(), 0);
|
||||
startTravelTime, startTravelTime + travelTimeStr.length(), 0);
|
||||
secondLineDesc.setSpan(new CustomTypefaceSpan(typeface),
|
||||
startTravelTime, startTravelTime + travelTime.length(), 0);
|
||||
startTravelTime, startTravelTime + travelTimeStr.length(), 0);
|
||||
|
||||
int startWalkTime = secondLine.lastIndexOf(walkTime);
|
||||
int startWalkTime = secondLine.lastIndexOf(walkTimeStr);
|
||||
secondLineDesc.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)),
|
||||
startWalkTime, startWalkTime + walkTime.length(), 0);
|
||||
startWalkTime, startWalkTime + walkTimeStr.length(), 0);
|
||||
secondLineDesc.setSpan(new CustomTypefaceSpan(typeface),
|
||||
startWalkTime, startWalkTime + walkTime.length(), 0);
|
||||
startWalkTime, startWalkTime + walkTimeStr.length(), 0);
|
||||
|
||||
return secondLineDesc;
|
||||
}
|
||||
|
|
|
@ -111,6 +111,50 @@ public class TransportRoutingHelper {
|
|||
return null;
|
||||
}
|
||||
|
||||
public int getWalkingTime(@NonNull List<TransportRouteResultSegment> segments) {
|
||||
int res = 0;
|
||||
Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments = this.walkingRouteSegments;
|
||||
if (walkingRouteSegments != null) {
|
||||
TransportRouteResultSegment prevSegment = null;
|
||||
for (TransportRouteResultSegment segment : segments) {
|
||||
RouteCalculationResult walkingRouteSegment = getWalkingRouteSegment(prevSegment, segment);
|
||||
if (walkingRouteSegment != null) {
|
||||
res += walkingRouteSegment.getRoutingTime();
|
||||
}
|
||||
prevSegment = segment;
|
||||
}
|
||||
if (segments.size() > 0) {
|
||||
RouteCalculationResult walkingRouteSegment = getWalkingRouteSegment(segments.get(segments.size() - 1), null);
|
||||
if (walkingRouteSegment != null) {
|
||||
res += walkingRouteSegment.getRoutingTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public int getWalkingDistance(@NonNull List<TransportRouteResultSegment> segments) {
|
||||
int res = 0;
|
||||
Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments = this.walkingRouteSegments;
|
||||
if (walkingRouteSegments != null) {
|
||||
TransportRouteResultSegment prevSegment = null;
|
||||
for (TransportRouteResultSegment segment : segments) {
|
||||
RouteCalculationResult walkingRouteSegment = getWalkingRouteSegment(prevSegment, segment);
|
||||
if (walkingRouteSegment != null) {
|
||||
res += walkingRouteSegment.getWholeDistance();
|
||||
}
|
||||
prevSegment = segment;
|
||||
}
|
||||
if (segments.size() > 0) {
|
||||
RouteCalculationResult walkingRouteSegment = getWalkingRouteSegment(segments.get(segments.size() - 1), null);
|
||||
if (walkingRouteSegment != null) {
|
||||
res += walkingRouteSegment.getWholeDistance();
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public void setCurrentRoute(int currentRoute) {
|
||||
this.currentRoute = currentRoute;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue