diff --git a/OsmAnd/res/layout/bottom_sheet_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_button_with_icon.xml index 79b89d1213..b184a3bea7 100644 --- a/OsmAnd/res/layout/bottom_sheet_button_with_icon.xml +++ b/OsmAnd/res/layout/bottom_sheet_button_with_icon.xml @@ -19,6 +19,7 @@ android:paddingEnd="@dimen/content_padding_small" android:paddingRight="@dimen/content_padding_small" android:paddingBottom="@dimen/text_margin_small" + tools:background="@drawable/btn_background_inactive_dark" tools:ignore="UselessParent"> + tools:textColor="@color/active_color_primary_dark" /> @@ -62,7 +63,7 @@ android:layout_marginLeft="@dimen/context_menu_padding_margin_large" android:duplicateParentState="true" tools:srcCompat="@drawable/ic_action_appearance" - tools:tint="@color/icon_color_secondary_light" /> + tools:tint="@color/icon_color_active_dark" /> diff --git a/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml index 3d2d1bbab1..2e1c2cd881 100644 --- a/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml +++ b/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml @@ -1,7 +1,7 @@ @@ -9,9 +9,9 @@ android:id="@+id/button_container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:duplicateParentState="true" android:gravity="center_vertical" android:orientation="horizontal" - android:duplicateParentState="true" android:paddingStart="@dimen/content_padding_small" android:paddingLeft="@dimen/content_padding_small" android:paddingTop="@dimen/text_margin_small" @@ -33,6 +33,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:duplicateParentState="true" + android:letterSpacing="@dimen/description_letter_spacing" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_medium" tools:text="Title" @@ -43,10 +44,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:duplicateParentState="true" + android:letterSpacing="@dimen/description_letter_spacing" android:textColor="@color/text_color_secondary_light" android:textSize="@dimen/default_desc_text_size" android:visibility="gone" - android:letterSpacing="@dimen/description_letter_spacing" osmand:typeface="@string/font_roboto_medium" tools:text="Description" tools:visibility="visible" /> @@ -57,9 +58,9 @@ android:id="@+id/icon" android:layout_width="@dimen/map_widget_icon" android:layout_height="@dimen/map_widget_icon" - android:duplicateParentState="true" android:layout_marginStart="@dimen/context_menu_padding_margin_large" android:layout_marginLeft="@dimen/context_menu_padding_margin_large" + android:duplicateParentState="true" tools:srcCompat="@drawable/ic_action_appearance" tools:tint="@color/icon_color_secondary_light" /> diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 625396e5e3..b216913466 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -360,10 +360,10 @@ public class MapActivityActions implements DialogProvider { } public void addActionsToAdapter(final double latitude, - final double longitude, - final ContextMenuAdapter adapter, - Object selectedObj, - boolean configureMenu) { + final double longitude, + final ContextMenuAdapter adapter, + Object selectedObj, + boolean configureMenu) { ItemBuilder itemBuilder = new ItemBuilder(); adapter.addItem(itemBuilder @@ -543,17 +543,17 @@ public class MapActivityActions implements DialogProvider { } public void enterRoutePlanningModeGivenGpx(GPXFile gpxFile, LatLon from, PointDescription fromName, - boolean useIntermediatePointsByDefault, boolean showMenu) { + boolean useIntermediatePointsByDefault, boolean showMenu) { enterRoutePlanningModeGivenGpx(gpxFile, from, fromName, useIntermediatePointsByDefault, showMenu, MapRouteInfoMenu.DEFAULT_MENU_STATE); } public void enterRoutePlanningModeGivenGpx(GPXFile gpxFile, LatLon from, PointDescription fromName, - boolean useIntermediatePointsByDefault, boolean showMenu, int menuState) { + boolean useIntermediatePointsByDefault, boolean showMenu, int menuState) { enterRoutePlanningModeGivenGpx(gpxFile, null, from, fromName, useIntermediatePointsByDefault, showMenu, menuState); } public void enterRoutePlanningModeGivenGpx(GPXFile gpxFile, ApplicationMode appMode, LatLon from, PointDescription fromName, - boolean useIntermediatePointsByDefault, boolean showMenu, int menuState) { + boolean useIntermediatePointsByDefault, boolean showMenu, int menuState) { settings.USE_INTERMEDIATE_POINTS_NAVIGATION.set(useIntermediatePointsByDefault); OsmandApplication app = mapActivity.getMyApplication(); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -843,7 +843,8 @@ public class MapActivityActions implements DialogProvider { } }).createItem()); - boolean isTripRecordingPluginOn = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class) != null; + final OsmandMonitoringPlugin monitoringPlugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class); + boolean isTripRecordingPluginOn = monitoringPlugin != null; if (isTripRecordingPluginOn) { optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.map_widget_monitoring, mapActivity) .setId(DRAWER_TRIP_RECORDING_ID) @@ -853,7 +854,13 @@ public class MapActivityActions implements DialogProvider { public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) { app.logEvent("trip_recording_open"); MapActivity.clearPrevActivityIntent(); - TripRecordingBottomSheet.showInstance(mapActivity.getSupportFragmentManager()); + if (monitoringPlugin.isHasDataToSave() || monitoringPlugin.isWasTrackMonitored()) { + TripRecordingActiveBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), + monitoringPlugin.getCurrentTrack(), monitoringPlugin.isWasTrackMonitored(), + monitoringPlugin.isHasDataToSave(), monitoringPlugin.isSearchingGPS()); + } else { + TripRecordingBottomSheet.showInstance(mapActivity.getSupportFragmentManager()); + } return true; } }).createItem()); @@ -1107,7 +1114,7 @@ public class MapActivityActions implements DialogProvider { } private String getProfileDescription(OsmandApplication app, ApplicationMode mode, - Map profilesObjects, String defaultDescription) { + Map profilesObjects, String defaultDescription) { String description = defaultDescription; String routingProfileKey = mode.getRoutingProfile(); diff --git a/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java index 971bfd01e0..0bdced7bc5 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java @@ -102,26 +102,18 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF @Override public void onResume() { super.onResume(); - // Replace later with tTripRecordingActiveBottomSheet.hide() Fragment target = getTargetFragment(); if (target instanceof TripRecordingActiveBottomSheet) { - Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog(); - if (dialog != null) { - dialog.hide(); - } + ((TripRecordingActiveBottomSheet) target).hide(); } } @Override public void onPause() { super.onPause(); - // Replace later with tTripRecordingActiveBottomSheet.show() Fragment target = getTargetFragment(); if (target instanceof TripRecordingActiveBottomSheet) { - Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog(); - if (dialog != null) { - dialog.show(); - } + ((TripRecordingActiveBottomSheet) target).show(); } } diff --git a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java index 65538733b0..eaa54a948a 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java @@ -28,6 +28,8 @@ import com.google.android.material.slider.Slider; import net.osmand.AndroidUtils; import net.osmand.Location; import net.osmand.ValueHolder; +import net.osmand.plus.GpxSelectionHelper; +import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.NavigationService; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndLocationProvider; @@ -318,8 +320,34 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { } } + public SelectedGpxFile getCurrentTrack() { + return app.getSavingTrackHelper().getCurrentTrack(); + } + + public boolean isWasTrackMonitored() { + return settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); + } + + public boolean isHasDataToSave() { + return app.getSavingTrackHelper().hasDataToSave(); + } + + public boolean isSearchingGPS() { + OsmAndLocationProvider locationProvider = app.getLocationProvider(); + Location lastKnownLocation = locationProvider.getLastKnownLocation(); + return lastKnownLocation == null; + } + public void controlDialog(final Activity activity, final boolean showTrackSelection) { - final boolean wasTrackMonitored = settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); + if (isHasDataToSave() || isWasTrackMonitored()) { + FragmentActivity fragmentActivity = (FragmentActivity) activity; + TripRecordingActiveBottomSheet.showInstance(fragmentActivity.getSupportFragmentManager(), + getCurrentTrack(), isWasTrackMonitored(), isHasDataToSave(), isSearchingGPS()); + } else { + FragmentActivity fragmentActivity = (FragmentActivity) activity; + TripRecordingBottomSheet.showInstance(fragmentActivity.getSupportFragmentManager()); + } + /*final boolean wasTrackMonitored = settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); final boolean nightMode; if (activity instanceof MapActivity) { nightMode = app.getDaynightHelper().isNightModeForMapControls(); @@ -328,8 +356,6 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { } AlertDialog.Builder bld = new AlertDialog.Builder(UiUtilities.getThemedContext(activity, nightMode)); final TIntArrayList items = new TIntArrayList(); - FragmentActivity fragmentActivity = (FragmentActivity) activity; - TripRecordingActiveBottomSheet.showInstance(fragmentActivity.getSupportFragmentManager()); if (wasTrackMonitored) { items.add(R.string.gpx_monitoring_stop); items.add(R.string.gpx_start_new_segment); @@ -419,7 +445,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { } }); // bld.show(); - } + }*/ } public void saveCurrentTrack() { diff --git a/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java index b7bf829457..5172bfc1bf 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java @@ -128,26 +128,18 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm @Override public void onResume() { super.onResume(); - // Replace later with tTripRecordingActiveBottomSheet.hide() Fragment target = getTargetFragment(); if (target instanceof TripRecordingActiveBottomSheet) { - Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog(); - if (dialog != null) { - dialog.hide(); - } + ((TripRecordingActiveBottomSheet) target).hide(); } } @Override public void onPause() { super.onPause(); - // Replace later with tTripRecordingActiveBottomSheet.show() Fragment target = getTargetFragment(); if (target instanceof TripRecordingActiveBottomSheet) { - Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog(); - if (dialog != null) { - dialog.show(); - } + ((TripRecordingActiveBottomSheet) target).show(); } } diff --git a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java index 23bf24e287..775bbac87c 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java @@ -29,7 +29,6 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; @@ -37,8 +36,9 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; import net.osmand.AndroidUtils; -import net.osmand.GPXUtilities; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.Location; +import net.osmand.PlatformUtil; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmandApplication; @@ -46,6 +46,7 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.SavingTrackHelper; +import net.osmand.plus.activities.SavingTrackHelper.SaveGpxResult; import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.helpers.AndroidUiHelper; @@ -53,15 +54,18 @@ import net.osmand.plus.helpers.FontCache; import net.osmand.plus.myplaces.SaveCurrentTrackTask; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.track.GpxBlockStatisticsBuilder; -import net.osmand.plus.track.SaveGpxAsyncTask; +import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; import net.osmand.plus.track.TrackAppearanceFragment; import net.osmand.plus.widgets.TextViewEx; import net.osmand.util.Algorithms; +import org.apache.commons.logging.Log; + import java.lang.ref.WeakReference; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Locale; import java.util.TimeZone; import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT; @@ -69,57 +73,28 @@ import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT; public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragment { public static final String TAG = TripRecordingActiveBottomSheet.class.getSimpleName(); + private static final Log log = PlatformUtil.getLog(TripRecordingActiveBottomSheet.class); private OsmandApplication app; private OsmandSettings settings; + private SavingTrackHelper helper; private SelectedGpxFile selectedGpxFile; - private GpxBlockStatisticsBuilder blockStatisticsBuilder; private boolean wasTrackMonitored = false; private boolean hasDataToSave = false; private boolean searchingGPS = false; private View statusContainer; + private View buttonSave; + private GpxBlockStatisticsBuilder blockStatisticsBuilder; private final Handler handler = new Handler(); private Runnable updatingGPS; + private Runnable updatingTimeTrackSaved; + private SaveGpxListener saveGpxListener; - SaveGpxAsyncTask.SaveGpxListener saveGpxListener = new SaveGpxAsyncTask.SaveGpxListener() { - - @Override - public void gpxSavingStarted() { - - } - - @Override - public void gpxSavingFinished(Exception errorMessage) { - String gpxFileName = Algorithms.getFileWithoutDirs(app.getSavingTrackHelper().getCurrentTrack().getGpxFile().path); - final MapActivity mapActivity = getMapActivity(); - final Context context = getContext(); - SavingTrackHelper helper = app.getSavingTrackHelper(); - final SavingTrackHelper.SaveGpxResult result = helper.saveDataToGpx(app.getAppCustomization().getTracksDir()); - if (mapActivity != null && context != null) { - Snackbar snackbar = Snackbar.make(mapActivity.getLayout(), - getString(R.string.shared_string_file_is_saved, gpxFileName), - Snackbar.LENGTH_LONG) - .setAction(R.string.shared_string_undo, new View.OnClickListener() { - @Override - public void onClick(View view) { - final WeakReference mapActivityRef = new WeakReference<>(mapActivity); - final FragmentActivity fragmentActivity = mapActivityRef.get(); - SaveGPXBottomSheetFragment.showInstance(fragmentActivity.getSupportFragmentManager(), result.getFilenames()); - } - }); - View view = snackbar.getView(); - FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); - params.gravity = Gravity.TOP; - AndroidUtils.setMargins(params, 0, AndroidUtils.getStatusBarHeight(context), 0, 0); - view.setLayoutParams(params); - UiUtilities.setupSnackbar(snackbar, nightMode); - snackbar.show(); - } - } - - }; + private GPXFile getGPXFile() { + return selectedGpxFile.getGpxFile(); + } public void setSelectedGpxFile(SelectedGpxFile selectedGpxFile) { this.selectedGpxFile = selectedGpxFile; @@ -153,57 +128,30 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen public void createMenuItems(Bundle savedInstanceState) { app = requiredMyApplication(); settings = app.getSettings(); + helper = app.getSavingTrackHelper(); LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode); final FragmentManager fragmentManager = getFragmentManager(); - final Fragment targetFragment = getTargetFragment(); View itemView = inflater.inflate(R.layout.trip_recording_active_fragment, null, false); items.add(new BottomSheetItemWithDescription.Builder() .setCustomView(itemView) .create()); - long timeTrackSaved = app.getSavingTrackHelper().getLastTimeUpdated(); - SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss:SSS Z"); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - Date resultDate = new Date(timeTrackSaved); - String sdfFormatted = sdf.format(resultDate); - CharSequence formattedTimeTrackSaved = null; - try { - long time = sdf.parse(sdfFormatted).getTime(); - long now = System.currentTimeMillis(); - formattedTimeTrackSaved = - DateUtils.getRelativeTimeSpanString(time, now, DateUtils.MINUTE_IN_MILLIS); - } catch (ParseException e) { - e.printStackTrace(); - } - View buttonClear = itemView.findViewById(R.id.button_clear); View buttonStart = itemView.findViewById(R.id.button_start); - View buttonSave = itemView.findViewById(R.id.button_save); + buttonSave = itemView.findViewById(R.id.button_save); final View buttonPause = itemView.findViewById(R.id.button_pause); View buttonStop = itemView.findViewById(R.id.button_stop); createItem(buttonClear, ItemType.CLEAR_DATA, hasDataToSave, null); createItem(buttonStart, ItemType.START_SEGMENT, wasTrackMonitored, null); - createItem(buttonSave, ItemType.SAVE, hasDataToSave, (String) formattedTimeTrackSaved); +// createItem(buttonSave, ItemType.SAVE, hasDataToSave, getTimeTrackSaved()); createItem(buttonPause, wasTrackMonitored ? ItemType.PAUSE : ItemType.RESUME, true, null); createItem(buttonStop, ItemType.STOP, true, null); statusContainer = itemView.findViewById(R.id.status_container); updateStatus(); - // todo example, need to check - buttonPause.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean wasTrackMonitored = !settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); - createItem(buttonPause, wasTrackMonitored ? ItemType.PAUSE : ItemType.RESUME, true, null); - TripRecordingActiveBottomSheet.this.wasTrackMonitored = wasTrackMonitored; - settings.SAVE_GLOBAL_TRACK_TO_GPX.set(wasTrackMonitored); - updateStatus(); - } - }); - RecyclerView statBlocks = itemView.findViewById(R.id.block_statistics); blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, null); blockStatisticsBuilder.setBlocksView(statBlocks); @@ -265,11 +213,49 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen } }); + buttonClear.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (fragmentManager != null && hasDataToSave) { + ClearRecordedDataBottomSheetFragment.showInstance(fragmentManager, TripRecordingActiveBottomSheet.this); + } + } + }); + + buttonStart.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (wasTrackMonitored) { + + } + } + }); + + setSaveListener(); buttonSave.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final GPXUtilities.GPXFile gpxFile = app.getSavingTrackHelper().getCurrentTrack().getGpxFile(); - new SaveCurrentTrackTask(app, gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + if (hasDataToSave) { + final GPXFile gpxFile = getGPXFile(); + new SaveCurrentTrackTask(app, gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } + }); + + // todo example, need to check + buttonPause.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean wasTrackMonitored = !settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); + createItem(buttonPause, wasTrackMonitored ? ItemType.PAUSE : ItemType.RESUME, true, null); + if (!wasTrackMonitored) { + blockStatisticsBuilder.stopUpdatingStatBlocks(); + } else { + blockStatisticsBuilder.runUpdatingStatBlocks(); + } + TripRecordingActiveBottomSheet.this.wasTrackMonitored = wasTrackMonitored; + settings.SAVE_GLOBAL_TRACK_TO_GPX.set(wasTrackMonitored); + updateStatus(); } }); @@ -277,16 +263,7 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen @Override public void onClick(View v) { if (fragmentManager != null) { - StopTrackRecordingBottomFragment.showInstance(fragmentManager, targetFragment); - } - } - }); - - buttonClear.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (fragmentManager != null) { - ClearRecordedDataBottomSheetFragment.showInstance(fragmentManager, targetFragment); + StopTrackRecordingBottomFragment.showInstance(fragmentManager, TripRecordingActiveBottomSheet.this); } } }); @@ -314,7 +291,7 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen type.setTintedIcon(icon, app, enabled, false, nightMode); } - TextView title = view.findViewById(R.id.title); + TextView title = view.findViewById(R.id.button_text); if (title != null) { title.setText(type.getTitleId()); type.setTextColor(title, app, enabled, false, nightMode); @@ -333,11 +310,29 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen } } + private String getTimeTrackSaved() { + long timeTrackSaved = helper.getLastTimeUpdated(); + SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss:SSS Z", Locale.getDefault()); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + Date resultDate = new Date(timeTrackSaved); + String sdfFormatted = sdf.format(resultDate); + CharSequence formattedTimeTrackSaved = null; + try { + long time = sdf.parse(sdfFormatted).getTime(); + long now = System.currentTimeMillis(); + formattedTimeTrackSaved = DateUtils.getRelativeTimeSpanString(time, now, DateUtils.MINUTE_IN_MILLIS); + } catch (ParseException e) { + log.error(e); + } + return String.valueOf(formattedTimeTrackSaved); + } + @Override public void onResume() { super.onResume(); blockStatisticsBuilder.runUpdatingStatBlocks(); runUpdatingGPS(); + runUpdatingTimeTrackSaved(); } @Override @@ -345,6 +340,7 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen super.onPause(); blockStatisticsBuilder.stopUpdatingStatBlocks(); stopUpdatingGPS(); + stopUpdatingTimeTrackSaved(); } public void stopUpdatingGPS() { @@ -366,6 +362,61 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen handler.post(updatingGPS); } + public void stopUpdatingTimeTrackSaved() { + handler.removeCallbacks(updatingTimeTrackSaved); + } + + public void runUpdatingTimeTrackSaved() { + updatingTimeTrackSaved = new Runnable() { + @Override + public void run() { + String time = getTimeTrackSaved(); + createItem(buttonSave, ItemType.SAVE, hasDataToSave, !Algorithms.isEmpty(time) ? time : null); + handler.postDelayed(this, 60000); + } + }; + handler.post(updatingTimeTrackSaved); + } + + private void setSaveListener() { + if (saveGpxListener == null) { + saveGpxListener = new SaveGpxListener() { + + @Override + public void gpxSavingStarted() { + } + + @Override + public void gpxSavingFinished(Exception errorMessage) { + String gpxFileName = Algorithms.getFileWithoutDirs(getGPXFile().path); + final MapActivity mapActivity = getMapActivity(); + final Context context = getContext(); + final SaveGpxResult result = helper.saveDataToGpx(app.getAppCustomization().getTracksDir()); + if (mapActivity != null && context != null) { + Snackbar snackbar = Snackbar.make(mapActivity.getLayout(), + getString(R.string.shared_string_file_is_saved, gpxFileName), + Snackbar.LENGTH_LONG) + .setAction(R.string.shared_string_undo, new View.OnClickListener() { + @Override + public void onClick(View view) { + final WeakReference mapActivityRef = new WeakReference<>(mapActivity); + final FragmentActivity fragmentActivity = mapActivityRef.get(); + SaveGPXBottomSheetFragment.showInstance(fragmentActivity.getSupportFragmentManager(), result.getFilenames()); + } + }); + View view = snackbar.getView(); + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); + params.gravity = Gravity.TOP; + AndroidUtils.setMargins(params, 0, AndroidUtils.getStatusBarHeight(context), 0, 0); + view.setLayoutParams(params); + UiUtilities.setupSnackbar(snackbar, nightMode); + snackbar.show(); + } + } + }; + } + } + @Nullable public MapActivity getMapActivity() { Activity activity = getActivity(); @@ -375,6 +426,13 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen return null; } + public void show() { + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.show(); + } + } + public void hide() { Dialog dialog = getDialog(); if (dialog != null) { @@ -443,7 +501,7 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen if (tv != null) { tv.setTextColor(ContextCompat.getColor(context, enabled ? pressed ? getPressedColorId(nightMode) - : equals(ItemType.CLEAR_DATA) ? R.color.color_osm_edit_delete + : this == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete : getActiveTextColorId(nightMode) : getSecondaryTextColorId(nightMode))); } } @@ -452,10 +510,15 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen if (iv != null) { int iconColor = ContextCompat.getColor(context, enabled ? pressed ? getPressedColorId(nightMode) - : equals(ItemType.CLEAR_DATA) ? R.color.color_osm_edit_delete + : this == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete : getActiveIconColorId(nightMode) : getSecondaryIconColorId(nightMode)); Drawable icon = UiUtilities.createTintedDrawable(context, iconId, iconColor); iv.setImageDrawable(icon); + if (this == ItemType.STOP) { + int stopSize = iv.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin_large); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(stopSize, stopSize); + iv.setLayoutParams(params); + } } } diff --git a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java index 178e662176..6653b6f5c3 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java @@ -28,6 +28,7 @@ import net.osmand.AndroidUtils; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.NavigationService; 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.DialogButtonType; @@ -246,12 +247,12 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { } @Override - protected int getRightButtonHeight(){ + protected int getRightButtonHeight() { return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height); } @Override - protected int getDismissButtonHeight(){ + protected int getDismissButtonHeight() { return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height); } @@ -280,6 +281,9 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { app.getSavingTrackHelper().startNewSegment(); settings.SAVE_GLOBAL_TRACK_TO_GPX.set(true); app.startNavigationService(NavigationService.USED_BY_GPX); + OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class); + TripRecordingActiveBottomSheet.showInstance(getMapActivity().getSupportFragmentManager(), + plugin.getCurrentTrack(), plugin.isWasTrackMonitored(), plugin.isHasDataToSave(), plugin.isSearchingGPS()); dismiss(); } diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index a7b23e18ec..3421a46a10 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -89,6 +89,7 @@ public class GpxBlockStatisticsBuilder { if (bsAdapter != null) { initItems(); bsAdapter.setItems(items); + AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items)); } int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get(); handler.postDelayed(this, Math.max(1000, interval)); @@ -272,7 +273,7 @@ public class GpxBlockStatisticsBuilder { public void setItems(List statBlocks) { this.statBlocks.clear(); this.statBlocks.addAll(statBlocks); - notifyItemRangeChanged(0, getItemCount()); + notifyDataSetChanged(); } } diff --git a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java index 522103ac02..0ad5475337 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java @@ -44,6 +44,7 @@ import net.osmand.plus.dialogs.GpxAppearanceAdapter; import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem; import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet; import net.osmand.plus.monitoring.TripRecordingBottomSheet; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; @@ -383,6 +384,8 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement Fragment target = getTargetFragment(); if (target instanceof TripRecordingBottomSheet) { ((TripRecordingBottomSheet) target).show(); + } else if (target instanceof TripRecordingActiveBottomSheet) { + ((TripRecordingActiveBottomSheet) target).show(); } }