diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 408c144a5a..950fe93b09 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -165,6 +165,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven private MapViewTrackingUtilities mapViewTrackingUtilities; private static MapContextMenu mapContextMenu = new MapContextMenu(); private static MapRouteInfoMenu mapRouteInfoMenu = new MapRouteInfoMenu(); + private static TrackDetailsMenu trackDetailsMenu = new TrackDetailsMenu(); private static Intent prevActivityIntent = null; private List activityResultListeners = new ArrayList<>(); @@ -228,6 +229,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven mapViewTrackingUtilities = app.getMapViewTrackingUtilities(); mapContextMenu.setMapActivity(this); mapRouteInfoMenu.setMapActivity(this); + trackDetailsMenu.setMapActivity(this); super.onCreate(savedInstanceState); // Full screen is not used here @@ -345,8 +347,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven if (removeFragment(PlanRouteFragment.TAG)) { app.getMapMarkersHelper().getPlanRouteContext().setFragmentVisible(true); } - if (TrackDetailsMenu.isVisible()) { - mapLayers.getMapControlsLayer().getTrackDetailsMenu().hide(); + if (trackDetailsMenu.isVisible()) { + trackDetailsMenu.dismiss(); } removeFragment(ImportGpxBottomSheetDialogFragment.TAG); removeFragment(AdditionalActionsBottomSheetDialogFragment.TAG); @@ -587,8 +589,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven showQuickSearch(ShowQuickSearchMode.CURRENT, false); return; } - if (TrackDetailsMenu.isVisible()) { - getMapLayers().getMapControlsLayer().getTrackDetailsMenu().hide(); + if (trackDetailsMenu.isVisible()) { + trackDetailsMenu.hide(); if (prevActivityIntent == null) { return; } @@ -1094,6 +1096,9 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven dashboardOnMap.hideDashboard(); } } + if (trackDetailsMenu.isVisible()) { + trackDetailsMenu.show(); + } if (searchRequestToShow != null) { showQuickSearch(searchRequestToShow); } @@ -1124,7 +1129,6 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven //mapContextMenu.setMapZoom(settings.getMapZoomToShow()); mapContextMenu.setMapZoom(tb.getZoom()); if (toShow instanceof GpxDisplayItem) { - TrackDetailsMenu trackDetailsMenu = mapLayers.getMapControlsLayer().getTrackDetailsMenu(); trackDetailsMenu.setGpxItem((GpxDisplayItem) toShow); trackDetailsMenu.show(); } else if (mapRouteInfoMenu.isVisible()) { @@ -1269,6 +1273,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven super.onDestroy(); mapContextMenu.setMapActivity(null); mapRouteInfoMenu.setMapActivity(null); + trackDetailsMenu.setMapActivity(null); unregisterReceiver(screenOffReceiver); app.getAidlApi().onDestroyMapActivity(this); FailSafeFuntions.quitRouteRestoreDialog(); @@ -1596,6 +1601,11 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven return mapRouteInfoMenu; } + @NonNull + public TrackDetailsMenu getTrackDetailsMenu() { + return trackDetailsMenu; + } + public void openDrawer() { mapActions.updateDrawerMenu(); boolean animate = !settings.DO_NOT_USE_ANIMATIONS.get(); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 809041feb6..af50969038 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -3,7 +3,7 @@ package net.osmand.plus.mapcontextmenu.other; import android.content.Context; import android.graphics.Matrix; import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import android.support.annotation.Nullable; import android.support.v7.widget.PopupMenu; import android.view.MenuItem; import android.view.MotionEvent; @@ -21,14 +21,14 @@ import com.github.mikephil.charting.listener.OnChartGestureListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import net.osmand.AndroidUtils; -import net.osmand.data.LatLon; -import net.osmand.data.QuadRect; -import net.osmand.data.RotatedTileBox; import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.WptPt; +import net.osmand.data.LatLon; +import net.osmand.data.QuadRect; +import net.osmand.data.RotatedTileBox; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -43,7 +43,6 @@ import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -51,42 +50,114 @@ import java.util.List; public class TrackDetailsMenu { + @Nullable private MapActivity mapActivity; + @Nullable private GpxDisplayItem gpxItem; + @Nullable private TrackDetailsBarController toolbarController; + @Nullable private TrkSegment segment; + @Nullable private TrackChartPoints trackChartPoints; + @Nullable private List xAxisPoints; private int topMarginPx; + private boolean visible; + private boolean hidding; - private static boolean VISIBLE; - - public TrackDetailsMenu(@NonNull MapActivity mapActivity) { - this.mapActivity = mapActivity; - topMarginPx = AndroidUtils.dpToPx(mapActivity, 48f); + public TrackDetailsMenu() { } + @Nullable + public MapActivity getMapActivity() { + return mapActivity; + } + + public void setMapActivity(@Nullable MapActivity mapActivity) { + this.mapActivity = mapActivity; + if (mapActivity != null) { + if (topMarginPx == 0) { + topMarginPx = AndroidUtils.dpToPx(mapActivity, 48f); + } + } + } + + @Nullable public GpxDisplayItem getGpxItem() { return gpxItem; } - public void setGpxItem(GpxDisplayItem gpxItem) { + public void setGpxItem(@NonNull GpxDisplayItem gpxItem) { this.gpxItem = gpxItem; } - public static boolean isVisible() { - return VISIBLE; + public boolean isVisible() { + return visible; } public void show() { - if (!VISIBLE) { - VISIBLE = true; + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && getGpxItem() != null) { + visible = true; + TrackDetailsMenuFragment.showInstance(mapActivity); + } + } + + public void dismiss() { + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + fragment.dismiss(); + } + } + + public void hide() { + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + hidding = true; + fragment.dismiss(); + } else { + segment = null; + trackChartPoints = null; + } + } + + public void update() { + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + fragment.updateInfo(); + } + } + + private TrackDetailsMenuFragment getMenuFragment() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + TrackDetailsMenuFragment fragment = (TrackDetailsMenuFragment) mapActivity.getSupportFragmentManager() + .findFragmentByTag(TrackDetailsMenuFragment.TAG); + if (fragment != null && !fragment.isDetached()) { + return fragment; + } + } + return null; + } + + public void onShow() { + MapActivity mapActivity = getMapActivity(); + GpxDisplayItem gpxItem = getGpxItem(); + if (mapActivity != null && gpxItem != null) { + OsmandApplication app = mapActivity.getMyApplication(); + GPXFile groupGpx = gpxItem.group.getGpx(); + if (groupGpx != null) { + gpxItem.wasHidden = app.getSelectedGpxHelper().getSelectedFileByPath(groupGpx.path) == null; + app.getSelectedGpxHelper().setGpxFileToDisplay(groupGpx); + } boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); if (!portrait) { mapActivity.getMapView().setMapPositionX(1); } else { - toolbarController = new TrackDetailsBarController(); - if (gpxItem != null && gpxItem.group != null) { + TrackDetailsBarController toolbarController = new TrackDetailsBarController(); + this.toolbarController = toolbarController; + if (gpxItem.group != null) { toolbarController.setTitle(gpxItem.group.getGpxName()); } else { toolbarController.setTitle(mapActivity.getString(R.string.rendering_category_details)); @@ -94,7 +165,10 @@ public class TrackDetailsMenu { toolbarController.setOnBackButtonClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mapActivity.onBackPressed(); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.onBackPressed(); + } } }); toolbarController.setOnCloseButtonClickListener(new View.OnClickListener() { @@ -105,55 +179,34 @@ public class TrackDetailsMenu { }); mapActivity.showTopToolbar(toolbarController); } - mapActivity.refreshMap(); - - TrackDetailsMenuFragment.showInstance(mapActivity); mapActivity.getMapLayers().getContextMenuLayer().enterGpxDetailsMode(); } } - public void hide() { - WeakReference fragmentRef = findMenuFragment(); - if (fragmentRef != null) { - fragmentRef.get().dismiss(); - } else { - segment = null; - VISIBLE = false; - } - } - - public void update() { - WeakReference fragmentRef = findMenuFragment(); - if (fragmentRef != null) { - fragmentRef.get().updateInfo(); - } - } - - private WeakReference findMenuFragment() { - Fragment fragment = mapActivity.getSupportFragmentManager().findFragmentByTag(TrackDetailsMenuFragment.TAG); - if (fragment != null && !fragment.isDetached()) { - return new WeakReference<>((TrackDetailsMenuFragment) fragment); - } else { - return null; - } - } - public void onDismiss() { - VISIBLE = false; - if (gpxItem != null && !gpxItem.route && gpxItem.wasHidden && gpxItem.group != null && gpxItem.group.getGpx() != null) { - mapActivity.getMyApplication().getSelectedGpxHelper().selectGpxFile(gpxItem.group.getGpx(), false, false); + GpxDisplayItem gpxItem = getGpxItem(); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + if (gpxItem != null && !gpxItem.route && gpxItem.wasHidden && gpxItem.group != null && gpxItem.group.getGpx() != null) { + mapActivity.getMyApplication().getSelectedGpxHelper().selectGpxFile(gpxItem.group.getGpx(), false, false); + } + TrackDetailsBarController toolbarController = this.toolbarController; + if (toolbarController != null) { + mapActivity.hideTopToolbar(toolbarController); + } + mapActivity.getMapLayers().getContextMenuLayer().exitGpxDetailsMode(); + mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(null); + mapActivity.getMapLayers().getMapInfoLayer().setTrackChartPoints(null); + mapActivity.getMapView().setMapPositionX(0); + mapActivity.getMapView().refreshMap(); } - if (toolbarController != null) { - mapActivity.hideTopToolbar(toolbarController); + if (hidding) { + hidding = false; + visible = false; + segment = null; + trackChartPoints = null; } - mapActivity.getMapLayers().getContextMenuLayer().exitGpxDetailsMode(); - mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(null); - mapActivity.getMapLayers().getMapInfoLayer().setTrackChartPoints(null); - mapActivity.getMapView().setMapPositionX(0); - mapActivity.getMapView().refreshMap(); - segment = null; - trackChartPoints = null; } public void updateInfo(final View main) { @@ -161,9 +214,11 @@ public class TrackDetailsMenu { } private TrkSegment getTrackSegment(LineChart chart) { + TrkSegment segment = this.segment; if (segment == null) { List ds = chart.getLineData().getDataSets(); - if (ds != null && ds.size() > 0) { + GpxDisplayItem gpxItem = getGpxItem(); + if (ds != null && ds.size() > 0 && gpxItem != null) { for (GPXUtilities.Track t : gpxItem.group.getGpx().tracks) { for (TrkSegment s : t.segments) { if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) { @@ -175,6 +230,7 @@ public class TrackDetailsMenu { break; } } + this.segment = segment; } } return segment; @@ -183,11 +239,12 @@ public class TrackDetailsMenu { private WptPt getPoint(LineChart chart, float pos) { WptPt wpt = null; List ds = chart.getLineData().getDataSets(); - if (ds != null && ds.size() > 0) { + GpxDisplayItem gpxItem = getGpxItem(); + if (ds != null && ds.size() > 0 && gpxItem != null) { TrkSegment segment = getTrackSegment(chart); OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0); if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME || - gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { + gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { float time = pos * 1000; for (WptPt p : segment.points) { if (p.time - gpxItem.analysis.startTime >= time) { @@ -220,7 +277,8 @@ public class TrackDetailsMenu { double left = 0, right = 0; double top = 0, bottom = 0; List ds = chart.getLineData().getDataSets(); - if (ds != null && ds.size() > 0) { + GpxDisplayItem gpxItem = getGpxItem(); + if (ds != null && ds.size() > 0 && gpxItem != null) { TrkSegment segment = getTrackSegment(chart); OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0); if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME || gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { @@ -274,45 +332,55 @@ public class TrackDetailsMenu { private void fitTrackOnMap(LineChart chart, LatLon location, boolean forceFit) { QuadRect rect = getRect(chart, chart.getLowestVisibleX(), chart.getHighestVisibleX()); - RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); - int tileBoxWidthPx = 0; - int tileBoxHeightPx = 0; + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); + int tileBoxWidthPx = 0; + int tileBoxHeightPx = 0; - WeakReference fragmentRef = findMenuFragment(); - if (fragmentRef != null) { - TrackDetailsMenuFragment f = fragmentRef.get(); - boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); - if (!portrait) { - tileBoxWidthPx = tb.getPixWidth() - f.getWidth(); - } else { - tileBoxHeightPx = tb.getPixHeight() - f.getHeight(); + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); + if (!portrait) { + tileBoxWidthPx = tb.getPixWidth() - fragment.getWidth(); + } else { + tileBoxHeightPx = tb.getPixHeight() - fragment.getHeight(); + } } - } - if (tileBoxHeightPx > 0 || tileBoxWidthPx > 0) { - if (forceFit) { - mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, - tileBoxWidthPx, tileBoxHeightPx, topMarginPx); - } else if (location != null && - !mapActivity.getMapView().getTileBox(tileBoxWidthPx, tileBoxHeightPx, topMarginPx).containsLatLon(location)) { - boolean animating = mapActivity.getMapView().getAnimatedDraggingThread().isAnimating(); - mapActivity.getMapView().fitLocationToMap(location.getLatitude(), location.getLongitude(), - mapActivity.getMapView().getZoom(), tileBoxWidthPx, tileBoxHeightPx, topMarginPx, !animating); - } else { - mapActivity.refreshMap(); + if (tileBoxHeightPx > 0 || tileBoxWidthPx > 0) { + if (forceFit) { + mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, + tileBoxWidthPx, tileBoxHeightPx, topMarginPx); + } else if (location != null && + !mapActivity.getMapView().getTileBox(tileBoxWidthPx, tileBoxHeightPx, topMarginPx).containsLatLon(location)) { + boolean animating = mapActivity.getMapView().getAnimatedDraggingThread().isAnimating(); + mapActivity.getMapView().fitLocationToMap(location.getLatitude(), location.getLongitude(), + mapActivity.getMapView().getZoom(), tileBoxWidthPx, tileBoxHeightPx, topMarginPx, !animating); + } else { + mapActivity.refreshMap(); + } } } } private void refreshChart(LineChart chart, boolean forceFit) { + MapActivity mapActivity = getMapActivity(); + GpxDisplayItem gpxItem = getGpxItem(); + if (mapActivity == null || gpxItem == null) { + return; + } + Highlight[] highlights = chart.getHighlighted(); LatLon location = null; + TrackChartPoints trackChartPoints = this.trackChartPoints; if (trackChartPoints == null) { trackChartPoints = new TrackChartPoints(); TrkSegment segment = getTrackSegment(chart); int segmentColor = segment != null ? segment.getColor(0) : 0; trackChartPoints.setSegmentColor(segmentColor); - trackChartPoints.setGpx(getGpxItem().group.getGpx()); + trackChartPoints.setGpx(gpxItem.group.getGpx()); + this.trackChartPoints = trackChartPoints; } float minimumVisibleXValue = chart.getLowestVisibleX(); @@ -370,6 +438,11 @@ public class TrackDetailsMenu { } private void updateView(final View parentView) { + MapActivity mapActivity = getMapActivity(); + GpxDisplayItem gpxItem = getGpxItem(); + if (mapActivity == null || gpxItem == null) { + return; + } GPXTrackAnalysis analysis = gpxItem.analysis; if (analysis == null || gpxItem.chartTypes == null) { parentView.setVisibility(View.GONE); @@ -408,15 +481,18 @@ public class TrackDetailsMenu { @Override public void onChartGestureEnd(MotionEvent me, ChartGesture lastPerformedGesture) { - if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || - lastPerformedGesture == ChartGesture.X_ZOOM || - lastPerformedGesture == ChartGesture.Y_ZOOM || - lastPerformedGesture == ChartGesture.PINCH_ZOOM || - lastPerformedGesture == ChartGesture.DOUBLE_TAP || - lastPerformedGesture == ChartGesture.ROTATE) { + GpxDisplayItem gpxItem = getGpxItem(); + if (gpxItem != null) { + if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || + lastPerformedGesture == ChartGesture.X_ZOOM || + lastPerformedGesture == ChartGesture.Y_ZOOM || + lastPerformedGesture == ChartGesture.PINCH_ZOOM || + lastPerformedGesture == ChartGesture.DOUBLE_TAP || + lastPerformedGesture == ChartGesture.ROTATE) { - gpxItem.chartMatrix = new Matrix(chart.getViewPortHandler().getMatrixTouch()); - refreshChart(chart, true); + gpxItem.chartMatrix = new Matrix(chart.getViewPortHandler().getMatrixTouch()); + refreshChart(chart, true); + } } } @@ -500,21 +576,21 @@ public class TrackDetailsMenu { final List availableTypes = new ArrayList<>(); boolean hasSlopeChart = false; if (analysis.hasElevationData) { - availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE }); + availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE}); if (gpxItem.chartAxisType != GPXDataSetAxisType.TIME - && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { + && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { availableTypes.add(new GPXDataSetType[]{GPXDataSetType.SLOPE}); } } if (analysis.hasSpeedData) { - availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SPEED }); + availableTypes.add(new GPXDataSetType[]{GPXDataSetType.SPEED}); } if (analysis.hasElevationData && gpxItem.chartAxisType != GPXDataSetAxisType.TIME - && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { - availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE }); + && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { + availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE}); } if (analysis.hasElevationData && analysis.hasSpeedData) { - availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED }); + availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED}); } for (GPXDataSetType t : gpxItem.chartTypes) { @@ -529,7 +605,7 @@ public class TrackDetailsMenu { yAxis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final PopupMenu optionsMenu = new PopupMenu(mapActivity, v); + PopupMenu optionsMenu = new PopupMenu(v.getContext(), v); DirectionsDialogs.setupPopUpMenuIcon(optionsMenu); for (final GPXDataSetType[] types : availableTypes) { MenuItem menuItem = optionsMenu.getMenu() @@ -538,6 +614,7 @@ public class TrackDetailsMenu { menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem mItem) { + GpxDisplayItem gpxItem = getGpxItem(); gpxItem.chartTypes = types; update(); return true; @@ -572,20 +649,24 @@ public class TrackDetailsMenu { xAxis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final PopupMenu optionsMenu = new PopupMenu(mapActivity, v); + final PopupMenu optionsMenu = new PopupMenu(v.getContext(), v); DirectionsDialogs.setupPopUpMenuIcon(optionsMenu); for (final GPXDataSetAxisType type : GPXDataSetAxisType.values()) { MenuItem menuItem = optionsMenu.getMenu() - .add(type.getStringId()).setIcon(type.getImageDrawable(app)); + .add(type.getStringId()).setIcon(type.getImageDrawable(app)); menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem mItem) { - - gpxItem.chartAxisType = type; - gpxItem.chartHighlightPos = -1; - gpxItem.chartMatrix = null; - update(); - return true; + GpxDisplayItem gpxItem = getGpxItem(); + if (gpxItem != null) { + gpxItem.chartAxisType = type; + gpxItem.chartHighlightPos = -1; + gpxItem.chartMatrix = null; + update(); + return true; + } else { + return false; + } } }); } @@ -603,15 +684,18 @@ public class TrackDetailsMenu { } private void updateChart(LineChart chart) { + GpxDisplayItem gpxItem = getGpxItem(); chart.notifyDataSetChanged(); chart.invalidate(); - if (gpxItem.chartMatrix != null) { - chart.getViewPortHandler().refresh(new Matrix(gpxItem.chartMatrix), chart, true); - } - if (gpxItem.chartHighlightPos != -1) { - chart.highlightValue(gpxItem.chartHighlightPos, 0); - } else { - chart.highlightValue(null); + if (gpxItem != null) { + if (gpxItem.chartMatrix != null) { + chart.getViewPortHandler().refresh(new Matrix(gpxItem.chartMatrix), chart, true); + } + if (gpxItem.chartHighlightPos != -1) { + chart.highlightValue(gpxItem.chartHighlightPos, 0); + } else { + chart.highlightValue(null); + } } } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java index 088f5bf1e0..c2f3768721 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java @@ -3,6 +3,7 @@ package net.osmand.plus.mapcontextmenu.other; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v7.view.ContextThemeWrapper; @@ -25,16 +26,23 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { private TrackDetailsMenu menu; private View mainView; + private boolean paused = true; + @Nullable private MapActivity getMapActivity() { return (MapActivity) getActivity(); } + @NonNull + private MapActivity requireMapActivity() { + return (MapActivity) requireMyActivity(); + } + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - MapActivity mapActivity = getMapActivity(); - menu = mapActivity.getMapLayers().getMapControlsLayer().getTrackDetailsMenu(); + MapActivity mapActivity = requireMapActivity(); + menu = mapActivity.getTrackDetailsMenu(); boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); ContextThemeWrapper context = new ContextThemeWrapper(mapActivity, !nightMode ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme); @@ -74,7 +82,7 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { closeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - dismiss(); + menu.hide(); } }); } @@ -107,7 +115,16 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { super.onResume(); if (menu == null || menu.getGpxItem() == null) { dismiss(); + } else { + menu.onShow(); } + paused = false; + } + + @Override + public void onPause() { + super.onPause(); + paused = true; } @Override @@ -123,6 +140,10 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { return R.color.status_bar_transparent_gradient; } + public boolean isPaused() { + return paused; + } + public int getHeight() { if (mainView != null) { return mainView.getHeight(); @@ -164,26 +185,28 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { public void applyDayNightMode() { MapActivity ctx = getMapActivity(); - boolean portraitMode = AndroidUiHelper.isOrientationPortrait(ctx); - boolean landscapeLayout = !portraitMode; - boolean nightMode = ctx.getMyApplication().getDaynightHelper().isNightModeForMapControls(); - if (!landscapeLayout) { - AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); - } else { - AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_left_menu_light, R.drawable.bg_left_menu_dark); - } + if (ctx != null) { + boolean portraitMode = AndroidUiHelper.isOrientationPortrait(ctx); + boolean landscapeLayout = !portraitMode; + boolean nightMode = ctx.getMyApplication().getDaynightHelper().isNightModeForMapControls(); + if (!landscapeLayout) { + AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); + } else { + AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_left_menu_light, R.drawable.bg_left_menu_dark); + } - AndroidUtils.setTextPrimaryColor(ctx, (TextView) mainView.findViewById(R.id.y_axis_title), nightMode); - AndroidUtils.setTextPrimaryColor(ctx, (TextView) mainView.findViewById(R.id.x_axis_title), nightMode); + AndroidUtils.setTextPrimaryColor(ctx, (TextView) mainView.findViewById(R.id.y_axis_title), nightMode); + AndroidUtils.setTextPrimaryColor(ctx, (TextView) mainView.findViewById(R.id.x_axis_title), nightMode); - ImageView yAxisArrow = (ImageView) mainView.findViewById(R.id.y_axis_arrow); - ImageView xAxisArrow = (ImageView) mainView.findViewById(R.id.x_axis_arrow); - yAxisArrow.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_drop_down)); - xAxisArrow.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_drop_down)); + ImageView yAxisArrow = (ImageView) mainView.findViewById(R.id.y_axis_arrow); + ImageView xAxisArrow = (ImageView) mainView.findViewById(R.id.x_axis_arrow); + yAxisArrow.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_drop_down)); + xAxisArrow.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_drop_down)); - ImageButton backButton = (ImageButton) mainView.findViewById(R.id.top_bar_back_button); - if (backButton != null) { - backButton.setImageDrawable(getIcon(R.drawable.ic_arrow_back, R.color.color_white)); + ImageButton backButton = (ImageButton) mainView.findViewById(R.id.top_bar_back_button); + if (backButton != null) { + backButton.setImageDrawable(getIcon(R.drawable.ic_arrow_back, R.color.color_white)); + } } } diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java index 571748ea68..f6a1319b5d 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java @@ -1358,10 +1358,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment { if (list.size() > 0) { gpxItem.chartTypes = list.toArray(new GPXDataSetType[list.size()]); } - if (gpxItem.group.getGpx() != null) { - gpxItem.wasHidden = app.getSelectedGpxHelper().getSelectedFileByPath(gpxInfo.file.getAbsolutePath()) == null; - app.getSelectedGpxHelper().setGpxFileToDisplay(gpxItem.group.getGpx()); - } final OsmandSettings settings = app.getSettings(); settings.setMapLocationToShow(gpxItem.locationStart.lat, gpxItem.locationStart.lon, settings.getLastKnownMapZoom(), diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java index 84c4bb1062..862e29a8b2 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java @@ -1168,12 +1168,6 @@ public class TrackSegmentFragment extends OsmAndListFragment implements TrackBit gpxItem.locationOnMap = gpxItem.locationStart; } - GPXFile gpx = getGpx(); - GPXFile groupGpx = gpxItem.group.getGpx(); - if (gpx != null && groupGpx != null) { - gpxItem.wasHidden = app.getSelectedGpxHelper().getSelectedFileByPath(gpx.path) == null; - app.getSelectedGpxHelper().setGpxFileToDisplay(groupGpx); - } final OsmandSettings settings = app.getSettings(); settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(), settings.getLastKnownMapZoom(), diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 0b1c65f5fc..94a96f7820 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -46,14 +46,13 @@ import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity.ShowQuickSearchMode; +import net.osmand.plus.base.ContextMenuFragment.MenuState; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.mapcontextmenu.MapContextMenu; -import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; -import net.osmand.plus.base.ContextMenuFragment.MenuState; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType; @@ -101,7 +100,6 @@ public class MapControlsLayer extends OsmandMapLayer { private OsmandSettings settings; private MapRouteInfoMenu mapRouteInfoMenu; - private TrackDetailsMenu trackDetailsMenu; private MapHudButton backToLocationControl; private MapHudButton menuControl; private MapHudButton compassHud; @@ -132,10 +130,6 @@ public class MapControlsLayer extends OsmandMapLayer { contextMenuLayer = mapActivity.getMapLayers().getContextMenuLayer(); } - public TrackDetailsMenu getTrackDetailsMenu() { - return trackDetailsMenu; - } - @Override public boolean drawInScreenPixels() { return true; @@ -299,7 +293,6 @@ public class MapControlsLayer extends OsmandMapLayer { private void initRouteControls() { mapRouteInfoMenu = mapActivity.getMapRouteInfoMenu(); - trackDetailsMenu = new TrackDetailsMenu(mapActivity); } public void setControlsClickable(boolean clickable) { @@ -753,7 +746,7 @@ public class MapControlsLayer extends OsmandMapLayer { routePlanningMode = true; } boolean routeFollowingMode = !routePlanningMode && rh.isFollowingMode(); - boolean trackDialogOpened = TrackDetailsMenu.isVisible(); + boolean trackDialogOpened = mapActivity.getTrackDetailsMenu().isVisible(); boolean contextMenuOpened = !mapActivity.getContextMenu().shouldShowTopControls(); boolean showRouteCalculationControls = routePlanningMode || ((app.accessibilityEnabled() || (System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS)) && routeFollowingMode);