From 63b101e3a79c3eec7b8342602f71fcfb5d593397 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Fri, 24 Jul 2020 17:46:08 +0300 Subject: [PATCH] Display split interval in card --- .../TrackActivityFragmentAdapter.java | 11 ++-- .../plus/track/SplitIntervalBottomSheet.java | 35 +++--------- .../osmand/plus/track/SplitIntervalCard.java | 53 ++++++++++++++++++- .../plus/track/TrackAppearanceFragment.java | 51 +++++++++++------- 4 files changed, 93 insertions(+), 57 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java index 6d22a7f305..29f14447fd 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java @@ -54,6 +54,7 @@ import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.measurementtool.NewGpxData; +import net.osmand.plus.track.SplitIntervalCard; import net.osmand.plus.track.SplitTrackAsyncTask; import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener; @@ -802,20 +803,14 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { if (model.size() > 0) { if (distance) { double dvalue = OsmAndFormatter.calculateRoundedDist(value, app); - options.add(OsmAndFormatter.getFormattedDistance((float) dvalue, app)); + options.add(SplitIntervalCard.getFormattedDistanceInterval(app, value)); distanceSplit.add(dvalue); timeSplit.add(-1); if (Math.abs(model.get(0).getSplitDistance() - dvalue) < 1) { selectedSplitInterval = distanceSplit.size() - 1; } } else { - if (value < 60) { - options.add(value + " " + app.getString(R.string.int_seconds)); - } else if (value % 60 == 0) { - options.add((value / 60) + " " + app.getString(R.string.int_min)); - } else { - options.add((value / 60f) + " " + app.getString(R.string.int_min)); - } + options.add(SplitIntervalCard.getFormattedTimeInterval(app, value)); distanceSplit.add(-1d); timeSplit.add(value); if (model.get(0).getSplitTime() == value) { diff --git a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java index e062483739..e8728d6003 100644 --- a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java @@ -1,6 +1,5 @@ package net.osmand.plus.track; -import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -27,7 +26,6 @@ import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import org.apache.commons.logging.Log; @@ -190,7 +188,7 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { private void addDistanceOptionSplit(int value, @NonNull List displayGroups) { if (displayGroups.size() > 0) { double dvalue = OsmAndFormatter.calculateRoundedDist(value, app); - String formattedDist = OsmAndFormatter.getFormattedDistance((float) dvalue, app); + String formattedDist = SplitIntervalCard.getFormattedDistanceInterval(app, value); distanceSplitOptions.put(formattedDist, dvalue); if (Math.abs(displayGroups.get(0).getSplitDistance() - dvalue) < 1) { selectedDistanceSplitInterval = distanceSplitOptions.size() - 1; @@ -200,14 +198,7 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { private void addTimeOptionSplit(int value, @NonNull List model) { if (model.size() > 0) { - String time; - if (value < 60) { - time = value + " " + getString(R.string.int_seconds); - } else if (value % 60 == 0) { - time = (value / 60) + " " + getString(R.string.int_min); - } else { - time = (value / 60f) + " " + getString(R.string.int_min); - } + String time = SplitIntervalCard.getFormattedTimeInterval(app, value); timeSplitOptions.put(time, value); if (model.get(0).getSplitTime() == value) { selectedTimeSplitInterval = timeSplitOptions.size() - 1; @@ -311,24 +302,10 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { int timeSplit = new ArrayList<>(timeSplitOptions.values()).get(selectedTimeSplitInterval); double distanceSplit = new ArrayList<>(distanceSplitOptions.values()).get(selectedDistanceSplitInterval); - SplitTrackListener splitTrackListener = new SplitTrackListener() { - - @Override - public void trackSplittingStarted() { - - } - - @Override - public void trackSplittingFinished() { - if (selectedGpxFile != null) { - List groups = getDisplayGroups(); - selectedGpxFile.setDisplayGroups(groups, app); - } - } - }; - List groups = getDisplayGroups(); - new SplitTrackAsyncTask(app, selectedSplitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), - timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + Fragment target = getTargetFragment(); + if (target instanceof TrackAppearanceFragment) { + ((TrackAppearanceFragment) target).applySplit(selectedSplitType, timeSplit, distanceSplit); + } } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java b/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java index 44b4d75b0c..377185e714 100644 --- a/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java +++ b/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java @@ -1,19 +1,31 @@ package net.osmand.plus.track; +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmAndFormatter; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.FontCache; import net.osmand.plus.routepreparationmenu.cards.BaseCard; +import net.osmand.plus.widgets.style.CustomTypefaceSpan; public class SplitIntervalCard extends BaseCard { - public SplitIntervalCard(@NonNull MapActivity mapActivity) { + private TrackDrawInfo trackDrawInfo; + + public SplitIntervalCard(@NonNull MapActivity mapActivity, @NonNull TrackDrawInfo trackDrawInfo) { super(mapActivity); + this.trackDrawInfo = trackDrawInfo; } @Override @@ -28,6 +40,17 @@ public class SplitIntervalCard extends BaseCard { TextView titleView = view.findViewById(R.id.title); titleView.setText(R.string.gpx_split_interval); + Typeface typeface = FontCache.getFont(app, app.getString(R.string.font_roboto_medium)); + int secondaryTextColor = AndroidUtils.getColorFromAttr(view.getContext(), R.attr.active_color_basic); + + String splitInterval = getSplitInterval(); + SpannableStringBuilder spannableSplitInterval = new SpannableStringBuilder(splitInterval); + spannableSplitInterval.setSpan(new ForegroundColorSpan(secondaryTextColor), 0, spannableSplitInterval.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + spannableSplitInterval.setSpan(new CustomTypefaceSpan(typeface), 0, spannableSplitInterval.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + TextView descriptionView = view.findViewById(R.id.description); + descriptionView.setText(spannableSplitInterval); + view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -38,4 +61,32 @@ public class SplitIntervalCard extends BaseCard { } }); } + + private String getSplitInterval() { + String intervalStr = ""; + int splitInterval = (int) trackDrawInfo.getSplitInterval(); + if (splitInterval == 0) { + intervalStr = GpxSplitType.NO_SPLIT.getHumanString(app); + } else if (trackDrawInfo.getSplitType() == GpxSplitType.DISTANCE.getType()) { + intervalStr = getFormattedDistanceInterval(app, trackDrawInfo.getSplitInterval()); + } else if (trackDrawInfo.getSplitType() == GpxSplitType.TIME.getType()) { + intervalStr = getFormattedTimeInterval(app, splitInterval); + } + return intervalStr; + } + + public static String getFormattedTimeInterval(OsmandApplication app, double interval) { + if (interval < 60) { + return interval + " " + app.getString(R.string.int_seconds); + } else if (interval % 60 == 0) { + return (interval / 60) + " " + app.getString(R.string.int_min); + } else { + return (interval / 60f) + " " + app.getString(R.string.int_min); + } + } + + public static String getFormattedDistanceInterval(OsmandApplication app, double interval) { + double roundedDist = OsmAndFormatter.calculateRoundedDist(interval, app); + return OsmAndFormatter.getFormattedDistance((float) roundedDist, app); + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java index de72d33f8e..02fe4b4748 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java @@ -41,6 +41,7 @@ import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.render.RenderingRulesStorage; import net.osmand.util.Algorithms; @@ -73,6 +74,7 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card private long modifiedTime = -1; private TrackWidthCard trackWidthCard; + private SplitIntervalCard splitIntervalCard; private ImageView appearanceIcon; private View zoomButtonsView; @@ -544,27 +546,38 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card if (splitType == null) { splitType = GpxSplitType.NO_SPLIT; } - SplitTrackAsyncTask.SplitTrackListener splitTrackListener = new SplitTrackAsyncTask.SplitTrackListener() { - - @Override - public void trackSplittingStarted() { - - } - - @Override - public void trackSplittingFinished() { - if (selectedGpxFile != null) { - List groups = getGpxDisplayGroups(); - selectedGpxFile.setDisplayGroups(groups, app); - } - } - }; - List groups = getGpxDisplayGroups(); - new SplitTrackAsyncTask(app, splitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), - timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + applySplit(splitType, timeSplit, distanceSplit); } } + void applySplit(GpxSplitType splitType, int timeSplit, double distanceSplit) { + if (splitIntervalCard != null) { + splitIntervalCard.updateContent(); + } + SplitTrackListener splitTrackListener = new SplitTrackListener() { + + @Override + public void trackSplittingStarted() { + + } + + @Override + public void trackSplittingFinished() { + if (selectedGpxFile != null) { + List groups = getGpxDisplayGroups(); + selectedGpxFile.setDisplayGroups(groups, app); + } + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) { + mapActivity.refreshMap(); + } + } + }; + List groups = getGpxDisplayGroups(); + new SplitTrackAsyncTask(app, splitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), + timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + private void saveGpx(final GPXFile gpxFile) { new SaveGpxAsyncTask(gpxFile, new SaveGpxAsyncTask.SaveGpxListener() { @Override @@ -587,7 +600,7 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card ViewGroup cardsContainer = getCardsContainer(); cardsContainer.removeAllViews(); - SplitIntervalCard splitIntervalCard = new SplitIntervalCard(mapActivity); + splitIntervalCard = new SplitIntervalCard(mapActivity, trackDrawInfo); splitIntervalCard.setListener(this); cardsContainer.addView(splitIntervalCard.build(mapActivity));