Refactored gpx info classes

This commit is contained in:
Alexey Kulish 2017-02-27 15:46:19 +03:00
parent 0ebb1d4b93
commit 7673717e3e
5 changed files with 410 additions and 343 deletions

View file

@ -25,7 +25,6 @@ import net.osmand.plus.OsmAndAppCustomization;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.myplaces.FavoritesActivity;
import net.osmand.plus.myplaces.SelectedGPXFragment;
import net.osmand.plus.myplaces.TrackPointFragment;
import net.osmand.plus.myplaces.TrackSegmentFragment;
import net.osmand.plus.views.controls.PagerSlidingTabStrip;
@ -102,8 +101,10 @@ public class TrackActivity extends TabActivity {
for (WeakReference<Fragment> f : fragList) {
Fragment frag = f.get();
if (frag instanceof SelectedGPXFragment) {
((SelectedGPXFragment) frag).setContent();
if (frag instanceof TrackSegmentFragment) {
((TrackSegmentFragment) frag).setContent();
} else if (frag instanceof TrackPointFragment) {
((TrackPointFragment) frag).setContent();
}
}
((OsmandFragmentPagerAdapter) mViewPager.getAdapter()).addTab(

View file

@ -845,8 +845,6 @@ public class GpxUiHelper {
public static void setupGPXChart(OsmandApplication ctx, LineChart mChart, int yLabelsCount) {
OsmandSettings settings = ctx.getSettings();
OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
boolean useFeet = (mc == OsmandSettings.MetricsConstants.MILES_AND_FEET) || (mc == OsmandSettings.MetricsConstants.MILES_AND_YARDS);
boolean light = settings.isLightContent();
//mChart.setHardwareAccelerationEnabled(true);

View file

@ -1,305 +0,0 @@
package net.osmand.plus.myplaces;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.GPXDatabase;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.OsmAndListFragment;
import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SelectedGPXFragment extends OsmAndListFragment {
public static final String ARG_TO_FILTER_SHORT_TRACKS = "ARG_TO_FILTER_SHORT_TRACKS";
protected OsmandApplication app;
protected ArrayAdapter<GpxDisplayItem> adapter;
private boolean updateEnable;
@Override
public void onAttach(Context context) {
super.onAttach(context);
final Collator collator = Collator.getInstance();
collator.setStrength(Collator.SECONDARY);
app = (OsmandApplication) getActivity().getApplication();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getListView().setBackgroundColor(getResources().getColor(
getMyApplication().getSettings().isLightContent() ? R.color.ctx_menu_info_view_bg_light
: R.color.ctx_menu_info_view_bg_dark));
}
public TrackActivity getMyActivity() {
return (TrackActivity) getActivity();
}
@Override
public ArrayAdapter<?> getAdapter() {
return adapter;
}
private void startHandler() {
Handler updateCurrentRecordingTrack = new Handler();
updateCurrentRecordingTrack.postDelayed(new Runnable() {
@Override
public void run() {
if (updateEnable) {
updateContent();
adapter.notifyDataSetChanged();
startHandler();
}
}
}, 2000);
}
public static boolean isArgumentTrue(@Nullable Bundle args, @NonNull String arg) {
return args != null && args.getBoolean(arg);
}
@Override
public void onResume() {
super.onResume();
updateContent();
updateEnable = true;
if (getGpx() != null && getGpx().showCurrentTrack && hasFilterType(GpxDisplayItemType.TRACK_POINTS)) {
startHandler();
}
}
@Override
public void onPause() {
super.onPause();
updateEnable = false;
}
protected static List<GpxDisplayGroup> filterGroups(GpxDisplayItemType[] types,
@NonNull TrackActivity trackActivity,
@Nullable Bundle args) {
List<GpxDisplayGroup> result = trackActivity.getGpxFile();
List<GpxDisplayGroup> groups = new ArrayList<>();
for (GpxDisplayGroup group : result) {
boolean add = types == null || hasFilterType(types, group.getType());
if (isArgumentTrue(args, ARG_TO_FILTER_SHORT_TRACKS)) {
Iterator<GpxDisplayItem> item = group.getModifiableList().iterator();
while (item.hasNext()) {
GpxDisplayItem it2 = item.next();
if (it2.analysis != null && it2.analysis.totalDistance < 100) {
item.remove();
}
}
if (group.getModifiableList().isEmpty()) {
add = false;
}
}
if (add) {
groups.add(group);
}
}
return groups;
}
public void setContent() {
setContent(getListView());
}
public void setContent(ListView listView) {
adapter = createSelectedGPXAdapter();
updateContent();
setupListView(listView);
setListAdapter(adapter);
}
protected void setupListView(ListView listView) {
if (adapter.getCount() > 0) {
listView.addFooterView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, null, false));
}
}
protected void updateContent() {
adapter.clear();
List<GpxDisplayGroup> groups = filterGroups(filterTypes(), getMyActivity(), getArguments());
adapter.setNotifyOnChange(false);
for (GpxDisplayItem i : flatten(groups)) {
adapter.add(i);
}
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
protected GpxDisplayItemType[] filterTypes() {
return null;
}
protected boolean hasFilterType(GpxDisplayItemType filterType) {
for (GpxDisplayItemType type : filterTypes()) {
if (type == filterType) {
return true;
}
}
return false;
}
protected static boolean hasFilterType(GpxDisplayItemType[] filterTypes, GpxDisplayItemType filterType) {
for (GpxDisplayItemType type : filterTypes) {
if (type == filterType) {
return true;
}
}
return false;
}
protected List<GpxDisplayItem> flatten(List<GpxDisplayGroup> groups) {
ArrayList<GpxDisplayItem> list = new ArrayList<>();
for(GpxDisplayGroup g : groups) {
list.addAll(g.getModifiableList());
}
return list;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = getActivity().getLayoutInflater().inflate(R.layout.update_index, container, false);
view.findViewById(R.id.header_layout).setVisibility(View.GONE);
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setDivider(null);
listView.setDividerHeight(0);
TextView tv = new TextView(getActivity());
tv.setText(R.string.none_selected_gpx);
tv.setTextSize(24);
listView.setEmptyView(tv);
setContent(listView);
return view;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
getMyActivity().getClearToolbar(false);
if (getGpx() != null && getGpx().path != null && !getGpx().showCurrentTrack) {
MenuItem item = menu.add(R.string.shared_string_share).setIcon(R.drawable.ic_action_gshare_dark)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final Uri fileUri = Uri.fromFile(new File(getGpx().path));
final Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
sendIntent.setType("application/gpx+xml");
startActivity(sendIntent);
return true;
}
});
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
}
}
protected GPXFile getGpx() {
return getMyActivity().getGpx();
}
protected GpxDataItem getGpxDataItem() {
return getMyActivity().getGpxDataItem();
}
public ArrayAdapter<GpxDisplayItem> createSelectedGPXAdapter() {
return null;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
GpxDisplayItem child = adapter.getItem(position);
if (child != null) {
if (child.group.getGpx() != null) {
app.getSelectedGpxHelper().setGpxFileToDisplay(child.group.getGpx());
}
final OsmandSettings settings = app.getSettings();
LatLon location = new LatLon(child.locationStart.lat, child.locationStart.lon);
if (child.group.getType() == GpxDisplayItemType.TRACK_POINTS) {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_WPT, child.locationStart.name),
false,
child.locationStart);
} else if (child.group.getType() == GpxDisplayItemType.TRACK_ROUTE_POINTS) {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_WPT, child.name),
false,
child.locationStart);
} else {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_GPX_ITEM, child.group.getGpxName()),
false,
child);
}
MapActivity.launchMapActivityMoveToTop(getActivity());
}
/*
// if(child.group.getType() == GpxDisplayItemType.TRACK_POINTS ||
// child.group.getType() == GpxDisplayItemType.TRACK_ROUTE_POINTS) {
ContextMenuAdapter qa = new ContextMenuAdapter(v.getContext());
qa.setAnchor(v);
PointDescription name = new PointDescription(PointDescription.POINT_TYPE_FAVORITE, Html.fromHtml(child.name).toString());
LatLon location = new LatLon(child.locationStart.lat, child.locationStart.lon);
OsmandSettings settings = app.getSettings();
final PopupMenu optionsMenu = new PopupMenu(getActivity(), v);
DirectionsDialogs.createDirectionActionsPopUpMenu(optionsMenu, location, child.locationStart, name, settings.getLastKnownMapZoom(),
getActivity(), false, false);
optionsMenu.show();
// } else {
// child.expanded = !child.expanded;
// adapter.notifyDataSetInvalidated();
// }
*/
}
}

