Merge pull request #10631 from osmandapp/gpx_context_menu_overview_actions
Gpx context menu overview actions
This commit is contained in:
commit
c970ff1f5f
11 changed files with 685 additions and 124 deletions
104
OsmAnd/res/layout/gpx_overview_fragment.xml
Normal file
104
OsmAnd/res/layout/gpx_overview_fragment.xml
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recycler_overview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/content_padding_small_half"
|
||||
android:clipToPadding="false"
|
||||
android:orientation="horizontal"
|
||||
tools:itemCount="4"
|
||||
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:listitem="@layout/item_gpx_stat_block" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="@dimen/dash_margin"
|
||||
android:paddingBottom="@dimen/dash_margin">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="@dimen/context_menu_transport_icon_size"
|
||||
android:layout_height="@dimen/context_menu_transport_icon_size"
|
||||
osmand:srcCompat="@drawable/ic_direction_arrow" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/distance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/content_padding_small_half"
|
||||
android:layout_marginLeft="@dimen/content_padding_small_half"
|
||||
android:maxLines="1"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:text="300 km" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginBottom="@dimen/content_padding"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="4">
|
||||
<!-- todo stretch buttons correctly -->
|
||||
|
||||
<include
|
||||
android:id="@+id/show_button"
|
||||
layout="@layout/item_gpx_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<Space
|
||||
android:layout_width="@dimen/content_padding_half"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/appearance_button"
|
||||
layout="@layout/item_gpx_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<Space
|
||||
android:layout_width="@dimen/content_padding_half"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/edit_button"
|
||||
layout="@layout/item_gpx_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<Space
|
||||
android:layout_width="@dimen/content_padding_half"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/directions_button"
|
||||
layout="@layout/item_gpx_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
21
OsmAnd/res/layout/item_gpx_action.xml
Normal file
21
OsmAnd/res/layout/item_gpx_action.xml
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/filled"
|
||||
android:layout_width="@dimen/fab_recycler_view_padding_bottom"
|
||||
android:layout_height="@dimen/setting_list_item_small_height"
|
||||
tools:alpha="0.1"
|
||||
tools:srcCompat="@drawable/bg_topbar_shield_exit_ref" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="@dimen/standard_icon_size"
|
||||
android:layout_height="@dimen/standard_icon_size"
|
||||
android:layout_gravity="center"
|
||||
tools:srcCompat="@drawable/ic_action_hide" />
|
||||
|
||||
</FrameLayout>
|
44
OsmAnd/res/layout/item_gpx_stat_block.xml
Normal file
44
OsmAnd/res/layout/item_gpx_stat_block.xml
Normal file
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/value"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@null"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium"
|
||||
tools:text="700 km" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="@dimen/context_menu_transport_icon_size"
|
||||
android:layout_height="@dimen/context_menu_transport_icon_size"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="@dimen/context_menu_first_line_top_margin"
|
||||
android:layout_marginLeft="@dimen/context_menu_first_line_top_margin"
|
||||
tools:src="@drawable/ic_action_track_16" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@null"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:text="@string/distance" />
|
||||
|
||||
</LinearLayout>
|
|
@ -43,12 +43,13 @@
|
|||
android:paddingStart="@dimen/context_menu_padding_margin_default"
|
||||
android:paddingLeft="@dimen/context_menu_padding_margin_default"
|
||||
android:paddingEnd="@dimen/context_menu_padding_margin_default"
|
||||
android:paddingRight="@dimen/context_menu_padding_margin_default">
|
||||
android:paddingRight="@dimen/context_menu_padding_margin_default"
|
||||
android:paddingBottom="@dimen/context_menu_direction_margin">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/context_menu_first_line_top_margin"
|
||||
android:layout_marginTop="@dimen/context_menu_second_line_top_margin"
|
||||
android:layout_marginEnd="@dimen/context_menu_padding_margin_default"
|
||||
android:layout_marginRight="@dimen/context_menu_padding_margin_default"
|
||||
android:layout_weight="1"
|
||||
|
@ -71,7 +72,8 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
tools:text="@string/amenity_type_finance" />
|
||||
android:visibility="gone"
|
||||
tools:text="@string/amenity_type_finance" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -79,7 +81,7 @@
|
|||
android:id="@+id/icon_view"
|
||||
android:layout_width="@dimen/map_widget_icon"
|
||||
android:layout_height="@dimen/map_widget_icon"
|
||||
android:layout_marginTop="@dimen/context_menu_padding_margin_default"
|
||||
android:layout_marginTop="@dimen/context_menu_second_line_top_margin"
|
||||
android:tint="?attr/default_icon_color"
|
||||
osmand:srcCompat="@drawable/ic_action_polygom_dark" />
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- <item-->
|
||||
<!-- android:id="@+id/action_overview"-->
|
||||
<!-- android:icon="@drawable/ic_action_trail_overview"-->
|
||||
<!-- android:title="@string/shared_string_overview" />-->
|
||||
|
||||
<item
|
||||
android:id="@+id/action_overview"
|
||||
android:icon="@drawable/ic_action_trail_overview"
|
||||
android:title="@string/shared_string_overview" />
|
||||
<item
|
||||
android:id="@+id/action_track"
|
||||
android:icon="@drawable/ic_action_polygom_dark"
|
||||
|
|
|
@ -274,6 +274,7 @@
|
|||
<color name="gpx_chart_green_label">#197d2a</color>
|
||||
|
||||
<color name="gpx_split_segment_icon_color">#b3b3b3</color>
|
||||
<color name="gpx_pale_green">#87CC70</color>
|
||||
|
||||
<color name="map_background_color_light">#fafafa</color>
|
||||
<color name="map_background_color_dark">#101821</color>
|
||||
|
|
|
@ -38,6 +38,7 @@ import net.osmand.plus.UiUtilities;
|
|||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.LineGraphType;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
||||
import net.osmand.plus.track.TrackDisplayHelper;
|
||||
|
@ -687,8 +688,50 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
|
|||
}
|
||||
|
||||
void openAnalyzeOnMap(GPXTabItemType tabType) {
|
||||
List<ILineDataSet> ds = getDataSets(null, tabType, null, null);
|
||||
actionsListener.openAnalyzeOnMap(gpxItem, ds, tabType);
|
||||
List<ILineDataSet> dataSets = getDataSets(null, tabType, null, null);
|
||||
prepareGpxItemChartTypes(gpxItem, dataSets);
|
||||
actionsListener.openAnalyzeOnMap(gpxItem);
|
||||
}
|
||||
|
||||
public static void prepareGpxItemChartTypes(GpxDisplayItem gpxItem, List<ILineDataSet> dataSets) {
|
||||
WptPt wpt = null;
|
||||
gpxItem.chartTypes = null;
|
||||
if (dataSets != null && dataSets.size() > 0) {
|
||||
gpxItem.chartTypes = new GPXDataSetType[dataSets.size()];
|
||||
for (int i = 0; i < dataSets.size(); i++) {
|
||||
OrderedLineDataSet orderedDataSet = (OrderedLineDataSet) dataSets.get(i);
|
||||
gpxItem.chartTypes[i] = orderedDataSet.getDataSetType();
|
||||
}
|
||||
if (gpxItem.chartHighlightPos != -1) {
|
||||
TrkSegment segment = null;
|
||||
for (Track t : gpxItem.group.getGpx().tracks) {
|
||||
for (TrkSegment s : t.segments) {
|
||||
if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) {
|
||||
segment = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
OrderedLineDataSet dataSet = (OrderedLineDataSet) dataSets.get(0);
|
||||
float distance = gpxItem.chartHighlightPos * dataSet.getDivX();
|
||||
for (WptPt p : segment.points) {
|
||||
if (p.distance >= distance) {
|
||||
wpt = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wpt != null) {
|
||||
gpxItem.locationOnMap = wpt;
|
||||
} else {
|
||||
gpxItem.locationOnMap = gpxItem.locationStart;
|
||||
}
|
||||
}
|
||||
|
||||
private void openSplitIntervalScreen() {
|
||||
|
|
|
@ -2,13 +2,9 @@ package net.osmand.plus.myplaces;
|
|||
|
||||
import android.view.View;
|
||||
|
||||
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface SegmentActionsListener {
|
||||
|
||||
void updateContent();
|
||||
|
@ -23,5 +19,5 @@ public interface SegmentActionsListener {
|
|||
|
||||
void showOptionsPopupMenu(View view, TrkSegment trkSegment, boolean confirmDeletion);
|
||||
|
||||
void openAnalyzeOnMap(GpxDisplayItem gpxItem, List<ILineDataSet> dataSets, GPXTabItemType tabType);
|
||||
void openAnalyzeOnMap(GpxDisplayItem gpxItem);
|
||||
}
|
||||
|
|
|
@ -22,16 +22,11 @@ import androidx.appcompat.app.AlertDialog;
|
|||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.FileUtils;
|
||||
import net.osmand.FileUtils.RenameCallback;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.Track;
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.PointDescription;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
|
@ -43,8 +38,6 @@ import net.osmand.plus.activities.MapActivity;
|
|||
import net.osmand.plus.activities.TrackActivity;
|
||||
import net.osmand.plus.base.OsmAndListFragment;
|
||||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
||||
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.track.SaveGpxAsyncTask;
|
||||
|
@ -299,55 +292,9 @@ public class TrackSegmentFragment extends OsmAndListFragment implements TrackBit
|
|||
}
|
||||
|
||||
@Override
|
||||
public void openAnalyzeOnMap(GpxDisplayItem gpxItem, List<ILineDataSet> dataSets, GPXTabItemType tabType) {
|
||||
LatLon location = null;
|
||||
WptPt wpt = null;
|
||||
gpxItem.chartTypes = null;
|
||||
if (dataSets != null && dataSets.size() > 0) {
|
||||
gpxItem.chartTypes = new GPXDataSetType[dataSets.size()];
|
||||
for (int i = 0; i < dataSets.size(); i++) {
|
||||
OrderedLineDataSet orderedDataSet = (OrderedLineDataSet) dataSets.get(i);
|
||||
gpxItem.chartTypes[i] = orderedDataSet.getDataSetType();
|
||||
}
|
||||
if (gpxItem.chartHighlightPos != -1) {
|
||||
TrkSegment segment = null;
|
||||
for (Track t : gpxItem.group.getGpx().tracks) {
|
||||
for (TrkSegment s : t.segments) {
|
||||
if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) {
|
||||
segment = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
OrderedLineDataSet dataSet = (OrderedLineDataSet) dataSets.get(0);
|
||||
float distance = gpxItem.chartHighlightPos * dataSet.getDivX();
|
||||
for (WptPt p : segment.points) {
|
||||
if (p.distance >= distance) {
|
||||
wpt = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (wpt != null) {
|
||||
location = new LatLon(wpt.lat, wpt.lon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (location == null) {
|
||||
location = new LatLon(gpxItem.locationStart.lat, gpxItem.locationStart.lon);
|
||||
}
|
||||
if (wpt != null) {
|
||||
gpxItem.locationOnMap = wpt;
|
||||
} else {
|
||||
gpxItem.locationOnMap = gpxItem.locationStart;
|
||||
}
|
||||
|
||||
public void openAnalyzeOnMap(GpxDisplayItem gpxItem) {
|
||||
OsmandSettings settings = app.getSettings();
|
||||
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
|
||||
settings.setMapLocationToShow(gpxItem.locationOnMap.lat, gpxItem.locationOnMap.lon,
|
||||
settings.getLastKnownMapZoom(),
|
||||
new PointDescription(PointDescription.POINT_TYPE_WPT, gpxItem.name),
|
||||
false,
|
||||
|
|
339
OsmAnd/src/net/osmand/plus/track/OverviewCard.java
Normal file
339
OsmAnd/src/net/osmand/plus/track/OverviewCard.java
Normal file
|
@ -0,0 +1,339 @@
|
|||
package net.osmand.plus.track;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.AppCompatImageView;
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView.ItemDecoration;
|
||||
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||
import net.osmand.plus.myplaces.SegmentActionsListener;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
|
||||
import net.osmand.plus.widgets.TextViewEx;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static net.osmand.plus.myplaces.TrackActivityFragmentAdapter.isGpxFileSelected;
|
||||
import static net.osmand.plus.track.OptionsCard.APPEARANCE_BUTTON_INDEX;
|
||||
import static net.osmand.plus.track.OptionsCard.DIRECTIONS_BUTTON_INDEX;
|
||||
import static net.osmand.plus.track.OptionsCard.EDIT_BUTTON_INDEX;
|
||||
import static net.osmand.plus.track.OptionsCard.SHOW_ON_MAP_BUTTON_INDEX;
|
||||
|
||||
public class OverviewCard extends BaseCard {
|
||||
|
||||
private RecyclerView rvOverview;
|
||||
private View showButton;
|
||||
private View appearanceButton;
|
||||
private View editButton;
|
||||
private View directionsButton;
|
||||
|
||||
private final TrackDisplayHelper displayHelper;
|
||||
private final GPXFile gpxFile;
|
||||
private final GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT};
|
||||
private final SegmentActionsListener listener;
|
||||
|
||||
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper,
|
||||
@NonNull SegmentActionsListener listener) {
|
||||
super(mapActivity);
|
||||
this.displayHelper = displayHelper;
|
||||
this.gpxFile = displayHelper.getGpx();
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCardLayoutId() {
|
||||
return R.layout.gpx_overview_fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateContent() {
|
||||
int iconColorDef = R.color.icon_color_active_light;
|
||||
int iconColorPres = R.color.active_buttons_and_links_text_dark;
|
||||
boolean fileAvailable = gpxFile.path != null && !gpxFile.showCurrentTrack;
|
||||
|
||||
showButton = view.findViewById(R.id.show_button);
|
||||
appearanceButton = view.findViewById(R.id.appearance_button);
|
||||
editButton = view.findViewById(R.id.edit_button);
|
||||
directionsButton = view.findViewById(R.id.directions_button);
|
||||
rvOverview = view.findViewById(R.id.recycler_overview);
|
||||
|
||||
initShowButton(iconColorDef, iconColorPres);
|
||||
initAppearanceButton(iconColorDef, iconColorPres);
|
||||
if (fileAvailable) {
|
||||
initEditButton(iconColorDef, iconColorPres);
|
||||
initDirectionsButton(iconColorDef, iconColorPres);
|
||||
}
|
||||
initStatBlocks();
|
||||
}
|
||||
|
||||
void initStatBlocks() {
|
||||
GpxDisplayItem gpxItem = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)).get(0);
|
||||
GPXTrackAnalysis analysis = gpxItem.analysis;
|
||||
boolean joinSegments = displayHelper.isJoinSegments();
|
||||
float totalDistance = !joinSegments && gpxItem.isGeneralTrack() ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
|
||||
float timeSpan = !joinSegments && gpxItem.isGeneralTrack() ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
|
||||
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
|
||||
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
|
||||
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
|
||||
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
|
||||
|
||||
StatBlock sDistance = new StatBlock(app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app),
|
||||
R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED);
|
||||
StatBlock sAscent = new StatBlock(app.getString(R.string.altitude_ascent), asc,
|
||||
R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null);
|
||||
StatBlock sDescent = new StatBlock(app.getString(R.string.altitude_descent), desc,
|
||||
R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE);
|
||||
StatBlock sAvSpeed = new StatBlock(app.getString(R.string.average_speed), avg,
|
||||
R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null);
|
||||
StatBlock sMaxSpeed = new StatBlock(app.getString(R.string.max_speed), max,
|
||||
R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null);
|
||||
StatBlock sTimeSpan = new StatBlock(app.getString(R.string.shared_string_time_span),
|
||||
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
|
||||
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null);
|
||||
|
||||
LinearLayoutManager llManager = new LinearLayoutManager(app);
|
||||
llManager.setOrientation(LinearLayoutManager.HORIZONTAL);
|
||||
rvOverview.setLayoutManager(llManager);
|
||||
rvOverview.setItemAnimator(new DefaultItemAnimator());
|
||||
List<StatBlock> items = Arrays.asList(sDistance, sAscent, sDescent, sAvSpeed, sMaxSpeed, sTimeSpan);
|
||||
final StatBlockAdapter siAdapter = new StatBlockAdapter(items);
|
||||
rvOverview.setAdapter(siAdapter);
|
||||
rvOverview.addItemDecoration(new HorizontalDividerDecoration(app));
|
||||
}
|
||||
|
||||
private void initShowButton(final int iconColorDef, final int iconColorPres) {
|
||||
final AppCompatImageView image = showButton.findViewById(R.id.image);
|
||||
final AppCompatImageView filled = showButton.findViewById(R.id.filled);
|
||||
final int iconShowResId = R.drawable.ic_action_view;
|
||||
final int iconHideResId = R.drawable.ic_action_hide;
|
||||
final boolean[] gpxFileSelected = {isGpxFileSelected(app, gpxFile)};
|
||||
filled.setImageResource(R.drawable.bg_topbar_shield_exit_ref);
|
||||
filled.setAlpha(gpxFileSelected[0] ? 1f : 0.1f);
|
||||
setImageDrawable(image, gpxFileSelected[0] ? iconShowResId : iconHideResId,
|
||||
gpxFileSelected[0] ? iconColorPres : iconColorDef);
|
||||
showButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
gpxFileSelected[0] = !gpxFileSelected[0];
|
||||
filled.setAlpha(gpxFileSelected[0] ? 1f : 0.1f);
|
||||
setImageDrawable(image, gpxFileSelected[0] ? iconShowResId : iconHideResId,
|
||||
gpxFileSelected[0] ? iconColorPres : iconColorDef);
|
||||
CardListener listener = getListener();
|
||||
if (listener != null) {
|
||||
listener.onCardButtonPressed(OverviewCard.this, SHOW_ON_MAP_BUTTON_INDEX);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initAppearanceButton(int iconColorDef, int iconColorPres) {
|
||||
initButton(appearanceButton, APPEARANCE_BUTTON_INDEX, R.drawable.ic_action_appearance, iconColorDef, iconColorPres);
|
||||
}
|
||||
|
||||
private void initEditButton(int iconColorDef, int iconColorPres) {
|
||||
initButton(editButton, EDIT_BUTTON_INDEX, R.drawable.ic_action_edit_dark, iconColorDef, iconColorPres);
|
||||
}
|
||||
|
||||
private void initDirectionsButton(int iconColorDef, int iconColorPres) {
|
||||
initButton(directionsButton, DIRECTIONS_BUTTON_INDEX, R.drawable.ic_action_gdirections_dark, iconColorDef, iconColorPres);
|
||||
}
|
||||
|
||||
private void initButton(View item, final int buttonIndex, int iconResId, int iconColorDef, int iconColorPres) {
|
||||
final AppCompatImageView image = item.findViewById(R.id.image);
|
||||
final AppCompatImageView filled = item.findViewById(R.id.filled);
|
||||
filled.setImageResource(R.drawable.bg_topbar_shield_exit_ref);
|
||||
filled.setAlpha(0.1f);
|
||||
setImageDrawable(image, iconResId, iconColorDef);
|
||||
setOnTouchItem(item, image, filled, iconResId, iconColorDef, iconColorPres);
|
||||
item.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CardListener listener = getListener();
|
||||
if (listener != null) {
|
||||
listener.onCardButtonPressed(OverviewCard.this, buttonIndex);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setImageDrawable(ImageView iv, @DrawableRes int resId, @ColorRes int color) {
|
||||
Drawable icon = app.getUIUtilities().getIcon(resId, color);
|
||||
iv.setImageDrawable(icon);
|
||||
}
|
||||
|
||||
private void setOnTouchItem(View item, final ImageView image, final ImageView filled, @DrawableRes final int resId, @ColorRes final int colorDef, @ColorRes final int colorPres) {
|
||||
item.setOnTouchListener(new View.OnTouchListener() {
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN: {
|
||||
filled.setAlpha(1f);
|
||||
setImageDrawable(image, resId, colorPres);
|
||||
break;
|
||||
}
|
||||
case MotionEvent.ACTION_UP:
|
||||
case MotionEvent.ACTION_CANCEL: {
|
||||
filled.setAlpha(0.1f);
|
||||
setImageDrawable(image, resId, colorDef);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private class StatBlockAdapter extends RecyclerView.Adapter<StatBlockViewHolder> {
|
||||
|
||||
private final List<StatBlock> statBlocks;
|
||||
|
||||
public StatBlockAdapter(List<StatBlock> StatBlocks) {
|
||||
this.statBlocks = StatBlocks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return statBlocks.size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public StatBlockViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
View itemView = LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.item_gpx_stat_block, parent, false);
|
||||
return new StatBlockViewHolder(itemView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(StatBlockViewHolder holder, int position) {
|
||||
final StatBlock item = statBlocks.get(position);
|
||||
|
||||
holder.valueText.setText(item.value);
|
||||
holder.titleText.setText(item.title);
|
||||
holder.valueText.setTextColor(app.getResources().getColor(R.color.active_color_primary_light));
|
||||
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light));
|
||||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
GpxDisplayItem gpxItem = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)).get(0);
|
||||
if (gpxItem != null && gpxItem.analysis != null) {
|
||||
ArrayList<GPXDataSetType> list = new ArrayList<>();
|
||||
if (item.firstType != null) {
|
||||
list.add(item.firstType);
|
||||
}
|
||||
if (item.secondType != null) {
|
||||
list.add(item.secondType);
|
||||
}
|
||||
if (list.size() > 0) {
|
||||
gpxItem.chartTypes = list.toArray(new GPXDataSetType[0]);
|
||||
}
|
||||
gpxItem.locationOnMap = gpxItem.locationStart;
|
||||
|
||||
listener.openAnalyzeOnMap(gpxItem);
|
||||
}
|
||||
}
|
||||
});
|
||||
setImageDrawable(holder.imageView, item.imageResId, item.imageColorId);
|
||||
}
|
||||
}
|
||||
|
||||
private static class StatBlockViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final TextViewEx valueText;
|
||||
private final TextView titleText;
|
||||
private final AppCompatImageView imageView;
|
||||
|
||||
StatBlockViewHolder(View view) {
|
||||
super(view);
|
||||
valueText = view.findViewById(R.id.value);
|
||||
titleText = view.findViewById(R.id.title);
|
||||
imageView = view.findViewById(R.id.image);
|
||||
}
|
||||
}
|
||||
|
||||
private static class HorizontalDividerDecoration extends ItemDecoration {
|
||||
|
||||
private final Drawable divider;
|
||||
private final int marginV;
|
||||
private final int marginH;
|
||||
|
||||
public HorizontalDividerDecoration(Context context) {
|
||||
int[] ATTRS = new int[] {android.R.attr.listDivider};
|
||||
final TypedArray ta = context.obtainStyledAttributes(ATTRS);
|
||||
divider = ta.getDrawable(0);
|
||||
// DrawableCompat.setTint(divider, context.getResources().getColor(R.color.divider_color_light)); //todo change drawable color
|
||||
ta.recycle();
|
||||
marginV = context.getResources().getDimensionPixelSize(R.dimen.map_small_button_margin);
|
||||
marginH = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
|
||||
drawHorizontal(c, parent);
|
||||
}
|
||||
|
||||
public void drawHorizontal(Canvas c, RecyclerView parent) {
|
||||
for (int i = 0; i < parent.getChildCount(); i++) {
|
||||
final View child = parent.getChildAt(i);
|
||||
final int left = child.getRight() - divider.getIntrinsicWidth() + marginH;
|
||||
final int right = left + divider.getIntrinsicHeight();
|
||||
final int top = child.getTop() + marginV;
|
||||
final int bottom = child.getBottom() - marginV;
|
||||
divider.setBounds(left, top, right, bottom);
|
||||
divider.draw(c);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getItemOffsets(Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
|
||||
outRect.set(marginH - divider.getIntrinsicWidth(), marginV, marginH + divider.getIntrinsicWidth(), marginV);
|
||||
}
|
||||
}
|
||||
|
||||
private static class StatBlock {
|
||||
|
||||
private final String title;
|
||||
private final String value;
|
||||
private final int imageResId;
|
||||
private final int imageColorId;
|
||||
private final GPXDataSetType firstType;
|
||||
private final GPXDataSetType secondType;
|
||||
|
||||
public StatBlock(String title, String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
|
||||
GPXDataSetType firstType, GPXDataSetType secondType) {
|
||||
this.title = title;
|
||||
this.value = value;
|
||||
this.imageResId = imageResId;
|
||||
this.imageColorId = imageColorId;
|
||||
this.firstType = firstType;
|
||||
this.secondType = secondType;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -33,6 +33,7 @@ import net.osmand.GPXUtilities.GPXFile;
|
|||
import net.osmand.GPXUtilities.Track;
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.QuadRect;
|
||||
|
@ -42,10 +43,13 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
|||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
|
||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.UiUtilities.UpdateLocationViewCache;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.MapActivityActions;
|
||||
import net.osmand.plus.base.ContextMenuFragment;
|
||||
|
@ -54,6 +58,7 @@ import net.osmand.plus.helpers.AndroidUiHelper;
|
|||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.OpenGpxDetailsTask;
|
||||
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
|
||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
||||
|
@ -73,6 +78,7 @@ import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener;
|
|||
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
|
||||
import net.osmand.plus.widgets.IconPopupMenu;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
|
@ -96,7 +102,7 @@ import static net.osmand.plus.track.OptionsCard.SHOW_ON_MAP_BUTTON_INDEX;
|
|||
import static net.osmand.plus.track.OptionsCard.UPLOAD_OSM_BUTTON_INDEX;
|
||||
|
||||
public class TrackMenuFragment extends ContextMenuScrollFragment implements CardListener,
|
||||
SegmentActionsListener, RenameCallback, OnTrackFileMoveListener {
|
||||
SegmentActionsListener, RenameCallback, OnTrackFileMoveListener, OsmAndLocationListener, OsmAndCompassListener {
|
||||
|
||||
public static final String TAG = TrackMenuFragment.class.getName();
|
||||
private static final Log log = PlatformUtil.getLog(TrackMenuFragment.class);
|
||||
|
@ -109,15 +115,22 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
private TextView headerTitle;
|
||||
private ImageView headerIcon;
|
||||
private BottomNavigationView bottomNav;
|
||||
private TrackMenuType menuType = TrackMenuType.TRACK;
|
||||
private TrackMenuType menuType = TrackMenuType.OVERVIEW;
|
||||
private SegmentsCard segmentsCard;
|
||||
private OptionsCard optionsCard;
|
||||
private OverviewCard overviewCard;
|
||||
|
||||
private TrackChartPoints trackChartPoints;
|
||||
|
||||
private int menuTitleHeight;
|
||||
private String gpxTitle;
|
||||
private UpdateLocationViewCache updateLocationViewCache;
|
||||
private Location lastLocation = null;
|
||||
private Float heading;
|
||||
private boolean locationUpdateStarted;
|
||||
|
||||
public enum TrackMenuType {
|
||||
OVERVIEW(R.id.action_overview, R.string.shared_string_overview),
|
||||
TRACK(R.id.action_track, R.string.shared_string_gpx_tracks),
|
||||
POINTS(R.id.action_points, R.string.shared_string_gpx_points),
|
||||
OPTIONS(R.id.action_options, R.string.shared_string_options);
|
||||
|
@ -160,6 +173,11 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInitialMenuState() {
|
||||
return MenuState.HEADER_ONLY;
|
||||
}
|
||||
|
||||
public TrackDisplayHelper getDisplayHelper() {
|
||||
return displayHelper;
|
||||
}
|
||||
|
@ -184,6 +202,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
selectedGpxFile = app.getSelectedGpxHelper().getSelectedFileByPath(gpxFilePath);
|
||||
}
|
||||
displayHelper.setGpx(selectedGpxFile.getGpxFile());
|
||||
String fileName = Algorithms.getFileWithoutDirs(getGpx().path);
|
||||
gpxTitle = GpxUiHelper.getGpxTitle(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -199,9 +219,12 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
routeMenuTopShadowAll = view.findViewById(R.id.route_menu_top_shadow_all);
|
||||
headerTitle = view.findViewById(R.id.title);
|
||||
headerIcon = view.findViewById(R.id.icon_view);
|
||||
updateLocationViewCache = app.getUIUtilities().getUpdateLocationViewCache();
|
||||
|
||||
if (isPortrait()) {
|
||||
updateCardsLayout();
|
||||
AndroidUiHelper.updateVisibility(getTopShadow(), true);
|
||||
AndroidUtils.setBackground(view.getContext(), getBottomContainer(), isNightMode(),
|
||||
R.color.list_background_color_light, R.color.list_background_color_dark);
|
||||
} else {
|
||||
int widthNoShadow = getLandscapeNoShadowWidth();
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(widthNoShadow, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
|
@ -218,14 +241,32 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
return view;
|
||||
}
|
||||
|
||||
private void setHeaderTitle(String text, boolean iconVisibility) {
|
||||
headerTitle.setText(text);
|
||||
AndroidUiHelper.updateVisibility(headerIcon, iconVisibility);
|
||||
}
|
||||
|
||||
private void updateHeader() {
|
||||
if (menuType == TrackMenuType.OPTIONS) {
|
||||
headerTitle.setText(menuType.titleId);
|
||||
AndroidUiHelper.updateVisibility(headerIcon, false);
|
||||
ViewGroup headerContainer = (ViewGroup) routeMenuTopShadowAll;
|
||||
if (menuType == TrackMenuType.OVERVIEW) {
|
||||
setHeaderTitle(gpxTitle, true);
|
||||
if (overviewCard != null && overviewCard.getView() != null) {
|
||||
ViewGroup parent = ((ViewGroup) overviewCard.getView().getParent());
|
||||
if (parent != null) {
|
||||
parent.removeView(overviewCard.getView());
|
||||
}
|
||||
headerContainer.addView(overviewCard.getView());
|
||||
} else {
|
||||
overviewCard = new OverviewCard(getMapActivity(), displayHelper, this);
|
||||
overviewCard.setListener(this);
|
||||
headerContainer.addView(overviewCard.build(getMapActivity()));
|
||||
}
|
||||
} else {
|
||||
String fileName = Algorithms.getFileWithoutDirs(getGpx().path);
|
||||
headerTitle.setText(GpxUiHelper.getGpxTitle(fileName));
|
||||
AndroidUiHelper.updateVisibility(headerIcon, true);
|
||||
if (overviewCard != null && overviewCard.getView() != null) {
|
||||
headerContainer.removeView(overviewCard.getView());
|
||||
}
|
||||
boolean isOptions = menuType == TrackMenuType.OPTIONS;
|
||||
setHeaderTitle(isOptions ? app.getString(menuType.titleId) : gpxTitle, !isOptions);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -306,6 +347,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
if (mapActivity != null && trackChartPoints != null) {
|
||||
mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(trackChartPoints);
|
||||
}
|
||||
startLocationUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -315,6 +357,67 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
if (mapActivity != null) {
|
||||
mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(null);
|
||||
}
|
||||
stopLocationUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLocation(Location location) {
|
||||
if (!MapUtils.areLatLonEqual(lastLocation, location)) {
|
||||
lastLocation = location;
|
||||
updateLocationUi();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateCompassValue(float value) {
|
||||
// 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction)
|
||||
// on non-compass devices
|
||||
float lastHeading = heading != null ? heading : 99;
|
||||
heading = value;
|
||||
if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) {
|
||||
updateLocationUi();
|
||||
} else {
|
||||
heading = lastHeading;
|
||||
}
|
||||
}
|
||||
|
||||
private void updateLocationUi() {
|
||||
app.runInUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateDistanceDirection();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updateDistanceDirection() {
|
||||
MapActivity mapActivity = getMapActivity();
|
||||
View view = overviewCard.getView();
|
||||
if (mapActivity != null && view != null) {
|
||||
MapContextMenu menu = mapActivity.getContextMenu();
|
||||
TextView distanceText = (TextView) view.findViewById(R.id.distance);
|
||||
ImageView direction = (ImageView) view.findViewById(R.id.direction);
|
||||
app.getUIUtilities().updateLocationView(updateLocationViewCache, direction, distanceText, menu.getLatLon());
|
||||
}
|
||||
}
|
||||
|
||||
private void startLocationUpdate() {
|
||||
OsmandApplication app = getMyApplication();
|
||||
if (app != null && !locationUpdateStarted) {
|
||||
locationUpdateStarted = true;
|
||||
app.getLocationProvider().addCompassListener(this);
|
||||
app.getLocationProvider().addLocationListener(this);
|
||||
updateLocationUi();
|
||||
}
|
||||
}
|
||||
|
||||
private void stopLocationUpdate() {
|
||||
OsmandApplication app = getMyApplication();
|
||||
if (app != null && locationUpdateStarted) {
|
||||
locationUpdateStarted = false;
|
||||
app.getLocationProvider().removeLocationListener(this);
|
||||
app.getLocationProvider().removeCompassListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -415,7 +518,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
if (mapActivity == null) {
|
||||
return;
|
||||
}
|
||||
if (card instanceof OptionsCard) {
|
||||
if (card instanceof OptionsCard || card instanceof OverviewCard) {
|
||||
final GPXFile gpxFile = getGpx();
|
||||
if (buttonIndex == SHOW_ON_MAP_BUTTON_INDEX) {
|
||||
boolean gpxFileSelected = !isGpxFileSelected(app, gpxFile);
|
||||
|
@ -547,7 +650,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
}
|
||||
}
|
||||
|
||||
private void updateCardsLayout() {
|
||||
/*private void updateCardsLayout() {
|
||||
View mainView = getMainView();
|
||||
if (mainView != null) {
|
||||
View topShadow = getTopShadow();
|
||||
|
@ -560,14 +663,14 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
AndroidUtils.setBackground(mainView.getContext(), bottomContainer, isNightMode(), R.color.list_background_color_light, R.color.list_background_color_dark);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
private void setupButtons(View view) {
|
||||
ColorStateList navColorStateList = AndroidUtils.createBottomNavColorStateList(getContext(), isNightMode());
|
||||
BottomNavigationView bottomNav = view.findViewById(R.id.bottom_navigation);
|
||||
bottomNav.setItemIconTintList(navColorStateList);
|
||||
bottomNav.setItemTextColor(navColorStateList);
|
||||
bottomNav.setSelectedItemId(R.id.action_track);
|
||||
bottomNav.setSelectedItemId(R.id.action_overview);
|
||||
bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
|
||||
@Override
|
||||
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
|
||||
|
@ -630,46 +733,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
}
|
||||
|
||||
@Override
|
||||
public void openAnalyzeOnMap(GpxDisplayItem gpxItem, List<ILineDataSet> dataSets, GPXTabItemType tabType) {
|
||||
WptPt wpt = null;
|
||||
gpxItem.chartTypes = null;
|
||||
if (dataSets != null && dataSets.size() > 0) {
|
||||
gpxItem.chartTypes = new GPXDataSetType[dataSets.size()];
|
||||
for (int i = 0; i < dataSets.size(); i++) {
|
||||
OrderedLineDataSet orderedDataSet = (OrderedLineDataSet) dataSets.get(i);
|
||||
gpxItem.chartTypes[i] = orderedDataSet.getDataSetType();
|
||||
}
|
||||
if (gpxItem.chartHighlightPos != -1) {
|
||||
TrkSegment segment = null;
|
||||
for (Track t : gpxItem.group.getGpx().tracks) {
|
||||
for (TrkSegment s : t.segments) {
|
||||
if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) {
|
||||
segment = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (segment != null) {
|
||||
OrderedLineDataSet dataSet = (OrderedLineDataSet) dataSets.get(0);
|
||||
float distance = gpxItem.chartHighlightPos * dataSet.getDivX();
|
||||
for (WptPt p : segment.points) {
|
||||
if (p.distance >= distance) {
|
||||
wpt = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wpt != null) {
|
||||
gpxItem.locationOnMap = wpt;
|
||||
} else {
|
||||
gpxItem.locationOnMap = gpxItem.locationStart;
|
||||
}
|
||||
|
||||
public void openAnalyzeOnMap(GpxDisplayItem gpxItem) {
|
||||
TrackDetailsMenu trackDetailsMenu = getMapActivity().getTrackDetailsMenu();
|
||||
trackDetailsMenu.setGpxItem(gpxItem);
|
||||
trackDetailsMenu.show();
|
||||
|
@ -788,7 +852,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
Bundle args = new Bundle();
|
||||
args.putString(TRACK_FILE_NAME, path);
|
||||
args.putBoolean(CURRENT_RECORDING, showCurrentTrack);
|
||||
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HALF_SCREEN);
|
||||
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY);
|
||||
|
||||
TrackMenuFragment fragment = new TrackMenuFragment();
|
||||
fragment.setArguments(args);
|
||||
|
|
Loading…
Reference in a new issue