Merge branch 'master' of ssh://github.com/osmandapp/Osmand into RoutePreparationUiImprovements
This commit is contained in:
commit
25641f5266
17 changed files with 300 additions and 185 deletions
|
@ -553,10 +553,6 @@ public class MapUtils {
|
|||
return sa < 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static long deinterleaveY(long coord) {
|
||||
long x = 0;
|
||||
for (byte b = 31; b >= 0; b--) {
|
||||
|
@ -607,6 +603,20 @@ public class MapUtils {
|
|||
return y1;
|
||||
}
|
||||
}
|
||||
|
||||
public static void insetLatLonRect(QuadRect r, double latitude, double longitude) {
|
||||
if (r.left == 0 && r.right == 0) {
|
||||
r.left = longitude;
|
||||
r.right = longitude;
|
||||
r.top = latitude;
|
||||
r.bottom = latitude;
|
||||
} else {
|
||||
r.left = Math.min(r.left, longitude);
|
||||
r.right = Math.max(r.right, longitude);
|
||||
r.top = Math.max(r.top, latitude);
|
||||
r.bottom = Math.min(r.bottom, latitude);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
9
OsmAnd/res/drawable/btn_active_dark.xml
Normal file
9
OsmAnd/res/drawable/btn_active_dark.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_dark" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
9
OsmAnd/res/drawable/btn_active_light.xml
Normal file
9
OsmAnd/res/drawable/btn_active_light.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_light" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
23
OsmAnd/res/drawable/btn_active_trans_dark.xml
Normal file
23
OsmAnd/res/drawable/btn_active_trans_dark.xml
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_trans_dark" />
|
||||
<stroke android:width="1dp" android:color="@color/active_buttons_and_links_dark" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:state_enabled="false">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/activity_background_light" />
|
||||
<corners android:radius="4dp" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@null" />
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_dark" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
23
OsmAnd/res/drawable/btn_active_trans_light.xml
Normal file
23
OsmAnd/res/drawable/btn_active_trans_light.xml
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_trans_light" />
|
||||
<stroke android:width="1dp" android:color="@color/active_buttons_and_links_light" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:state_enabled="false">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/activity_background_light" />
|
||||
<corners android:radius="4dp" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@null" />
|
||||
<corners android:radius="4dp" />
|
||||
<solid android:color="@color/active_buttons_and_links_light" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
9
OsmAnd/res/drawable/ripple_active_dark.xml
Normal file
9
OsmAnd/res/drawable/ripple_active_dark.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/per42black">
|
||||
<item android:id="@android:id/mask">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/active_buttons_and_links_dark" />
|
||||
<corners android:radius="4dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
9
OsmAnd/res/drawable/ripple_active_light.xml
Normal file
9
OsmAnd/res/drawable/ripple_active_light.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/per42black">
|
||||
<item android:id="@android:id/mask">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/active_buttons_and_links_light" />
|
||||
<corners android:radius="4dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
|
@ -107,8 +107,7 @@
|
|||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone">
|
||||
android:orientation="horizontal">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/show_button_descr"
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
Thx - Hardy
|
||||
|
||||
-->
|
||||
<string name="transfers_size">%1$d transfers</string>
|
||||
<string name="add_start_and_end_points">Add start and end points</string>
|
||||
<string name="route_add_start_point">Add start point</string>
|
||||
<string name="route_descr_select_start_point">Select start point</string>
|
||||
|
|
|
@ -67,7 +67,6 @@ import net.osmand.data.QuadRect;
|
|||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.data.TransportRoute;
|
||||
import net.osmand.data.TransportStop;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.plus.GeocodingLookupService;
|
||||
import net.osmand.plus.GpxSelectionHelper;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||
|
@ -869,7 +868,17 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment {
|
|||
public void showWalkingRouteOnMap(TransportRouteResultSegment startSegment, TransportRouteResultSegment endSegment) {
|
||||
RouteCalculationResult walkingRouteSegment = app.getTransportRoutingHelper().getWalkingRouteSegment(startSegment, endSegment);
|
||||
if (walkingRouteSegment != null) {
|
||||
QuadRect rect = getWalkingSegmentRect(walkingRouteSegment);
|
||||
QuadRect rect = walkingRouteSegment.getLocationsRect();
|
||||
if (rect != null) {
|
||||
openMenuHeaderOnly();
|
||||
fitRectOnMap(rect, null, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void showRouteOnMap(TransportRouteResult result) {
|
||||
if (result != null) {
|
||||
QuadRect rect = app.getTransportRoutingHelper().getTransportRouteRect(result);
|
||||
if (rect != null) {
|
||||
openMenuHeaderOnly();
|
||||
fitRectOnMap(rect, null, true);
|
||||
|
@ -1005,6 +1014,7 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment {
|
|||
iconViewCollapse.setImageDrawable(getCollapseIcon(false));
|
||||
collapsableView.setCollapsed(false);
|
||||
}
|
||||
doAfterMenuStateChange(0, 0);
|
||||
}
|
||||
});
|
||||
if (collapsableView.isCollapsed()) {
|
||||
|
@ -1237,52 +1247,11 @@ public class ShowRouteInfoDialogFragment extends BaseOsmAndFragment {
|
|||
((LinearLayout) view).addView(baseItemView);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private QuadRect getTransportSegmentRect(@NonNull TransportRouteResultSegment segment) {
|
||||
double left = 0, right = 0;
|
||||
double top = 0, bottom = 0;
|
||||
List<Node> nodes = segment.getNodes();
|
||||
for (Node n : nodes) {
|
||||
if (left == 0 && right == 0) {
|
||||
left = n.getLongitude();
|
||||
right = n.getLongitude();
|
||||
top = n.getLatitude();
|
||||
bottom = n.getLatitude();
|
||||
} else {
|
||||
left = Math.min(left, n.getLongitude());
|
||||
right = Math.max(right, n.getLongitude());
|
||||
top = Math.max(top, n.getLatitude());
|
||||
bottom = Math.min(bottom, n.getLatitude());
|
||||
}
|
||||
}
|
||||
return left == 0 && right == 0 ? null : new QuadRect(left, top, right, bottom);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private QuadRect getWalkingSegmentRect(@NonNull RouteCalculationResult result) {
|
||||
double left = 0, right = 0;
|
||||
double top = 0, bottom = 0;
|
||||
for (Location p : result.getRouteLocations()) {
|
||||
if (left == 0 && right == 0) {
|
||||
left = p.getLongitude();
|
||||
right = p.getLongitude();
|
||||
top = p.getLatitude();
|
||||
bottom = p.getLatitude();
|
||||
} else {
|
||||
left = Math.min(left, p.getLongitude());
|
||||
right = Math.max(right, p.getLongitude());
|
||||
top = Math.max(top, p.getLatitude());
|
||||
bottom = Math.min(bottom, p.getLatitude());
|
||||
}
|
||||
}
|
||||
return left == 0 && right == 0 ? null : new QuadRect(left, top, right, bottom);
|
||||
}
|
||||
|
||||
private void showOnMap(@NonNull LatLon latLon) {
|
||||
MapActivity mapActivity = getMapActivity();
|
||||
if (mapActivity != null) {
|
||||
int currentZoom = mapActivity.getMapView().getZoom();
|
||||
mapActivity.getMapView().getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), Math.max(13, currentZoom), true);
|
||||
mapActivity.getMapView().getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), Math.max(15, currentZoom), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,28 +19,27 @@ import android.widget.LinearLayout;
|
|||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.plus.LockableViewPager;
|
||||
import net.osmand.plus.OsmAndLocationProvider;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.ShowRouteInfoDialogFragment;
|
||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener;
|
||||
import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.routing.TransportRoutingHelper;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResult;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResultSegment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ChooseRouteFragment extends BaseOsmAndFragment {
|
||||
public class ChooseRouteFragment extends BaseOsmAndFragment implements CardListener {
|
||||
|
||||
public static final String TAG = "ChooseRouteFragment";
|
||||
|
||||
|
@ -50,6 +49,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
private View view;
|
||||
private LockableViewPager viewPager;
|
||||
private ImageButton myLocButtonView;
|
||||
private List<PublicTransportCard> routeCards = new ArrayList<>();
|
||||
|
||||
private boolean portrait;
|
||||
private boolean nightMode;
|
||||
|
@ -58,21 +58,21 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
mapActivity = (MapActivity) getActivity();
|
||||
mapActivity = (MapActivity) requireActivity();
|
||||
nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
||||
portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
|
||||
map = getMapActivity().getMapView();
|
||||
List<TransportRouteResult> routes = getMyApplication().getTransportRoutingHelper().getRoutes();
|
||||
OsmandApplication app = mapActivity.getMyApplication();
|
||||
List<TransportRouteResult> routes = app.getTransportRoutingHelper().getRoutes();
|
||||
if (routes != null && !routes.isEmpty()) {
|
||||
view = inflater.inflate(R.layout.fragment_show_all_routes, null);
|
||||
viewPager = view.findViewById(R.id.pager);
|
||||
|
||||
AndroidUtils.addStatusBarPadding21v(mapActivity, view);
|
||||
|
||||
final List<PublicTransportCard> routeCards = new ArrayList<>();
|
||||
for (int i = 0; i < routes.size(); i++) {
|
||||
PublicTransportCard card = new PublicTransportCard(mapActivity, routes.get(i), i);
|
||||
card.setSecondButtonVisible(true);
|
||||
card.setListener(this);
|
||||
card.setShowTopShadow(false);
|
||||
card.setShowBottomShadow(false);
|
||||
routeCards.add(card);
|
||||
|
@ -91,11 +91,14 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
public void onPageSelected(int position) {
|
||||
mapActivity.getMyApplication().getTransportRoutingHelper().setCurrentRoute(routeCards.get(position).getRouteId());
|
||||
mapActivity.refreshMap();
|
||||
for (PublicTransportCard card : routeCards) {
|
||||
card.update();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!portrait) {
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AndroidUtils.dpToPx(getMyApplication(), 200f));
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AndroidUtils.dpToPx(app, 200f));
|
||||
params.gravity = Gravity.BOTTOM;
|
||||
viewPager.setLayoutParams(params);
|
||||
}
|
||||
|
@ -154,43 +157,20 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
}
|
||||
|
||||
private void adjustMapPosition() {
|
||||
RoutingHelper rh = mapActivity.getRoutingHelper();
|
||||
OsmandApplication app = mapActivity.getMyApplication();
|
||||
TransportRoutingHelper transportRoutingHelper = rh.getTransportRoutingHelper();
|
||||
if (getMapActivity().getMapView() != null) {
|
||||
Location lt = rh.getLastProjection();
|
||||
if (lt == null) {
|
||||
lt = app.getTargetPointsHelper().getPointToStartLocation();
|
||||
}
|
||||
if (lt != null) {
|
||||
double left = lt.getLongitude(), right = lt.getLongitude();
|
||||
double top = lt.getLatitude(), bottom = lt.getLatitude();
|
||||
List<Location> list = rh.getCurrentCalculatedRoute();
|
||||
for (Location l : list) {
|
||||
left = Math.min(left, l.getLongitude());
|
||||
right = Math.max(right, l.getLongitude());
|
||||
top = Math.max(top, l.getLatitude());
|
||||
bottom = Math.min(bottom, l.getLatitude());
|
||||
}
|
||||
MapActivity mapActivity = getMapActivity();
|
||||
if (mapActivity != null) {
|
||||
OsmandMapTileView mapView = mapActivity.getMapView();
|
||||
if (mapView != null) {
|
||||
RoutingHelper rh = mapActivity.getRoutingHelper();
|
||||
OsmandApplication app = mapActivity.getMyApplication();
|
||||
TransportRoutingHelper transportRoutingHelper = rh.getTransportRoutingHelper();
|
||||
|
||||
QuadRect rect = null;
|
||||
TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult();
|
||||
if (result != null) {
|
||||
for (TransportRouteResultSegment segment : result.getSegments()) {
|
||||
for (Node n : segment.getNodes()) {
|
||||
left = Math.min(left, n.getLongitude());
|
||||
right = Math.max(right, n.getLongitude());
|
||||
top = Math.max(top, n.getLatitude());
|
||||
bottom = Math.min(bottom, n.getLatitude());
|
||||
}
|
||||
}
|
||||
rect = transportRoutingHelper.getTransportRouteRect(result);
|
||||
}
|
||||
List<TargetPointsHelper.TargetPoint> targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
|
||||
for (TargetPointsHelper.TargetPoint l : targetPoints) {
|
||||
left = Math.min(left, l.getLongitude());
|
||||
right = Math.max(right, l.getLongitude());
|
||||
top = Math.max(top, l.getLatitude());
|
||||
bottom = Math.min(bottom, l.getLatitude());
|
||||
}
|
||||
RotatedTileBox tb = getMapActivity().getMapView().getCurrentRotatedTileBox().copy();
|
||||
RotatedTileBox tb = mapView.getCurrentRotatedTileBox().copy();
|
||||
int tileBoxWidthPx = 0;
|
||||
int tileBoxHeightPx = 0;
|
||||
|
||||
|
@ -200,7 +180,9 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
int fHeight = viewPager.getHeight() + AndroidUtils.getStatusBarHeight(app);
|
||||
tileBoxHeightPx = tb.getPixHeight() - fHeight;
|
||||
}
|
||||
getMapActivity().getMapView().fitRectToMap(left, right, top, bottom, tileBoxWidthPx, tileBoxHeightPx, 0);
|
||||
if (rect != null) {
|
||||
mapView.fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, tileBoxWidthPx, tileBoxHeightPx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -302,6 +284,21 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCardLayoutNeeded(@NonNull BaseCard card) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCardButtonPressed(@NonNull BaseCard card, int buttonIndex) {
|
||||
if (card instanceof PublicTransportCard) {
|
||||
if (buttonIndex == PublicTransportCard.SHOW_BUTTON_INDEX) {
|
||||
for (PublicTransportCard transportCard : routeCards) {
|
||||
transportCard.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ViewsPagerAdapter extends PagerAdapter {
|
||||
|
||||
private List<PublicTransportCard> cards;
|
||||
|
@ -338,29 +335,10 @@ public class ChooseRouteFragment extends BaseOsmAndFragment {
|
|||
@NonNull
|
||||
@Override
|
||||
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
|
||||
|
||||
View view = createPageView(position);
|
||||
view.setBackgroundDrawable(null);
|
||||
view.setBackgroundResource(R.drawable.route_cards_topsides_light);
|
||||
view.findViewById(R.id.details_button).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (position < cards.size()) {
|
||||
int routeId = cards.get(position).getRouteId();
|
||||
mapActivity.getMyApplication().getTransportRoutingHelper().setCurrentRoute(routeId);
|
||||
mapActivity.getMapView().refreshMap(true);
|
||||
ShowRouteInfoDialogFragment.showInstance(mapActivity, routeId);
|
||||
}
|
||||
}
|
||||
});
|
||||
view.findViewById(R.id.show_button).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
adjustMapPosition();
|
||||
}
|
||||
});
|
||||
container.addView(view, 0);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
|
|
@ -488,6 +488,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
PublicTransportCard card = new PublicTransportCard(mapActivity, routes.get(i), i);
|
||||
card.setShowBottomShadow(i == routes.size() - 1);
|
||||
card.setShowTopShadow(i != 0);
|
||||
card.setListener(this);
|
||||
menuCards.add(card);
|
||||
}
|
||||
bottomShadowVisible = routes.size() == 0;
|
||||
|
@ -581,6 +582,11 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
updateOptionsButtons();
|
||||
|
||||
app.getTargetPointsHelper().restoreTargetPoints(true);
|
||||
} else if (card instanceof PublicTransportCard) {
|
||||
if (buttonIndex == PublicTransportCard.SHOW_BUTTON_INDEX) {
|
||||
setupCards();
|
||||
openMenuHeaderOnly();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import android.widget.TextView;
|
|||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
|
@ -37,16 +38,18 @@ import net.osmand.plus.LockableScrollView;
|
|||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.TargetPointsHelper.TargetPoint;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.mapcontextmenu.InterceptorLinearLayout;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.routing.TransportRoutingHelper;
|
||||
import net.osmand.plus.views.controls.HorizontalSwipeConfirm;
|
||||
import net.osmand.plus.widgets.ImageViewExProgress;
|
||||
import net.osmand.plus.widgets.TextViewExProgress;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResult;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResultSegment;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@ -335,7 +338,6 @@ public class MapRouteInfoMenuFragment extends BaseOsmAndFragment {
|
|||
}
|
||||
MapActivity mapActivity = getMapActivity();
|
||||
if (mapActivity != null) {
|
||||
updateInfo();
|
||||
mapActivity.getMapLayers().getMapControlsLayer().showMapControlsIfHidden();
|
||||
wasDrawerDisabled = mapActivity.isDrawerDisabled();
|
||||
if (!wasDrawerDisabled) {
|
||||
|
@ -726,52 +728,48 @@ public class MapRouteInfoMenuFragment extends BaseOsmAndFragment {
|
|||
|
||||
RoutingHelper rh = app.getRoutingHelper();
|
||||
if (rh.isRoutePlanningMode() && mapActivity.getMapView() != null) {
|
||||
Location lt = rh.getLastProjection();
|
||||
if (lt == null) {
|
||||
lt = app.getTargetPointsHelper().getPointToStartLocation();
|
||||
}
|
||||
if (lt != null) {
|
||||
double left = lt.getLongitude(), right = lt.getLongitude();
|
||||
double top = lt.getLatitude(), bottom = lt.getLatitude();
|
||||
List<Location> list = rh.getCurrentCalculatedRoute();
|
||||
for (Location l : list) {
|
||||
left = Math.min(left, l.getLongitude());
|
||||
right = Math.max(right, l.getLongitude());
|
||||
top = Math.max(top, l.getLatitude());
|
||||
bottom = Math.min(bottom, l.getLatitude());
|
||||
}
|
||||
if (menu.isTransportRouteCalculated()) {
|
||||
TransportRouteResult result = app.getTransportRoutingHelper().getCurrentRouteResult();
|
||||
if (result != null) {
|
||||
for (TransportRouteResultSegment segment : result.getSegments()) {
|
||||
for (Node n : segment.getNodes()) {
|
||||
left = Math.min(left, n.getLongitude());
|
||||
right = Math.max(right, n.getLongitude());
|
||||
top = Math.max(top, n.getLatitude());
|
||||
bottom = Math.min(bottom, n.getLatitude());
|
||||
}
|
||||
}
|
||||
QuadRect r = new QuadRect(0, 0, 0, 0);
|
||||
if (menu.isTransportRouteCalculated()) {
|
||||
TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
|
||||
TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult();
|
||||
if (result != null) {
|
||||
QuadRect transportRouteRect = transportRoutingHelper.getTransportRouteRect(result);
|
||||
if (transportRouteRect != null) {
|
||||
r = transportRouteRect;
|
||||
}
|
||||
}
|
||||
List<TargetPointsHelper.TargetPoint> targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
|
||||
for (TargetPointsHelper.TargetPoint l : targetPoints) {
|
||||
left = Math.min(left, l.getLongitude());
|
||||
right = Math.max(right, l.getLongitude());
|
||||
top = Math.max(top, l.getLatitude());
|
||||
bottom = Math.min(bottom, l.getLatitude());
|
||||
} else if (rh.isRouteCalculated()) {
|
||||
Location lt = rh.getLastProjection();
|
||||
if (lt == null) {
|
||||
lt = app.getTargetPointsHelper().getPointToStartLocation();
|
||||
}
|
||||
|
||||
RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
|
||||
int tileBoxWidthPx = 0;
|
||||
int tileBoxHeightPx = 0;
|
||||
|
||||
if (!portrait) {
|
||||
tileBoxWidthPx = tb.getPixWidth() - getWidth();
|
||||
} else {
|
||||
int fHeight = viewHeight - y - AndroidUtils.getStatusBarHeight(app);
|
||||
tileBoxHeightPx = tb.getPixHeight() - fHeight;
|
||||
if (lt == null) {
|
||||
lt = app.getLocationProvider().getLastKnownLocation();
|
||||
}
|
||||
mapActivity.getMapView().fitRectToMap(left, right, top, bottom, tileBoxWidthPx, tileBoxHeightPx, 0);
|
||||
if (lt != null) {
|
||||
MapUtils.insetLatLonRect(r, lt.getLatitude(), lt.getLongitude());
|
||||
}
|
||||
List<Location> list = rh.getCurrentCalculatedRoute();
|
||||
for (Location l : list) {
|
||||
MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude());
|
||||
}
|
||||
List<TargetPoint> targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
|
||||
for (TargetPoint l : targetPoints) {
|
||||
MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude());
|
||||
}
|
||||
}
|
||||
RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
|
||||
int tileBoxWidthPx = 0;
|
||||
int tileBoxHeightPx = 0;
|
||||
|
||||
if (!portrait) {
|
||||
tileBoxWidthPx = tb.getPixWidth() - getWidth();
|
||||
} else {
|
||||
int fHeight = viewHeight - y - AndroidUtils.getStatusBarHeight(app);
|
||||
tileBoxHeightPx = tb.getPixHeight() - fHeight;
|
||||
}
|
||||
if (r.left != 0 && r.right != 0) {
|
||||
mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import net.osmand.plus.widgets.FlowLayout;
|
|||
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResult;
|
||||
import net.osmand.router.TransportRoutePlanner.TransportRouteResultSegment;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
@ -33,11 +34,12 @@ import java.util.List;
|
|||
public class PublicTransportCard extends BaseCard {
|
||||
|
||||
private static final int MIN_WALK_TIME = 120;
|
||||
public static final int DETAILS_BUTTON_INDEX = 0;
|
||||
public static final int SHOW_BUTTON_INDEX = 1;
|
||||
|
||||
private TransportRouteResult routeResult;
|
||||
|
||||
private int routeId;
|
||||
private boolean secondButtonVisible;
|
||||
|
||||
public PublicTransportCard(MapActivity mapActivity, TransportRouteResult routeResult, int routeId) {
|
||||
super(mapActivity);
|
||||
|
@ -61,14 +63,6 @@ public class PublicTransportCard extends BaseCard {
|
|||
fromLine.setText(getFirstLineDescrSpan());
|
||||
wayLine.setText(getSecondLineDescrSpan());
|
||||
|
||||
view.findViewById(R.id.details_button).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
app.getTransportRoutingHelper().setCurrentRoute(routeId);
|
||||
getMapActivity().refreshMap();
|
||||
ShowRouteInfoDialogFragment.showInstance(mapActivity, routeId);
|
||||
}
|
||||
});
|
||||
FrameLayout detailsButton = (FrameLayout) view.findViewById(R.id.details_button);
|
||||
TextView detailsButtonDescr = (TextView) view.findViewById(R.id.details_button_descr);
|
||||
|
||||
|
@ -80,21 +74,44 @@ public class PublicTransportCard extends BaseCard {
|
|||
}
|
||||
int color = ContextCompat.getColor(app, nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light);
|
||||
detailsButtonDescr.setTextColor(color);
|
||||
detailsButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
app.getTransportRoutingHelper().setCurrentRoute(routeId);
|
||||
getMapActivity().refreshMap();
|
||||
ShowRouteInfoDialogFragment.showInstance(mapActivity, routeId);
|
||||
}
|
||||
});
|
||||
|
||||
FrameLayout showButton = (FrameLayout) view.findViewById(R.id.show_button);
|
||||
if (secondButtonVisible) {
|
||||
TextView showButtonDescr = (TextView) view.findViewById(R.id.show_button_descr);
|
||||
TextView showButtonDescr = (TextView) view.findViewById(R.id.show_button_descr);
|
||||
if (isCurrentRoute()) {
|
||||
color = ContextCompat.getColor(app, R.color.color_white);
|
||||
AndroidUtils.setBackground(app, showButton, nightMode, R.drawable.btn_active_light, R.drawable.btn_active_dark);
|
||||
showButtonDescr.setText(R.string.shared_string_selected);
|
||||
showButton.setOnClickListener(null);
|
||||
} else {
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
|
||||
AndroidUtils.setBackground(app, showButton, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark);
|
||||
AndroidUtils.setBackground(app, showButtonDescr, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark);
|
||||
} else {
|
||||
AndroidUtils.setBackground(app, showButton, nightMode, R.drawable.btn_border_trans_light, R.drawable.btn_border_trans_dark);
|
||||
}
|
||||
showButtonDescr.setTextColor(color);
|
||||
showButton.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
showButton.setVisibility(View.GONE);
|
||||
showButtonDescr.setText(R.string.shared_string_show_on_map);
|
||||
showButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
app.getTransportRoutingHelper().setCurrentRoute(routeId);
|
||||
getMapActivity().refreshMap();
|
||||
CardListener listener = getListener();
|
||||
if (listener != null) {
|
||||
listener.onCardButtonPressed(PublicTransportCard.this, SHOW_BUTTON_INDEX);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
showButtonDescr.setTextColor(color);
|
||||
|
||||
view.findViewById(R.id.bottom_shadow).setVisibility(showBottomShadow ? View.VISIBLE : View.GONE);
|
||||
view.findViewById(R.id.card_divider).setVisibility(showTopShadow ? View.VISIBLE : View.GONE);
|
||||
view.findViewById(R.id.top_divider).setVisibility(!showTopShadow ? View.VISIBLE : View.GONE);
|
||||
|
@ -104,17 +121,17 @@ public class PublicTransportCard extends BaseCard {
|
|||
return routeId;
|
||||
}
|
||||
|
||||
public void setSecondButtonVisible(boolean secondButtonVisible) {
|
||||
this.secondButtonVisible = secondButtonVisible;
|
||||
public boolean isCurrentRoute() {
|
||||
return routeId == app.getTransportRoutingHelper().getCurrentRoute();
|
||||
}
|
||||
|
||||
private SpannableString getFirstLineDescrSpan() {
|
||||
List<TransportRouteResultSegment> segments = routeResult.getSegments();
|
||||
String name = segments.get(0).getStart().getName();
|
||||
String firstLine = app.getString(R.string.route_from) + " " + name;
|
||||
String firstLine = Algorithms.capitalizeFirstLetter(app.getString(R.string.shared_string_from)) + " " + name;
|
||||
|
||||
if (segments.size() > 1) {
|
||||
firstLine += ", " + app.getString(R.string.transfers) +": "+(segments.size() - 1);
|
||||
firstLine += " • " + app.getString(R.string.transfers_size, (segments.size() - 1));
|
||||
}
|
||||
|
||||
SpannableString firstLineDesc = new SpannableString(firstLine);
|
||||
|
@ -133,19 +150,21 @@ public class PublicTransportCard extends BaseCard {
|
|||
String walkTime = OsmAndFormatter.getFormattedDuration((int) routeResult.getWalkTime(), app);
|
||||
String walkDistance = OsmAndFormatter.getFormattedDistance((int) routeResult.getWalkDist(), app);
|
||||
|
||||
String secondLine = app.getString(R.string.route_way) + ": " + travelTime + " • " + app.getString(R.string.on_foot) + ": " + walkTime + " • " + walkDistance;
|
||||
String secondLine = travelTime + " • " + app.getString(R.string.on_foot) + " " + walkTime + ", " + walkDistance;
|
||||
|
||||
SpannableString secondLineDesc = new SpannableString(secondLine);
|
||||
|
||||
int startTravelTime = secondLine.indexOf(travelTime);
|
||||
secondLineDesc.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)),
|
||||
secondLine.indexOf(travelTime), secondLine.indexOf(travelTime) + travelTime.length(), 0);
|
||||
startTravelTime, startTravelTime + travelTime.length(), 0);
|
||||
secondLineDesc.setSpan(new CustomTypefaceSpan(typeface),
|
||||
secondLine.indexOf(travelTime), secondLine.indexOf(travelTime) + travelTime.length(), 0);
|
||||
startTravelTime, startTravelTime + travelTime.length(), 0);
|
||||
|
||||
int startWalkTime = secondLine.lastIndexOf(walkTime);
|
||||
secondLineDesc.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)),
|
||||
secondLine.indexOf(walkTime), secondLine.indexOf(walkTime) + walkTime.length(), 0);
|
||||
startWalkTime, startWalkTime + walkTime.length(), 0);
|
||||
secondLineDesc.setSpan(new CustomTypefaceSpan(typeface),
|
||||
secondLine.indexOf(walkTime), secondLine.indexOf(walkTime) + walkTime.length(), 0);
|
||||
startWalkTime, startWalkTime + walkTime.length(), 0);
|
||||
|
||||
return secondLineDesc;
|
||||
}
|
||||
|
@ -153,6 +172,7 @@ public class PublicTransportCard extends BaseCard {
|
|||
private void createRouteBadges(List<TransportRouteResultSegment> segments) {
|
||||
int itemsSpacing = AndroidUtils.dpToPx(app, 6);
|
||||
FlowLayout routesBadges = (FlowLayout) view.findViewById(R.id.routes_badges);
|
||||
routesBadges.removeAllViews();
|
||||
|
||||
Iterator<TransportRouteResultSegment> iterator = segments.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
|
@ -213,11 +233,11 @@ public class PublicTransportCard extends BaseCard {
|
|||
TextView transportStopRouteTextView = (TextView) convertView.findViewById(R.id.transport_stop_route_text);
|
||||
ImageView transportStopRouteImageView = (ImageView) convertView.findViewById(R.id.transport_stop_route_icon);
|
||||
|
||||
transportStopRouteImageView.setImageDrawable(getColoredIcon(R.drawable.ic_action_pedestrian_dark, nightMode ? R.color.ctx_menu_bottom_view_url_color_dark : R.color.ctx_menu_bottom_view_url_color_light ));
|
||||
transportStopRouteImageView.setImageDrawable(getColoredIcon(R.drawable.ic_action_pedestrian_dark, nightMode ? R.color.ctx_menu_bottom_view_url_color_dark : R.color.ctx_menu_bottom_view_url_color_light));
|
||||
transportStopRouteTextView.setText(walkTime);
|
||||
GradientDrawable gradientDrawableBg = (GradientDrawable) convertView.getBackground();
|
||||
gradientDrawableBg.setColor(bgColor);
|
||||
transportStopRouteTextView.setTextColor(ContextCompat.getColor(app, nightMode ? R.color.ctx_menu_bottom_view_url_color_dark : R.color.ctx_menu_bottom_view_url_color_light));
|
||||
transportStopRouteTextView.setTextColor(ContextCompat.getColor(app, nightMode ? R.color.ctx_menu_bottom_view_url_color_dark : R.color.ctx_menu_bottom_view_url_color_light));
|
||||
|
||||
AndroidUtils.setBackground(app, convertView, nightMode, R.drawable.btn_border_active_light, R.drawable.btn_border_active_dark);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package net.osmand.plus.routing;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
|
@ -8,6 +9,7 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
|||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.LocationPoint;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
|
@ -512,7 +514,26 @@ public class RouteCalculationResult {
|
|||
sum += originalDirections.get(i).getExpectedTime();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
public QuadRect getLocationsRect() {
|
||||
double left = 0, right = 0;
|
||||
double top = 0, bottom = 0;
|
||||
for (Location p : locations) {
|
||||
if (left == 0 && right == 0) {
|
||||
left = p.getLongitude();
|
||||
right = p.getLongitude();
|
||||
top = p.getLatitude();
|
||||
bottom = p.getLatitude();
|
||||
} else {
|
||||
left = Math.min(left, p.getLongitude());
|
||||
right = Math.max(right, p.getLongitude());
|
||||
top = Math.max(top, p.getLatitude());
|
||||
bottom = Math.min(bottom, p.getLatitude());
|
||||
}
|
||||
}
|
||||
return left == 0 && right == 0 ? null : new QuadRect(left, top, right, bottom);
|
||||
}
|
||||
|
||||
public static String toString(TurnType type, Context ctx, boolean shortName) {
|
||||
if(type.isRoundAbout()){
|
||||
|
|
|
@ -9,6 +9,8 @@ import net.osmand.PlatformUtil;
|
|||
import net.osmand.ValueHolder;
|
||||
import net.osmand.binary.BinaryMapIndexReader;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
|
@ -281,6 +283,35 @@ public class TransportRoutingHelper {
|
|||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public QuadRect getTransportRouteRect(@NonNull TransportRouteResult result) {
|
||||
TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
|
||||
QuadRect r = new QuadRect(0, 0, 0, 0);
|
||||
TransportRouteResultSegment s1;
|
||||
TransportRouteResultSegment s2 = null;
|
||||
for (TransportRouteResultSegment segment : result.getSegments()) {
|
||||
s1 = segment;
|
||||
for (Node n : segment.getNodes()) {
|
||||
MapUtils.insetLatLonRect(r, n.getLatitude(), n.getLongitude());
|
||||
}
|
||||
RouteCalculationResult wrs = s2 == null ? transportRoutingHelper.getWalkingRouteSegment(null, s1) :
|
||||
transportRoutingHelper.getWalkingRouteSegment(s1, s2);
|
||||
if (wrs != null) {
|
||||
for (Location p : wrs.getRouteLocations()) {
|
||||
MapUtils.insetLatLonRect(r, p.getLatitude(), p.getLongitude());
|
||||
}
|
||||
}
|
||||
s2 = s1;
|
||||
}
|
||||
RouteCalculationResult wrs = transportRoutingHelper.getWalkingRouteSegment(s2, null);
|
||||
if (wrs != null) {
|
||||
for (Location p : wrs.getRouteLocations()) {
|
||||
MapUtils.insetLatLonRect(r, p.getLatitude(), p.getLongitude());
|
||||
}
|
||||
}
|
||||
return r.left == 0 && r.right == 0 ? null : r;
|
||||
}
|
||||
|
||||
public interface TransportRouteCalculationProgressCallback {
|
||||
|
||||
void start();
|
||||
|
|
Loading…
Reference in a new issue