Compare commits

...

17 Commits

Author SHA1 Message Date
Dennis Guse d76131a34f Release: v4.19.6 2025-06-22 21:41:51 +02:00
Dennis Guse 3bae0869c4 Launcher icon was sometimes incorrectly scaled (e.g., kvaesitso).
Use same icon as OSMDashboard for launcher (w/o background).

This time also for the reproducible build.

Fixes #2108.
2025-06-21 17:22:39 +02:00
Dennis Guse a164876615 Edge-2-edge for Android 10 and below requires a quirk.
Part of #2073.
2025-06-20 19:13:05 +02:00
Dennis Guse 5bbb5f789f Bugfix: apply edge-2-edge insets to everything always.
Fixes #2073.
2025-06-20 19:13:05 +02:00
Dennis Guse 6e42857023 Cleanup: properly name method (has side effect). 2025-06-20 19:13:05 +02:00
Dennis Guse b883bb3862 Track list: center recording icon. 2025-06-19 17:54:45 +02:00
Dennis Guse 9b5ef0707e Cleanup: remove unused code for track list. 2025-06-19 17:54:45 +02:00
Dennis Guse 9c1a44abb4 Release: v4.19.5 2025-06-19 10:18:37 +02:00
தமிழ்நேரம் f75ed13e52 Translated using Weblate (Tamil)
Currently translated at 100.0% (539 of 539 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ta/
2025-06-17 09:02:20 +02:00
தமிழ்நேரம் 5483065d4d Translated using Weblate (Tamil)
Currently translated at 100.0% (164 of 164 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/ta/
2025-06-17 09:02:18 +02:00
Cloud Esp c1ecebccaa Translated using Weblate (French)
Currently translated at 95.3% (514 of 539 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/fr/
2025-06-17 09:01:46 +02:00
Aindriú Mac Giolla Eoin 8f130c50ff Translated using Weblate (Irish)
Currently translated at 100.0% (164 of 164 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/ga/
2025-06-14 09:02:13 +02:00
Fjuro 1da04398f8 Translated using Weblate (Czech)
Currently translated at 100.0% (164 of 164 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/cs/
2025-06-14 09:02:13 +02:00
Yurt Page 8c05be048a Translated using Weblate (Russian)
Currently translated at 99.6% (537 of 539 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ru/
2025-06-14 09:02:12 +02:00
Dennis Guse 77d040d08b Launcher icon was sometimes incorrectly scaled (e.g., kvaesitso).
Use same icon as OSMDashboard for launcher (w/o background).

Fixes #2108.
2025-06-14 09:02:06 +02:00
Dennis Guse 07124ad702 Bugfix: track icon in track detail page should taken from activityType (not te localized string).
Fixes #2112.
2025-06-13 08:16:29 +02:00
Dennis Guse 9257abb9ec Cleanup: remove unused attribute. 2025-06-13 08:16:29 +02:00
42 changed files with 242 additions and 174 deletions
+2 -2
View File
@@ -46,8 +46,8 @@ android {
defaultConfig {
applicationId 'de.dennisguse.opentracks'
versionCode 6170
versionName "v4.19.4"
versionCode 6187
versionName "v4.19.6"
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
@@ -0,0 +1,5 @@
v4.19.4: OpenTracks
Oprava chyb:
- Edge-to-edge (SDK35): použito na všechny verze Androidu (určitý pokrok, ale stále se na tom pracuje)
- KMZ s obrázky nebylo možné exportovat (záhlaví nebylo možné vypočítat; funkce odstraněna)
@@ -0,0 +1,5 @@
v4.19.5: OpenTracks
Bugfix:
- Launcher icon was sometimes shown too small
- Track icon on detail page using localized activity type
@@ -0,0 +1,4 @@
v4.19.6: OpenTracks
Changes:
- Edge-2-edge should now be working on all Android versions
@@ -0,0 +1,5 @@
v4.19.4: OpenTracks
Ceartú fabht:
- Imeall go himeall (SDK35): curtha i bhfeidhm ar gach leagan de Android (roinnt dul chun cinn, ach obair ar siúl fós)
- Níorbh fhéidir KMZ le pictiúir a easpórtáil (níorbh fhéidir an ceannteideal a ríomh; baineadh an ghné)
@@ -0,0 +1,4 @@
V4.17.8: Opentracks
மாற்றங்கள்:
- விளக்கப்படங்கள்: காட்டப்பட்ட தரவை உள்ளமைக்க முடியும்
@@ -0,0 +1,11 @@
v4.18.0: ஓபன்ட்ராக்ச்
மாற்றங்கள்:
- சி.பி.எச் முடக்கப்பட்ட எச்சரிக்கையை முடக்கலாம்
பிழைத்திருத்த:
- பாட்டம்அப்ப்பார் உள்ளடக்கத்தை ஒன்றுடன் ஒன்று
டெவலப்பர்:
- ஆண்ட்ராய்டு இருப்பிடத்திற்கு பதிலாக பதிவு நிலையைப் பயன்படுத்தவும்
- மறுசீரமைக்கப்பட்ட சென்சார் திரட்டிகள்
@@ -0,0 +1,7 @@
V4.19.0: Opentracks
மாற்றங்கள்:
- சிபிஎக்ச் ஏற்றுமதி இணக்கமாக இல்லை (டிராக் பாயிண்ட் எக்ச்டென்சன் ஆர்டர் மற்றும் உள்ளடக்கம்)
பிழைத்திருத்த:
- முன்-V4.18.0 படங்கள் இல்லாத குறிப்பான்களை நீக்க முடியவில்லை
@@ -0,0 +1,4 @@
V4.19.1: Opentracks
பிழைத்திருத்த:
- ஏற்றுமதி செய்யப்பட்ட சிபிஎக்ச் கோப்புகள் ஒரு திட்டத்தை தவறவிட்டன
@@ -0,0 +1,4 @@
V4.19.2: Opentracks
பிழைத்திருத்த:
- தவறான மொழிபெயர்ப்புகள் காரணமாக விபத்தை சரிசெய்யவும்
@@ -0,0 +1,4 @@
V4.19.3: Opentracks
பிழைத்திருத்த:
- உயரத்திற்கு காபிம ஏற்றுமதியை சரிசெய்யவும் (1000 மீ.
@@ -0,0 +1,5 @@
V4.19.4: Opentracks
பிழைத்திருத்த:
-எட்ச்-டு-எட்ச் (SDK35): ஆண்ட்ராய்டு இன் அனைத்து பதிப்பிற்கும் பயன்படுத்தப்பட்டது (சில முன்னேற்றம், ஆனால் இன்னும் முன்னேற்றத்தில் உள்ளது)
- படங்களுடன் KMZ ஏற்றுமதி செய்ய முடியவில்லை (தலைப்பு கணக்கிட முடியாதது; நற்பொருத்தம் அகற்றப்பட்டது)
@@ -3,6 +3,7 @@ package de.dennisguse.opentracks;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import de.dennisguse.opentracks.databinding.AboutBinding;
@@ -29,7 +30,8 @@ public class AboutActivity extends AbstractActivity {
ViewUtils.makeClickableLinks(findViewById(android.R.id.content));
}
protected View getRootView() {
@NonNull
protected View createRootView() {
viewBinding = AboutBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -16,16 +16,17 @@
package de.dennisguse.opentracks;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.ViewCompat;
import android.view.ViewGroup.LayoutParams;
import androidx.core.view.ViewGroupCompat;
import androidx.core.view.WindowInsetsCompat;
import de.dennisguse.opentracks.services.announcement.TTSManager;
import de.dennisguse.opentracks.settings.PreferencesUtils;
@@ -40,51 +41,27 @@ public abstract class AbstractActivity extends AppCompatActivity {
setTheme(R.style.OpenTracksThemeOled);
}
// Enable edge-to-edge rendering
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState);
// Set volume control stream for text to speech
setVolumeControlStream(TTSManager.AUDIO_STREAM);
View rootView = getRootView();
View rootView = createRootView();
setContentView(rootView);
apply_insets(rootView);
edge2edgeApplyInsets(rootView);
}
private void apply_insets(View rootView) {
View bottom_app_bar = findViewById(R.id.bottom_app_bar);
if (rootView != null) {
// Apply navbar insets to the whole content
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
// Apply the insets as a padding to the view.
// Don't need to set the top inset for some reason (?)
view.setPadding(insets.left, 0, insets.right, 0);
// Return the insets to apply to the next view (BottomAppBar)
return windowInsets;
});
}
if (bottom_app_bar != null) {
// Apply status and navbar insets to BottomAppBar
// WARNING: this is called twice for bottomappbar.xml
ViewCompat.setOnApplyWindowInsetsListener(bottom_app_bar, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
// Apply the insets as a padding to the view.
view.setPadding(0, 0, 0, insets.bottom);
// Set new height to account for the inset
LayoutParams layout = view.getLayoutParams();
// Get actionBar height attribute
final TypedArray arr = obtainStyledAttributes(new int[] { com.google.android.material.R.attr.actionBarSize });
int actionBarHeight = (int) arr.getDimension(0, 0f);
arr.recycle();
layout.height = insets.bottom + actionBarHeight;
view.setLayoutParams(layout);
// Return CONSUMED if you don't want the window insets to keep passing down to descendant views.
return WindowInsetsCompat.CONSUMED;
});
}
private void edge2edgeApplyInsets(View rootView) {
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout());
view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
return WindowInsetsCompat.CONSUMED;
});
// For Android 10 and below.
ViewGroupCompat.installCompatInsetsDispatch(rootView);
}
@Override
@@ -93,5 +70,6 @@ public abstract class AbstractActivity extends AppCompatActivity {
return true;
}
protected abstract View getRootView();
@NonNull
protected abstract View createRootView();
}
@@ -3,6 +3,7 @@ package de.dennisguse.opentracks;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import de.dennisguse.opentracks.databinding.HelpBinding;
@@ -19,8 +20,9 @@ public class HelpActivity extends AbstractActivity {
ViewUtils.makeClickableLinks(findViewById(android.R.id.content));
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
helpBinding = HelpBinding.inflate(getLayoutInflater());
return helpBinding.getRoot();
}
@@ -7,6 +7,8 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -28,8 +30,9 @@ public class ShowErrorActivity extends AbstractActivity {
setSupportActionBar(viewBinding.bottomAppBarLayout.bottomAppBar);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = ActivityShowErrorBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -115,8 +115,9 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
outState.putSerializable(ICON_VALUE_KEY, activityType);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = TrackEditBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -30,6 +30,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat;
@@ -242,8 +243,9 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
adapter = null;
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = TrackListBinding.inflate(getLayoutInflater());
viewBinding.trackListSearchView.getEditText().setOnEditorActionListener((v, actionId, event) -> {
@@ -34,7 +34,6 @@ import com.google.android.material.tabs.TabLayoutMediator;
import de.dennisguse.opentracks.chart.ChartFragment;
import de.dennisguse.opentracks.chart.TrackDataHubInterface;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.TrackDataHub;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.databinding.TrackRecordedBinding;
@@ -67,8 +66,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
private static final String CURRENT_TAB_TAG_KEY = "current_tab_tag_key";
// The following are setFrequency in onCreate.
private ContentProviderUtils contentProviderUtils;
private TrackDataHub trackDataHub;
private TrackRecordedBinding viewBinding;
@@ -85,8 +82,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
contentProviderUtils = new ContentProviderUtils(this);
handleIntent(getIntent());
trackDataHub = new TrackDataHub(this);
@@ -101,7 +96,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindCallback);
Track track = contentProviderUtils.getTrack(trackId);
viewBinding.bottomAppBarLayout.bottomAppBar.replaceMenu(R.menu.track_detail);
setSupportActionBar(viewBinding.bottomAppBarLayout.bottomAppBar);
@@ -142,8 +136,9 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
outState.putInt(CURRENT_TAB_TAG_KEY, viewBinding.trackDetailActivityViewPager.getCurrentItem());
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = TrackRecordedBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -250,8 +250,9 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
trackRecordingServiceConnection = null;
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = TrackRecordingBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -7,6 +7,8 @@ import android.util.Pair;
import android.view.View;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.data.models.DistanceFormatter;
@@ -110,8 +112,9 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
contentProviderUtils);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = TrackStoppedBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -16,7 +16,6 @@
package de.dennisguse.opentracks.fragments;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
@@ -33,7 +32,6 @@ import androidx.fragment.app.Fragment;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.TrackRecordedActivity;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.data.models.DistanceFormatter;
import de.dennisguse.opentracks.data.models.SpeedFormatter;
import de.dennisguse.opentracks.data.models.Track;
@@ -185,13 +183,7 @@ public class StatisticsRecordedFragment extends Fragment {
}
// Set activity type
{
Context context = getContext();
String localizedActivityType = track.getActivityTypeLocalized();
int iconDrawableId = ActivityType.findByLocalizedString(context, localizedActivityType)
.getIconDrawableId();
viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), iconDrawableId));
}
viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), track.getActivityType().getIconDrawableId()));
// Set time and start datetime
{
@@ -47,8 +47,9 @@ public class IntroductionActivity extends AbstractActivity {
viewBinding.introductionViewPager.setUserInputEnabled(false);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = IntroductionBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -72,8 +72,9 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
}
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = SettingsBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -116,8 +116,9 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
recordingLayoutFieldsVisible = null;
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = ActivitySettingsCustomLayoutBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -108,8 +108,9 @@ public class SettingsCustomLayoutListActivity extends AbstractActivity implement
adapter.reloadLayouts();
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
PreferencesUtils.getCustomLayout();
viewBinding = ActivitySettingsCustomLayoutListBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
@@ -35,7 +35,6 @@ import de.dennisguse.opentracks.settings.UnitSystem;
import de.dennisguse.opentracks.ui.util.ActivityUtils;
import de.dennisguse.opentracks.ui.util.ListItemUtils;
import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.StringUtils;
public class TrackListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements ActionMode.Callback {
@@ -229,12 +228,6 @@ public class TrackListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
viewBinding.trackListItemTime.setText(null);
}
//TODO Check if this is needed or a leftover from the MarkerList migration
String category = activityType == null ? activityTypeLocalized : null;
String categoryDescription = StringUtils.getCategoryDescription(category, description);
viewBinding.trackListItemCategoryDescription.setText(categoryDescription);
viewBinding.trackListItemCategoryDescription.setVisibility("".equals(categoryDescription) ? View.GONE : View.VISIBLE);
setSelected(selection.get((int) getId()));
}
@@ -83,8 +83,9 @@ public class AggregatedStatisticsActivity extends AbstractActivity implements Fi
outState.putBoolean(STATE_ARE_FILTERS_APPLIED, areFiltersApplied);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = AggregatedStatsBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -110,8 +110,9 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
setSupportActionBar(viewBinding.bottomAppBarLayout.bottomAppBar);
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = MarkerDetailActivityBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -85,8 +85,9 @@ public class MarkerEditActivity extends AbstractActivity {
// UI elements
private MarkerEditBinding viewBinding;
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = MarkerEditBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@@ -145,8 +145,9 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
contentProviderUtils = null;
}
@NonNull
@Override
protected View getRootView() {
protected View createRootView() {
viewBinding = MarkerListBinding.inflate(getLayoutInflater());
viewBinding.markerListSearchView.getEditText().setOnEditorActionListener((v, actionId, event) -> {
+2 -10
View File
@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background" />
<foreground>
<inset
android:inset="20dp"
android:drawable="@drawable/ic_logo_color_24dp" />
</foreground>
<monochrome>
<inset
android:inset="20dp"
android:drawable="@drawable/ic_logo_24dp" />
</monochrome>
<foreground android:drawable="@drawable/ic_logo_color_108dp" />
<monochrome android:drawable="@drawable/ic_logo_color_108dp" />
</adaptive-icon>
+16
View File
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.56"
android:scaleY="0.56"
android:translateX="22"
android:translateY="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M82.489,12.834C83.196,10.418 82.043,9.556 79.926,10.917L10.087,55.828c-2.117,1.361 -1.795,2.628 0.714,2.815L39.806,60.807c2.51,0.188 5.291,2.267 6.18,4.621l10.282,27.208c0.89,2.354 2.195,2.304 2.902,-0.111z" />
</group>
</vector>
@@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.56"
android:scaleY="0.56"
android:translateX="22"
android:translateY="24">
<path
android:pathData="M85.133,20.59C85.731,18.546 84.756,17.817 82.965,18.968L23.874,56.967c-1.791,1.152 -1.519,2.224 0.604,2.382L49.019,61.18c2.124,0.159 4.477,1.918 5.229,3.91l8.7,23.021c0.753,1.992 1.857,1.949 2.455,-0.094z"
android:strokeWidth="1"
android:strokeColor="#f69123">
<aapt:attr name="android:fillColor">
<gradient
android:endX="84.4913"
android:endY="19.211866"
android:startX="38.773293"
android:startY="80.33152"
android:type="linear">
<item
android:color="#FFFBB22F"
android:offset="0" />
<item
android:color="#FFF58820"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
</group>
</vector>
@@ -1,33 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="24dp"
android:height="24dp"
android:viewportWidth="100"
android:viewportHeight="100">
<group
android:name="rotationGroup"
android:pivotX="50"
android:pivotY="50"
android:scaleX="0.6"
android:scaleY="0.6"
>
<path android:pathData="M82.489,12.834C83.196,10.418 82.043,9.556 79.926,10.917L10.087,55.828c-2.117,1.361 -1.795,2.628 0.714,2.815L39.806,60.807c2.51,0.188 5.291,2.267 6.18,4.621l10.282,27.208c0.89,2.354 2.195,2.304 2.902,-0.111z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="70.0"
android:endY="30.0"
android:startX="7.0"
android:startY="83.0"
android:type="linear">
<item
android:color="#FFFBB22F"
android:offset="0" />
<item
android:color="#FFFF6D00"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
</group>
</vector>
+4 -16
View File
@@ -11,9 +11,10 @@
<!-- Icon -->
<ImageView
android:id="@+id/track_list_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@string/image_track"
android:scaleType="centerInside"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_activity_bike_24dp" />
@@ -94,19 +95,6 @@
app:barrierDirection="bottom"
app:constraint_referenced_ids="track_list_item_time_distance,track_list_item_marker_count_icon,track_list_item_marker_count,track_list_item_time" />
<!-- Category and description -->
<TextView
android:id="@+id/track_list_item_category_description"
style="?attr/textAppearanceBodySmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/track_list_item_name"
app:layout_constraintTop_toBottomOf="@id/track_list_item_barrier"
tools:text="Description" />
<!-- Bottom Line -->
<View
android:id="@+id/marker_list_item_bottom_line"
@@ -114,6 +102,6 @@
android:layout_marginBottom="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/track_list_item_category_description" />
app:layout_constraintTop_toBottomOf="@+id/track_list_item_barrier" />
</androidx.constraintlayout.widget.ConstraintLayout>
+1
View File
@@ -673,4 +673,5 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="lap_heart_rate">Fréquence cardiaque au tour</string>
<string name="settings_recording_show_gps_disabled_warning_title">Alerte GPS désactivée</string>
<string name="settings_recording_show_gps_disabled_warning_summary">Pendant l\'enregistrement, afficher un avertissement si le GPS est désactivé.</string>
<string name="empty">vide</string>
</resources>
+1 -1
View File
@@ -23,7 +23,7 @@
<style name="SplashTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splashscreen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_logo_color_splashscreen</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_logo_color_108dp</item>
<item name="postSplashScreenTheme">@style/OpenTracksTheme</item>
</style>
+57 -31
View File
@@ -175,7 +175,7 @@ limitations under the License.
<string name="settings_chart_by_distance">По расстоянию</string>
<string name="settings_chart_by_time">По времени</string>
<string name="settings_recording_default_activity_title">Вид активности по умолчанию</string>
<string name="settings_recording_location_frequency_summary">%1$s между записанными точками местоположения</string>
<string name="settings_recording_location_frequency_summary">%1$s между проверками местоположения</string>
<string name="settings_recording_max_recording_distance_summary">Новый сегмент создается, если расстояние между двумя точками больше %1$s</string>
<string name="settings_recording_max_recording_distance_title">Макс. расстояние</string>
<string name="settings_recording_min_recording_distance_title">Интервал записи расстояния</string>
@@ -184,9 +184,9 @@ limitations under the License.
<string name="settings_recording_track_name_date_iso_8601_option">Дата (ISO 8601)</string>
<string name="settings_recording_track_name_date_local_option">Дата (местный формат)</string>
<string name="settings_recording_track_name_number_option">Номер</string>
<string name="settings_recording_track_name_title">Название трека по умолчанию</string>
<string name="settings_recording_track_name_title">Название пути по умолчанию</string>
<!-- Settings Reset -->
<string name="settings_reset_confirm_message">Все настройки будут сброшены к значениям по умолчанию. Это не удалит треки на устройстве.</string>
<string name="settings_reset_confirm_message">Все настройки будут сброшены к значениям по умолчанию. Это не удалит пути на устройстве.</string>
<string name="settings_reset_confirm_title">Сбросить настройки?</string>
<string name="settings_reset_done">Все настройки сброшены к значениям по умолчанию</string>
<!-- Settings Sensor -->
@@ -199,7 +199,7 @@ limitations under the License.
<string name="share_track_share_file_body">Я думаю этот маршрут покажется вам интересным.
\n
\n%1$s</string>
<string name="share_track_subject">Хочу поделиться с вами треком</string>
<string name="share_track_subject">Хочу поделиться с вами путём</string>
<!-- Stats -->
<string name="stats_average_moving_pace">Средний темп движения</string>
<string name="stats_average_moving_speed">Средняя скорость движения</string>
@@ -217,12 +217,12 @@ limitations under the License.
<string name="stats_distance">Расстояние</string>
<string name="stats_total_time">Общее время</string>
<!-- Track -->
<string name="track_name_format">Трек %1$d</string>
<string name="track_name_format">Путь %1$d</string>
<string name="track_markers">%1$s маркеры</string>
<!-- Track Delete -->
<string name="track_delete_one_confirm_message">Трек и связанные с ним маркеры будут удалены с устройства без возможности восстановления.</string>
<string name="track_delete_one_confirm_title">Удалить трек?</string>
<string name="track_delete_multiple_confirm_message">Выбранные треки и связанные с ними маркеры будут удалены с устройства без возможности восстановления.</string>
<string name="track_delete_one_confirm_message">Путь и связанные с ним маркеры будут удалены с устройства без возможности восстановления.</string>
<string name="track_delete_one_confirm_title">Удалить путь?</string>
<string name="track_delete_multiple_confirm_message">Выбранные пути и связанные с ними маркеры будут удалены с устройства без возможности восстановления.</string>
<string name="track_delete_progress_message">Удаление…</string>
<!-- Track Detail -->
<string name="track_detail_stats_tab">Статистика</string>
@@ -312,7 +312,7 @@ limitations under the License.
\nНа самом деле, OSMDashboard — это отдельное приложение, которое может получить (временный) доступ только к данным трека(-ов), которые будут просмотрены.
\nб) Через обычное картографическое приложение (например, <a href="http://osmand.net/">OsmAnd</a> и <a href="https://maps.me/">MAPS.ME</a>). Такие приложения должны поддерживать формат файлов KMZ (только точки местоположения и метки времени). Фактически, приложение должно поддерживать <i>ACTION_VIEW</i> с MIME <i>application/vnd.google-earth.kmz</i>. </string>
<string name="help_storage_pictures_title">Как OpenTracks хранит изображения, используемые в качестве маркеров?</string>
<string name="about_preference_title">Об OpenTracks</string>
<string name="about_preference_title">О приложении</string>
<string name="about_description"><i>OpenTracks</i> — это приложение для отслеживания спортивных тренировок, которое полностью уважает вашу конфиденциальность.</string>
<string name="about_url">Веб-страница проекта: <a href="%1$s">%1$s</a></string>
<string name="about_version_name">Название версии: %1$s</string>
@@ -362,14 +362,14 @@ limitations under the License.
<string name="marker_add_photo_canceled">Отменено, фотомаркер не добавлен</string>
<string name="import_progress_summary_exists_msg">Уже существует</string>
<string name="import_progress_summary_ok_msg">Файлы импортированы</string>
<string name="menu_resume_track">Возобновить трек</string>
<string name="menu_resume_track">Продолжить путь</string>
<string name="settings_night_mode_title">Тема интерфейса</string>
<string name="open_track_as_trackfileformat">Открыть как %1$s</string>
<string name="help_support_title">Как я могу поддержать OpenTracks?</string>
<string name="help_gps_troubleshooting_title">OpenTracks не записывает точки местоположения?</string>
<string name="activity_type_escooter">электросамокат</string>
<string name="permission_gps_failed">OpenTracks требуется разрешение на использование GPS.</string>
<string name="settings_prevent_reimport_tracks_title">Предотвращение повторного импорта треков</string>
<string name="settings_prevent_reimport_tracks_title">Предотвращение повторного импорта путей</string>
<string name="sensor_state_cadence_max">Макс. каденс</string>
<string name="sensor_state_cadence_avg">Средний каденс</string>
<string name="settings_recording_fullscreen_on_while_recording_title">Полный экран</string>
@@ -390,8 +390,8 @@ limitations under the License.
<string name="export_track_errors">Файлы не экспортированы</string>
<string name="export_error_post_workout">Сбой экспорта после тренировки, пожалуйста, проверьте папку экспорта.</string>
<string name="description_altitude_loss">Потеря высоты: %1$d м (%2$d футов)</string>
<string name="settings_default_export_uri_title">Папка для экспорта треков</string>
<string name="instant_export_enabled_summary">Экспортировать трек в хранилище после завершения записи</string>
<string name="settings_default_export_uri_title">Папка для экспорта путей</string>
<string name="instant_export_enabled_summary">Экспортировать путь в хранилище после завершения записи</string>
<string name="share_image_subject">Я хотел бы поделиться с вами изображением</string>
<string name="track_detail_intervals_tab">Интервалы</string>
<string name="help_data_storage_content"> Данные датчиков сохраняются для каждого записанного местоположения. Для пульсометра это означает, что на каждую точку местоположения сохраняется только <i>одно</i> значение пульса. Если вы стоите на месте или находитесь в помещении, данные датчика не будут записываться (но будут отображаться). </string>
@@ -406,7 +406,7 @@ limitations under the License.
<string name="track_speed_notification">Скорость: %1$s</string>
<string name="track_distance_notification">Расстояние: %1$s</string>
<string name="interval_list_empty_message">Интервалов пока нет</string>
<string name="aggregated_stats_empty_message">Запишите свой первый трек, чтобы увидеть статистику</string>
<string name="aggregated_stats_empty_message">Запишите свой первый путь, чтобы увидеть статистику</string>
<string name="instant_export_enabled_title">Мгновенный экспорт после тренировки</string>
<string name="hold_to_stop">Удерживайте для остановки</string>
<string name="share_image_body">Я думаю, вас может заинтересовать это изображение.</string>
@@ -428,7 +428,7 @@ limitations under the License.
<string name="import_prevent_reimport">Вы запретили повторный импорт трека</string>
<string name="about_third_party_data">Сторонние данные</string>
<string name="menu_voice_rate">Скорость голоса</string>
<string name="track_delete_not_recording">Этот трек нельзя удалить, так как он записывается в данный момент.</string>
<string name="track_delete_not_recording">Этот путь нельзя удалить, так как он записывается в данный момент.</string>
<plurals name="generic_completed_with_errors">
<item quantity="one">Завершено, %1$d ошибка</item>
<item quantity="few">Завершено, %1$d ошибки</item>
@@ -454,11 +454,11 @@ limitations under the License.
<string name="settings_sensors_title">датчики</string>
<string name="settings_sensors_summary">Велосипедные датчики, окружность колеса, датчики для бега</string>
<string name="settings_announcements_statistics_title">Голосовые подсказки статистические</string>
<string name="settings_import_export_title">Импорт/экспорт</string>
<string name="settings_import_export_title">Импорт и экспорт</string>
<string name="settings_import_export_summary">Импорт, экспорт, автоэкспорт</string>
<string name="settings_units_category">Единицы измерения</string>
<string name="settings_announcements_totaltime_frequency">Интервал времени</string>
<string name="settings_announcements_distance_frequency">Интервал расстояния</string>
<string name="settings_announcements_distance_frequency">Длина окружности</string>
<string name="custom_layout_list_layout_removed">Раскладка удалена</string>
<string name="settings_cycling_sensor">Велосипед</string>
<string name="settings_public_api_enabled_title">Публичный API</string>
@@ -466,7 +466,7 @@ limitations under the License.
<string name="settings_public_api_enabled_summary_off">Только OpenTracks может запускать и останавливать запись.</string>
<string name="value_float_mile_hour_recommended">%1$.1f миль/ч (рекомендуется)</string>
<string name="export_cannot_write_to_dir">Невозможно записать в папку экспорта.</string>
<string name="settings_defaults_summary">Предпочитаемые единицы, вид активности и название трека по умолчанию</string>
<string name="settings_defaults_summary">Предпочитаемые единицы, вид активности и название пути по умолчанию</string>
<string name="settings_recording_customize_layout_title">Изменить раскладку записи</string>
<string name="settings_recording_customize_layout_select_columns">Ячеек с данными в строке</string>
<string name="custom_layout_list_title">Раскладки</string>
@@ -486,7 +486,7 @@ limitations under the License.
<string name="custom_layout_select_layout">Выбрать раскладку</string>
<string name="stats_custom_layout_default_layout">Раскладка по умолчанию</string>
<string name="settings_layout_reset_confirm_title">Сбросить ваши раскладки?</string>
<string name="settings_layout_reset_confirm_message">Настройки всех раскладок будут сброшены к значениям по умолчанию. Это не удалит треки на устройстве.</string>
<string name="settings_layout_reset_confirm_message">Настройки всех раскладок будут сброшены к значениям по умолчанию. Это не удалит пути на устройстве.</string>
<string name="stats_sensors_heart_rate">Пульс</string>
<string name="stats_sensors_power">Мощность</string>
<string name="value_float_mile_hour">%1$.1f миль/ч</string>
@@ -536,7 +536,7 @@ limitations under the License.
<string name="value_integer_knots">%1$d узлов</string>
<string name="value_float_knots">%1$.1f узлов</string>
<string name="image_discard">Отменить</string>
<string name="track_discarding">Отмена записи трека</string>
<string name="track_discarding">Отмена записи пути</string>
<string name="settings_announcements_lap_heart_rate">Значение пульса за круг</string>
<string name="settings_announcements_lap_speed_pace">Скорость/темп за круг</string>
<string name="settings_public_api_package_title">Название пакета для публичного API</string>
@@ -549,18 +549,18 @@ limitations under the License.
<string name="settings_announcements_average_speed_pace">Средняя скорость/темп</string>
<string name="unit_minute_per_nautical_mile">минут на морскую милю</string>
<string name="sensor_state_heart_rate_unit">уд/мин</string>
<string name="voiceDistanceNauticalMilesPlural">{n, plural, =1 {1 nautical mile} other {{n,number,#.0} nautical miles} }</string>
<string name="voiceMinutesPlural">{n, plural, =1 {1 minute} other {{n,number} minutes} }</string>
<string name="voiceDistanceNauticalMilesPlural">{n, plural, =1 {1 морская миля} few {{n,number,#.0} морских миля} other {{n,number,#.0} морских миль} }</string>
<string name="voiceMinutesPlural">{n, plural, =1 {1 минута} few {{n,number} минуты} other {{n,number} минут} }</string>
<string name="help_data_google_play_services_content">Не использует</string>
<string name="menu_export_all_one_file">Экспортировать все треки в один файл</string>
<string name="track_delete_number_of_tracks">%1$d треки</string>
<string name="track_delete_number_of_tracks">%1$d пути</string>
<string name="show_on_dashboard">OpenTracks Dashboard API</string>
<string name="settings_announcements_idle_category_title">Голосовые подсказки без движения</string>
<string name="sensor_state_power_unit">Вт</string>
<string name="settings_stats_units_imperial_meter">Британская система (мили, метры)</string>
<string name="voiceSpeedMilesPerHourPlural">{n, plural, =1 {1 mile per hour} other {{n,number,#.0} miles per hour} }</string>
<string name="voiceDistanceMilesPlural">{n, plural, =1 {1 mile} other {{n,number,#.0} miles} }</string>
<string name="voiceSpeedKilometersPerHourPlural">{n, plural, =1 {1 kilometer per hour} other {{n,number,#.0} kilometers per hour} }</string>
<string name="voiceSpeedMilesPerHourPlural">{n, plural, =1 {1 миля в час} few {{n,number} мили в час} other {{n,number} миль в час} }</string>
<string name="voiceDistanceMilesPlural">{n, plural, =1 {1 миля} few {{n,number,#.0} миль} other {{n,number,#.0} мили} }</string>
<string name="voiceSpeedKilometersPerHourPlural">{n, plural, =1 {1 километр в час} few {{n,number} километра в час} other {{n,number} километров в час} }</string>
<string name="voice_on_device_speaker_title">Использовать динамик устройства</string>
<string name="settings_ui_dynamic_colors_title">Динамические цвета</string>
<string name="settings_sensor_heart_rate_max">Зоны: макс. пульс (уд/мин)</string>
@@ -570,7 +570,7 @@ limitations under the License.
<string name="sensor_state_power_max">Макс. мощность</string>
<string name="activity_type_kickscooter">самокат</string>
<string name="no_compatible_camera_installed">Не установлено совместимое приложение камеры</string>
<string name="voiceSecondsPlural">{n, plural, =1 {1 second} other {{n,number} seconds} }</string>
<string name="voiceSecondsPlural">{n, plural, =1 {1 секунда} few {{n,number} секунды} other {{n,number} секунд} }</string>
<string name="settings_api_summary">API для удаленного управления и статистики для сторонних приложений</string>
<string name="no_compatible_gallery_installed">Не установлено совместимое приложение для просмотра изображений</string>
<string name="show_on_dashboard_not_installed">Не установлено приложение, поддерживающее OpenTracks Dashboard API.</string>
@@ -580,12 +580,38 @@ limitations under the License.
<string name="sensor_state_cadence_unit">об/мин</string>
<string name="voiceIdle">Переход в режим без движения.</string>
<string name="introduction_osm_dashboard">В OpenTracks не предусмотрена карта. Пожалуйста, установите OSMDashboard для просмотра ваших записей на карте.</string>
<string name="voiceHoursPlural">{n, plural, =1 {1 hour} other {{n,number} hours} }</string>
<string name="voiceHoursPlural">{n, plural, =1 {1 час} few {{n,number} часа} other {{n,number} часов} }</string>
<string name="settings_announcements_idle_title">Без движения</string>
<string name="settings_recording_idle_timeout_title">Предел периода без движения</string>
<string name="settings_recording_min_required_accuracy_summary">Информация о местоположении игнорируется, если показатель точности превышает %1$s</string>
<string name="voiceSpeedMKnotsPlural">{n, plural, =1 {1 knot} other {{n,number,#.0} knots} }</string>
<string name="voiceSpeedMKnotsPlural">{n, plural, =1 {1 узел} few {{n,number,#.0} узла} other {{n,number,#.0} узлов} }</string>
<string name="value_int_seconds">%1$d сек (рекомендуется)</string>
<string name="settings_sensor_bluetooth_service_filter_title">Фильтровать устройства Bluetooth</string>
<string name="voiceDistanceKilometersPlural">{n, plural, =1 {1 kilometer} other {{n,number,#.0} kilometers} }</string>
</resources>
<string name="voiceDistanceKilometersPlural">{n, plural, =1 {1 километр} few {{n,number,#.0} километра} other {{n,number,#.0} километров} }</string>
<string name="settings_recording_show_gps_disabled_warning_title">Предупреждение о нерабочем GPS положении</string>
<string name="settings_recording_show_gps_disabled_warning_summary">Во время записи, показать предупреждение, если GPS отключён.</string>
<string name="stats_gain_loss">Подъём и спуск</string>
<string name="lap_heart_rate">Пульс на круге</string>
<string name="settings_charts_title">Графики</string>
<string name="settings_chart_display_elevation_title">Показать высоту</string>
<string name="settings_chart_display_pace_or_speed_title">Показать темп или скорость</string>
<string name="settings_chart_display_heart_rate_title">Показать пульс</string>
<string name="settings_recording_location_distance_summary">%1$s между записанными местоположениями</string>
<string name="empty">пусто</string>
<string name="sensor_state_pressure">Барометр</string>
<string name="bluetooth_sensor_summary">%1$s (%2$s)</string>
<string name="voiceSpeed">{n, plural, =1 {1} few {{n,number,#.0}} other {{n,number,#.0}} }</string>
<string name="value_internal_sensor">Внутренний датчик</string>
<string name="settings_locale_title">Язык</string>
<string name="settings_locale_system_default">Как в системе</string>
<string name="settings_night_mode_option_night_oled">Ночной (полностью чёрный)</string>
<string name="settings_announcements_unit">Единицы расстояния/скорости</string>
<string name="voice_announce_lap_power_key">voiceAnnounceLapPower</string>
<string name="power_x_watt">Мощность {x, plural, =1 {1 Ватт} few {# Ватта} other {# Ваттов} }</string>
<string name="settings_recording_min_sampling_interval_title">Интервал выборки</string>
<string name="settings_announcements_lap_power">Мощность на круге</string>
<string name="create_marker_error">Невозможно создать маркер. Попробуйте ещё раз.</string>
<string name="settings_theme_switch_restart">При изменении темы может потребоваться ручной перезапуск.</string>
<string name="power">Мощность</string>
<string name="voiceDistance">{n, plural, =1 {1 } few {{n,number,#.0}} other {{n,number,#.0}} }</string>
</resources>
+8 -1
View File
@@ -33,7 +33,7 @@
<string name="unit_mile_per_hour">எம்.பி.எச்</string>
<string name="unit_nautical_mile">என்.எம்</string>
<string name="unit_knots">kn</string>
<string name="unit_minute_per_kilometer">எனது/கி.மீ.</string>
<string name="unit_minute_per_kilometer">நிமையம்/கி.மீ</string>
<string name="unit_minute_per_mile">min/mi</string>
<string name="value_integer_feet_excellent_gps">%1$d அடி (சிறந்த சி.பி.எச்)</string>
<string name="value_float_kilometer_hour_recommended">%1 $ .1f கிமீ/மணி (பரிந்துரைக்கப்படுகிறது)</string>
@@ -535,4 +535,11 @@
<string name="activity_type_ice_sailing">பனி படகோட்டம்</string>
<string name="activity_type_inline_skating">இன்லைன் ச்கேட்டிங்</string>
<string name="activity_type_kayaking">கயாக்கிங்</string>
<string name="settings_recording_show_gps_disabled_warning_title">சி.பி.எச் முடக்கப்பட்ட முன்னறிவிப்பு</string>
<string name="settings_recording_show_gps_disabled_warning_summary">பதிவு செய்யும் போது, சி.பி.எச் முடக்கப்பட்டிருந்தால் ஒரு எச்சரிக்கையைக் காட்டுங்கள்.</string>
<string name="empty">காலி</string>
<string name="settings_charts_title">விளக்கப்படங்கள்</string>
<string name="settings_chart_display_elevation_title">றிந்த உயரத்தைக் காண்பி</string>
<string name="settings_chart_display_pace_or_speed_title">விரைவு அல்லது வேகத்தைக் காண்பி</string>
<string name="settings_chart_display_heart_rate_title">இதய துடிப்பைக் காண்பி</string>
</resources>
+1 -1
View File
@@ -27,7 +27,7 @@
</style>
<style name="SplashTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_logo_color_splashscreen</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_logo_color_108dp</item>
<item name="postSplashScreenTheme">@style/OpenTracksTheme</item>
</style>
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_logo_24dp" />
android:drawable="@drawable/ic_logo_108dp" />