View file

@ -1,7 +1,9 @@
package net.osmand.plus.myplaces;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AlertDialog;
import android.text.Html;
@ -21,32 +23,88 @@ import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GPXDatabase;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.FavoriteImageDrawable;
import net.osmand.plus.base.OsmAndListFragment;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class TrackPointFragment extends SelectedGPXFragment {
public class TrackPointFragment extends OsmAndListFragment {
public static final String ARG_TO_FILTER_SHORT_TRACKS = "ARG_TO_FILTER_SHORT_TRACKS";
private OsmandApplication app;
private ArrayAdapter<GpxDisplayItem> adapter;
private GpxDisplayItemType[] filterTypes = { GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS };
@Override
protected void setupListView(ListView listView) {
super.setupListView(listView);
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.app = getMyApplication();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getListView().setBackgroundColor(getResources().getColor(
getMyApplication().getSettings().isLightContent() ? R.color.ctx_menu_info_view_bg_light
: R.color.ctx_menu_info_view_bg_dark));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = getActivity().getLayoutInflater().inflate(R.layout.update_index, container, false);
view.findViewById(R.id.header_layout).setVisibility(View.GONE);
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setDivider(null);
listView.setDividerHeight(0);
TextView tv = new TextView(getActivity());
tv.setText(R.string.none_selected_gpx);
tv.setTextSize(24);
listView.setEmptyView(tv);
setContent(listView);
return view;
}
public TrackActivity getMyActivity() {
return (TrackActivity) getActivity();
}
public ArrayAdapter<?> getAdapter() {
return adapter;
}
private GPXUtilities.GPXFile getGpx() {
return getMyActivity().getGpx();
}
private GPXDatabase.GpxDataItem getGpxDataItem() {
return getMyActivity().getGpxDataItem();
}
private void setupListView(ListView listView) {
if (adapter.getCount() > 0) {
listView.addHeaderView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_header, null, false));
listView.addFooterView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, null, false));
}
}
@Override
protected GpxDisplayItemType[] filterTypes() {
return new GpxDisplayItemType[] { GpxSelectionHelper.GpxDisplayItemType.TRACK_POINTS, GpxSelectionHelper.GpxDisplayItemType.TRACK_ROUTE_POINTS };
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
@ -75,10 +133,78 @@ public class TrackPointFragment extends SelectedGPXFragment {
}
}
private boolean isArgumentTrue(@NonNull String arg) {
return getArguments() != null && getArguments().getBoolean(arg);
}
private boolean hasFilterType(GpxDisplayItemType[] filterTypes, GpxDisplayItemType filterType) {
for (GpxDisplayItemType type : filterTypes) {
if (type == filterType) {
return true;
}
}
return false;
}
private List<GpxDisplayGroup> filterGroups(GpxDisplayItemType[] types) {
List<GpxDisplayGroup> result = getMyActivity().getGpxFile();
List<GpxDisplayGroup> groups = new ArrayList<>();
for (GpxDisplayGroup group : result) {
boolean add = types == null || hasFilterType(types, group.getType());
if (isArgumentTrue(ARG_TO_FILTER_SHORT_TRACKS)) {
Iterator<GpxDisplayItem> item = group.getModifiableList().iterator();
while (item.hasNext()) {
GpxDisplayItem it2 = item.next();
if (it2.analysis != null && it2.analysis.totalDistance < 100) {
item.remove();
}
}
if (group.getModifiableList().isEmpty()) {
add = false;
}
}
if (add) {
groups.add(group);
}
}
return groups;
}
public void setContent() {
setContent(getListView());
}
public void setContent(ListView listView) {
adapter = new PointGPXAdapter(new ArrayList<GpxDisplayItem>());
updateContent();
setupListView(listView);
setListAdapter(adapter);
}
protected void updateContent() {
adapter.clear();
List<GpxDisplayGroup> groups = filterGroups(filterTypes);
adapter.setNotifyOnChange(false);
for (GpxDisplayItem i : flatten(groups)) {
adapter.add(i);
}
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
protected List<GpxDisplayItem> flatten(List<GpxDisplayGroup> groups) {
ArrayList<GpxDisplayItem> list = new ArrayList<>();
for(GpxDisplayGroup g : groups) {
list.addAll(g.getModifiableList());
}
return list;
}
protected void saveAsFavorites(final GpxDisplayItemType gpxDisplayItemType) {
AlertDialog.Builder b = new AlertDialog.Builder(getMyActivity());
final EditText editText = new EditText(getMyActivity());
final List<GpxSelectionHelper.GpxDisplayGroup> gs = filterGroups(new GpxDisplayItemType[] { gpxDisplayItemType }, getMyActivity(), getArguments());
final List<GpxDisplayGroup> gs = filterGroups(new GpxDisplayItemType[] { gpxDisplayItemType });
if (gs.size() == 0) {
return;
}
@ -103,7 +229,7 @@ public class TrackPointFragment extends SelectedGPXFragment {
protected void saveAsMapMarkers(final GpxDisplayItemType gpxDisplayItemType) {
AlertDialog.Builder b = new AlertDialog.Builder(getMyActivity());
final List<GpxSelectionHelper.GpxDisplayGroup> gs = filterGroups(new GpxDisplayItemType[] { gpxDisplayItemType }, getMyActivity(), getArguments());
final List<GpxDisplayGroup> gs = filterGroups(new GpxDisplayItemType[] { gpxDisplayItemType });
if (gs.size() == 0) {
return;
}
@ -147,17 +273,65 @@ public class TrackPointFragment extends SelectedGPXFragment {
}
@Override
public ArrayAdapter<GpxDisplayItem> createSelectedGPXAdapter() {
return new PointGPXAdapter(new ArrayList<GpxDisplayItem>());
public void onListItemClick(ListView l, View v, int position, long id) {
GpxDisplayItem child = adapter.getItem(position);
if (child != null) {
if (child.group.getGpx() != null) {
app.getSelectedGpxHelper().setGpxFileToDisplay(child.group.getGpx());
}
final OsmandSettings settings = app.getSettings();
LatLon location = new LatLon(child.locationStart.lat, child.locationStart.lon);
if (child.group.getType() == GpxDisplayItemType.TRACK_ROUTE_POINTS) {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_WPT, child.name),
false,
child.locationStart);
} else {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_GPX_ITEM, child.group.getGpxName()),
false,
child);
}
MapActivity.launchMapActivityMoveToTop(getActivity());
}
}
class PointGPXAdapter extends ArrayAdapter<GpxDisplayItem> {
Map<GpxDisplayItemType, List<GpxDisplayItem>> itemTypes = new LinkedHashMap<>();
List<GpxDisplayItemType> types = new ArrayList<>();
PointGPXAdapter(List<GpxDisplayItem> items) {
super(getActivity(), R.layout.gpx_list_item_tab_content, items);
}
@Override
public void add(GpxDisplayItem item) {
super.add(item);
GpxDisplayItemType type = item.group.getType();
List<GpxDisplayItem> items = itemTypes.get(type);
if (items == null) {
items = new ArrayList<>();
itemTypes.put(type, items);
}
items.add(item);
if (!types.contains(type)) {
types.add(type);
}
}
@Override
public void clear() {
super.clear();
types.clear();
itemTypes.clear();
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {

View file

@ -1,10 +1,15 @@
package net.osmand.plus.myplaces;
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.ListPopupWindow;
@ -12,6 +17,9 @@ import android.support.v7.widget.SwitchCompat;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@ -31,6 +39,7 @@ import com.github.mikephil.charting.listener.OnChartGestureListener;
import net.osmand.AndroidUtils;
import net.osmand.data.PointDescription;
import net.osmand.plus.GPXDatabase;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GpxSelectionHelper;
@ -45,6 +54,7 @@ import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.OsmAndListFragment;
import net.osmand.plus.dialogs.ConfigureMapMenu.AppearanceListItem;
import net.osmand.plus.dialogs.ConfigureMapMenu.GpxAppearanceAdapter;
import net.osmand.plus.dialogs.ConfigureMapMenu.GpxAppearanceAdapter.GpxAppearanceAdapterType;
@ -57,11 +67,13 @@ import net.osmand.plus.views.controls.WrapContentHeightViewPager.ViewAtPositionI
import net.osmand.render.RenderingRulesStorage;
import net.osmand.util.Algorithms;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ -70,19 +82,127 @@ import gnu.trove.list.array.TIntArrayList;
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR;
public class TrackSegmentFragment extends SelectedGPXFragment {
public class TrackSegmentFragment extends OsmAndListFragment {
public static final String ARG_TO_FILTER_SHORT_TRACKS = "ARG_TO_FILTER_SHORT_TRACKS";
private OsmandApplication app;
private ArrayAdapter<GpxDisplayItem> adapter;
private GpxDisplayItemType[] filterTypes = { GpxSelectionHelper.GpxDisplayItemType.TRACK_SEGMENT };
private List<String> options = new ArrayList<>();
private List<Double> distanceSplit = new ArrayList<>();
private TIntArrayList timeSplit = new TIntArrayList();
private int selectedSplitInterval;
private boolean updateEnable;
@Override
protected void setupListView(ListView listView) {
super.setupListView(listView);
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.app = getMyApplication();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getListView().setBackgroundColor(getResources().getColor(
getMyApplication().getSettings().isLightContent() ? R.color.ctx_menu_info_view_bg_light
: R.color.ctx_menu_info_view_bg_dark));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = getActivity().getLayoutInflater().inflate(R.layout.update_index, container, false);
view.findViewById(R.id.header_layout).setVisibility(View.GONE);
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setDivider(null);
listView.setDividerHeight(0);
TextView tv = new TextView(getActivity());
tv.setText(R.string.none_selected_gpx);
tv.setTextSize(24);
listView.setEmptyView(tv);
setContent(listView);
return view;
}
public TrackActivity getMyActivity() {
return (TrackActivity) getActivity();
}
public ArrayAdapter<?> getAdapter() {
return adapter;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
getMyActivity().getClearToolbar(false);
if (getGpx() != null && getGpx().path != null && !getGpx().showCurrentTrack) {
MenuItem item = menu.add(R.string.shared_string_share).setIcon(R.drawable.ic_action_gshare_dark)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final Uri fileUri = Uri.fromFile(new File(getGpx().path));
final Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
sendIntent.setType("application/gpx+xml");
startActivity(sendIntent);
return true;
}
});
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
}
}
private GPXUtilities.GPXFile getGpx() {
return getMyActivity().getGpx();
}
private GPXDatabase.GpxDataItem getGpxDataItem() {
return getMyActivity().getGpxDataItem();
}
private void startHandler() {
Handler updateCurrentRecordingTrack = new Handler();
updateCurrentRecordingTrack.postDelayed(new Runnable() {
@Override
public void run() {
if (updateEnable) {
updateContent();
adapter.notifyDataSetChanged();
startHandler();
}
}
}, 2000);
}
@Override
public void onResume() {
super.onResume();
updateContent();
updateEnable = true;
if (getGpx() != null && getGpx().showCurrentTrack) {
startHandler();
}
}
@Override
public void onPause() {
super.onPause();
updateEnable = false;
}
private void setupListView(ListView listView) {
if (adapter.getCount() > 0) {
View view = getActivity().getLayoutInflater().inflate(R.layout.gpx_item_list_header, null, false);
listView.addHeaderView(view);
listView.addFooterView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, null, false));
final ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
final View splitIntervalView = view.findViewById(R.id.split_interval_view);
final View colorView = view.findViewById(R.id.color_view);
@ -204,8 +324,7 @@ public class TrackSegmentFragment extends SelectedGPXFragment {
}
private List<GpxDisplayGroup> getGroups() {
return filterGroups(new GpxDisplayItemType[] { GpxDisplayItemType.TRACK_SEGMENT },
getMyActivity(), getArguments());
return filterGroups();
}
private void setupSplitIntervalView(View view) {
@ -255,9 +374,72 @@ public class TrackSegmentFragment extends SelectedGPXFragment {
}
}
@Override
protected GpxDisplayItemType[] filterTypes() {
return new GpxDisplayItemType[] { GpxSelectionHelper.GpxDisplayItemType.TRACK_SEGMENT };
private boolean isArgumentTrue(@NonNull String arg) {
return getArguments() != null && getArguments().getBoolean(arg);
}
protected boolean hasFilterType(GpxDisplayItemType filterType) {
for (GpxDisplayItemType type : filterTypes) {
if (type == filterType) {
return true;
}
}
return false;
}
private List<GpxDisplayGroup> filterGroups() {
List<GpxDisplayGroup> result = getMyActivity().getGpxFile();
List<GpxDisplayGroup> groups = new ArrayList<>();
for (GpxDisplayGroup group : result) {
boolean add = hasFilterType(group.getType());
if (isArgumentTrue(ARG_TO_FILTER_SHORT_TRACKS)) {
Iterator<GpxDisplayItem> item = group.getModifiableList().iterator();
while (item.hasNext()) {
GpxDisplayItem it2 = item.next();
if (it2.analysis != null && it2.analysis.totalDistance < 100) {
item.remove();
}
}
if (group.getModifiableList().isEmpty()) {
add = false;
}
}
if (add) {
groups.add(group);
}
}
return groups;
}
public void setContent() {
setContent(getListView());
}
public void setContent(ListView listView) {
adapter = new SegmentGPXAdapter(new ArrayList<GpxDisplayItem>());
updateContent();
setupListView(listView);
setListAdapter(adapter);
}
protected void updateContent() {
adapter.clear();
List<GpxDisplayGroup> groups = filterGroups();
adapter.setNotifyOnChange(false);
for (GpxDisplayItem i : flatten(groups)) {
adapter.add(i);
}
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
protected List<GpxDisplayItem> flatten(List<GpxDisplayGroup> groups) {
ArrayList<GpxDisplayItem> list = new ArrayList<>();
for(GpxDisplayGroup g : groups) {
list.addAll(g.getModifiableList());
}
return list;
}
private void prepareSplitIntervalAdapterData() {
@ -292,7 +474,7 @@ public class TrackSegmentFragment extends SelectedGPXFragment {
}
private void updateSplit(List<GpxDisplayGroup> groups, SelectedGpxFile sf) {
new SplitTrackAsyncTask(sf, this, getMyActivity(), groups).execute((Void) null);
new SplitTrackAsyncTask(sf, groups).execute((Void) null);
}
private void addOptionSplit(int value, boolean distance, List<GpxDisplayGroup> model) {
@ -320,11 +502,31 @@ public class TrackSegmentFragment extends SelectedGPXFragment {
}
}
/*
@Override
public ArrayAdapter<GpxDisplayItem> createSelectedGPXAdapter() {
return new SegmentGPXAdapter(new ArrayList<GpxDisplayItem>());
public void onListItemClick(ListView l, View v, int position, long id) {
GpxDisplayItem child = adapter.getItem(position);
if (child != null) {
if (child.group.getGpx() != null) {
app.getSelectedGpxHelper().setGpxFileToDisplay(child.group.getGpx());
}
final OsmandSettings settings = app.getSettings();
LatLon location = new LatLon(child.locationStart.lat, child.locationStart.lon);
if (child.group.getType() == GpxDisplayItemType.TRACK_POINTS) {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_WPT, child.locationStart.name),
false,
child.locationStart);
}
MapActivity.launchMapActivityMoveToTop(getActivity());
}
}
*/
class SegmentGPXAdapter extends ArrayAdapter<GpxDisplayItem> {
private Map<GpxDisplayItem, GPXItemPagerAdapter> pagerAdaptersMap = new HashMap<>();
@ -783,24 +985,21 @@ public class TrackSegmentFragment extends SelectedGPXFragment {
class SplitTrackAsyncTask extends AsyncTask<Void, Void, Void> {
@Nullable
private final SelectedGpxFile mSelectedGpxFile;
@NonNull private final SelectedGPXFragment mFragment;
@NonNull private final TrackSegmentFragment mFragment;
@NonNull private final TrackActivity mActivity;
private final List<GpxDisplayGroup> groups;
SplitTrackAsyncTask(@Nullable SelectedGpxFile selectedGpxFile,
@NonNull SelectedGPXFragment fragment,
@NonNull TrackActivity activity,
List<GpxDisplayGroup> groups) {
SplitTrackAsyncTask(@Nullable SelectedGpxFile selectedGpxFile, List<GpxDisplayGroup> groups) {
mSelectedGpxFile = selectedGpxFile;
mFragment = fragment;
mActivity = activity;
mFragment = TrackSegmentFragment.this;
mActivity = getMyActivity();
this.groups = groups;
}
protected void onPostExecute(Void result) {
if (mSelectedGpxFile != null) {
mSelectedGpxFile.setDisplayGroups(filterGroups(null, mActivity, mFragment.getArguments()));
mSelectedGpxFile.setDisplayGroups(filterGroups());
}
if (mFragment.isVisible()) {
mFragment.updateContent();