diff --git a/app/build.gradle b/app/build.gradle index f645cdb..e96c1b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { applicationId 'org.y20k.trackbook' minSdkVersion 25 - targetSdkVersion 27 + targetSdkVersion 29 versionCode 42 versionName '2.0.5' resConfigs "en", "da", "de", "fr", "hr", "id", "it", "ja", "nb-rNO", "nl", "sv", "zh-rCN" diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.kt b/app/src/main/java/org/y20k/trackbook/MainActivity.kt index 585ba3d..9f70971 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.kt +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.kt @@ -30,7 +30,6 @@ import androidx.preference.PreferenceManager import com.google.android.material.bottomnavigation.BottomNavigationView import org.osmdroid.config.Configuration import org.y20k.trackbook.helpers.AppThemeHelper -import org.y20k.trackbook.helpers.ImportHelper import org.y20k.trackbook.helpers.LogHelper import org.y20k.trackbook.helpers.PreferencesHelper @@ -91,12 +90,6 @@ class MainActivity : AppCompatActivity() { } } - // convert old tracks (one-time import) - if (PreferencesHelper.isHouseKeepingNecessary(this)) { - ImportHelper.convertOldTracks(this) - PreferencesHelper.saveHouseKeepingNecessaryState(this) - } - // register listener for changes in shared preferences PreferenceManager.getDefaultSharedPreferences(this as Context).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) } diff --git a/app/src/main/java/org/y20k/trackbook/MapFragment.kt b/app/src/main/java/org/y20k/trackbook/MapFragment.kt index 2f0d0a6..d9f6ce0 100644 --- a/app/src/main/java/org/y20k/trackbook/MapFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/MapFragment.kt @@ -44,7 +44,7 @@ import org.y20k.trackbook.ui.MapFragmentLayoutHolder /* * MapFragment class */ -class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { +class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlay.MarkerListener { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(MapFragment::class.java) @@ -75,7 +75,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { /* Overrides onStop from Fragment */ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // initialize layout - layout = MapFragmentLayoutHolder(activity as Context, inflater, container, currentBestLocation, trackingState) + layout = MapFragmentLayoutHolder(activity as Context, this as MapOverlay.MarkerListener, inflater, container, currentBestLocation, trackingState) // set up buttons layout.currentLocationButton.setOnClickListener { @@ -178,6 +178,17 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { } + /* Overrides onMarkerTapped from MarkerListener */ + override fun onMarkerTapped(latitude: Double, longitude: Double) { + super.onMarkerTapped(latitude, longitude) + if (bound) { + track = TrackHelper.toggleStarred(activity as Context, track, latitude, longitude) + layout.overlayCurrentTrack(track, trackingState) + trackerService.track = track + } + } + + /* Start tracker service */ private fun startTrackerService() { val intent = Intent(activity, TrackerService::class.java) diff --git a/app/src/main/java/org/y20k/trackbook/TrackFragment.kt b/app/src/main/java/org/y20k/trackbook/TrackFragment.kt index d254a4d..d33305d 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackFragment.kt @@ -41,10 +41,12 @@ import org.y20k.trackbook.core.Track import org.y20k.trackbook.dialogs.RenameTrackDialog import org.y20k.trackbook.helpers.FileHelper import org.y20k.trackbook.helpers.LogHelper +import org.y20k.trackbook.helpers.MapOverlay +import org.y20k.trackbook.helpers.TrackHelper import org.y20k.trackbook.ui.TrackFragmentLayoutHolder -class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDialog.YesNoDialogListener { +class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDialog.YesNoDialogListener, MapOverlay.MarkerListener { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(TrackFragment::class.java) @@ -71,7 +73,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi /* Overrides onCreateView from Fragment */ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // initialize layout - layout = TrackFragmentLayoutHolder(activity as Context, inflater, container, track) + layout = TrackFragmentLayoutHolder(activity as Context, this as MapOverlay.MarkerListener, inflater, container, track) // set up share button layout.shareButton.setOnClickListener { @@ -162,6 +164,19 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi } + /* Overrides onMarkerTapped from MarkerListener */ + override fun onMarkerTapped(latitude: Double, longitude: Double) { + super.onMarkerTapped(latitude, longitude) + // update track display + track = TrackHelper.toggleStarred(activity as Context, track, latitude, longitude) + layout.updateTrackOverlay(track) + // save track + GlobalScope.launch { + FileHelper.saveTrackSuspended(track, true) + } + } + + /* Opens up a file picker to select the save location */ private fun openSaveGpxDialog() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { @@ -182,7 +197,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi /* Share track as GPX via share sheet */ private fun shareGpxTrack() { val gpxFile = Uri.parse(layout.track.gpxUriString).toFile() - val gpxShareUri = FileProvider.getUriForFile(this.activity as Context, "${activity!!.applicationContext.packageName}.provider", gpxFile) + val gpxShareUri = FileProvider.getUriForFile(this.activity as Context, "${requireActivity().applicationContext.packageName}.provider", gpxFile) val shareIntent: Intent = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND data = gpxShareUri diff --git a/app/src/main/java/org/y20k/trackbook/core/WayPoint.kt b/app/src/main/java/org/y20k/trackbook/core/WayPoint.kt index cbc1dd0..d3bf6b0 100644 --- a/app/src/main/java/org/y20k/trackbook/core/WayPoint.kt +++ b/app/src/main/java/org/y20k/trackbook/core/WayPoint.kt @@ -37,7 +37,8 @@ data class WayPoint(@Expose val provider: String, @Expose val time: Long, @Expose val distanceToStartingPoint: Float = 0f, @Expose val numberSatellites: Int = 0, - @Expose var isStopOver: Boolean = false): Parcelable { + @Expose var isStopOver: Boolean = false, + @Expose var starred: Boolean = false): Parcelable { /* Converts WayPoint into Location */ diff --git a/app/src/main/java/org/y20k/trackbook/helpers/ImportHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/ImportHelper.kt deleted file mode 100644 index 7c7f28b..0000000 --- a/app/src/main/java/org/y20k/trackbook/helpers/ImportHelper.kt +++ /dev/null @@ -1,168 +0,0 @@ -/* - * ImportHelper.kt - * Implements the ImportHelper object - * A ImportHelper manages the one-time import of old .trackbook files - * - * This file is part of - * TRACKBOOK - Movement Recorder for Android - * - * Copyright (c) 2016-20 - Y20K.org - * Licensed under the MIT-License - * http://opensource.org/licenses/MIT - * - * Trackbook uses osmdroid - OpenStreetMap-Tools for Android - * https://github.com/osmdroid/osmdroid - */ - - -package org.y20k.trackbook.helpers - -import android.content.Context -import android.location.Location -import androidx.annotation.Keep -import com.google.gson.GsonBuilder -import com.google.gson.annotations.SerializedName -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import org.y20k.trackbook.Keys -import org.y20k.trackbook.core.Track -import org.y20k.trackbook.core.WayPoint -import java.io.BufferedReader -import java.io.File -import java.io.InputStream -import java.io.InputStreamReader -import java.util.* - - -/* - * ImportHelper data class - */ -object ImportHelper { - - - /* Define log tag */ - private val TAG: String = LogHelper.makeLogTag(ImportHelper::class.java) - - - - /* Converts older tracks of type .trackbook into the new format */ - fun convertOldTracks(context: Context) { - val oldTracks: ArrayList = arrayListOf() - val trackFolder: File? = context.getExternalFilesDir(Keys.FOLDER_TRACKS) - - if (trackFolder != null && trackFolder.exists() && trackFolder.isDirectory) { - trackFolder.listFiles()?.forEach { file -> - if (file.name.endsWith(".trackbook")) { - // read until last line reached - val stream: InputStream = file.inputStream() - val reader: BufferedReader = BufferedReader(InputStreamReader(stream)) - val builder: StringBuilder = StringBuilder() - reader.forEachLine { - builder.append(it) - builder.append("\n") } - stream.close() - // get content of file - val fileContent: String = builder.toString() - // get LegacyTrack from JSON - val gsonBuilder = GsonBuilder() - gsonBuilder.setDateFormat("M/d/yy hh:mm a") - val oldTrack: LegacyTrack = gsonBuilder.create().fromJson(fileContent, LegacyTrack::class.java) - oldTracks.add(oldTrack.toTrack()) - } - } - } - - // save track using "deferred await" - if (oldTracks.isNotEmpty()) { - GlobalScope.launch { - oldTracks.forEach { oldTrack -> - // step 1: create and store filenames for json and gpx files - oldTrack.trackUriString = FileHelper.getTrackFileUri(context, oldTrack).toString() - oldTrack.gpxUriString = FileHelper.getGpxFileUri(context, oldTrack).toString() - // step 2: save track - FileHelper.saveTrackSuspended(oldTrack, saveGpxToo = true) - // step 3: save tracklist - FileHelper.addTrackAndSaveTracklistSuspended(context, oldTrack) - } - } - } - - } - - - /* - * Inner class: Legacy version of Track - used for one-time import only - * Warning: Works only as long as targetSdkVersion < 28 - */ - @Keep - private data class LegacyTrack ( - @SerializedName("b") var mTrackFormatVersion: Int = 0, - @SerializedName("c") var mWayPoints: List, - @SerializedName("d") var mTrackLength: Float = 0f, - @SerializedName("e") var mDuration: Long = 0, - @SerializedName("f") var mStepCount: Float = 0f, - @SerializedName("g") var mRecordingStart: Date = GregorianCalendar.getInstance().time, - @SerializedName("h") var mRecordingStop: Date = mRecordingStart, - @SerializedName("i") var mMaxAltitude: Double = 0.0, - @SerializedName("j") var mMinAltitude: Double = 0.0, - @SerializedName("k") var mPositiveElevation: Double = 0.0, - @SerializedName("l") var mNegativeElevation: Double = 0.0) { - - - /* Converts */ - fun toTrack():Track { - val track: Track = Track() - track.trackFormatVersion = mTrackFormatVersion - mWayPoints.forEach { legacyWayPoint -> - val wayPoint: WayPoint= WayPoint( - provider = legacyWayPoint.mLocation.provider, - latitude = legacyWayPoint.mLocation.latitude, - longitude = legacyWayPoint.mLocation.longitude, - altitude = legacyWayPoint.mLocation.altitude, - accuracy = legacyWayPoint.mLocation.accuracy, - time = legacyWayPoint.mLocation.time, - distanceToStartingPoint = legacyWayPoint.mDistanceToStartingPoint, - numberSatellites = legacyWayPoint.mNumberSatellites, - isStopOver = legacyWayPoint.mIsStopOver - ) - track.wayPoints.add(wayPoint) - } - track.length = mTrackLength - track.duration = mDuration - track.stepCount = mStepCount - track.recordingStart = mRecordingStart - track.recordingStop = mRecordingStop - track.maxAltitude = mMaxAltitude - track.minAltitude = mMinAltitude - track.positiveElevation = mPositiveElevation - track.negativeElevation = mNegativeElevation - track.latitude = track.wayPoints[0].latitude - track.longitude = track.wayPoints[0].longitude - track.name = DateTimeHelper.convertToReadableDate(mRecordingStart) - return track - } - - } - /* - * End of inner class - */ - - - /* - * Inner class: Legacy version of WayPoint - used for one-time import only - * Warning: Works only as long as targetSdkVersion < 28 - */ - @Keep - private data class LegacyWayPoint ( - @SerializedName("a") var mLocation: Location, - @SerializedName("b") var mIsStopOver: Boolean = false, - @SerializedName("c") var mDistanceToStartingPoint: Float = 0f, - @SerializedName("d") var mNumberSatellites: Int = 0) { - } - /* - * End of inner class - */ - - - -} \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt index b134baa..d2f6e4c 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt @@ -106,7 +106,6 @@ object LengthUnitHelper { // speed in km/h / mph val velocity: Double = convertMetersPerSecond((trackLength / duration), useImperialUnits) // create readable speed string - LogHelper.e("TAG", "duration = $duration velocity = $velocity") var bd: BigDecimal = BigDecimal.valueOf(velocity) bd = bd.setScale(1, RoundingMode.HALF_UP) speed = bd.toPlainString() diff --git a/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/MapOverlay.kt similarity index 73% rename from app/src/main/java/org/y20k/trackbook/helpers/MapHelper.kt rename to app/src/main/java/org/y20k/trackbook/helpers/MapOverlay.kt index 1d191c8..8fcb595 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/MapOverlay.kt @@ -36,12 +36,18 @@ import java.util.* /* - * MapHelper object + * MapHelper class */ -object MapHelper { +class MapOverlay (private var markerListener: MarkerListener) { + + /* Interface used to communicate back to activity/fragment */ + interface MarkerListener { + fun onMarkerTapped(latitude: Double, longitude: Double) { + } + } /* Define log tag */ - private val LOG_TAG = MapHelper::class.java.simpleName + private val TAG = MapOverlay::class.java.simpleName /* Creates icon overlay for current position (used in MapFragment) */ @@ -93,16 +99,22 @@ object MapHelper { when (trackingState) { // CASE: Recording is active Keys.STATE_TRACKING_ACTIVE -> { - when (wayPoint.isStopOver) { - true -> newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_grey_24dp)!! - false -> newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_red_24dp)!! + if (wayPoint.starred) { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_star_red_24dp)!! + } else if (wayPoint.isStopOver) { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_grey_24dp)!! + } else { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_red_24dp)!! } } // CASE: Recording is paused/stopped else -> { - when (wayPoint.isStopOver) { - true -> newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_grey_24dp)!! - false -> newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_blue_24dp)!! + if (wayPoint.starred) { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_star_blue_24dp)!! + } else if (wayPoint.isStopOver) { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_grey_24dp)!! + } else { + newMarker = ContextCompat.getDrawable(context, R.drawable.ic_marker_track_location_blue_24dp)!! } } } @@ -121,7 +133,8 @@ object MapHelper { /* Creates a marker overlay item */ private fun createOverlayItem(context: Context, latitude: Double, longitude: Double, accuracy: Float, provider: String, time: Long): OverlayItem { val title: String = "${context.getString(R.string.marker_description_time)}: ${SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault()).format(time)}" - val description: String = "${context.getString(R.string.marker_description_accuracy)}: ${DecimalFormat("#0.00").format(accuracy)} (${provider})" + //val description: String = "${context.getString(R.string.marker_description_accuracy)}: ${DecimalFormat("#0.00").format(accuracy)} (${provider})" + val description: String = "${context.getString(R.string.marker_description_time)}: ${SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault()).format(time)} | ${context.getString(R.string.marker_description_accuracy)}: ${DecimalFormat("#0.00").format(accuracy)} (${provider})" val position: GeoPoint = GeoPoint(latitude, longitude) return OverlayItem(title, description, position) } @@ -129,10 +142,10 @@ object MapHelper { /* Creates an overlay */ private fun createOverlay(context: Context, overlayItems: ArrayList): ItemizedIconOverlay { - return ItemizedIconOverlay(overlayItems, + return ItemizedIconOverlay(context, overlayItems, object : ItemizedIconOverlay.OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: OverlayItem): Boolean { - Toast.makeText(context, item.title, Toast.LENGTH_LONG).show() + markerListener.onMarkerTapped(item.point.latitude, item.point.longitude) return true } override fun onItemLongPress(index: Int, item: OverlayItem): Boolean { @@ -141,8 +154,7 @@ object MapHelper { Toast.makeText(context, item.snippet, Toast.LENGTH_LONG).show() return true } - }, context) + }) } - } \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt index 1c37151..9e525cc 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt @@ -19,6 +19,8 @@ package org.y20k.trackbook.helpers import android.content.Context import android.location.Location +import android.widget.Toast +import org.y20k.trackbook.R import org.y20k.trackbook.core.Track import org.y20k.trackbook.core.TracklistElement import org.y20k.trackbook.core.WayPoint @@ -219,5 +221,18 @@ object TrackHelper { } + /* Toggles starred flag for given position */ + fun toggleStarred(context: Context, track: Track, latitude: Double, longitude: Double): Track { + track.wayPoints.forEach { waypoint -> + if (waypoint.latitude == latitude && waypoint.longitude == longitude) { + waypoint.starred = !waypoint.starred + when (waypoint.starred) { + true -> Toast.makeText(context, R.string.toast_message_poi_added, Toast.LENGTH_LONG).show() + false -> Toast.makeText(context, R.string.toast_message_poi_removed, Toast.LENGTH_LONG).show() + } + } + } + return track + } } \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt index a825722..aace758 100644 --- a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt +++ b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt @@ -88,8 +88,8 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_24dp)) - false -> trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_border_24dp)) + true -> trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_filled_24dp)) + false -> trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_outline_24dp)) } trackElementViewHolder.trackElement.setOnClickListener { tracklistListener.onTrackElementTapped(tracklist.tracklistElements[position]) @@ -134,11 +134,11 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter { - starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_border_24dp)) + starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_outline_24dp)) tracklist.tracklistElements[position].starred = false } false -> { - starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_24dp)) + starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_filled_24dp)) tracklist.tracklistElements[position].starred = true } } diff --git a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt index b17a17b..66bf9ab 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt @@ -44,14 +44,14 @@ import org.y20k.trackbook.R import org.y20k.trackbook.core.Track import org.y20k.trackbook.helpers.AppThemeHelper import org.y20k.trackbook.helpers.LogHelper -import org.y20k.trackbook.helpers.MapHelper +import org.y20k.trackbook.helpers.MapOverlay import org.y20k.trackbook.helpers.PreferencesHelper /* * MapFragmentLayoutHolder class */ -data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInflater, var container: ViewGroup?, val startLocation: Location, val trackingState: Int) { +data class MapFragmentLayoutHolder(private var context: Context, private var markerListener: MapOverlay.MarkerListener, private var inflater: LayoutInflater, private var container: ViewGroup?, private val startLocation: Location, private val trackingState: Int) { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(MapFragmentLayoutHolder::class.java) @@ -109,7 +109,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf mapView.overlays.add(compassOverlay) // add my location overlay - currentPositionOverlay = MapHelper.createMyLocationOverlay(context, startLocation, trackingState) + currentPositionOverlay = MapOverlay(markerListener).createMyLocationOverlay(context, startLocation, trackingState) mapView.overlays.add(currentPositionOverlay) centerMap(startLocation) @@ -157,7 +157,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf /* Mark current position on map */ fun markCurrentPosition(location: Location, trackingState: Int = Keys.STATE_TRACKING_NOT) { mapView.overlays.remove(currentPositionOverlay) - currentPositionOverlay = MapHelper.createMyLocationOverlay(context, location, trackingState) + currentPositionOverlay = MapOverlay(markerListener).createMyLocationOverlay(context, location, trackingState) mapView.overlays.add(currentPositionOverlay) } @@ -168,7 +168,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf mapView.overlays.remove(currentTrackOverlay) } if (track.wayPoints.isNotEmpty()) { - currentTrackOverlay = MapHelper.createTrackOverlay(context, track, trackingState) + currentTrackOverlay = MapOverlay(markerListener).createTrackOverlay(context, track, trackingState) mapView.overlays.add(currentTrackOverlay) } } diff --git a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt index 5ed80ce..5609dac 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt @@ -50,7 +50,7 @@ import kotlin.math.roundToInt /* * TrackFragmentLayoutHolder class */ -data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutInflater, var container: ViewGroup?, var track: Track) { +data class TrackFragmentLayoutHolder(private var context: Context, private var markerListener: MapOverlay.MarkerListener, private var inflater: LayoutInflater, private var container: ViewGroup?, var track: Track) { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(TrackFragmentLayoutHolder::class.java) @@ -140,7 +140,7 @@ data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutI mapView.overlays.add(compassOverlay) // create map overlay - trackOverlay = MapHelper.createTrackOverlay(context, track, Keys.STATE_TRACKING_NOT) + trackOverlay = MapOverlay(markerListener).createTrackOverlay(context, track, Keys.STATE_TRACKING_NOT) if (track.wayPoints.isNotEmpty()) { mapView.overlays.add(trackOverlay) } @@ -161,6 +161,19 @@ data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutI } + /* Updates map overlay */ + fun updateTrackOverlay(newTrack: Track) { + track = newTrack + if (trackOverlay != null) { + mapView.overlays.remove(trackOverlay) + } + if (track.wayPoints.isNotEmpty()) { + trackOverlay = MapOverlay(markerListener).createTrackOverlay(context, track, Keys.STATE_TRACKING_NOT) + mapView.overlays.add(trackOverlay) + } + } + + /* Saves zoom level and center of this map */ fun saveViewStateToTrack() { val center: IGeoPoint = mapView.mapCenter diff --git a/app/src/main/res/drawable/ic_star_blue_24dp.xml b/app/src/main/res/drawable/ic_star_blue_24dp.xml new file mode 100644 index 0000000..6ba138a --- /dev/null +++ b/app/src/main/res/drawable/ic_star_blue_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_24dp.xml b/app/src/main/res/drawable/ic_star_filled_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_star_24dp.xml rename to app/src/main/res/drawable/ic_star_filled_24dp.xml diff --git a/app/src/main/res/drawable/ic_star_border_24dp.xml b/app/src/main/res/drawable/ic_star_outline_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_star_border_24dp.xml rename to app/src/main/res/drawable/ic_star_outline_24dp.xml diff --git a/app/src/main/res/drawable/ic_star_red_24dp.xml b/app/src/main/res/drawable/ic_star_red_24dp.xml new file mode 100644 index 0000000..c30d723 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_red_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/track_element.xml b/app/src/main/res/layout/track_element.xml index 968270b..c6ca581 100644 --- a/app/src/main/res/layout/track_element.xml +++ b/app/src/main/res/layout/track_element.xml @@ -57,7 +57,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_star_border_24dp" /> + app:srcCompat="@drawable/ic_star_outline_24dp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 304cd47..2048088 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,6 +43,8 @@ Copied to clipboard. Hint: The accuracy of elevation data depends on your device. The uphill and downhill elevation of the whole route is measured. Unable to save. Please install a file manager first. + Point of interest marker added. + Point of interest marker removed. Saving recording as GPX. Time