Skip to content
This repository was archived by the owner on Aug 16, 2025. It is now read-only.

Commit 395755b

Browse files
committed
fix #477 make track colors configurable
1 parent eb28ec4 commit 395755b

File tree

15 files changed

+235
-143
lines changed

15 files changed

+235
-143
lines changed

build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ android {
4040
compileSdk = 35
4141
minSdk = 26
4242
targetSdk = 35
43-
versionCode = 49
44-
versionName = "6.1.0"
43+
versionCode = 50
44+
versionName = "6.2.0"
4545
applicationId = "de.storchp.opentracks.osmplugin"
4646

4747
testInstrumentationRunnerArguments += mapOf("runnerBuilder" to "de.mannodermaus.junit5.AndroidJUnit5Builder")
@@ -179,6 +179,7 @@ dependencies {
179179
implementation(libs.material)
180180
implementation(libs.activity)
181181
implementation(libs.activity.ktx)
182+
implementation(libs.colorpicker)
182183

183184
// VTM
184185
implementation(libs.vtm)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- Neu: Trackfarben sind nun konfigurierbar
2+
- Übersetzungen aktualisiert
3+
- Abhängigkeiten aktualisiert
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- New: make track colors configurable
2+
- Updated translations
3+
- Updated dependencies

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ androidsvg = "1.4"
55
androidTest = "1.7.0"
66
appcompat = "1.7.0"
77
assertJ = "3.27.3"
8+
colorpicker = "1.1.5"
89
constraintlayout = "2.2.1"
910
desugar_jdk_libs = "2.1.5"
1011
documentfile = "1.0.1"
@@ -26,6 +27,7 @@ android-test-core = { module = "de.mannodermaus.junit5:android-test-core", versi
2627
androidsvg = { module = "com.caverock:androidsvg", version.ref = "androidsvg" }
2728
appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
2829
assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertJ" }
30+
colorpicker = { module = "com.github.7Koston:HSVColorPicker", version.ref = "colorpicker" }
2931
constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
3032
desugar_jdk_libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_jdk_libs" }
3133
documentfile = { module = "androidx.documentfile:documentfile", version.ref = "documentfile" }

src/main/kotlin/de/storchp/opentracks/osmplugin/map/MapUtils.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package de.storchp.opentracks.osmplugin.map
33
import android.content.Context
44
import android.graphics.Bitmap
55
import android.graphics.Canvas
6-
import android.graphics.Color
76
import android.location.Location
87
import android.util.Log
98
import androidx.core.content.ContextCompat
9+
import androidx.core.graphics.ColorUtils
10+
import androidx.core.graphics.createBitmap
1011
import de.storchp.opentracks.osmplugin.R
1112
import de.storchp.opentracks.osmplugin.map.model.Trackpoint
1213
import de.storchp.opentracks.osmplugin.utils.UnitConversions
@@ -101,9 +102,9 @@ object MapUtils {
101102
idx = current[0] + 1
102103
while (idx < current[1]) {
103104
dist = distance(
104-
trackpoints[idx].latLong!!,
105-
trackpoints[current[0]].latLong!!,
106-
trackpoints[current[1]].latLong!!
105+
trackpoints[idx].latLong,
106+
trackpoints[current[0]].latLong,
107+
trackpoints[current[1]].latLong
107108
)
108109
if (dist > maxDist) {
109110
maxDist = dist
@@ -179,10 +180,7 @@ object MapUtils {
179180

180181
fun getBitmapFromVectorDrawable(context: Context, drawableId: Int): Bitmap {
181182
val drawable = ContextCompat.getDrawable(context, drawableId)
182-
val bitmap = Bitmap.createBitmap(
183-
drawable!!.intrinsicWidth,
184-
drawable.intrinsicHeight, Bitmap.Config.ARGB_8888
185-
)
183+
val bitmap = createBitmap(drawable!!.intrinsicWidth, drawable.intrinsicHeight)
186184
val canvas = Canvas(bitmap)
187185
drawable.setBounds(0, 0, canvas.width, canvas.height)
188186
drawable.draw(canvas)
@@ -191,21 +189,25 @@ object MapUtils {
191189
}
192190

193191
fun getTrackColorBySpeed(
194-
average: Double,
195-
averageToMaxSpeed: Double,
196-
trackpoint: Trackpoint
192+
averageSpeed: Double,
193+
maxSpeed: Double,
194+
trackpoint: Trackpoint,
195+
trackSpeedColors: SpeedColors
197196
): Int {
198-
var red = 255
199-
var green = 255
197+
val averageToMaxSpeed = maxSpeed - averageSpeed
200198
val speed = trackpoint.speed ?: 0.0
201-
if (speed == 0.0) {
202-
green = 0
203-
} else if (speed < average) {
204-
green = (255 * speed / average).toInt()
199+
return if (speed < averageSpeed) {
200+
ColorUtils.blendARGB(
201+
trackSpeedColors.low, trackSpeedColors.average,
202+
(speed / averageSpeed).toFloat()
203+
)
205204
} else {
206-
red = 255 - (255 * (speed - average) / averageToMaxSpeed).toInt()
205+
ColorUtils.blendARGB(
206+
trackSpeedColors.average, trackSpeedColors.high,
207+
((speed - averageSpeed) / averageToMaxSpeed).toFloat()
208+
)
209+
207210
}
208-
return Color.argb(255, red, green, 0)
209211
}
210212

211213
fun createMarkerSymbol(
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package de.storchp.opentracks.osmplugin.map
2+
3+
data class SpeedColors(val low: Int, val average: Int, val high: Int)

src/main/kotlin/de/storchp/opentracks/osmplugin/map/StyleColorCreator.kt

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/main/kotlin/de/storchp/opentracks/osmplugin/map/reader/MapDataReader.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.util.Log
44
import de.storchp.opentracks.osmplugin.map.DEFAULT_TRACK_COLOR_MODE
55
import de.storchp.opentracks.osmplugin.map.MapData
66
import de.storchp.opentracks.osmplugin.map.MapUtils
7-
import de.storchp.opentracks.osmplugin.map.StyleColorCreator
87
import de.storchp.opentracks.osmplugin.map.TrackColorMode
98
import de.storchp.opentracks.osmplugin.map.model.Track
109
import de.storchp.opentracks.osmplugin.map.model.TrackStatistics
@@ -13,7 +12,6 @@ import de.storchp.opentracks.osmplugin.map.model.TrackpointsDebug
1312
import de.storchp.opentracks.osmplugin.map.model.Waypoint
1413
import de.storchp.opentracks.osmplugin.utils.PreferencesUtils
1514
import org.oscim.core.GeoPoint
16-
import kotlin.collections.forEach
1715

1816
private val TAG: String = MapDataReader::class.java.getSimpleName()
1917

@@ -23,8 +21,9 @@ abstract class MapDataReader(
2321
private val updateTrackpointsDebug: UpdateTrackpointsDebug,
2422
) {
2523

26-
private val colorCreator = StyleColorCreator()
27-
private var trackColor = colorCreator.nextColor()
24+
private val trackSpeedColors = PreferencesUtils.getTrackSpeedColors()
25+
private val trackColors = PreferencesUtils.getTrackColors()
26+
private var trackColor = trackColors.first()
2827
private var trackpointsDebug = TrackpointsDebug()
2928
var lastTrackId: Long? = null
3029
protected set
@@ -53,11 +52,11 @@ abstract class MapDataReader(
5352

5453
val average = trackpointsBySegments.calcAverageSpeed()
5554
val maxSpeed = trackpointsBySegments.calcMaxSpeed()
56-
val averageToMaxSpeed = maxSpeed - average
5755
var trackColorMode = PreferencesUtils.getTrackColorMode()
5856
if (isRecording && !trackColorMode.supportsLiveTrack) {
5957
trackColorMode = DEFAULT_TRACK_COLOR_MODE
6058
}
59+
var trackIndex = 0
6160

6261
trackpointsBySegments.segments.map { trackpoints ->
6362
if (!update) {
@@ -71,7 +70,8 @@ abstract class MapDataReader(
7170
trackpoints.forEach { trackpoint ->
7271
if (trackpoint.trackId != lastTrackId) {
7372
if (trackColorMode == TrackColorMode.BY_TRACK) {
74-
trackColor = colorCreator.nextColor()
73+
trackColor = trackColors[trackIndex % trackColors.size]
74+
trackIndex++
7575
}
7676
lastTrackId = trackpoint.trackId
7777
mapData.resetCurrentPolyline()
@@ -80,8 +80,9 @@ abstract class MapDataReader(
8080
if (trackColorMode == TrackColorMode.BY_SPEED) {
8181
trackColor = MapUtils.getTrackColorBySpeed(
8282
average,
83-
averageToMaxSpeed,
84-
trackpoint
83+
maxSpeed,
84+
trackpoint,
85+
trackSpeedColors,
8586
)
8687
mapData.addNewPolyline(trackColor, trackpoint)
8788
} else {

src/main/kotlin/de/storchp/opentracks/osmplugin/settings/SettingsActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ import androidx.core.view.WindowInsetsCompat
1111
import androidx.core.view.updateLayoutParams
1212
import androidx.preference.Preference
1313
import androidx.preference.Preference.SummaryProvider
14-
import androidx.preference.PreferenceFragmentCompat
14+
import com.github.koston.preference.ColorPreferenceFragmentCompat
1515
import de.storchp.opentracks.osmplugin.BuildConfig
1616
import de.storchp.opentracks.osmplugin.R
1717
import de.storchp.opentracks.osmplugin.databinding.ActivitySettingsBinding
1818
import de.storchp.opentracks.osmplugin.download.MAPS_V_5_DOWNLOAD_URI
19-
import de.storchp.opentracks.osmplugin.settings.SettingsActivity.SettingsFragment
2019
import de.storchp.opentracks.osmplugin.utils.FileUtil
2120
import de.storchp.opentracks.osmplugin.utils.PreferencesUtils
2221

@@ -43,7 +42,7 @@ class SettingsActivity : AppCompatActivity() {
4342
setSupportActionBar(binding.toolbar.mapsToolbar)
4443
}
4544

46-
class SettingsFragment : PreferenceFragmentCompat() {
45+
class SettingsFragment : ColorPreferenceFragmentCompat() {
4746
private val sharedPreferenceChangeListener =
4847
OnSharedPreferenceChangeListener { sharedPreferences, key ->
4948
if (PreferencesUtils.isKey(R.string.night_mode_key, key)) {

src/main/kotlin/de/storchp/opentracks/osmplugin/utils/PreferencesUtils.kt

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import androidx.appcompat.app.AppCompatDelegate
1111
import androidx.preference.PreferenceManager
1212
import de.storchp.opentracks.osmplugin.R
1313
import de.storchp.opentracks.osmplugin.map.MapMode
14+
import de.storchp.opentracks.osmplugin.map.SpeedColors
1415
import de.storchp.opentracks.osmplugin.map.TrackColorMode
1516
import de.storchp.opentracks.osmplugin.map.toMapMode
16-
import java.lang.Exception
1717

1818
object PreferencesUtils {
1919
private val TAG: String = PreferencesUtils::class.java.getSimpleName()
@@ -27,6 +27,46 @@ object PreferencesUtils {
2727

2828
private fun getKey(@StringRes keyId: Int) = resources.getString(keyId)
2929

30+
fun getTrackColors() =
31+
listOf(
32+
getInt(
33+
R.string.APP_PREF_TRACK_COLOR_1,
34+
resources.getColor(R.color.track_color_1_default, null)
35+
),
36+
getInt(
37+
R.string.APP_PREF_TRACK_COLOR_2,
38+
resources.getColor(R.color.track_color_2_default, null)
39+
),
40+
getInt(
41+
R.string.APP_PREF_TRACK_COLOR_3,
42+
resources.getColor(R.color.track_color_3_default, null)
43+
),
44+
getInt(
45+
R.string.APP_PREF_TRACK_COLOR_4,
46+
resources.getColor(R.color.track_color_4_default, null)
47+
),
48+
getInt(
49+
R.string.APP_PREF_TRACK_COLOR_5,
50+
resources.getColor(R.color.track_color_5_default, null)
51+
),
52+
)
53+
54+
fun getTrackSpeedColors() =
55+
SpeedColors(
56+
getInt(
57+
R.string.APP_PREF_TRACK_COLOR_SPEED_LOW,
58+
resources.getColor(R.color.track_color_speed_low_default, null)
59+
),
60+
getInt(
61+
R.string.APP_PREF_TRACK_COLOR_SPEED_AVERAGE,
62+
resources.getColor(R.color.track_color_speed_average_default, null)
63+
),
64+
getInt(
65+
R.string.APP_PREF_TRACK_COLOR_SPEED_HIGH,
66+
resources.getColor(R.color.track_color_speed_high_default, null)
67+
)
68+
)
69+
3070
fun getMapUris(): Set<Uri> {
3171
return getUris(getKey(R.string.APP_PREF_MAP_FILES))
3272
}
@@ -96,7 +136,8 @@ object PreferencesUtils {
96136
}
97137

98138
private fun setUris(keyId: Int, uris: Set<Uri>) {
99-
setStringSet(keyId,
139+
setStringSet(
140+
keyId,
100141
uris
101142
.map { it.toString() }
102143
.toSet())

0 commit comments

Comments
 (0)