Compare commits

...

13 Commits

Author SHA1 Message Date
CI/CD Bot by pstorch 66906d1fa6 chore(deps): update dependency com.android.tools.build:gradle to v9.5.1 2026-11-05 16:35:22 +00:00
Dennis Guse 28def9fd9b README: add signing for tools like AppVerifier.
Fixes #2375
2026-11-01 20:35:29 +01:00
Dennis Guse 663a436839 Forgejo: document docker image location. 2026-11-01 20:18:59 +01:00
graue70 883b9ae7d2 Share: use ACTION_SEND when sharing a single track so apps like Signal are offered as share target (#2405). 2026-11-01 20:08:54 +01:00
CI/CD Bot by pstorch 94d068fe9b Update dependency com.android.tools.build:gradle to v9.5.0 2026-10-31 08:57:39 +01:00
CI/CD Bot by pstorch 2e60a31ca4 Update dependency gradle to v9.8.2 2026-10-31 06:17:15 +00:00
Dennis Guse a4064322cd chore(deps): update dependency androidx.core:core-location-altitude to v1.0.1 2026-10-21 23:00:52 +02:00
Dennis Guse 6eb45aff09 chore(deps): update dependency androidx.work:work-runtime to v2.12.0 2026-10-21 23:00:52 +02:00
Dennis Guse ccd2c344d4 chore(deps): update dependency com.android.tools.build:gradle to v9.4.1 2026-10-21 23:00:52 +02:00
Dennis Guse 111ae968d5 Bugfix: the currently recorded should not be deletable.
Fixes #2403.
2026-10-08 07:51:02 +02:00
W-W 693eb69eac Translated using Weblate (Romanian)
Currently translated at 73.3% (404 of 551 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://translate.codeberg.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ro/
2026-10-06 10:27:21 +00:00
gimmick24 9f425fed24 Translated using Weblate (Romanian)
Currently translated at 73.3% (404 of 551 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://translate.codeberg.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ro/
2026-10-06 10:27:21 +00:00
codebergian42 70ed4bd40d Translated using Weblate (German)
Currently translated at 100.0% (551 of 551 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://translate.codeberg.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/de/
2026-10-06 10:27:21 +00:00
9 changed files with 117 additions and 29 deletions
+2 -2
View File
@@ -10,7 +10,7 @@ jobs:
name: Android Lint
runs-on: docker
container:
image: 'ubuntu:android-24.04'
image: 'ubuntu:android-24.04' # See https://codeberg.org/pstorch/ansible-storchp-de/src/branch/main/roles/runner/files/Dockerfile
steps:
- name: Checkout sources
uses: actions/checkout@v7
@@ -24,7 +24,7 @@ jobs:
android-check:
runs-on: docker
container:
image: 'ubuntu:android-24.04'
image: 'ubuntu:android-24.04' # See https://codeberg.org/pstorch/ansible-storchp-de/src/branch/main/roles/runner/files/Dockerfile
steps:
- name: Checkout sources
uses: actions/checkout@v7
+3
View File
@@ -39,6 +39,9 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
</td>
</tr>
</table>
Signing key for reproducible build:
de.dennisguse.opentracks.playstore 87:2C:78:45:63:77:3B:3D:76:9E:C3:4C:EA:C4:E3:8F:1A:2F:15:EF:8E:D4:4A:61:21:4C:6D:9D:11:C8:8A:9B
Translations are hosted on <a href="https://translate.codeberg.org/engage/opentracks/">translate.codeberg.org/projects/opentracks/</a>.
<a href="https://translate.codeberg.org/engage/opentracks/">
+4 -4
View File
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:9.4.0'
classpath 'com.android.tools.build:gradle:9.5.1'
}
}
@@ -151,11 +151,11 @@ dependencies {
implementation 'androidx.gridlayout:gridlayout:1.1.0'
implementation 'com.google.android.material:material:1.14.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.2'
implementation 'androidx.core:core:1.19.0'
implementation 'androidx.core:core:1.19.1'
implementation 'androidx.core:core-splashscreen:1.2.0'
implementation 'androidx.mediarouter:mediarouter:1.8.1'
implementation 'androidx.core:core-location-altitude:1.0.0'
implementation 'androidx.work:work-runtime:2.11.2'
implementation 'androidx.core:core-location-altitude:1.0.1'
implementation 'androidx.work:work-runtime:2.12.0'
implementation 'androidx.health.connect:connect-client:1.1.0'
androidTestImplementation 'androidx.test:core:1.7.0'
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
@@ -0,0 +1,64 @@
package de.dennisguse.opentracks.share;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Objects;
import de.dennisguse.opentracks.content.data.TestDataUtil;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.Track;
public class ShareUtilsTest {
private final Context context = ApplicationProvider.getApplicationContext();
private ContentProviderUtils contentProviderUtils;
@Before
public void setUp() {
contentProviderUtils = new ContentProviderUtils(context);
contentProviderUtils.deleteAllTracks(context);
}
@Test
public void testSingleTrack() {
// given
Track.Id trackId = new Track.Id(System.currentTimeMillis());
contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId));
// when
Intent intent = ShareUtils.newShareFileIntent(context, trackId);
// then
assertEquals(Intent.ACTION_SEND, intent.getAction());
assertTrue(intent.getParcelableExtra(Intent.EXTRA_STREAM) instanceof Uri);
}
@Test
public void testMultipleTracks() {
// given
long random = System.currentTimeMillis();
Track.Id trackId1 = new Track.Id(random);
Track.Id trackId2 = new Track.Id(random + 1);
contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId1));
contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId2));
// when
Intent intent = ShareUtils.newShareFileIntent(context, trackId1, trackId2);
// then
assertEquals(Intent.ACTION_SEND_MULTIPLE, intent.getAction());
ArrayList<Uri> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
assertEquals(2, Objects.requireNonNull(uris).size());
}
}
@@ -61,7 +61,7 @@ public abstract class AbstractTrackDeleteActivity extends AbstractActivity imple
WorkManager workManager = WorkManager.getInstance(this);
WorkRequest deleteRequest = new OneTimeWorkRequest.Builder(TrackDeletionWorker.class)
.setInputData(new Data.Builder()
.putLongArray(TrackDeletionWorker.TRACKIDS_KEY, Arrays.stream(trackIds).mapToLong(Track.Id::id).toArray())
.putLongArray(TrackDeletionWorker.TRACKIDS_KEY, trackIdList.stream().mapToLong(Track.Id::id).toArray())
.build())
.build();
@@ -62,6 +62,15 @@ public class ShareUtils {
mime = uriAndMime.second;
}
if (uris.size() == 1) {
return new Intent(Intent.ACTION_SEND)
.setType(mime)
.putExtra(Intent.EXTRA_STREAM, uris.get(0))
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.share_track_subject))
.putExtra(Intent.EXTRA_TEXT, context.getString(R.string.share_track_share_file_body, trackDescription));
}
return new Intent(Intent.ACTION_SEND_MULTIPLE)
.setType(mime)
.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
+16 -20
View File
@@ -30,9 +30,7 @@ limitations under the License.
\n* arbeitet vollständig offline
\n* Tracks auf einer Karte anzeigen (siehe unten)</string>
<string name="help_track_map_title">Wie wird ein Track auf einer Karte angezeigt?</string>
<string name="help_track_map_content"> \u0020Verwende das kleine Kartensymbol.
\na) (Live-Aktualisierungen) Installiere <a href="https://codeberg.org/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a> zur Verfügung. Tatsächlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann.
\nb) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). Genauer ausgedrückt muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen. \u0020</string>
<string name="help_track_map_content">Verwende das kleine Kartensymbol. \n a) (Live-Aktualisierungen) Installiere <a href="https://codeberg.org/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a> zur Verfügung. \n Tatsächlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann. \n b) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). Genauer ausgedrückt muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen.</string>
<string name="help_storage_pictures_title">Wie speichert OpenTracks Fotos, die als Markierungen aufgenommen wurden?</string>
<string name="help_storage_pictures_content">Diese werden App-intern gespeichert (d.h. nur innerhalb von OpenTracks zugänglich).</string>
<string name="help_track_export_title">Wie kann ich aufgezeichnete Tracks exportieren/teilen?</string>
@@ -43,24 +41,11 @@ limitations under the License.
OpenTracks verwendet den GPS-Sensor des Geräts, um den Standort kontinuierlich aufzuzeichnen.
Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), kann OpenTracks nichts dagegen unternehmen.</string>
<string name="help_data_storage_title">Wie speichert OpenTracks Sensordaten?</string>
<string name="help_data_storage_content"> Sensordaten werden pro aufgezeichnetem Standort gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Standort gespeichert wird. Wenn Du still stehst oder dich in geschlossenen Räumen aufhältst, werden keine Sensordaten aufgezeichnet (aber angezeigt). </string>
<string name="help_data_storage_content">Sensordaten werden pro aufgezeichnetem Standort gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Standort gespeichert wird. Wenn Du still stehst oder dich in geschlossenen Räumen aufhältst, werden keine Sensordaten aufgezeichnet (aber sie werden angezeigt).</string>
<string name="help_gps_troubleshooting_title">OpenTracks zeichnet keine Standorte auf?</string>
<string name="help_gps_troubleshooting_content"> \u0020Was Du tun kannst:
\na) prüfen, ob GPS aktiviert ist,
\nb) den GPS-Empfang verbessern (z.B. ins Freie gehen),
\nc) mit der <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App das GPS testen, und
\nd) Energiesparen deaktivieren.
\n
\nWenn das alles nicht hilft, melde bitte einen Fehler. \u0020</string>
<string name="help_gps_troubleshooting_content">Was Du tun kannst: \n a) prüfen, ob GPS aktiviert ist, \n b) den GPS-Empfang verbessern (z.B. ins Freie gehen), \n c) mit der <a href="https://f-droid.org/de/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App prüfen, und \n d) Energiesparen deaktivieren. \n \n Wenn das alles nicht hilft, melde bitte einen Fehler.</string>
<string name="help_support_title">Wie kann ich OpenTracks unterstützen?</string>
<string name="help_support_content"> \u0020Du kannst:
\na) auf OpenTracks aufmerksam machen,
\nb) <a href="https://codeberg.org/OpenTracksApp/OpenTracks/issues">Funktionen vorschlagen</a>,
\nc) <a href="https://codeberg.org/OpenTracksApp/OpenTracks/issues">Fehler melden</a>,
\nd) bei der Software-Entwicklung helfen,
\ne) es im <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a> kaufen,
\nf) spenden, und
\ng) das tun, was OpenTracks Deiner Meinung nach hilft. \u0020</string>
<string name="help_support_content">Du kannst: \n a) auf OpenTracks aufmerksam machen, \n b) <a href="https://codeberg.org/OpenTracksApp/OpenTracks/issues">Funktionen vorschlagen</a>, \n c) <a href="https://codeberg.org/OpenTracksApp/OpenTracks/issues">Fehler melden</a>, \n d) bei der Software-Entwicklung helfen, \n e) es im <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a> kaufen, \n f) spenden, und \n g) das tun, was OpenTracks deiner Meinung nach hilft.</string>
<!-- Activity Type -->
<string name="activity_type_airplane">Flugzeug</string>
<string name="activity_type_atv">Quad</string>
@@ -82,7 +67,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="activity_type_hang_gliding">Drachenfliegen</string>
<string name="activity_type_helicopter">Hubschrauber</string>
<string name="activity_type_hiking">Wandern</string>
<string name="activity_type_horse_back_riding">Reiten</string>
<string name="activity_type_horse_back_riding">Ausreiten</string>
<string name="activity_type_hot_air_balloon">Heißluftballon</string>
<string name="activity_type_ice_sailing">Eissegeln</string>
<string name="activity_type_inline_skating">Inlineskating</string>
@@ -655,4 +640,15 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_announcements_segment_average_speed_pace">Durchschnittsgeschwindigkeit/pace (Segment)</string>
<string name="stats_average_segment_pace">Durchschnittliche Segment Geschwindigkeit</string>
<string name="stats_elapsed_segment_time">Verstrichene Segment Zeit</string>
<string name="activity_type_gravel_biking">Gravelrad</string>
<string name="description_sensor_temperature">Temperatur (Celsius)</string>
<string name="menu_export_all_to_health_connect">Alles exportieren</string>
<string name="settings_export_to_health_connect">Export zu Health Connect</string>
<string name="health_connect_export_enabled_summary">Export der Aktivität zu Health Connect sobald die Aufnahme beendet ist</string>
<string name="health_connect_not_available">Health Connect ist auf diesem Endgerät nicht verfügbar</string>
<string name="health_connect_open_settings_title">Health Connect Einstellungen</string>
<string name="health_connect_open_settings_summary">Öffne die Health Connect Einstellungen</string>
<string name="health_connect_permissions_rationale_title">Health Connect Berechtigungen</string>
<string name="health_connect_permissions_rationale_heading">Wie OpenTracks Health Connect verwendet</string>
<string name="health_connect_permissions_rationale_summary">Sofern in den Einstellungen aktiviert, überträgt OpenTracks die Trainingsdaten in Health Connect. OpenTracks liest keine Daten aus von Health Connect.</string>
</resources>
+16
View File
@@ -463,4 +463,20 @@ limitations under the License.
<string name="generic_choose_an_option">Alegeți o opțiune</string>
<string name="generic_undo">Anulați</string>
<string name="settings_defaults_summary">Unități preferate, Activitate implicită, Urmărire nume implicit</string>
<string name="help_data_google_play_services_content">Nu</string>
<string name="description_pace_nautical">Ritm (min/NM)</string>
<string name="description_sensor_temperature">Temperatura (Celsius)</string>
<string name="description_speed_nautical">Viteza (noduri)</string>
<string name="description_speed_source_gps">GPS</string>
<string name="generic_from">De la</string>
<string name="generic_to">Către</string>
<string name="create_marker_error">Nu s-a putut crea semnul. Încearcă din nou.</string>
<string name="marker_detail_title">%1$d al %2$d:%3$s</string>
<string name="menu_export_all_one_file">Exportă tot (un fișier pentru toate traseele)</string>
<string name="gps_recording_without_signal">OpenTracks înregistrează fără date GPS.</string>
<string name="activity_type_kickscooter">scuter</string>
<string name="menu_export_all_to_health_connect">Exportă tot</string>
<string name="permission_recording_failed">OpenTracks are nevoie de permisiunea de a accesa locația și dispozitivele în apropiere.</string>
<string name="permission_bluetooth_failed">OpenTracks necesită permisiunea de a utiliza Bluetooth.</string>
<string name="permission_bluetooth_failed_rejected">Îți trebuie să permiți OpenTracks pentru a accesa la Dispozitive din Apropriere în setările sistemului.</string>
</resources>