Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2016-01-08 19:07:46 +01:00
commit e3b4ceb3c6
25 changed files with 1480 additions and 410 deletions

View file

@ -52,13 +52,13 @@
android:layout_gravity="start"
android:visibility="gone" >
<com.github.ksoichiro.android.observablescrollview.ObservableListView
<net.osmand.plus.views.controls.DynamicListView
android:id="@+id/dash_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/bg_color"
android:fadeScrollbars="true" >
</com.github.ksoichiro.android.observablescrollview.ObservableListView>
</net.osmand.plus.views.controls.DynamicListView>
</FrameLayout>
</LinearLayout>

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:background="@color/color_transparent">
<FrameLayout
android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_transparent"
android:clickable="true">
<LinearLayout
android:id="@+id/main_view"
@ -18,53 +19,47 @@
<LinearLayout
android:id="@+id/ModesLayout"
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
</LinearLayout>
<ScrollView
@ -252,8 +247,8 @@
android:id="@+id/Info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:minHeight="@dimen/list_item_height"
android:orientation="horizontal">
<ImageView
@ -269,9 +264,9 @@
android:id="@+id/InfoIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_info_dark"/>
@ -309,9 +304,9 @@
android:id="@+id/DurationIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_time"/>
@ -350,8 +345,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|left"
android:layout_weight="1"
android:layout_margin="8dp"
android:layout_weight="1"
android:textSize="@dimen/default_desc_text_size"/>
<ImageView

View file

@ -61,12 +61,12 @@
android:layout_height="wrap_content"
android:background="?attr/bg_color" />
<com.github.ksoichiro.android.observablescrollview.ObservableListView
<net.osmand.plus.views.controls.DynamicListView
android:id="@+id/dash_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadeScrollbars="true" >
</com.github.ksoichiro.android.observablescrollview.ObservableListView>
</net.osmand.plus.views.controls.DynamicListView>
</FrameLayout>
<include layout="@layout/dashboard_toolbar"/>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:minHeight="40dp"
android:minHeight="48dp"
android:layout_marginBottom="5dp">
<ImageView
@ -24,15 +24,16 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_list_text_size" />
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/default_list_text_size"
android:textColor="@color/sherpafy_selection"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginRight="8dp" />
android:layout_marginRight="16dp" />
</LinearLayout>

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:minHeight="50dp"
android:layout_marginBottom="5dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="@string/search_radius_proximity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginTop="2dp"
android:text="500 m"
android:layout_marginRight="16dp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/titleEx"
android:text="@string/shared_string_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/descriptionEx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginTop="2dp"
android:text="Cinema"
android:layout_marginRight="16dp" />
</LinearLayout>
</LinearLayout>

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:background="@color/color_transparent">
<FrameLayout
android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_transparent"
android:clickable="true">
<LinearLayout
android:id="@+id/main_view"
@ -18,53 +19,46 @@
<LinearLayout
android:id="@+id/ModesLayout"
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
</LinearLayout>
<ScrollView
@ -252,8 +246,8 @@
android:id="@+id/Info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:minHeight="@dimen/list_item_height"
android:orientation="horizontal">
<ImageView
@ -269,9 +263,9 @@
android:id="@+id/InfoIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_info_dark"/>
@ -309,9 +303,9 @@
android:id="@+id/DurationIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_time"/>

View file

@ -1,13 +1,14 @@
<?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"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_marginBottom="5dp"
android:layout_marginRight="3dp"
android:paddingRight="16dp"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:minHeight="40dp"
android:minHeight="48dp"
android:orientation="horizontal">
<ProgressBar
@ -17,16 +18,17 @@
android:layout_gravity="center_vertical"
android:layout_marginLeft="4dp"/>
<TextView
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/header_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
android:layout_marginLeft="16dp"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true"
android:textSize="@dimen/default_list_text_size_large"/>
style="@style/DashboardSubHeader"
osmand:typeface="@string/font_roboto_medium"/>
<include layout="@layout/check_item_rel"/>

View file

@ -3,63 +3,103 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/view_transparent_selection"
android:id="@+id/package_delivered_layout"
android:minHeight="48dp"
android:minHeight="50dp"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/waypoint_icon"
android:layout_marginLeft="8dp"
android:src="@drawable/ic_action_fav_dark"
android:layout_height="25dp"
android:layout_width="25dp"
android:layout_width="56dp"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/waypoint_dist"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:layout_gravity="center_vertical"
android:textColor="@color/wpt_distance_color"
android:maxLines="2"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"/>
<TextView
android:id="@+id/waypoint_text"
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:maxLines="2"
android:ellipsize="end"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:textSize="@dimen/default_list_text_size" />
android:gravity="center"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/waypoint_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_list_text_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:orientation="horizontal">
<TextView
android:id="@+id/waypoint_dist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:textColor="@color/color_myloc_distance"
android:maxLines="1"
android:textSize="@dimen/default_sub_text_size"/>
<TextView
android:id="@+id/waypoint_desc_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textColor="@color/secondary_text_dark"
android:textSize="@dimen/default_sub_text_size" />
</LinearLayout>
</LinearLayout>
<ImageButton
android:id="@+id/all_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/shared_string_more"
android:layout_gravity="center_vertical"
android:layout_marginRight="2dp"
android:visibility="gone"
android:focusable="false"
android:scaleType="center"
style="@style/Widget.AppCompat.ActionButton"
android:src="@drawable/ic_action_core_overflow_dark" />
android:src="@drawable/map_overflow_menu_white" />
<ImageButton
android:id="@+id/info_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/shared_string_close"
android:layout_gravity="center_vertical"
android:layout_marginRight="4dp"
android:layout_marginRight="2dp"
style="@style/Widget.AppCompat.ActionButton"
android:focusable="false"
android:src="@drawable/ic_action_gremove_dark" />
android:scaleType="center"
android:src="@drawable/ic_action_remove_dark" />
<ImageView
android:id="@+id/info_move"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="2dp"
android:focusable="false"
android:clickable="false"
android:scaleType="center"
android:src="@drawable/ic_flat_list_dark"
android:tag="DragIcon"
android:visibility="gone"/>
</LinearLayout>

View file

@ -9,6 +9,8 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
<string name="shared_string_type">Type</string>
<string name="starting_point">Starting point</string>
<string name="shared_string_not_selected">Not selected</string>
<string name="rec_split">Recorder Split</string>
<string name="rec_split_title">Use Recorder Split</string>

View file

@ -83,8 +83,13 @@ public class CurrentPositionHelper {
}
}
};
if (!app.getRoutingHelper().startTaskInRouteThreadIfPossible(run) && result != null) {
result.publish(null);
if (!app.getRoutingHelper().startTaskInRouteThreadIfPossible(run)) {
if (result != null) {
result.publish(null);
}
if (geoCoding != null) {
geoCoding.publish(null);
}
}
}
}

View file

@ -29,6 +29,7 @@ public class TargetPointsHelper {
private PointDescription pointDescription;
public int index;
public boolean intermediate;
public boolean start;
public TargetPoint(LatLon point, PointDescription name) {
this.point = point;
@ -67,6 +68,14 @@ public class TargetPointsHelper {
return null;
}
public static TargetPoint createStartPoint(LatLon point, PointDescription name) {
if (point != null) {
TargetPoint target = new TargetPoint(point, name);
target.start = true;
return target;
}
return null;
}
public double getLatitude() {
return point.getLatitude();
@ -97,7 +106,7 @@ public class TargetPointsHelper {
private void readFromSettings(OsmandSettings settings) {
pointToNavigate = TargetPoint.create(settings.getPointToNavigate(), settings.getPointNavigateDescription());
pointToStart = TargetPoint.create(settings.getPointToStart(), settings.getStartPointDescription());
pointToStart = TargetPoint.createStartPoint(settings.getPointToStart(), settings.getStartPointDescription());
intermediatePoints.clear();
List<LatLon> ips = settings.getIntermediatePoints();
List<String> desc = settings.getIntermediatePointDescriptions(ips.size());
@ -285,7 +294,7 @@ public class TargetPointsHelper {
}
public void reorderAllTargetPoints(List<TargetPoint> point, boolean updateRoute){
public void reorderAllTargetPoints(List<TargetPoint> point, boolean updateRoute) {
settings.clearPointToNavigate();
if (point.size() > 0) {
List<TargetPoint> subList = point.subList(0, point.size() - 1);

View file

@ -102,11 +102,11 @@ public class MapActivityActions implements DialogProvider {
TargetPointsHelper targets = getMyApplication().getTargetPointsHelper();
targets.navigateToPoint(new LatLon(latitude, longitude), true, targets.getIntermediatePoints().size() + 1,
pd);
openIntermediateEditPointsDialog();
openIntermediatePointsDialog();
}
public void editWaypoints() {
openIntermediateEditPointsDialog();
openIntermediatePointsDialog();
}
private Bundle enhance(Bundle aBundle, double latitude, double longitude, String name) {

View file

@ -96,7 +96,7 @@ public class DashWaypointsFragment extends DashLocationFragment {
View dv = getActivity().getLayoutInflater().inflate(R.layout.divider, null);
favorites.addView(dv);
View v = WaypointDialogHelper.updateWaypointItemView(false, null, getMyApplication(),
getActivity(), null, ps, null, !getMyApplication().getSettings().isLightContent());
getActivity(), null, ps, null, !getMyApplication().getSettings().isLightContent(), true);
favorites.addView(v);
}
@ -142,7 +142,21 @@ public class DashWaypointsFragment extends DashLocationFragment {
view.findViewById(R.id.group_image).setVisibility(View.GONE);
boolean target = helper.getPointToNavigate() == point;
int id = target ? R.drawable.list_destination : R.drawable.list_intermediate;
int id;
if (!target) {
if (getMyApplication().getSettings().isLightContent()) {
id = R.drawable.widget_intermediate_day;
} else {
id = R.drawable.widget_intermediate_night;
}
} else {
if (getMyApplication().getSettings().isLightContent()) {
id = R.drawable.widget_target_day;
} else {
id = R.drawable.widget_target_night;
}
}
((ImageView) view.findViewById(R.id.favourite_icon)).setImageDrawable(getMyApplication().getIconsCache()
.getIcon(id, 0));
DashLocationView dv = new DashLocationView(direction, label, new LatLon(point.getLatitude(),

View file

@ -35,6 +35,7 @@ import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCal
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import net.osmand.PlatformUtil;
import net.osmand.ValueHolder;
import net.osmand.data.LatLon;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
@ -44,7 +45,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.IntermediatePointsDialog;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.dashboard.tools.DashboardSettingsDialogFragment;
@ -57,8 +58,12 @@ import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper;
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu;
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu.LocalRoutingParameter;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.IRouteInformationListener;
import net.osmand.plus.views.DownloadedRegionsLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.controls.DynamicListView;
import net.osmand.plus.views.controls.DynamicListViewCallbacks;
import net.osmand.plus.views.controls.StableArrayAdapter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@ -72,7 +77,7 @@ import static android.util.TypedValue.COMPLEX_UNIT_DIP;
/**
*/
public class DashboardOnMap implements ObservableScrollViewCallbacks {
public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicListViewCallbacks, IRouteInformationListener {
private static final org.apache.commons.logging.Log LOG =
PlatformUtil.getLog(DashboardOnMap.class);
private static final String TAG = "DashboardOnMap";
@ -182,6 +187,8 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
toolbar = ((Toolbar) dashboardView.findViewById(R.id.toolbar));
ObservableScrollView scrollView = ((ObservableScrollView) dashboardView.findViewById(R.id.main_scroll));
listView = (ListView) dashboardView.findViewById(R.id.dash_list_view);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
((DynamicListView) listView).setDynamicListViewCallbacks(this);
gradientToolbar = mapActivity.getResources().getDrawable(R.drawable.gradient_toolbar).mutate();
if (AndroidUiHelper.isOrientationPortrait(mapActivity)) {
this.portrait = true;
@ -211,7 +218,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM));
shadow.setScaleType(ScaleType.FIT_XY);
shadowContainer.addView(shadow);
((FrameLayout)paddingView).addView(shadowContainer);
((FrameLayout) paddingView).addView(shadowContainer);
listView.addHeaderView(paddingView);
listBackgroundView = mapActivity.findViewById(R.id.dash_list_background);
}
@ -248,8 +255,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
TextView tv = (TextView) dashboardView.findViewById(R.id.toolbar_text);
tv.setText("");
boolean waypointsVisible = visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.WAYPOINTS_FLAT;
boolean waypointsEdit = visibleType == DashboardType.WAYPOINTS_EDIT;
if (waypointsVisible || waypointsEdit) {
if (waypointsVisible) {
tv.setText(R.string.waypoints);
} else if (visibleType == DashboardType.CONFIGURE_MAP) {
tv.setText(R.string.configure_map);
@ -283,25 +289,6 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
});
if (waypointsVisible && getMyApplication().getWaypointHelper().getAllPoints().size() > 0) {
if (mapActivity.getMyApplication().getTargetPointsHelper().getIntermediatePoints().size() > 0) {
sort.setVisibility(View.VISIBLE);
sort.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideDashboard();
IntermediatePointsDialog.openIntermediatePointsDialog(mapActivity, getMyApplication(), true);
}
});
}
edit.setVisibility(View.VISIBLE);
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setDashboardVisibility(true, DashboardType.WAYPOINTS_EDIT);
}
});
if (getMyApplication().getWaypointHelper().isRouteCalculated()) {
flat.setVisibility(View.VISIBLE);
final boolean flatNow = visibleType == DashboardType.WAYPOINTS_FLAT;
@ -317,17 +304,17 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
});
}
}
if (waypointsEdit) {
ok.setVisibility(View.VISIBLE);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mapActivity.getMyApplication().getWaypointHelper().removeVisibleLocationPoint(deletedPoints);
hideDashboard();
}
});
}
// if (waypointsEdit) {
// ok.setVisibility(View.VISIBLE);
// ok.setOnClickListener(new View.OnClickListener() {
//
// @Override
// public void onClick(View v) {
mapActivity.getMyApplication().getWaypointHelper().removeVisibleLocationPoint(deletedPoints);
// hideDashboard();
// }
// });
// }
if (visibleType == DashboardType.DASHBOARD || visibleType == DashboardType.LIST_MENU) {
settingsButton.setVisibility(View.VISIBLE);
settingsButton.setOnClickListener(new View.OnClickListener() {
@ -552,7 +539,9 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
open(dashboardView.findViewById(R.id.animateContent), animation);
updateLocation(true, true, false);
// addOrUpdateDashboardFragments();
mapActivity.getRoutingHelper().addListener(this);
} else {
mapActivity.getRoutingHelper().removeListener(this);
mapActivity.getMapViewTrackingUtilities().setDashboard(null);
hide(dashboardView.findViewById(R.id.animateContent), animation);
mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.VISIBLE);
@ -607,10 +596,15 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
private void updateListAdapter() {
ContextMenuAdapter cm = null;
if (DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType) {
ArrayAdapter<Object> listAdapter = waypointDialogHelper.getWaypointsDrawerAdapter(false, deletedPoints, mapActivity, running,
StableArrayAdapter listAdapter = waypointDialogHelper.getWaypointsDrawerAdapter(true, deletedPoints, mapActivity, running,
DashboardType.WAYPOINTS_FLAT == visibleType, nightMode);
OnItemClickListener listener = waypointDialogHelper.getDrawerItemClickListener(mapActivity, running,
listAdapter);
DynamicListView dynamicListView = (DynamicListView) listView;
dynamicListView.setItemsList(listAdapter.getObjects());
dynamicListView.setActiveItemsList(listAdapter.getActiveObjects());
updateListAdapter(listAdapter, listener);
} else if (DashboardType.WAYPOINTS_EDIT == visibleType) {
deletedPoints.clear();
@ -643,7 +637,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
if (this.nightMode != nightMode) {
this.nightMode = nightMode;
applyDayNightMode();
applyDayNightMode();
}
final ArrayAdapter<?> listAdapter = cm.createListAdapter(mapActivity, !nightMode);
OnItemClickListener listener = getOptionsMenuOnClickListener(cm, listAdapter);
@ -1087,4 +1081,54 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
return settings.registerBooleanPreference(SHOULD_SHOW + tag, true).makeGlobal().get();
}
}
@Override
public void onItemsSwapped(final List<Object> items) {
getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
if (visibleType == DashboardType.WAYPOINTS) {
List<TargetPoint> allTargets = new ArrayList<>();
if (items != null) {
for (Object obj : items) {
if (obj instanceof LocationPointWrapper) {
LocationPointWrapper p = (LocationPointWrapper) obj;
if (p.getPoint() instanceof TargetPoint) {
TargetPoint t = (TargetPoint) p.getPoint();
if (!t.start) {
t.intermediate = true;
allTargets.add(t);
}
}
}
}
if (allTargets.size() > 0) {
allTargets.get(allTargets.size() - 1).intermediate = false;
}
}
getMyApplication().getTargetPointsHelper().reorderAllTargetPoints(allTargets, false);
newRouteIsCalculated(false, null);
getMyApplication().getTargetPointsHelper().updateRouteAndReferesh(true);
}
}
}, 50);
}
@Override
public void newRouteIsCalculated(boolean newRoute, ValueHolder<Boolean> showToast) {
if ((DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType)
&& listAdapter != null && listAdapter instanceof StableArrayAdapter) {
StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter;
waypointDialogHelper.reloadListAdapter(stableAdapter);
if (listView instanceof DynamicListView) {
DynamicListView dynamicListView = (DynamicListView) listView;
dynamicListView.setItemsList(stableAdapter.getObjects());
dynamicListView.setActiveItemsList(stableAdapter.getActiveObjects());
}
}
}
@Override
public void routeWasCancelled() {
}
}

View file

@ -74,7 +74,7 @@ public class AvoidSpecificRoads {
ImageButton remove = (ImageButton) v.findViewById(R.id.info_close);
remove.setVisibility(View.VISIBLE);
remove.setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_action_gremove_dark));
R.drawable.ic_action_remove_dark));
remove.setOnClickListener(new View.OnClickListener() {
@Override

View file

@ -4,8 +4,6 @@ import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
@ -19,18 +17,20 @@ import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.LocationPoint;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.activities.IntermediatePointsDialog;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.controls.StableArrayAdapter;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
@ -62,39 +62,74 @@ public class WaypointDialogHelper {
public static void updatePointInfoView(final OsmandApplication app, final Activity activity,
View localView, final LocationPointWrapper ps,
final boolean mapCenter, final boolean nightMode) {
final boolean mapCenter, final boolean nightMode,
final boolean edit) {
WaypointHelper wh = app.getWaypointHelper();
final LocationPoint point = ps.getPoint();
TextView text = (TextView) localView.findViewById(R.id.waypoint_text);
AndroidUtils.setTextPrimaryColor(activity, text, nightMode);
TextView textShadow = (TextView) localView.findViewById(R.id.waypoint_text_shadow);
localView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showOnMap(app, activity, point, mapCenter);
}
});
TextView textDist = (TextView) localView.findViewById(R.id.waypoint_dist);
((ImageView) localView.findViewById(R.id.waypoint_icon)).setImageDrawable(ps.getDrawable(activity, app));
int dist = -1;
if (!wh.isRouteCalculated()) {
if (activity instanceof MapActivity) {
dist = (int) MapUtils.getDistance(((MapActivity) activity).getMapView().getLatitude(), ((MapActivity) activity)
.getMapView().getLongitude(), point.getLatitude(), point.getLongitude());
}
} else {
dist = wh.getRouteDistance(ps);
if (!edit) {
localView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showOnMap(app, activity, point, mapCenter);
}
});
}
TextView textDist = (TextView) localView.findViewById(R.id.waypoint_dist);
((ImageView) localView.findViewById(R.id.waypoint_icon)).setImageDrawable(ps.getDrawable(activity, app, nightMode));
int dist = -1;
boolean startPoint = ps.type == WaypointHelper.TARGETS && ((TargetPoint) ps.point).start;
if (!startPoint) {
if (!wh.isRouteCalculated()) {
if (activity instanceof MapActivity) {
dist = (int) MapUtils.getDistance(((MapActivity) activity).getMapView().getLatitude(), ((MapActivity) activity)
.getMapView().getLongitude(), point.getLatitude(), point.getLongitude());
}
} else {
dist = wh.getRouteDistance(ps);
}
}
String pointDescription = "";
TextView descText = (TextView) localView.findViewById(R.id.waypoint_desc_text);
if (descText != null) {
AndroidUtils.setTextSecondaryColor(activity, descText, nightMode);
switch (ps.type) {
case WaypointHelper.TARGETS:
TargetPoint targetPoint = (TargetPoint) ps.point;
if (targetPoint.start) {
pointDescription = activity.getResources().getString(R.string.starting_point);
} else {
pointDescription = targetPoint.getPointDescription(activity).getTypeName();
}
break;
case WaypointHelper.FAVORITES:
FavouritePoint favPoint = (FavouritePoint) ps.point;
pointDescription = favPoint.getCategory();
break;
}
}
if (dist > 0) {
String dd = OsmAndFormatter.getFormattedDistance(dist, app);
if (ps.deviationDistance > 0) {
dd += "\n+" + OsmAndFormatter.getFormattedDistance(ps.deviationDistance, app);
dd += " +" + OsmAndFormatter.getFormattedDistance(ps.deviationDistance, app);
}
textDist.setText(dd);
if (!Algorithms.isEmpty(pointDescription)) {
pointDescription = "" + pointDescription;
}
} else {
textDist.setText("");
}
if (descText != null) {
descText.setText(pointDescription);
}
String descr;
PointDescription pd = point.getPointDescription(app);
if (Algorithms.isEmpty(pd.getName())) {
@ -113,18 +148,33 @@ public class WaypointDialogHelper {
// 0);
}
private List<Object> getActivePoints(List<Object> points) {
List<Object> activePoints = new ArrayList<>();
for (Object p : points) {
if (p instanceof LocationPointWrapper) {
LocationPointWrapper w = (LocationPointWrapper) p;
if (w.type == WaypointHelper.TARGETS && !((TargetPoint) w.point).start) {
activePoints.add(p);
}
}
}
return activePoints;
}
public ArrayAdapter<Object> getWaypointsDrawerAdapter(
public StableArrayAdapter getWaypointsDrawerAdapter(
final boolean edit, final List<LocationPointWrapper> deletedPoints,
final MapActivity ctx, final int[] running, final boolean flat, final boolean nightMode) {
final List<Object> points;
if (flat) {
points = new ArrayList<Object>(waypointHelper.getAllPoints());
} else {
points = getPoints();
}
return new ArrayAdapter<Object>(ctx,
R.layout.waypoint_reached, R.id.title, points) {
List<Object> activePoints = getActivePoints(points);
return new StableArrayAdapter(ctx,
R.layout.waypoint_reached, R.id.title, points, activePoints) {
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
@ -139,56 +189,76 @@ public class WaypointDialogHelper {
final int type = ((RadiusItem) obj).type;
v = createItemForRadiusProximity(ctx, type, running, position, thisAdapter, nightMode);
//Drawable d = new ColorDrawable(mapActivity.getResources().getColor(R.color.dashboard_divider_light));
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
} else if (labelView) {
v = createItemForCategory(ctx, (Integer) obj, running, position, thisAdapter, nightMode);
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
} else if (topDividerView) {
v = ctx.getLayoutInflater().inflate(R.layout.card_top_divider, null);
} else if (bottomDividerView) {
v = ctx.getLayoutInflater().inflate(R.layout.card_bottom_divider, null);
} else if (obj instanceof LocationPointWrapper) {
LocationPointWrapper point = (LocationPointWrapper) obj;
v = updateWaypointItemView(edit, deletedPoints, app, ctx, v, point, this, nightMode);
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
v = updateWaypointItemView(edit, deletedPoints, app, ctx, v, point, this,
nightMode, flat);
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
}
return v;
}
};
}
public static View updateWaypointItemView(final boolean edit, final List<LocationPointWrapper> deletedPoints,
final OsmandApplication app, final Activity ctx, View v, final LocationPointWrapper point,
final ArrayAdapter adapter, final boolean nightMode) {
final OsmandApplication app, final Activity ctx, View v,
final LocationPointWrapper point,
final ArrayAdapter adapter, final boolean nightMode,
final boolean flat) {
if (v == null || v.findViewById(R.id.info_close) == null) {
v = ctx.getLayoutInflater().inflate(R.layout.waypoint_reached, null);
}
updatePointInfoView(app, ctx, v, point, true, nightMode);
updatePointInfoView(app, ctx, v, point, true, nightMode, edit);
View more = v.findViewById(R.id.all_points);
View move = v.findViewById(R.id.info_move);
View remove = v.findViewById(R.id.info_close);
if (!edit) {
remove.setVisibility(View.GONE);
move.setVisibility(View.GONE);
more.setVisibility(View.GONE);
} else if (point.type == WaypointHelper.TARGETS && !flat) {
if (((TargetPoint) point.point).start) {
remove.setVisibility(View.GONE);
move.setVisibility(View.GONE);
more.setVisibility(View.VISIBLE);
((ImageButton) more).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.map_overflow_menu_white, !nightMode));
more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//hideDashboard();
IntermediatePointsDialog.openIntermediatePointsDialog(ctx, app, true);
}
});
} else {
remove.setVisibility(View.GONE);
move.setVisibility(View.VISIBLE);
more.setVisibility(View.GONE);
((ImageView) move).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_flat_list_dark, !nightMode));
}
} else {
remove.setVisibility(View.VISIBLE);
move.setVisibility(View.GONE);
more.setVisibility(View.GONE);
((ImageButton) remove).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_action_gremove_dark, !nightMode));
R.drawable.ic_action_remove_dark, !nightMode));
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ArrayList<LocationPointWrapper> arr = new ArrayList<>();
arr.add(point);
app.getWaypointHelper().removeVisibleLocationPoint(arr);
deletedPoints.add(point);
if (adapter != null) {
adapter.remove(point);
@ -204,11 +274,38 @@ public class WaypointDialogHelper {
protected View createItemForRadiusProximity(final FragmentActivity ctx, final int type, final int[] running,
final int position, final ArrayAdapter<Object> thisAdapter, boolean nightMode) {
View v;
IconsCache iconsCache = app.getIconsCache();
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius, null);
if (type == WaypointHelper.POI) {
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius_ex, null);
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.titleEx), nightMode);
String descEx = waypointHelper.getPoiFilter() == null ? ctx.getString(R.string.poi) : waypointHelper
.getPoiFilter().getName();
((TextView) v.findViewById(R.id.title)).setText(ctx.getString(R.string.search_radius_proximity) + ":");
((TextView) v.findViewById(R.id.titleEx)).setText(ctx.getString(R.string.shared_string_type) + ":");
final TextView radiusEx = (TextView) v.findViewById(R.id.descriptionEx);
radiusEx.setText(descEx);
radiusEx.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
running[0] = position;
thisAdapter.notifyDataSetInvalidated();
MapActivity map = (MapActivity) ctx;
final PoiUIFilter[] selected = new PoiUIFilter[1];
AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected);
dlg.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
enableType(running, thisAdapter, type, true);
}
});
}
});
} else {
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius, null);
((TextView) v.findViewById(R.id.title)).setText(ctx.getString(R.string.search_radius_proximity));
}
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.title), nightMode);
final TextView radius = (TextView) v.findViewById(R.id.description);
((ImageView) v.findViewById(R.id.waypoint_icon)).setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_poi_radius_dark, !nightMode));
radius.setText(OsmAndFormatter.getFormattedDistance(waypointHelper.getSearchDeviationRadius(type), app));
radius.setOnClickListener(new View.OnClickListener() {
@Override
@ -249,26 +346,6 @@ public class WaypointDialogHelper {
TextView tv = (TextView) v.findViewById(R.id.header_text);
AndroidUtils.setTextPrimaryColor(mapActivity, tv, nightMode);
tv.setText(getHeader(type, checked, ctx));
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (type == WaypointHelper.POI && btn.isChecked()) {
running[0] = position;
thisAdapter.notifyDataSetInvalidated();
MapActivity map = (MapActivity) ctx;
final PoiUIFilter[] selected = new PoiUIFilter[1];
AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected);
dlg.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (selected != null) {
enableType(running, thisAdapter, type, true);
}
}
});
}
}
});
return v;
}
@ -305,11 +382,7 @@ public class WaypointDialogHelper {
protected void onPostExecute(Void result) {
running[0] = -1;
listAdapter.clear();
for (Object point : getPoints()) {
listAdapter.add(point);
}
listAdapter.notifyDataSetChanged();
reloadListAdapter(listAdapter);
}
}.execute((Void) null);
}
@ -372,15 +445,23 @@ public class WaypointDialogHelper {
protected void onPostExecute(Void result) {
running[0] = -1;
listAdapter.clear();
for (Object point : getPoints()) {
listAdapter.add(point);
}
listAdapter.notifyDataSetChanged();
reloadListAdapter(listAdapter);
}
}.execute((Void) null);
}
public void reloadListAdapter(ArrayAdapter<Object> listAdapter) {
listAdapter.clear();
List<Object> points = getPoints();
for (Object point : points) {
listAdapter.add(point);
}
if (listAdapter instanceof StableArrayAdapter) {
((StableArrayAdapter) listAdapter).updateObjects(points, getActivePoints(points));
}
listAdapter.notifyDataSetChanged();
}
protected String getHeader(int type, boolean checked, Activity ctx) {
String str = ctx.getString(R.string.waypoints);
switch (type) {
@ -397,8 +478,7 @@ public class WaypointDialogHelper {
str = ctx.getString(R.string.waypoints);
break;
case WaypointHelper.POI:
str = waypointHelper.getPoiFilter() == null || !checked ? ctx.getString(R.string.poi) : waypointHelper
.getPoiFilter().getName();
str = ctx.getString(R.string.poi);
break;
}
return str;
@ -416,7 +496,33 @@ public class WaypointDialogHelper {
points.add(true);
}
points.add(i);
if ((i == WaypointHelper.POI || i == WaypointHelper.FAVORITES || i == WaypointHelper.WAYPOINTS)
if (i == WaypointHelper.TARGETS && rc) {
TargetPoint start = app.getTargetPointsHelper().getPointToStart();
if (start == null) {
LatLon latLon;
Location loc = app.getLocationProvider().getLastKnownLocation();
if (loc != null) {
latLon = new LatLon(loc.getLatitude(), loc.getLongitude());
} else {
latLon = new LatLon(mapActivity.getMapView().getLatitude(),
mapActivity.getMapView().getLongitude());
}
start = TargetPoint.createStartPoint(latLon,
new PointDescription(PointDescription.POINT_TYPE_MY_LOCATION,
mapActivity.getString(R.string.shared_string_my_location)));
} else {
String oname = start.getOnlyName().length() > 0 ? start.getOnlyName()
: (mapActivity.getString(R.string.route_descr_map_location)
+ " " + mapActivity.getString(R.string.route_descr_lat_lon, start.getLatitude(), start.getLongitude()));
start = TargetPoint.createStartPoint(new LatLon(start.getLatitude(), start.getLongitude()),
new PointDescription(PointDescription.POINT_TYPE_LOCATION,
oname));
}
points.add(new LocationPointWrapper(null, WaypointHelper.TARGETS, start, 0f, 0));
} else if ((i == WaypointHelper.POI || i == WaypointHelper.FAVORITES || i == WaypointHelper.WAYPOINTS)
&& rc) {
if (waypointHelper.isTypeEnabled(i)) {
points.add(new RadiusItem(i));
@ -435,6 +541,11 @@ public class WaypointDialogHelper {
if (!(a instanceof MapActivity)) {
return;
}
app.getSettings().setMapLocationToShow(locationPoint.getLatitude(), locationPoint.getLongitude(),
15, locationPoint.getPointDescription(a), false, locationPoint);
MapActivity.launchMapActivityMoveToTop(a);
/*
MapActivity ctx = (MapActivity) a;
AnimateDraggingMapThread thread = ctx.getMapView().getAnimatedDraggingThread();
int fZoom = ctx.getMapView().getZoom() < 15 ? 15 : ctx.getMapView().getZoom();
@ -467,15 +578,9 @@ public class WaypointDialogHelper {
new LatLon(locationPoint.getLatitude(), locationPoint.getLongitude()),
locationPoint.getPointDescription(ctx),
locationPoint);
/*
ctx.getMapLayers().getContextMenuLayer().setSelectedObject(locationPoint);
ctx.getMapLayers()
.getContextMenuLayer()
.setLocation(new LatLon(locationPoint.getLatitude(), locationPoint.getLongitude()),
PointDescription.getSimpleName(locationPoint, ctx));
*/
}
}
*/
}
}

View file

@ -19,6 +19,8 @@ import net.osmand.data.Amenity.AmenityRoutePoint;
import net.osmand.data.LocationPoint;
import net.osmand.data.PointDescription;
import net.osmand.osm.PoiType;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings.MetricsConstants;
@ -33,6 +35,7 @@ import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.VoiceRouter;
import net.osmand.util.MapUtils;
import android.content.Context;
import android.graphics.drawable.Drawable;
@ -71,17 +74,16 @@ public class WaypointHelper {
private long announcedAlarmTime;
public WaypointHelper(OsmandApplication application) {
app = application;
}
public List<LocationPointWrapper> getWaypoints(int type) {
if(type == TARGETS) {
if (type == TARGETS) {
return getTargets(new ArrayList<WaypointHelper.LocationPointWrapper>());
}
if(type >= locationPoints.size()) {
if (type >= locationPoints.size()) {
return Collections.emptyList();
}
return locationPoints.get(type);
@ -98,7 +100,7 @@ public class WaypointHelper {
}
public void removeVisibleLocationPoint(LocationPointWrapper lp) {
if(lp.type < locationPoints.size()) {
if (lp.type < locationPoints.size()) {
locationPoints.get(lp.type).remove(lp);
}
}
@ -108,11 +110,11 @@ public class WaypointHelper {
boolean[] checkedIntermediates = null;
for (LocationPointWrapper lp : points) {
if (lp.type == TARGETS) {
if(checkedIntermediates == null) {
if (checkedIntermediates == null) {
checkedIntermediates = new boolean[ps.size()];
Arrays.fill(checkedIntermediates, true);
}
if(((TargetPoint) lp.point).intermediate) {
if (((TargetPoint) lp.point).intermediate) {
checkedIntermediates[((TargetPoint) lp.point).index] = false;
} else {
checkedIntermediates[ps.size() - 1] = false;
@ -121,33 +123,33 @@ public class WaypointHelper {
locationPoints.get(lp.type).remove(lp);
}
}
if(checkedIntermediates != null) {
if (checkedIntermediates != null) {
IntermediatePointsDialog.commitPointsRemoval(app, checkedIntermediates);
}
}
public LocationPointWrapper getMostImportantLocationPoint(List<LocationPointWrapper> list ) {
public LocationPointWrapper getMostImportantLocationPoint(List<LocationPointWrapper> list) {
//Location lastProjection = app.getRoutingHelper().getLastProjection();
if(list != null) {
if (list != null) {
list.clear();
}
LocationPointWrapper found = null;
for (int type = 0; type < locationPoints.size(); type++) {
if(type == ALARMS || type == TARGETS) {
if (type == ALARMS || type == TARGETS) {
continue;
}
int kIterator = pointsProgress.get(type);
List<LocationPointWrapper> lp = locationPoints.get(type);
while(kIterator < lp.size()) {
while (kIterator < lp.size()) {
LocationPointWrapper lwp = lp.get(kIterator);
if(lp.get(kIterator).routeIndex < route.getCurrentRoute()) {
if (lp.get(kIterator).routeIndex < route.getCurrentRoute()) {
// skip
} else {
if(route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS ) {
if(found == null || found.routeIndex < lwp.routeIndex) {
if (route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS) {
if (found == null || found.routeIndex < lwp.routeIndex) {
found = lwp;
if(list != null) {
if (list != null) {
list.add(lwp);
}
}
@ -200,26 +202,26 @@ public class WaypointHelper {
public void enableWaypointType(int type, boolean enable) {
//An item will be displayed in the Waypoint list if either "Show..." or "Announce..." is selected for it in the Navigation settings
//Keep both "Show..." and "Announce..." Nav settings in sync when user changes what to display in the Waypoint list, as follows:
if(type == ALARMS) {
if (type == ALARMS) {
app.getSettings().SHOW_TRAFFIC_WARNINGS.set(enable);
app.getSettings().SPEAK_TRAFFIC_WARNINGS.set(enable);
app.getSettings().SHOW_PEDESTRIAN.set(enable);
app.getSettings().SPEAK_PEDESTRIAN.set(enable);
//But do not implicitly change speed_cam settings here because of legal restrictions in some countries, so Nav settings must prevail
} else if(type == POI) {
} else if (type == POI) {
app.getSettings().SHOW_NEARBY_POI.set(enable);
app.getSettings().ANNOUNCE_NEARBY_POI.set(enable);
} else if(type == FAVORITES) {
} else if (type == FAVORITES) {
app.getSettings().SHOW_NEARBY_FAVORITES.set(enable);
app.getSettings().ANNOUNCE_NEARBY_FAVORITES.set(enable);
} else if(type == WAYPOINTS) {
} else if (type == WAYPOINTS) {
app.getSettings().SHOW_WPT.set(enable);
app.getSettings().ANNOUNCE_WPT.set(enable);
}
recalculatePoints(route, type, locationPoints);
}
public void recalculatePoints(int type){
public void recalculatePoints(int type) {
recalculatePoints(route, type, locationPoints);
}
@ -230,14 +232,14 @@ public class WaypointHelper {
public boolean isTypeVisible(int waypointType) {
boolean vis = app.getAppCustomization().isWaypointGroupVisible(waypointType, route);
if(!vis) {
if (!vis) {
return false;
}
return vis;
}
public boolean isTypeEnabled(int type) {
if(type == ALARMS) {
if (type == ALARMS) {
return showAlarms() || announceAlarms();
} else if (type == POI) {
//no SHOW item in nav settings, hence only query ANNOUNCE here (makes inital Waypoint dialogue consistent with nav settings)
@ -256,9 +258,9 @@ public class WaypointHelper {
}
public AlarmInfo calculateMostImportantAlarm(RouteDataObject ro, Location loc,
MetricsConstants mc, boolean showCameras) {
MetricsConstants mc, boolean showCameras) {
boolean direction = true;
if(loc.hasBearing()) {
if (loc.hasBearing()) {
double diff = MapUtils.alignAngleDifference(ro.directionRoute(0, true) -
loc.getBearing() / (2 * Math.PI));
direction = Math.abs(diff) < Math.PI;
@ -279,8 +281,8 @@ public class WaypointHelper {
AlarmInfo info = AlarmInfo.createAlarmInfo(typeRule, 0, loc);
if (info != null) {
if (info.getType() != AlarmInfoType.SPEED_CAMERA || showCameras) {
long ms = System.currentTimeMillis() ;
if(ms - announcedAlarmTime > 50 * 1000) {
long ms = System.currentTimeMillis();
if (ms - announcedAlarmTime > 50 * 1000) {
announcedAlarmTime = ms;
getVoiceRouter().announceAlarm(info.getType());
}
@ -319,15 +321,15 @@ public class WaypointHelper {
List<LocationPointWrapper> approachPoints = new ArrayList<LocationPointWrapper>();
List<LocationPointWrapper> announcePoints = new ArrayList<LocationPointWrapper>();
List<LocationPointWrapper> lp = locationPoints.get(type);
if(lp != null) {
if (lp != null) {
int kIterator = pointsProgress.get(type);
while(kIterator < lp.size() && lp.get(kIterator).routeIndex < currentRoute) {
while (kIterator < lp.size() && lp.get(kIterator).routeIndex < currentRoute) {
kIterator++;
}
pointsProgress.set(type, kIterator);
while(kIterator < lp.size()) {
while (kIterator < lp.size()) {
LocationPointWrapper lwp = lp.get(kIterator);
if(route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2){
if (route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2) {
break;
}
LocationPoint point = lwp.point;
@ -350,7 +352,7 @@ public class WaypointHelper {
kIterator++;
}
if (!announcePoints.isEmpty()) {
if(announcePoints.size() > ANNOUNCE_POI_LIMIT) {
if (announcePoints.size() > ANNOUNCE_POI_LIMIT) {
announcePoints = announcePoints.subList(0, ANNOUNCE_POI_LIMIT);
}
if (type == WAYPOINTS) {
@ -364,7 +366,7 @@ public class WaypointHelper {
}
}
if (!approachPoints.isEmpty()) {
if(approachPoints.size() > APPROACH_POI_LIMIT) {
if (approachPoints.size() > APPROACH_POI_LIMIT) {
approachPoints = approachPoints.subList(0, APPROACH_POI_LIMIT);
}
if (type == WAYPOINTS) {
@ -373,10 +375,10 @@ public class WaypointHelper {
getVoiceRouter().approachPoi(lastKnownLocation, approachPoints);
} else if (type == ALARMS) {
EnumSet<AlarmInfoType> ait = EnumSet.noneOf(AlarmInfoType.class);
for(LocationPointWrapper pw : approachPoints) {
for (LocationPointWrapper pw : approachPoints) {
ait.add(((AlarmInfo) pw.point).getType());
}
for(AlarmInfoType t : ait) {
for (AlarmInfoType t : ait) {
app.getRoutingHelper().getVoiceRouter().announceAlarm(t);
}
} else if (type == FAVORITES) {
@ -418,8 +420,8 @@ public class WaypointHelper {
for (int k = 0; k < wts.size(); k++) {
final int index = wts.size() - k - 1;
TargetPoint tp = wts.get(index);
int routeIndex ;
if(route == null) {
int routeIndex;
if (route == null) {
routeIndex = k == 0 ? Integer.MAX_VALUE : index;
} else {
routeIndex = k == 0 ? route.getImmutableAllLocations().size() - 1 : route.getIndexOfIntermediate(k - 1);
@ -459,7 +461,7 @@ public class WaypointHelper {
sortList(array);
}
}
if((type == ALARMS || all)) {
if ((type == ALARMS || all)) {
final List<LocationPointWrapper> array = clearAndGetArray(locationPoints, ALARMS);
calculateAlarms(route, array);
sortList(array);
@ -473,9 +475,9 @@ public class WaypointHelper {
sortList(array);
}
}
if((type == POI || all)) {
if ((type == POI || all)) {
final List<LocationPointWrapper> array = clearAndGetArray(locationPoints, POI);
if(showPOI()) {
if (showPOI()) {
calculatePoi(route, array);
sortList(array);
}
@ -486,13 +488,13 @@ public class WaypointHelper {
private float dist(LocationPoint l, List<Location> locations, int[] ind) {
float dist = Float.POSITIVE_INFINITY;
// Special iterations because points stored by pairs!
for (int i = 1; i < locations.size(); i ++) {
for (int i = 1; i < locations.size(); i++) {
final double ld = MapUtils.getOrthogonalDistance(
l.getLatitude(), l.getLongitude(),
locations.get(i - 1).getLatitude(), locations.get(i - 1).getLongitude(),
locations.get(i).getLatitude(), locations.get(i).getLongitude());
if(ld < dist){
if(ind != null) {
if (ld < dist) {
if (ind != null) {
ind[0] = i;
}
dist = (float) ld;
@ -517,7 +519,7 @@ public class WaypointHelper {
public int compare(LocationPointWrapper olhs, LocationPointWrapper orhs) {
int lhs = olhs.routeIndex;
int rhs = orhs.routeIndex;
if(lhs == rhs) {
if (lhs == rhs) {
return Float.compare(olhs.deviationDistance, orhs.deviationDistance);
}
return lhs < rhs ? -1 : 1;
@ -545,17 +547,16 @@ public class WaypointHelper {
}
private void calculateAlarms(RouteCalculationResult route, List<LocationPointWrapper> array) {
for(AlarmInfo i : route.getAlarmInfo()) {
if(i.getType() == AlarmInfoType.SPEED_CAMERA) {
if(app.getSettings().SHOW_CAMERAS.get() || app.getSettings().SPEAK_SPEED_CAMERA.get()){
for (AlarmInfo i : route.getAlarmInfo()) {
if (i.getType() == AlarmInfoType.SPEED_CAMERA) {
if (app.getSettings().SHOW_CAMERAS.get() || app.getSettings().SPEAK_SPEED_CAMERA.get()) {
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
lw.setAnnounce(app.getSettings().SPEAK_SPEED_CAMERA.get());
array.add(lw);
}
} else {
if(app.getSettings().SHOW_TRAFFIC_WARNINGS.get() || app.getSettings().SPEAK_TRAFFIC_WARNINGS.get()){
if (app.getSettings().SHOW_TRAFFIC_WARNINGS.get() || app.getSettings().SPEAK_TRAFFIC_WARNINGS.get()) {
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
lw.setAnnounce(app.getSettings().SPEAK_TRAFFIC_WARNINGS.get());
array.add(lw);
@ -568,8 +569,8 @@ public class WaypointHelper {
private List<LocationPointWrapper> clearAndGetArray(List<List<LocationPointWrapper>> array,
int ind) {
while(array.size() <= ind) {
int ind) {
while (array.size() <= ind) {
array.add(new ArrayList<WaypointHelper.LocationPointWrapper>());
}
array.get(ind).clear();
@ -578,13 +579,13 @@ public class WaypointHelper {
private void findLocationPoints(RouteCalculationResult rt, int type, List<LocationPointWrapper> locationPoints,
List<? extends LocationPoint> points, boolean announce) {
List<? extends LocationPoint> points, boolean announce) {
List<Location> immutableAllLocations = rt.getImmutableAllLocations();
int[] ind = new int[1];
for(LocationPoint p : points) {
for (LocationPoint p : points) {
float dist = dist(p, immutableAllLocations, ind);
int rad = getSearchDeviationRadius(type);
if(dist <= rad) {
if (dist <= rad) {
LocationPointWrapper lpw = new LocationPointWrapper(rt, type, p, dist, ind[0]);
lpw.setAnnounce(announce);
locationPoints.add(lpw);
@ -597,6 +598,7 @@ public class WaypointHelper {
public PoiUIFilter getPoiFilter() {
return app.getPoiFilters().getFilterById(app.getSettings().SELECTED_POI_FILTER_FOR_MAP.get());
}
public boolean showPOI() {
return app.getSettings().SHOW_NEARBY_POI.get();
}
@ -662,10 +664,8 @@ public class WaypointHelper {
}
public Drawable getDrawable(Context uiCtx, OsmandApplication app) {
if(type == POI) {
public Drawable getDrawable(Context uiCtx, OsmandApplication app, boolean nightMode) {
if (type == POI) {
Amenity amenity = ((AmenityLocationPoint) point).a;
PoiType st = amenity.getType().getPoiTypeByKeyName(amenity.getSubType());
if (st != null) {
@ -678,36 +678,53 @@ public class WaypointHelper {
}
}
return null;
} else if(type == TARGETS) {
int i = !((TargetPoint)point).intermediate? R.drawable.list_destination :
R.drawable.list_intermediate;
return uiCtx.getResources().getDrawable(i);
} else if(type == FAVORITES || type == WAYPOINTS) {
} else if (type == TARGETS) {
IconsCache iconsCache = app.getIconsCache();
if (((TargetPoint) point).start) {
ApplicationMode appMode = app.getSettings().getApplicationMode();
return uiCtx.getResources().getDrawable(appMode.getResourceLocationDay());
} else if (((TargetPoint) point).intermediate) {
if (!nightMode) {
return iconsCache.getIcon(R.drawable.widget_intermediate_day, 0, 0f);
} else {
return iconsCache.getIcon(R.drawable.widget_intermediate_night, 0, 0f);
}
} else {
if (!nightMode) {
return iconsCache.getIcon(R.drawable.widget_target_day, 0, 0f);
} else {
return iconsCache.getIcon(R.drawable.widget_target_night, 0, 0f);
}
}
} else if (type == FAVORITES || type == WAYPOINTS) {
return FavoriteImageDrawable.getOrCreate(uiCtx, point.getColor(), false);
} else if(type == ALARMS) {
} else if (type == ALARMS) {
//assign alarm list icons manually for now
if(((AlarmInfo) point).getType().toString() == "SPEED_CAMERA") {
if (((AlarmInfo) point).getType().toString().equals("SPEED_CAMERA")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_highway_speed_camera);
} else if(((AlarmInfo) point).getType().toString() == "BORDER_CONTROL") {
} else if (((AlarmInfo) point).getType().toString().equals("BORDER_CONTROL")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_barrier_border_control);
} else if(((AlarmInfo) point).getType().toString() == "RAILWAY") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("RAILWAY")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_railways_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_railways);
}
} else if(((AlarmInfo) point).getType().toString() == "TRAFFIC_CALMING") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("TRAFFIC_CALMING")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_traffic_calming_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_traffic_calming);
}
} else if(((AlarmInfo) point).getType().toString() == "TOLL_BOOTH") {
} else if (((AlarmInfo) point).getType().toString().equals("TOLL_BOOTH")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_toll_booth);
} else if(((AlarmInfo) point).getType().toString() == "STOP") {
} else if (((AlarmInfo) point).getType().toString().equals("STOP")) {
return uiCtx.getResources().getDrawable(R.drawable.list_stop);
} else if(((AlarmInfo) point).getType().toString() == "PEDESTRIAN") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("PEDESTRIAN")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_pedestrian_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_pedestrian);
@ -715,6 +732,7 @@ public class WaypointHelper {
} else {
return null;
}
} else {
return null;
}
@ -724,6 +742,7 @@ public class WaypointHelper {
public int hashCode() {
return ((point == null) ? 0 : point.hashCode());
}
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -743,12 +762,12 @@ public class WaypointHelper {
}
public int getSearchDeviationRadius(int type){
public int getSearchDeviationRadius(int type) {
return type == POI ? poiSearchDeviationRadius : searchDeviationRadius;
}
public void setSearchDeviationRadius(int type, int radius){
if(type == POI) {
public void setSearchDeviationRadius(int type, int radius) {
if (type == POI) {
this.poiSearchDeviationRadius = radius;
} else {
this.searchDeviationRadius = radius;

View file

@ -143,13 +143,12 @@ public abstract class MenuTitleController {
protected void acquireStreetName() {
if (searchingAddress) {
cancelSearch = true;
searchingAddress = false;
getMapActivity().getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
acquireStreetName();
}
}, 50);
}, 100);
return;
}

View file

@ -65,6 +65,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
private boolean selectFromMapForTarget;
private boolean showMenu = false;
private boolean visible;
private MapActivity mapActivity;
private MapControlsLayer mapControlsLayer;
public static final String TARGET_SELECT = "TARGET_SELECT";
@ -375,7 +376,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
}
public boolean isVisible() {
return findMenuFragment() != null;
return visible;
}
public WeakReference<MapRouteInfoMenuFragment> findMenuFragment() {
@ -602,29 +603,34 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
}
public void onDismiss() {
visible = false;
mapActivity.getMapView().setMapPositionX(0);
mapActivity.getMapView().refreshMap();
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin), false);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_right_widgets_panel), true);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_left_widgets_panel), true);
if (switched) {
mapControlsLayer.switchToRouteFollowingLayout();
}
}
public void show() {
visible = true;
switched = mapControlsLayer.switchToRoutePlanningLayout();
boolean refreshMap = !switched;
boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
if (!portrait) {
mapActivity.getMapView().setMapPositionX(1);
mapActivity.getMapView().refreshMap();
refreshMap = true;
}
if (refreshMap) {
mapActivity.refreshMap();
}
MapRouteInfoMenuFragment.showInstance(mapActivity);
if (!AndroidUiHelper.isXLargeDevice(mapActivity)) {
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_right_widgets_panel), false);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_left_widgets_panel), false);
}
if (!portrait) {
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin), true);
@ -635,6 +641,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
WeakReference<MapRouteInfoMenuFragment> fragmentRef = findMenuFragment();
if (fragmentRef != null) {
fragmentRef.get().dismiss();
} else {
visible = false;
}
}
@ -677,7 +685,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
label.setText(row.text);
Drawable icon = mapActivity.getMyApplication().getIconsCache().getContentIcon(row.iconId);
label.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
label.setCompoundDrawablePadding(dpToPx(12f));
label.setCompoundDrawablePadding(dpToPx(16f));
label.setPadding(dpToPx((16f)), 0, 0, 0);
return label;
}

View file

@ -609,6 +609,7 @@ public class RoutingHelper {
voiceRouter.newRouteIsCalculated(newRoute);
}
}
app.getWaypointHelper().setNewRoute(res);
app.runInUIThread(new Runnable() {
@Override
@ -616,10 +617,10 @@ public class RoutingHelper {
ValueHolder<Boolean> showToast = new ValueHolder<Boolean>();
showToast.value = true;
Iterator<WeakReference<IRouteInformationListener>> it = listeners.iterator();
while(it.hasNext()) {
while (it.hasNext()) {
WeakReference<IRouteInformationListener> ref = it.next();
IRouteInformationListener l = ref.get();
if(l == null) {
if (l == null) {
it.remove();
} else {
l.newRouteIsCalculated(newRoute, showToast);
@ -635,9 +636,6 @@ public class RoutingHelper {
}
}
});
app.getWaypointHelper().setNewRoute(res);
}
public int getLeftDistance(){

View file

@ -492,7 +492,7 @@ public class MapControlsLayer extends OsmandMapLayer {
((System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS) && routeFollowingMode);
updateMyLocation(rh, dialogOpened);
boolean showButtons = (showRouteCalculationControls || !routeFollowingMode);
routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_gabout_dark : R.drawable.map_directions);
//routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_gabout_dark : R.drawable.map_directions);
if (routePlanningMode || routeFollowingMode) {
routePlanningBtn.setIconResId(R.drawable.map_start_navigation);
routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
@ -534,7 +534,7 @@ public class MapControlsLayer extends OsmandMapLayer {
updateCompass(isNight);
for (MapHudButton mc : controls) {
mc.update(mapActivity.getMyApplication(), nightMode != null && nightMode.isNightMode());
mc.update(mapActivity.getMyApplication(), isNight);
}
}

View file

@ -0,0 +1,689 @@
package net.osmand.plus.views.controls;
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.HeaderViewListAdapter;
import android.widget.ListAdapter;
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
import java.util.List;
public class DynamicListView extends ObservableListView {
public final String TAG_DRAG_ICON = "DragIcon";
protected final int SMOOTH_SCROLL_AMOUNT_AT_EDGE = 15;
protected final int MOVE_DURATION = 150;
protected List<Object> mItemsList;
protected List<Object> mActiveItemsList;
private DynamicListViewCallbacks dCallbacks;
private int mLastEventY = -1;
protected int mDownY = -1;
protected int mDownX = -1;
private int mTotalOffset = 0;
private boolean mCellIsMobile = false;
private boolean mIsMobileScrolling = false;
private int mSmoothScrollAmountAtEdge = 0;
private boolean itemsSwapped = false;
protected final int INVALID_ID = -1;
private long mAboveItemId = INVALID_ID;
private long mMobileItemId = INVALID_ID;
private long mBelowItemId = INVALID_ID;
private BitmapDrawable mHoverCell;
private Rect mHoverCellCurrentBounds;
private Rect mHoverCellOriginalBounds;
protected final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;
private boolean mIsWaitingForScrollFinish = false;
private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;
public DynamicListView(Context context) {
super(context);
init(context);
}
public DynamicListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public DynamicListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context context) {
setOnScrollListener(mScrollListener);
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
mSmoothScrollAmountAtEdge = (int) (SMOOTH_SCROLL_AMOUNT_AT_EDGE / metrics.density);
}
public void setDynamicListViewCallbacks(DynamicListViewCallbacks callbacks) {
dCallbacks = callbacks;
}
/**
* Creates the hover cell with the appropriate bitmap and of appropriate
* size. The hover cell's BitmapDrawable is drawn on top of the bitmap every
* single time an invalidate call is made.
*/
private BitmapDrawable getAndAddHoverView(View v) {
int w = v.getWidth();
int h = v.getHeight();
int top = v.getTop();
int left = v.getLeft();
Bitmap b = getBitmapFromView(v);
BitmapDrawable drawable = new BitmapDrawable(getResources(), b);
mHoverCellOriginalBounds = new Rect(left, top, left + w, top + h);
mHoverCellCurrentBounds = new Rect(mHoverCellOriginalBounds);
drawable.setBounds(mHoverCellCurrentBounds);
return drawable;
}
/**
* Returns a bitmap showing a screenshot of the view passed in.
*/
private Bitmap getBitmapFromView(View v) {
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
v.draw(canvas);
Bitmap bitmapOut = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvasOut = new Canvas(bitmapOut);
canvasOut.drawColor(Color.TRANSPARENT);
Paint p = new Paint();
p.setAlpha(200);
canvasOut.drawBitmap(bitmap, 0, 0, p);
return bitmapOut;
}
public StableArrayAdapter getStableAdapter() {
ListAdapter listAdapter = getAdapter();
if (listAdapter instanceof HeaderViewListAdapter) {
listAdapter = ((HeaderViewListAdapter) listAdapter).getWrappedAdapter();
}
if (listAdapter instanceof StableArrayAdapter) {
return (StableArrayAdapter) listAdapter;
}
return null;
}
/**
* Stores a reference to the views above and below the item currently
* corresponding to the hover cell. It is important to note that if this
* item is either at the top or bottom of the list, mAboveItemId or mBelowItemId
* may be invalid.
*/
private void updateNeighborViewsForID(long itemID) {
ListAdapter adapter = getAdapter();
int position = getPositionForID(itemID);
int pos = position;
mAboveItemId = INVALID_ID;
while (mAboveItemId == INVALID_ID && pos > 0) {
pos--;
mAboveItemId = adapter.getItemId(pos);
if (mAboveItemId != INVALID_ID) {
Object obj = adapter.getItem(pos);
if (mActiveItemsList == null || !mActiveItemsList.contains(obj)) {
mAboveItemId = INVALID_ID;
}
}
}
pos = position;
mBelowItemId = INVALID_ID;
while (mBelowItemId == INVALID_ID && pos < mItemsList.size()) {
pos++;
mBelowItemId = adapter.getItemId(pos);
if (mBelowItemId != INVALID_ID) {
Object obj = adapter.getItem(pos);
if (mActiveItemsList == null || !mActiveItemsList.contains(obj)) {
mBelowItemId = INVALID_ID;
}
}
}
}
/**
* Retrieves the view in the list corresponding to itemID
*/
public View getViewForID(long itemID) {
if (itemID != INVALID_ID) {
int firstVisiblePosition = getFirstVisiblePosition();
ListAdapter adapter = getAdapter();
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
int position = firstVisiblePosition + i;
long id = adapter.getItemId(position);
if (id == itemID) {
return v;
}
}
}
return null;
}
public void setAllVisible() {
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
if (v != null && v.getVisibility() != VISIBLE) {
v.setVisibility(VISIBLE);
}
}
}
/**
* Retrieves the position in the list corresponding to itemID
*/
public int getPositionForID(long itemID) {
View v = getViewForID(itemID);
if (v == null) {
return -1;
} else {
return getPositionForView(v);
}
}
/**
* dispatchDraw gets invoked when all the child views are about to be drawn.
* By overriding this method, the hover cell (BitmapDrawable) can be drawn
* over the listview's items whenever the listview is redrawn.
*/
@Override
protected void dispatchDraw(@NonNull Canvas canvas) {
super.dispatchDraw(canvas);
if (mHoverCell != null) {
mHoverCell.draw(canvas);
}
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
if (!mCellIsMobile && mHoverCell == null) {
mDownX = (int) event.getX();
mDownY = (int) event.getY();
mActivePointerId = event.getPointerId(0);
// Find the view that the user pressed their finger down on.
View v = findViewAtPositionWithTag(getRootView(), (int) event.getRawX(), (int) event.getRawY(), TAG_DRAG_ICON);
// If the view contains a tag set to "DragIcon", it means that the user wants to
// reorder the list item.
if ((v != null) && (v.getTag() != null) && (v.getTag().equals(TAG_DRAG_ICON))) {
mTotalOffset = 0;
int position = pointToPosition(mDownX, mDownY);
if (position != INVALID_POSITION) {
Object item = getAdapter().getItem(position);
if (mActiveItemsList == null || mActiveItemsList.contains(item)) {
int itemNum = position - getFirstVisiblePosition();
itemsSwapped = false;
View selectedView = getChildAt(itemNum);
mMobileItemId = getAdapter().getItemId(position);
mHoverCell = getAndAddHoverView(selectedView);
selectedView.setVisibility(INVISIBLE);
mCellIsMobile = true;
updateNeighborViewsForID(mMobileItemId);
}
}
}
}
break;
case MotionEvent.ACTION_MOVE:
if (mActivePointerId == INVALID_POINTER_ID) {
break;
}
int pointerIndex = event.findPointerIndex(mActivePointerId);
mLastEventY = (int) event.getY(pointerIndex);
int deltaY = mLastEventY - mDownY;
if (mCellIsMobile && mHoverCell != null) {
mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left,
mHoverCellOriginalBounds.top + deltaY + mTotalOffset);
mHoverCell.setBounds(mHoverCellCurrentBounds);
invalidate();
handleCellSwitch();
mIsMobileScrolling = false;
handleMobileCellScroll();
return false;
}
break;
case MotionEvent.ACTION_UP:
touchEventsEnded();
break;
case MotionEvent.ACTION_CANCEL:
touchEventsCancelled();
break;
case MotionEvent.ACTION_POINTER_UP:
/* If a multitouch event took place and the original touch dictating
* the movement of the hover cell has ended, then the dragging event
* ends and the hover cell is animated to its corresponding position
* in the listview. */
pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = event.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
touchEventsEnded();
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
/**
* This method determines whether the hover cell has been shifted far enough
* to invoke a cell swap. If so, then the respective cell swap candidate is
* determined and the data set is changed. Upon posting a notification of the
* data set change, a layout is invoked to place the cells in the right place.
* Using a ViewTreeObserver and a corresponding OnPreDrawListener, we can
* offset the cell being swapped to where it previously was and then animate it to
* its new position.
*/
private void handleCellSwitch() {
final int deltaY = mLastEventY - mDownY;
final int deltaYTotal = mHoverCellOriginalBounds.top + mTotalOffset + deltaY;
View belowView = getViewForID(mBelowItemId);
View mobileView = getViewForID(mMobileItemId);
View aboveView = getViewForID(mAboveItemId);
boolean isBelow = (belowView != null) && (deltaYTotal > belowView.getTop());
boolean isAbove = (aboveView != null) && (deltaYTotal < aboveView.getTop());
if (isBelow || isAbove) {
final long switchItemID = isBelow ? mBelowItemId : mAboveItemId;
View switchView = isBelow ? belowView : aboveView;
final int originalItem = getPositionForView(mobileView) - getHeaderViewsCount();
final int switchItem = getPositionForView(switchView) - getHeaderViewsCount();
swapElements(originalItem, switchItem);
getStableAdapter().notifyDataSetChanged();
mDownY = mLastEventY;
final int switchViewStartTop = switchView.getTop();
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.KITKAT) {
mobileView.setVisibility(View.VISIBLE);
switchView.setVisibility(View.INVISIBLE);
}
updateNeighborViewsForID(mMobileItemId);
final ViewTreeObserver observer = getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
View switchView = getViewForID(switchItemID);
mTotalOffset += deltaY;
int switchViewNewTop = switchView.getTop();
int delta = switchViewStartTop - switchViewNewTop;
switchView.setTranslationY(delta);
ObjectAnimator animator = ObjectAnimator.ofFloat(switchView,
View.TRANSLATION_Y, 0);
animator.setDuration(MOVE_DURATION);
animator.start();
return true;
}
});
}
}
private void swapElements(int indexOne, int indexTwo) {
Object obj1 = mItemsList.get(indexOne);
Object obj2 = mItemsList.get(indexTwo);
mItemsList.set(indexOne, obj2);
mItemsList.set(indexTwo, obj1);
int index1 = mActiveItemsList.indexOf(obj1);
int index2 = mActiveItemsList.indexOf(obj2);
if (index1 != -1 && index2 != -1) {
mActiveItemsList.set(index1, obj2);
mActiveItemsList.set(index2, obj1);
itemsSwapped = true;
}
}
/**
* Resets all the appropriate fields to a default state while also animating
* the hover cell back to its correct location.
*/
private void touchEventsEnded() {
final View mobileView = getViewForID(mMobileItemId);
if (mCellIsMobile || mIsWaitingForScrollFinish) {
mCellIsMobile = false;
mIsWaitingForScrollFinish = false;
mIsMobileScrolling = false;
mActivePointerId = INVALID_POINTER_ID;
// If the autoscroller has not completed scrolling, we need to wait for it to
// finish in order to determine the final location of where the hover cell
// should be animated to.
if (mScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
mIsWaitingForScrollFinish = true;
return;
}
mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left, mobileView.getTop());
ObjectAnimator hoverViewAnimator = ObjectAnimator.ofObject(mHoverCell, "bounds",
sBoundEvaluator, mHoverCellCurrentBounds);
hoverViewAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
invalidate();
}
});
hoverViewAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
setEnabled(false);
}
@Override
public void onAnimationEnd(Animator animation) {
mAboveItemId = INVALID_ID;
mMobileItemId = INVALID_ID;
mBelowItemId = INVALID_ID;
setAllVisible();
mHoverCell = null;
setEnabled(true);
invalidate();
processSwapped();
}
});
hoverViewAnimator.start();
} else {
touchEventsCancelled();
}
}
/**
* Resets all the appropriate fields to a default state.
*/
private void touchEventsCancelled() {
if (mCellIsMobile) {
mAboveItemId = INVALID_ID;
mMobileItemId = INVALID_ID;
mBelowItemId = INVALID_ID;
setAllVisible();
mHoverCell = null;
invalidate();
processSwapped();
}
mCellIsMobile = false;
mIsMobileScrolling = false;
mActivePointerId = INVALID_POINTER_ID;
}
private void processSwapped() {
if (itemsSwapped) {
itemsSwapped = false;
if (dCallbacks != null) {
dCallbacks.onItemsSwapped(mActiveItemsList);
}
}
}
/**
* This TypeEvaluator is used to animate the BitmapDrawable back to its
* final location when the user lifts his finger by modifying the
* BitmapDrawable's bounds.
*/
private final static TypeEvaluator<Rect> sBoundEvaluator = new TypeEvaluator<Rect>() {
public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
return new Rect(interpolate(startValue.left, endValue.left, fraction),
interpolate(startValue.top, endValue.top, fraction),
interpolate(startValue.right, endValue.right, fraction),
interpolate(startValue.bottom, endValue.bottom, fraction));
}
public int interpolate(int start, int end, float fraction) {
return (int) (start + fraction * (end - start));
}
};
/**
* Determines whether this listview is in a scrolling state invoked
* by the fact that the hover cell is out of the bounds of the listview;
*/
private void handleMobileCellScroll() {
mIsMobileScrolling = handleMobileCellScroll(mHoverCellCurrentBounds);
}
/**
* This method is in charge of determining if the hover cell is above
* or below the bounds of the listview. If so, the listview does an appropriate
* upward or downward smooth scroll so as to reveal new items.
*/
public boolean handleMobileCellScroll(Rect r) {
int offset = computeVerticalScrollOffset();
int height = getHeight();
int extent = computeVerticalScrollExtent();
int range = computeVerticalScrollRange();
int hoverViewTop = r.top;
int hoverHeight = r.height();
if (hoverViewTop <= 0 && offset > 0) {
smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
return true;
}
if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
return true;
}
return false;
}
public void setItemsList(List<Object> itemsList) {
mItemsList = itemsList;
}
/*
* Define items which can be moved
* mActiveItemsList == null means all items are movable
*/
public void setActiveItemsList(List<Object> mActiveItemsList) {
this.mActiveItemsList = mActiveItemsList;
}
/**
* This scroll listener is added to the listview in order to handle cell swapping
* when the cell is either at the top or bottom edge of the listview. If the hover
* cell is at either edge of the listview, the listview will begin scrolling. As
* scrolling takes place, the listview continuously checks if new cells became visible
* and determines whether they are potential candidates for a cell swap.
*/
private AbsListView.OnScrollListener mScrollListener = new AbsListView.OnScrollListener() {
private int mPreviousFirstVisibleItem = -1;
private int mPreviousVisibleItemCount = -1;
private int mCurrentFirstVisibleItem;
private int mCurrentVisibleItemCount;
private int mCurrentScrollState;
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
mCurrentFirstVisibleItem = firstVisibleItem;
mCurrentVisibleItemCount = visibleItemCount;
mPreviousFirstVisibleItem = (mPreviousFirstVisibleItem == -1) ? mCurrentFirstVisibleItem
: mPreviousFirstVisibleItem;
mPreviousVisibleItemCount = (mPreviousVisibleItemCount == -1) ? mCurrentVisibleItemCount
: mPreviousVisibleItemCount;
checkAndHandleFirstVisibleCellChange();
checkAndHandleLastVisibleCellChange();
mPreviousFirstVisibleItem = mCurrentFirstVisibleItem;
mPreviousVisibleItemCount = mCurrentVisibleItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
mCurrentScrollState = scrollState;
mScrollState = scrollState;
isScrollCompleted();
}
/**
* This method is in charge of invoking 1 of 2 actions. Firstly, if the listview
* is in a state of scrolling invoked by the hover cell being outside the bounds
* of the listview, then this scrolling event is continued. Secondly, if the hover
* cell has already been released, this invokes the animation for the hover cell
* to return to its correct position after the listview has entered an idle scroll
* state.
*/
private void isScrollCompleted() {
if (mCurrentVisibleItemCount > 0 && mCurrentScrollState == SCROLL_STATE_IDLE) {
if (mCellIsMobile && mIsMobileScrolling) {
handleMobileCellScroll();
} else if (mIsWaitingForScrollFinish) {
touchEventsEnded();
}
}
}
/**
* Determines if the listview scrolled up enough to reveal a new cell at the
* top of the list. If so, then the appropriate parameters are updated.
*/
public void checkAndHandleFirstVisibleCellChange() {
if (mCurrentFirstVisibleItem != mPreviousFirstVisibleItem) {
if (mCellIsMobile && mMobileItemId != INVALID_ID) {
updateNeighborViewsForID(mMobileItemId);
handleCellSwitch();
}
}
}
/**
* Determines if the listview scrolled down enough to reveal a new cell at the
* bottom of the list. If so, then the appropriate parameters are updated.
*/
public void checkAndHandleLastVisibleCellChange() {
int currentLastVisibleItem = mCurrentFirstVisibleItem + mCurrentVisibleItemCount;
int previousLastVisibleItem = mPreviousFirstVisibleItem + mPreviousVisibleItemCount;
if (currentLastVisibleItem != previousLastVisibleItem) {
if (mCellIsMobile && mMobileItemId != INVALID_ID) {
updateNeighborViewsForID(mMobileItemId);
handleCellSwitch();
}
}
}
};
/**
* Returns the most inner view that contains the xy coordinate.
*
* @param v This method gets called recursively. The initial call should be the root view.
* @param x The X location to be tested.
* @param y The Y location to be tested.
* @return Returns the most inner view that contains the XY coordinate or null if no view could be found.
*/
private View findViewAtPositionWithTag(View v, int x, int y, String tag) {
View vXY = null;
if (v instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) v;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View c = viewGroup.getChildAt(i);
int loc[] = new int[2];
c.getLocationOnScreen(loc);
if ((x >= loc[0] && (x <= (loc[0] + c.getWidth()))) && (y >= loc[1] && (y <= (loc[1] + c.getHeight())))) {
vXY = c;
View viewAtPosition = findViewAtPositionWithTag(c, x, y, tag);
if ((viewAtPosition != null) && (viewAtPosition.getTag() != null) && viewAtPosition.getTag().equals(tag)) {
vXY = viewAtPosition;
break;
}
}
}
}
return vXY;
}
}

View file

@ -0,0 +1,9 @@
package net.osmand.plus.views.controls;
import java.util.List;
public interface DynamicListViewCallbacks {
void onItemsSwapped(final List<Object> items);
}

View file

@ -0,0 +1,66 @@
package net.osmand.plus.views.controls;
import android.content.Context;
import android.support.annotation.NonNull;
import android.widget.ArrayAdapter;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
public class StableArrayAdapter extends ArrayAdapter<Object> {
final int INVALID_ID = -1;
List<Object> objects;
List<Object> activeObjects;
HashMap<Object, Integer> mIdMap = new HashMap<>();
public StableArrayAdapter(Context context, int textViewResourceId, int titleId,
List<Object> objects, List<Object> activeObjects) {
super(context, textViewResourceId, titleId, objects);
updateObjects(objects, activeObjects);
}
public List<Object> getObjects() {
return objects;
}
public List<Object> getActiveObjects() {
return activeObjects;
}
public void updateObjects(List<Object> objects, List<Object> activeObjects) {
this.objects = objects;
this.activeObjects = activeObjects;
HashMap<Object, Integer> idMap = new HashMap<>();
for (int i = 0; i < objects.size(); ++i) {
idMap.put(objects.get(i), i);
}
mIdMap = idMap;
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mIdMap.size()) {
return INVALID_ID;
}
Object item = getItem(position);
if (mIdMap.containsKey(item)) {
return mIdMap.get(item);
} else {
return INVALID_ID;
}
}
@Override
public boolean hasStableIds() {
return true;
}
}

View file

@ -321,7 +321,7 @@ public class MapInfoWidgetsFactory {
boolean updated = updateVisibility(waypointInfoBar, true);
// pass top bar to make it clickable
WaypointDialogHelper.updatePointInfoView(map.getMyApplication(), map, topBar,
pnt, true, !map.getMyApplication().getSettings().isLightContent());
pnt, true, !map.getMyApplication().getSettings().isLightContent(), false);
if (updated || changed) {
ImageView all = (ImageView) waypointInfoBar.findViewById(R.id.waypoint_more);
ImageView remove = (ImageView) waypointInfoBar.findViewById(R.id.waypoint_close);