Compare commits

..

31 Commits

Author SHA1 Message Date
Mihail Mitrofanov
d8ddf5a0ae [android]: Backup geo tags and tracks to local folder
This commit adds backup of user data to a local folder on the device.

Features:
* Turn on/off regular backup
* Choose new or existing folder for saving backup
* Set how often backup runs
* Set how many backups to keep
* Create backup manually

Signed-off-by: Mihail Mitrofanov <mk.mitrofanov@outlook.com>
2025-06-27 23:55:49 +07:00
Harry Bond
1e32df193d [Android] fix speed limit indicator activating when driving exactly at speed limit
the displayed speed is rounded, but the speedLimitExceeded check isn't, resulting in what appears to be incorrect activations. Fixed by rounding in speedLimitExceeded also.
fixes #544

Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 23:54:30 +07:00
Eivind Samseth
fca61732b7 [styles] Regenerate
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:52:16 +07:00
Eivind Samseth
8053d2f4a5 [styles] Remove path designated bicycle on level z14 as requested by review
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:39 +07:00
Eivind Samseth
7bfe507e57 [styles] Regenerate
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:35 +07:00
Eivind Samseth
1e06e46344 [styles] Render paths and track at same level as footway and cycleway
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:02 +07:00
Yannik Bloscheck
f7f73f04b1 [styles] Regenerated files for made pedestrian areas slightly more distinct
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 18:44:09 +02:00
Yannik Bloscheck
eee299f6cd [styles] Made pedestrian areas slightly more distinct
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 18:44:09 +02:00
Codeberg Translate
5b43e4ec9b [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: ZeljkoBG <zeljkobg@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: canadagoose <canadagoose@noreply.codeberg.org>
Co-authored-by: openfab <openfab@noreply.codeberg.org>
Co-authored-by: oster5 <oster5@noreply.codeberg.org>
Co-authored-by: oxisol <oxisol@noreply.codeberg.org>
Co-authored-by: projjalm <projjalm@noreply.codeberg.org>
Co-authored-by: sunsand <sunsand@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/ca/
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/sv/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ast/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/az/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/be/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/bg/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/cs/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/es/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fi/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hi/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hu/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ia/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ko/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/mr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ru/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sq/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sw/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/th/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/uk/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/eu/
Translate-URL: https://translate.codeberg.org/projects/comaps/google-play-descriptions/de/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/ca/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/sv/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ast/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/az/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/be/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/bg/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/cs/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/eu/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hi/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hu/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ia/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ko/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/mr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ru/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sq/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sw/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/th/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/tr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/uk/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/Google Play and Huawei AppGallery descriptions
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-06-27 14:43:21 +00:00
Yannik Bloscheck
733c0ae8a8 [strings] Removed unsupported App Store languages
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
30ee5c30e1 [strings] Added App Store keywords field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
d562f23256 [strings] Added copyright symbol to App Store copyright field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
ecb44b5ae9 [strings] Removed unused App Store fields
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
c49cf48575 [strings] Adjusted German App Store subtitle
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
4581907f00 [strings] Put App Store subtitles in actual subtitle field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
vipo
423d45a1bb Adding to CONTRIBUTORS 2025-06-27 10:41:23 +02:00
vipo
4d8e7c39fd [styles] Changed train station icons to look the same like normal train icons 2025-06-27 10:40:26 +02:00
Jean-Baptiste
273eeed9f3 [android] Migrate download item layouts to Material Components
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 08:08:43 +02:00
Jean-Baptiste
754748123c [android] Use Material components in settings layout
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 08:06:42 +02:00
Yannik Bloscheck
b58bacddf1 [ios] Matched translations
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Yannik Bloscheck
a985bf8349 [ios] Fixed issues with Panoramax button not working as intented
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
b4f115a8fa [desktop] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Harry Bond <me@hbond.xyz>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
df89761eba [iOS] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
25e49b0fe1 [android] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
6a10cffe51 [generator] Add support of Panoramax tag
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Harry Bond <me@hbond.xyz>
2025-06-27 05:19:47 +02:00
Konstantin Pastbin
495167c11f [strings] Fix sights category search for ES
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-06-27 05:17:41 +02:00
Yannik Bloscheck
d44d671550 [ios] Ending search when a route starts
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:13:40 +02:00
Harry Bond
d44d575368 [android] remove help button from settings menu
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Harry Bond
fbddff009e [android] Rename "Help" ("About CoMaps") to "About & Help"
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Harry Bond
58bab61890 [android] Hide currently active left button action from hamburger menu
fixes #549
And add "About CoMaps" option in burger menu when using custom buttons
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Yannik Bloscheck
464b3cf59a [ios] Making sure the whole location button is visible during routing
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-26 15:48:26 +02:00
239 changed files with 2946 additions and 1268 deletions

View File

@@ -8,6 +8,8 @@ CoMaps contributors:
--------------------------------------------------------------------------------
clover sage
Harry Bond <me@hbond.xyz>
vikiawv
--------------------------------------------------------------------------------
Organic Maps (formerly OMaps) contributors:

View File

@@ -1 +1 @@
CoMaps - Navigation mit Datenschutz
CoMaps - Navi mit Datenschutz

View File

@@ -44,6 +44,7 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.ViewModelProvider;
import app.organicmaps.api.Const;
import app.organicmaps.backup.PeriodicBackupRunner;
import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.base.OnBackPressListener;
import app.organicmaps.bookmarks.BookmarkCategoriesActivity;
@@ -139,6 +140,7 @@ import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
import static app.organicmaps.util.concurrency.UiThread.runLater;
public class MwmActivity extends BaseMwmFragmentActivity
implements PlacePageActivationListener,
@@ -253,6 +255,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
@NonNull
private DisplayManager mDisplayManager;
private PeriodicBackupRunner backupRunner;
ManageRouteBottomSheet mManageRouteBottomSheet;
private boolean mRemoveDisplayListener = true;
@@ -607,6 +611,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
*/
if (Map.isEngineCreated())
onRenderingInitializationFinished();
backupRunner = new PeriodicBackupRunner(this);
}
private void onSettingsResult(ActivityResult activityResult)
@@ -838,7 +844,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public String getPrefsName()
{
return getString(R.string.help);
return getString(R.string.about_help);
}
@Override
@@ -1352,6 +1358,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
final String backUrl = Framework.nativeGetParsedBackUrl();
if (!TextUtils.isEmpty(backUrl))
Utils.openUri(this, Uri.parse(backUrl), null);
if (backupRunner != null && !backupRunner.isAlreadyChecked() && backupRunner.isTimeToBackup())
{
backupRunner.doBackup();
}
}
@CallSuper
@@ -2584,20 +2595,28 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
if (id.equals(MAIN_MENU_ID))
{
final String activeLeftButton = buttonsHolder.getActiveButtonCode();
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
items.add(new MenuBottomSheetItem(
R.string.download_maps,
R.drawable.ic_download,
getDownloadMapsCounter(),
this::onDownloadMapsOptionSelected
));
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
if (!TextUtils.isEmpty(mDonatesUrl))
if (!BUTTON_ADD_PLACE_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(), this::onDownloadMapsOptionSelected));
if (!Config.getDonateUrl(getApplicationContext()).isEmpty())
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1, this::onTrackRecordingOptionSelected));
if (!BUTTON_SETTINGS_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
if (!BUTTON_RECORD_TRACK_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1, this::onTrackRecordingOptionSelected));
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_question_mark, this::showHelp));
return items;
}
return null;

View File

@@ -0,0 +1,114 @@
package app.organicmaps.backup;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_DEFAULT_COUNT;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_KEY;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.AbsoluteSizeSpan;
import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.log.Logger;
public class BackupUtils
{
private static final String BACKUP_PREFIX = "backup_";
private static final String BACKUP_EXTENSION = ".kmz";
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss").withLocale(Locale.US);
private static final String TAG = BackupUtils.class.getSimpleName();
public static CharSequence formatReadableFolderPath(Context context, @NonNull Uri uri)
{
String docId = DocumentsContract.getTreeDocumentId(uri);
String volumeId;
String subPath = "";
int colonIndex = docId.indexOf(':');
if (colonIndex >= 0)
{
volumeId = docId.substring(0, colonIndex);
subPath = docId.substring(colonIndex + 1);
}
else
{
volumeId = docId;
}
String volumeName;
if ("primary".equalsIgnoreCase(volumeId))
volumeName = context.getString(R.string.maps_storage_shared);
else
volumeName = context.getString(R.string.maps_storage_removable);
SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}
public static int getMaxBackups(SharedPreferences prefs)
{
String rawValue = prefs.getString(MAX_BACKUPS_KEY, String.valueOf(MAX_BACKUPS_DEFAULT_COUNT));
try
{
return Integer.parseInt(rawValue);
} catch (NumberFormatException e)
{
Logger.e(TAG, "Failed to parse max backups count, raw value: " + rawValue + " set to default: " + MAX_BACKUPS_DEFAULT_COUNT, e);
prefs.edit()
.putString(MAX_BACKUPS_KEY, String.valueOf(MAX_BACKUPS_DEFAULT_COUNT))
.apply();
return MAX_BACKUPS_DEFAULT_COUNT;
}
}
public static DocumentFile createUniqueBackupFolder(@NonNull DocumentFile parentDir, LocalDateTime backupTime)
{
String folderName = BACKUP_PREFIX + backupTime.format(DATE_FORMATTER);
return parentDir.createDirectory(folderName);
}
public static String getBackupName(LocalDateTime backupTime)
{
String formattedBackupTime = backupTime.format(DATE_FORMATTER);
return BACKUP_PREFIX + formattedBackupTime + BACKUP_EXTENSION;
}
public static DocumentFile[] getBackupFolders(DocumentFile parentDir)
{
List<DocumentFile> backupFolders = new ArrayList<>();
for (DocumentFile file : parentDir.listFiles())
{
if (file.isDirectory() && file.getName() != null && file.getName().startsWith(BACKUP_PREFIX))
backupFolders.add(file);
}
return backupFolders.toArray(new DocumentFile[0]);
}
public static boolean isBackupFolderAvailable(Context context, String storedFolderPath)
{
return !TextUtils.isEmpty(storedFolderPath) && isFolderWritable(context, storedFolderPath);
}
}

View File

@@ -0,0 +1,189 @@
package app.organicmaps.backup;
import static app.organicmaps.backup.BackupUtils.getBackupName;
import static app.organicmaps.backup.BackupUtils.getBackupFolders;
import static app.organicmaps.util.StorageUtils.copyFileToDocumentFile;
import static app.organicmaps.util.StorageUtils.deleteDirectoryRecursive;
import android.app.Activity;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import app.organicmaps.bookmarks.data.BookmarkCategory;
import app.organicmaps.bookmarks.data.BookmarkManager;
import app.organicmaps.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.bookmarks.data.KmlFileType;
import app.organicmaps.util.concurrency.ThreadPool;
import app.organicmaps.util.concurrency.UiThread;
import app.organicmaps.util.log.Logger;
public class LocalBackupManager implements BookmarkManager.BookmarksSharingListener
{
public static final String TAG = LocalBackupManager.class.getSimpleName();
private final Activity activity;
private final String backupFolderPath;
private final int maxBackups;
private Listener listener;
public LocalBackupManager(@NonNull Activity activity, @NonNull String backupFolderPath, int maxBackups)
{
this.activity = activity;
this.backupFolderPath = backupFolderPath;
this.maxBackups = maxBackups;
}
public void doBackup()
{
BookmarkManager.INSTANCE.addSharingListener(this);
prepareBookmarkCategoriesForSharing();
if (listener != null)
listener.onBackupStarted();
}
public void setListener(@NonNull Listener listener)
{
this.listener = listener;
}
@Override
public void onPreparedFileForSharing(@NonNull BookmarkSharingResult result)
{
BookmarkManager.INSTANCE.removeSharingListener(this);
ThreadPool.getWorker().execute(() -> {
ErrorCode errorCode = null;
switch (result.getCode())
{
case BookmarkSharingResult.SUCCESS ->
{
if (!saveBackup(result))
{
Logger.e(TAG, "Failed to save backup. See system log above");
errorCode = ErrorCode.FILE_ERROR;
}
else
{
Logger.i(TAG, "Backup was created and saved successfully");
}
}
case BookmarkSharingResult.EMPTY_CATEGORY ->
{
errorCode = ErrorCode.EMPTY_CATEGORY;
Logger.e(TAG, "Failed to create backup. Category is empty");
}
case BookmarkSharingResult.ARCHIVE_ERROR ->
{
errorCode = ErrorCode.ARCHIVE_ERROR;
Logger.e(TAG, "Failed to create archive of bookmarks");
}
case BookmarkSharingResult.FILE_ERROR ->
{
errorCode = ErrorCode.FILE_ERROR;
Logger.e(TAG, "Failed create file for archive");
}
default ->
{
errorCode = ErrorCode.UNSUPPORTED;
Logger.e(TAG, "Failed to create backup. Unknown error");
}
}
ErrorCode finalErrorCode = errorCode;
UiThread.run(() -> {
if (listener != null)
{
if (finalErrorCode == null)
listener.onBackupFinished();
else
listener.onBackupFailed(finalErrorCode);
}
});
});
}
private boolean saveBackup(@NonNull BookmarkSharingResult result)
{
boolean isSuccess = false;
Uri folderUri = Uri.parse(backupFolderPath);
try
{
DocumentFile parentFolder = DocumentFile.fromTreeUri(activity, folderUri);
if (parentFolder != null && parentFolder.canWrite())
{
LocalDateTime now = LocalDateTime.now();
DocumentFile backupFolder = BackupUtils.createUniqueBackupFolder(parentFolder, now);
if (backupFolder != null)
{
String backupName = getBackupName(now);
DocumentFile backupFile = backupFolder.createFile(result.getMimeType(), backupName);
if (backupFile != null && copyFileToDocumentFile(activity, new File(result.getSharingPath()), backupFile))
{
Logger.i(TAG, "Backup saved to " + backupFile.getUri());
isSuccess = true;
}
}
else
{
Logger.e(TAG, "Failed to create backup folder");
}
}
cleanOldBackups(parentFolder);
} catch (Exception e)
{
Logger.e(TAG, "Failed to save backup", e);
}
return isSuccess;
}
public void cleanOldBackups(DocumentFile parentDir)
{
DocumentFile[] backupFolders = getBackupFolders(parentDir);
if (backupFolders.length > maxBackups)
{
Arrays.sort(backupFolders, Comparator.comparing(DocumentFile::getName));
for (int i = 0; i < backupFolders.length - maxBackups; i++)
{
Logger.i(TAG, "Delete old backup " + backupFolders[i].getUri());
deleteDirectoryRecursive(backupFolders[i]);
}
}
}
private void prepareBookmarkCategoriesForSharing()
{
List<BookmarkCategory> categories = BookmarkManager.INSTANCE.getCategories();
long[] categoryIds = new long[categories.size()];
for (int i = 0; i < categories.size(); i++)
categoryIds[i] = categories.get(i).getId();
BookmarkManager.INSTANCE.prepareCategoriesForSharing(categoryIds, KmlFileType.Text);
}
public interface Listener
{
void onBackupStarted();
void onBackupFinished();
void onBackupFailed(ErrorCode errorCode);
}
public enum ErrorCode
{
EMPTY_CATEGORY,
ARCHIVE_ERROR,
FILE_ERROR,
UNSUPPORTED,
}
}

View File

@@ -0,0 +1,104 @@
package app.organicmaps.backup;
import static app.organicmaps.backup.BackupUtils.getMaxBackups;
import static app.organicmaps.backup.BackupUtils.isBackupFolderAvailable;
import static app.organicmaps.settings.BackupSettingsFragment.BACKUP_FOLDER_PATH_KEY;
import static app.organicmaps.settings.BackupSettingsFragment.BACKUP_INTERVAL_KEY;
import static app.organicmaps.settings.BackupSettingsFragment.LAST_BACKUP_TIME_KEY;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import app.organicmaps.util.log.Logger;
public class PeriodicBackupRunner
{
private final Activity activity;
private static final String TAG = PeriodicBackupRunner.class.getSimpleName();
private final SharedPreferences prefs;
private boolean alreadyChecked = false;
public PeriodicBackupRunner(Activity activity)
{
this.activity = activity;
this.prefs = PreferenceManager.getDefaultSharedPreferences(activity);
}
public boolean isAlreadyChecked()
{
return alreadyChecked;
}
public boolean isTimeToBackup()
{
long intervalMs = getBackupIntervalMs();
if (intervalMs <= 0)
return false;
long lastBackupTime = prefs.getLong(LAST_BACKUP_TIME_KEY, 0);
long now = System.currentTimeMillis();
alreadyChecked = true;
return (now - lastBackupTime) >= intervalMs;
}
public void doBackup()
{
String storedFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (isBackupFolderAvailable(activity, storedFolderPath))
{
Logger.i(TAG, "Performing periodic backup");
performBackup(storedFolderPath, getMaxBackups(prefs));
}
else
{
Logger.w(TAG, "Backup folder is not writable, passed path: " + storedFolderPath);
}
}
private long getBackupIntervalMs()
{
String defaultValue = "0";
try
{
return Long.parseLong(prefs.getString(BACKUP_INTERVAL_KEY, defaultValue));
} catch (NumberFormatException e)
{
return 0;
}
}
private void performBackup(String backupFolderPath, int maxBackups)
{
LocalBackupManager backupManager = new LocalBackupManager(activity, backupFolderPath, maxBackups);
backupManager.setListener(new LocalBackupManager.Listener()
{
@Override
public void onBackupStarted()
{
Logger.i(TAG, "Periodic backup started");
}
@Override
public void onBackupFinished()
{
prefs.edit().putLong(LAST_BACKUP_TIME_KEY, System.currentTimeMillis()).apply();
Logger.i(TAG, "Periodic backup finished");
}
@Override
public void onBackupFailed(LocalBackupManager.ErrorCode errorCode)
{
Logger.e(TAG, "Periodic backup was failed with code: " + errorCode);
}
});
backupManager.doBackup();
}
}

View File

@@ -69,7 +69,8 @@ public class Metadata implements Parcelable
FMD_OUTDOOR_SEATING(48),
FMD_NETWORK(49),
FMD_CONTACT_FEDIVERSE(50),
FMD_CONTACT_BLUESKY(51);
FMD_CONTACT_BLUESKY(51),
FMD_PANORAMAX(52);
private final int mMetaType;
MetadataType(int metadataType)

View File

@@ -41,7 +41,7 @@ public class HelpScreen extends BaseMapScreen
{
final Header.Builder builder = new Header.Builder();
builder.setStartHeaderAction(Action.BACK);
builder.setTitle(getCarContext().getString(R.string.help));
builder.setTitle(getCarContext().getString(R.string.about_help));
return builder.build();
}

View File

@@ -109,7 +109,7 @@ public class SettingsScreen extends BaseMapScreen
private Item createHelpItem()
{
final Row.Builder builder = new Row.Builder();
builder.setTitle(getCarContext().getString(R.string.help));
builder.setTitle(getCarContext().getString(R.string.about_help));
builder.setOnClickListener(() -> getScreenManager().push(new HelpScreen(getCarContext(), getSurfaceRenderer())));
builder.setBrowsable(true);
return builder.build();

View File

@@ -11,7 +11,6 @@ import android.text.style.StyleSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
@@ -28,6 +27,7 @@ import app.organicmaps.util.UiUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Collection;
@@ -362,10 +362,10 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
private class ItemViewHolder extends BaseInnerViewHolder<CountryItem>
{
private final DownloaderStatusIcon mStatusIcon;
private final TextView mName;
private final TextView mSubtitle;
private final TextView mFoundName;
private final TextView mSize;
private final MaterialTextView mName;
private final MaterialTextView mSubtitle;
private final MaterialTextView mFoundName;
private final MaterialTextView mSize;
private void processClick(boolean clickOnStatus)
{
@@ -510,7 +510,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
static class HeaderViewHolder extends BaseInnerViewHolder<String>
{
@NonNull
private final TextView mTitle;
private final MaterialTextView mTitle;
HeaderViewHolder(@NonNull View frame)
{

View File

@@ -2,11 +2,12 @@ package app.organicmaps.downloader;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.AttrRes;
import androidx.annotation.DrawableRes;
import com.google.android.material.imageview.ShapeableImageView;
import app.organicmaps.R;
import app.organicmaps.widget.WheelProgressView;
import app.organicmaps.util.ThemeUtils;
@@ -15,7 +16,7 @@ import app.organicmaps.util.UiUtils;
public class DownloaderStatusIcon
{
private final View mFrame;
protected final ImageView mIcon;
protected final ShapeableImageView mIcon;
private final WheelProgressView mProgress;
private static final SparseIntArray sIconsCache = new SparseIntArray();

View File

@@ -43,7 +43,7 @@ public class CopyrightFragment extends BaseMwmFragment
{
if (!mDelegate.onBackPressed())
{
((HelpActivity) requireActivity()).stackFragment(HelpFragment.class, getString(R.string.help), null);
((HelpActivity) requireActivity()).stackFragment(HelpFragment.class, getString(R.string.about_help), null);
}
return true;

View File

@@ -43,15 +43,21 @@ public class LeftButtonsHolder
}
@Nullable
public LeftButton getActiveButton()
public String getActiveButtonCode()
{
String activeButtonCode = prefs.getString(leftButtonPreferenceKey, DEFAULT_BUTTON_CODE);
if (!TextUtils.isEmpty(activeButtonCode))
return availableButtons.get(activeButtonCode);
return activeButtonCode;
else
return null;
}
@Nullable
public LeftButton getActiveButton()
{
return availableButtons.get(getActiveButtonCode());
}
public Collection<LeftButton> getAllButtons()
{
return availableButtons.values();

View File

@@ -213,7 +213,7 @@ public class MapButtonsController extends Fragment
)
{
leftButtonView.setImageResource(R.drawable.ic_christmas_tree);
leftButtonView.setContentDescription(getString(R.string.help));
leftButtonView.setContentDescription(getString(R.string.about_help));
leftButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
}
else

View File

@@ -266,7 +266,8 @@ public class NavigationController implements TrafficManager.TrafficCallback,
mSpeedLimit.setSpeedLimit(0, false);
return;
}
final boolean speedLimitExceeded = info.speedLimitMps < location.getSpeed();
mSpeedLimit.setSpeedLimit(StringUtils.nativeFormatSpeed(info.speedLimitMps), speedLimitExceeded);
final int fSpeedLimit = StringUtils.nativeFormatSpeed(info.speedLimitMps);
final boolean speedLimitExceeded = fSpeedLimit < StringUtils.nativeFormatSpeed(location.getSpeed());
mSpeedLimit.setSpeedLimit(fSpeedLimit, speedLimitExceeded);
}
}

View File

@@ -0,0 +1,384 @@
package app.organicmaps.settings;
import static app.organicmaps.backup.BackupUtils.formatReadableFolderPath;
import static app.organicmaps.backup.BackupUtils.getMaxBackups;
import static app.organicmaps.backup.BackupUtils.isBackupFolderAvailable;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.text.DateFormat;
import app.organicmaps.R;
import app.organicmaps.backup.LocalBackupManager;
import app.organicmaps.util.log.Logger;
public class BackupSettingsFragment
extends BaseXmlSettingsFragment
{
private ActivityResultLauncher<Intent> folderPickerLauncher;
private static final String TAG = LocalBackupManager.class.getSimpleName();
public static final String BACKUP_FOLDER_PATH_KEY = "backup_location";
public static final String LAST_BACKUP_TIME_KEY = "last_backup_time";
private static final String BACKUP_NOW_KEY = "backup_now";
public static final String BACKUP_INTERVAL_KEY = "backup_history_interval";
public static final String MAX_BACKUPS_KEY = "backup_history_count";
public static final int MAX_BACKUPS_DEFAULT_COUNT = 10;
public static final String DEFAULT_BACKUP_INTERVAL = "86400000"; // 24 hours in ms
private LocalBackupManager mBackupManager;
private SharedPreferences prefs;
@Override
protected int getXmlResources()
{
return R.xml.prefs_backup;
}
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference backupLocationOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
ListPreference backupIntervalOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference maxBackupsOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference backupNowOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference advancedCategory;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
folderPickerLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
boolean isSuccess = false;
String lastFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (result.getResultCode() == Activity.RESULT_OK)
{
Intent data = result.getData();
Logger.i(TAG, "Folder selection result: " + data);
if (data == null)
return;
Uri uri = data.getData();
if (uri != null)
{
takePersistableUriPermission(uri);
Logger.i(TAG, "Backup location changed to " + uri);
prefs.edit().putString(BACKUP_FOLDER_PATH_KEY, uri.toString()).apply();
setFormattedBackupPath(uri);
runBackup();
isSuccess = true;
}
else
{
Logger.w(TAG, "Folder selection result is null");
}
}
else if (result.getResultCode() == Activity.RESULT_CANCELED)
{
Logger.w(TAG, "User canceled folder selection");
if (TextUtils.isEmpty(lastFolderPath))
{
prefs.edit().putString(BACKUP_FOLDER_PATH_KEY, null).apply();
Logger.i(TAG, "Backup settings reset");
initBackupLocationOption();
}
else if (isFolderWritable(requireActivity(), lastFolderPath))
{
Logger.i(TAG, "Backup location not changed, using previous value " + lastFolderPath);
isSuccess = true;
}
else
{
Logger.e(TAG, "Backup location not changed, but last folder is not writable: " + lastFolderPath);
}
}
resetLastBackupTime();
updateStatusSummaryOption();
Logger.i(TAG, "Folder selection result: " + isSuccess);
applyAdvancedSettings(isSuccess);
}
);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{
super.onCreatePreferences(savedInstanceState, rootKey);
prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
backupLocationOption = findPreference(BACKUP_FOLDER_PATH_KEY);
backupIntervalOption = findPreference(BACKUP_INTERVAL_KEY);
maxBackupsOption = findPreference(MAX_BACKUPS_KEY);
backupNowOption = findPreference(BACKUP_NOW_KEY);
initBackupLocationOption();
initBackupIntervalOption();
initMaxBackupsOption();
initBackupNowOption();
}
private void initBackupLocationOption()
{
String storedFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
boolean isEnabled = false;
if (!TextUtils.isEmpty(storedFolderPath))
{
if (isFolderWritable(requireContext(), storedFolderPath))
{
setFormattedBackupPath(Uri.parse(storedFolderPath));
isEnabled = true;
}
else
{
Logger.e(TAG, "Backup location is not available, path: " + storedFolderPath);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_missing_folder));
backupLocationOption.setSummary(requireContext().getString(R.string.pref_backup_now_summary_folder_unavailable));
}
}
else
{
backupLocationOption.setSummary(requireContext().getString(R.string.pref_backup_location_summary_initial));
}
applyAdvancedSettings(isEnabled);
backupLocationOption.setOnPreferenceClickListener(preference -> {
launchFolderPicker();
return true;
});
}
private void setFormattedBackupPath(@NonNull Uri uri)
{
backupLocationOption.setSummary(formatReadableFolderPath(requireContext(), uri));
}
private void initBackupIntervalOption()
{
String backupInterval = prefs.getString(BACKUP_INTERVAL_KEY, DEFAULT_BACKUP_INTERVAL);
CharSequence entry = getEntryForValue(backupIntervalOption, backupInterval);
if (entry != null)
backupIntervalOption.setSummary(entry);
backupIntervalOption.setOnPreferenceChangeListener((preference, newValue) -> {
CharSequence newEntry = getEntryForValue(backupIntervalOption, newValue.toString());
Logger.i(TAG, "auto backup interval changed to " + newEntry);
if (newEntry != null)
backupIntervalOption.setSummary(newEntry);
return true;
});
}
private void initMaxBackupsOption()
{
maxBackupsOption.setSummary(String.valueOf(getMaxBackups(prefs)));
maxBackupsOption.setOnPreferenceChangeListener((preference, newValue) -> {
maxBackupsOption.setSummary(newValue.toString());
return true;
});
}
private void initBackupNowOption()
{
updateStatusSummaryOption();
backupNowOption.setOnPreferenceClickListener(preference -> {
runBackup();
return true;
});
}
private void updateStatusSummaryOption()
{
long lastBackupTime = prefs.getLong(LAST_BACKUP_TIME_KEY, 0L);
String summary;
if (lastBackupTime > 0)
{
String time = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(lastBackupTime);
summary = requireContext().getString(R.string.pref_backup_status_summary_success) + ": " + time;
}
else
{
summary = requireContext().getString(R.string.pref_backup_now_summary);
}
backupNowOption.setSummary(summary);
}
private void resetLastBackupTime()
{
prefs.edit().remove(LAST_BACKUP_TIME_KEY).apply();
}
private void applyAdvancedSettings(boolean isBackupEnabled)
{
backupIntervalOption.setVisible(isBackupEnabled);
maxBackupsOption.setVisible(isBackupEnabled);
backupNowOption.setVisible(isBackupEnabled);
}
private void runBackup()
{
String currentFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (!TextUtils.isEmpty(currentFolderPath))
{
if (isFolderWritable(requireContext(), currentFolderPath))
{
mBackupManager = new LocalBackupManager(requireActivity(), currentFolderPath, getMaxBackups(prefs));
mBackupManager.setListener(new LocalBackupManager.Listener()
{
@Override
public void onBackupStarted()
{
Logger.i(TAG, "Manual backup started");
backupNowOption.setEnabled(false);
backupNowOption.setSummary(R.string.pref_backup_now_summary_progress);
}
@Override
public void onBackupFinished()
{
Logger.i(TAG, "Manual backup successful");
backupNowOption.setEnabled(true);
backupNowOption.setSummary(R.string.pref_backup_now_summary_ok);
prefs.edit().putLong(LAST_BACKUP_TIME_KEY, System.currentTimeMillis()).apply();
}
@Override
public void onBackupFailed(LocalBackupManager.ErrorCode errorCode)
{
String errorMessage = switch (errorCode)
{
case EMPTY_CATEGORY -> requireContext().getString(R.string.pref_backup_now_summary_empty_lists);
default -> requireContext().getString(R.string.pref_backup_now_summary_failed);
};
Logger.e(TAG, "Manual backup was failed with code: " + errorCode);
backupNowOption.setEnabled(true);
backupNowOption.setSummary(errorMessage);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_with_logs));
}
});
mBackupManager.doBackup();
}
else
{
backupNowOption.setSummary(R.string.pref_backup_now_summary_folder_unavailable);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_missing_folder));
Logger.e(TAG, "Manual backup error: folder " + currentFolderPath + " unavailable");
}
}
else
{
backupNowOption.setSummary(R.string.pref_backup_now_summary_folder_unavailable);
Logger.e(TAG, "Manual backup error: no folder selected");
}
}
private void launchFolderPicker()
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
PackageManager packageManager = requireActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null)
folderPickerLauncher.launch(intent);
else
showNoFileManagerError();
}
private void showNoFileManagerError()
{
new MaterialAlertDialogBuilder(requireActivity())
.setMessage(R.string.error_no_file_manager_app)
.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
}
private void showBackupErrorAlertDialog(String message)
{
requireActivity().runOnUiThread(() -> {
new MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.pref_backup_now_summary_failed)
.setMessage(message)
.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
});
}
private void takePersistableUriPermission(Uri uri)
{
requireContext().getContentResolver().takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);
}
@Nullable
public static CharSequence getEntryForValue(@NonNull ListPreference listPref, @NonNull CharSequence value)
{
CharSequence[] entryValues = listPref.getEntryValues();
CharSequence[] entries = listPref.getEntries();
if (entryValues == null || entries == null)
return null;
for (int i = 0; i < entryValues.length; i++)
{
if (entryValues[i].equals(value))
return entries[i];
}
return null;
}
}

View File

@@ -184,15 +184,15 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
{
getSettingsActivity().stackFragment(VoiceInstructionsSettingsFragment.class, getString(R.string.pref_tts_enable_title), null);
}
else if (key.equals(getString(R.string.pref_help)))
{
startActivity(new Intent(requireActivity(), HelpActivity.class));
}
else if (key.equals(getString(R.string.pref_map_locale)))
{
LanguagesFragment langFragment = (LanguagesFragment)getSettingsActivity().stackFragment(LanguagesFragment.class, getString(R.string.change_map_locale), null);
langFragment.setListener(this);
}
else if (key.equals(getString(R.string.pref_backup)))
{
getSettingsActivity().stackFragment(BackupSettingsFragment.class, getString(R.string.pref_backup_title), null);
}
}
return super.onPreferenceTreeClick(preference);
}

View File

@@ -1,5 +1,6 @@
package app.organicmaps.util;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -10,10 +11,13 @@ import android.provider.DocumentsContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import androidx.documentfile.provider.DocumentFile;
import app.organicmaps.BuildConfig;
import app.organicmaps.util.log.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
@@ -323,4 +327,76 @@ public class StorageUtils
}
}
}
public static boolean copyFileToDocumentFile(
@NonNull Activity activity,
@NonNull File sourceFile,
@NonNull DocumentFile targetFile
)
{
try (
InputStream in = new FileInputStream(sourceFile);
OutputStream out = activity.getContentResolver().openOutputStream(targetFile.getUri())
)
{
if (out == null)
{
Logger.e(TAG, "Failed to open output stream for " + targetFile.getUri());
return false;
}
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) > 0)
out.write(buffer, 0, length);
out.flush();
return true;
} catch (IOException e)
{
Logger.e(TAG, "Failed to copy file from " + sourceFile.getAbsolutePath() + " to " + targetFile.getUri(), e);
return false;
}
}
public static void deleteDirectoryRecursive(@NonNull DocumentFile dir)
{
try
{
for (DocumentFile file : dir.listFiles())
{
if (file.isDirectory())
deleteDirectoryRecursive(file);
else
file.delete();
}
dir.delete();
} catch (Exception e)
{
Logger.e(TAG, "Failed to delete directory: " + dir.getUri(), e);
}
}
public static boolean isFolderWritable(Context context, String folderPath)
{
try
{
Uri folderUri = Uri.parse(folderPath);
DocumentFile folder = DocumentFile.fromTreeUri(context, folderUri);
if (folder != null && folder.canWrite())
{
DocumentFile tempFile = folder.createFile("application/octet-stream", "temp_file");
if (tempFile != null)
{
tempFile.delete();
return true;
}
}
} catch (Exception e)
{
Logger.e(TAG, "Failed to check if folder is writable: " + folderPath, e);
}
return false;
}
}

View File

@@ -56,6 +56,9 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
private View mWikimedia;
private TextView mTvWikimedia;
private View mPanoramax;
private TextView mTvPanoramax;
private PlacePageViewModel mViewModel;
private MapObject mMapObject;
@@ -163,6 +166,11 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
mTvLinePage = mFrame.findViewById(R.id.tv__place_line_page);
mLinePage.setOnClickListener((v) -> openUrl(Metadata.MetadataType.FMD_CONTACT_LINE));
mLinePage.setOnLongClickListener((v) -> copyUrl(mLinePage, Metadata.MetadataType.FMD_CONTACT_LINE));
mPanoramax = mFrame.findViewById(R.id.ll__place_panoramax);
mTvPanoramax = mFrame.findViewById(R.id.tv__place_panoramax);
mPanoramax.setOnClickListener((v) -> openUrl(Metadata.MetadataType.FMD_PANORAMAX));
mTvPanoramax.setOnLongClickListener((v) -> copyUrl(mPanoramax, Metadata.MetadataType.FMD_PANORAMAX));
}
private void openUrl(Metadata.MetadataType type)
@@ -226,6 +234,9 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
final String line = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_LINE);
refreshMetadataOrHide(line, mLinePage, mTvLinePage);
final String panoramax = mMapObject.getMetadata(Metadata.MetadataType.FMD_PANORAMAX);
refreshMetadataOrHide(panoramax, mPanoramax, mTvPanoramax);
}
@Override

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@
<include
layout="@layout/toolbar_extended"/>
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/settings_width"
android:layout_height="match_parent"
android:layout_marginTop="?actionBarSize"
@@ -18,6 +18,6 @@
style="@style/MwmWidget.FrameLayout.Elevation"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
</FrameLayout>

View File

@@ -18,7 +18,7 @@
android:layout_marginEnd="@dimen/margin_base"
android:layout_centerVertical="true"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -37,7 +37,7 @@
android:layout_centerVertical="true"
android:layout_toEndOf="@id/downloader_status_frame"
android:layout_toStartOf="@id/size">
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/found_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -46,7 +46,7 @@
tools:text="Крымск"
tools:background="#60FF00FF"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -54,7 +54,7 @@
tools:text="Донецкая область"
tools:background="#40FF0000"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:background="#400000FF">
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -15,7 +15,7 @@
wheel:wheelSecondaryColor="?dividerHorizontal"
wheel:wheelThickness="@dimen/margin_eighth"/>
<ImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/downloader_status"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -21,4 +21,5 @@
<include layout="@layout/place_page_line" />
<include layout="@layout/place_page_bluesky" />
<include layout="@layout/place_page_wikimedia" />
<include layout="@layout/place_page_panoramax" />
</LinearLayout>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll__place_panoramax"
style="@style/PlacePageItemFrame"
android:tag="website"
tools:background="#20FF0000"
tools:visibility="visible">
<ImageView
android:id="@+id/iv__place_panoramax"
style="@style/PlacePageMetadataIcon"
app:srcCompat="@drawable/ic_panoramax"
app:tint="?colorAccent"/>
<TextView
android:id="@+id/tv__place_panoramax"
android:textAlignment="viewStart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/MwmTextAppearance.PlacePage.Accent"
tools:text="@string/panoramax"/>
</LinearLayout>

View File

@@ -890,4 +890,5 @@
<string name="telegram_url">https://t.me/CoMapsApp</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ويكيميديا كومنز</string>
</resources>

View File

@@ -181,4 +181,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

@@ -671,7 +671,7 @@
<string name="power_managment_setting_never">Heç vaxt</string>
<string name="power_managment_setting_auto">Avtomatik</string>
<string name="power_managment_setting_manual_max">Maksimum enerji qənaəti</string>
<string name="enable_logging_warning_message">Yardım dialoq qutusunda “Problemi bildir” istifadə etməklə probleminizlə bağlı ətraflı diaqnostik jurnalları qeyd etmək və bizə göndərmək üçün bu seçimi müvəqqəti aktivləşdirin. Qeydlərə məkan məlumatı daxil ola bilər</string>
<string name="enable_logging_warning_message">Yardım dialoq qutusunda “Problemi bildir” istifadə etməklə probleminizlə bağlı ətraflı diaqnostik jurnalları qeyd etmək və bizə göndərmək üçün bu seçimi müvəqqəti aktivləşdirin. Qeydlərə məkan məlumatı daxil ola bilər.</string>
<string name="access_rules_author_only">Onlayn redaktə</string>
<string name="driving_options_title">Marşrutlaşdırma seçimləri</string>
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
@@ -682,7 +682,7 @@
<string name="avoid_ferry">Bərə keçidlərindən çəkinin</string>
<string name="avoid_motorways">Magistral yoldan çəkinin</string>
<string name="unable_to_calc_alert_title">Marşrutu hesablamaq mümkün deyil</string>
<string name="unable_to_calc_alert_subtitle">Təəssüf ki, seçdiyiniz seçimlərə görə marşrut tapa bilmədik. Seçimləri dəyişdirin və yenidən cəhd edin</string>
<string name="unable_to_calc_alert_subtitle">Təəssüf ki, seçdiyiniz seçimlərə görə marşrut tapa bilmədik. Seçimləri dəyişdirin və yenidən cəhd edin.</string>
<string name="define_to_avoid_btn">Qarşısını almaq üçün yolları müəyyənləşdirin</string>
<string name="change_driving_options_btn">Sürmə seçimləri aktiv edildi</string>
<string name="toll_road">Ücrətli yol</string>
@@ -843,4 +843,5 @@
<string name="telegram_url">https://t.me/CoMapsApp/</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Vikianbar</string>
</resources>

View File

@@ -880,7 +880,7 @@
<item quantity="other">Знойдзена %d файлаў. Вы можаце ўбачыць іх пасля пераўтварэння.</item>
</plurals>
<string name="error_enter_correct_vk_page">Увядзіце сапраўднае імя карыстальніка або спасылку VK</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Вікісховішча</string>
<string name="comma_separated_pair">%1$s, %2$s</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/RU:О_проекте</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>

View File

@@ -838,4 +838,5 @@
<string name="trip_finished">Пристигнахте!</string>
<string name="instagram">Instagram</string>
<string name="downloader_loading_ios">Изтегляне</string>
<string name="wikimedia_commons">Общомедия</string>
</resources>

View File

@@ -29,10 +29,11 @@
<string name="country_status_download_failed">ডাউনলোড ব্যর্থ হল</string>
<string name="try_again">আবার চেষ্টা করুন</string>
<string name="about_menu_title">CoMaps এর ব্যাপারে</string>
<string name="about_headline">উন্মুক্ত প্রকল্প, একটি সমাজ দ্বারা চলিত</string>
<string name="about_headline">উন্মুক্ত প্রকল্প, তার সমাজ দ্বারা চলিত</string>
<string name="location_settings">লোকেশন সেটিংস</string>
<string name="about_proposition_1">• ব্যবহার করা সহজ এবং দেখতে সুন্দর</string>
<string name="about_proposition_2">• গোপনীয়তা বান্ধব এবং বিজ্ঞাপন মুক্ত</string>
<string name="about_proposition_3">• অফলাইন, দ্রুত এবং ছোট সাইজ</string>
<string name="about_developed_by_enthusiasts">পুরোপুরি ওপেন সোর্স, অলাভজনক, প্রকাশ্য সিদ্ধান্ত করণ এবং অর্থায়ন।</string>
<string name="wikimedia_commons">উইকিমিডিয়া কমন্স</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -960,4 +960,6 @@
<string name="type.place.suburb">Suburbi</string>
<string name="type.place.state.USA">Estat</string>
<string name="type.power.line">Línia elèctrica</string>
<string name="type.amenity.studio">Estudi</string>
<string name="type.barrier.guard_rail">Barrera de seguretat</string>
</resources>

View File

@@ -886,9 +886,11 @@
<string name="editor_level">Podlaží (0 je přízemí)</string>
<string name="route_type">Typ trasy</string>
<string name="vehicle">Vozidlo</string>
<string name="pedestrian">Pěší</string>
<string name="bicycle">Kolo</string>
<string name="ruler">Měření</string>
<string name="pedestrian">Pěší zóna</string>
<string name="bicycle">Jízdní kolo</string>
<string name="ruler">Pravítko</string>
<string name="bookmark_color">Barva záložky</string>
<string name="clear">Vymazat</string>
<string name="panoramax">Obrázek Panoramax</string>
<string name="about_help">O aplikaci a nápověda</string>
</resources>

View File

@@ -888,8 +888,8 @@
<string name="saved">Guardado</string>
<string name="codeberg">Codeberg</string>
<string name="error_enter_correct_fediverse_page">Introduce un nombre de usuario o una dirección web de Mastodon válidos</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="app_site_url">https://comaps.app/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity/</string>
<string name="app_site_url">https://comaps.app/es/</string>
<string name="bluesky">Bluesky</string>
<string name="error_enter_correct_bluesky_page">Introduce un nombre de usuario o una dirección web de Bluesky válidos</string>
<string name="telegram_url">https://t.me/CoMapsApp/</string>
@@ -898,4 +898,8 @@
<string name="editor_level">Planta (0 es la planta baja)</string>
<string name="editor_building_levels">Plantas (incl. planta baja, excl. tejado)</string>
<string name="error_enter_correct_level">Introduce un número de planta válido</string>
<string name="route_type">Tipo de ruta</string>
<string name="vehicle">Vehículo</string>
<string name="pedestrian">Peatonal</string>
<string name="bicycle">Bicicleta</string>
</resources>

View File

@@ -895,4 +895,6 @@
<string name="pedestrian">Jalakäija</string>
<string name="ruler">Joonlaud</string>
<string name="bookmark_color">Järjehoidja värv</string>
<string name="panoramax">Panoramaxi pilt</string>
<string name="about_help">Rakenduse teave ja abiteave</string>
</resources>

View File

@@ -817,4 +817,5 @@
<string name="translated_om_site_url">https://comaps.app</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ویکی‌انبار</string>
</resources>

View File

@@ -900,4 +900,6 @@
<string name="bicycle">Polkupyörä</string>
<string name="ruler">Viivoitin</string>
<string name="bookmark_color">Kirjanmerkin väri</string>
<string name="about_help">Tietoja ja ohje</string>
<string name="panoramax">Panoramax-kuva</string>
</resources>

View File

@@ -599,4 +599,5 @@
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="wikimedia_commons">विकिमीडिया कॉमन्स</string>
</resources>

View File

@@ -148,4 +148,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Zajednički poslužitelj</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -838,7 +838,7 @@
<string name="nav_auto">Automatikus navigáció</string>
<string name="telegram">Telegram</string>
<string name="instagram">Instagram</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Wikimédia Commons</string>
<string name="editor_line_social_network">LINE</string>
<string name="empty_street_name_error">Adjon meg egy utcanevet</string>
<string name="vk">VKontakte</string>

View File

@@ -4,4 +4,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

@@ -862,4 +862,5 @@
<string name="translated_om_site_url">https://comaps.app</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ויקישיתוף</string>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="type.amenity.bicycle_parking">חניית אופניים</string>
<string name="type.amenity.bicycle_rental">השכרת אופניים</string>
<string name="type.amenity.bicycle_repair_station">תחנת תיקון אופניים</string>
<string name="type.amenity.biergarten">ביר גרדן</string>
<string name="type.amenity.biergarten">גן בירה</string>
<string name="type.amenity.brothel">בית בושת</string>
<string name="type.amenity.bureau_de_change">המרת מטבע חוץ</string>
<string name="type.amenity.bus_station">תחנת אוטובוס</string>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -822,4 +822,5 @@
<string name="openstreetmap">OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">위키미디어 공용</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -837,4 +837,5 @@
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="wikimedia_commons">विकिमीडिया कॉमन्स</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -888,7 +888,7 @@
<string name="twitter">X (Twitter)</string>
<string name="openstreetmap">OpenStreetMap</string>
<string name="instagram">Instagram</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Викисклад</string>
<string name="editor_line_social_network">LINE</string>
<string name="vk">VK</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity/</string>
@@ -904,4 +904,29 @@
<string name="editor_building_levels">Этажей (вкл. подвалы искл. крышу)</string>
<string name="editor_level">Этаж (0 это первый этаж)</string>
<string name="error_enter_correct_level">Введите правильный номер этажа</string>
<!-- Settings "Backup" category: "Backup" title -->
<string name="pref_backup_title">Резервное копирование меток и треков</string>
<string name="pref_backup_summary">Автоматически сохранять в папку на устройстве</string>
<string name="pref_backup_now_title">Создать резервную копию</string>
<string name="pref_backup_now_summary">Запустить резервное копирование вручную</string>
<string name="pref_backup_now_summary_progress">Идёт резервное копирование…</string>
<string name="pref_backup_now_summary_ok">Копирование успешно завершено</string>
<string name="pref_backup_now_summary_empty_lists">Нет данных для копирования</string>
<string name="pref_backup_now_summary_failed">Ошибка при копировании</string>
<string name="pref_backup_now_summary_folder_unavailable">Папка для копий недоступна</string>
<string name="pref_backup_status_summary_success">Последнее успешное копирование</string>
<string name="pref_backup_location_title">Папка для резервных копий</string>
<string name="pref_backup_location_summary_initial">Сначала выберите папку и дайте доступ</string>
<string name="pref_backup_history_title">Хранить количество копий</string>
<string name="pref_backup_interval_title">Автозапуск</string>
<string name="backup_interval_every_day">Каждый день</string>
<string name="backup_interval_every_week">Каждую неделю</string>
<string name="backup_interval_manual_only">Выключено (только вручную)</string>
<string name="dialog_report_error_missing_folder">Выбранная папка для резервного копирования недоступна или нет права записи в неё. Пожалуйста, выберите другую папку</string>
<string name="dialog_report_error_with_logs">Пожалуйста, отправьте нам отчет об ошибке:\n
- Включите \"Запись логов\" в настройках\n
- воспроизведите проблему\n
- на экране \"Справка\" нажмите кнопку \"Сообщить о проблеме\" и отправьте нам отчет по почте или в чат\n
- отключите логирование
</string>
</resources>

View File

@@ -4,4 +4,5 @@
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="translated_om_site_url">https://comaps.app/</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -27,7 +27,7 @@
<!-- Location services are disabled by user alert - message -->
<string name="location_is_disabled_long_text">Тренутно су сви локацијски сервиси на овом уређају или апликацији искључени. Потребно је да их укључите у Подешавањима.</string>
<!-- View and button titles for accessibility -->
<string name="zoom_to_country">Прикажи на мапи</string>
<string name="zoom_to_country">Прикажи мапу</string>
<!-- Message to display at the center of the screen when the country download has failed -->
<string name="country_status_download_failed">Преузимање није успело</string>
<!-- Button text for the button under the country_status_download_failed message -->

View File

@@ -8,7 +8,7 @@
<string name="type.aeroway.aerodrome">Flygplats</string>
<string name="type.aeroway.aerodrome.international">Flygplats</string>
<string name="type.aeroway.helipad">Helikopterplatta</string>
<string name="type.amenity">Infrastrukturen</string>
<string name="type.amenity">Infrastruktur</string>
<string name="type.amenity.arts_centre">Kulturcenter</string>
<string name="type.amenity.atm">Bankomat</string>
<string name="type.amenity.bbq">Grill för barbecue</string>
@@ -181,7 +181,7 @@
<string name="type.building.address">Adress</string>
<string name="type.building.has_parts">Byggnad</string>
<string name="type.building_part">Byggnad</string>
<string name="type.building.train_station">Stationsbyggnaden</string>
<string name="type.building.train_station">Stationsbyggnad</string>
<string name="type.cemetery.grave">Grav</string>
<string name="type.craft">Hantverk</string>
<string name="type.craft.beekeeper">Biodlare</string>
@@ -346,7 +346,7 @@
<string name="type.highway.living_street.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.living_street.tunnel">Tunnel</string>
<string name="type.highway.motorway">Gata</string>
<string name="type.highway.motorway">Motorväg</string>
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.motorway.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
@@ -419,7 +419,7 @@
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.service.tunnel">Tunnel</string>
<string name="type.highway.speed_camera">Hastighetskamera</string>
<string name="type.highway.steps">Gångväg</string>
<string name="type.highway.steps">Trappa</string>
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.steps.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
@@ -469,7 +469,7 @@
<string name="type.area_highway.secondary">Gata</string>
<string name="type.area_highway.service">Gata</string>
<string name="type.area_highway.tertiary">Gata</string>
<string name="type.area_highway.steps">Gångväg</string>
<string name="type.area_highway.steps">Trappa</string>
<string name="type.area_highway.track">Gata</string>
<string name="type.area_highway.trunk">Gata</string>
<string name="type.area_highway.unclassified">Gata</string>
@@ -530,11 +530,11 @@
<string name="type.landuse.forest.coniferous">Skog</string>
<string name="type.landuse.forest.deciduous">Skog</string>
<string name="type.landuse.forest.mixed">Skog</string>
<string name="type.landuse.grass">Gräsmattan</string>
<string name="type.landuse.landfill">Soptippen</string>
<string name="type.landuse.grass">Gräsmatta</string>
<string name="type.landuse.landfill">Soptipp</string>
<string name="type.landuse.railway">Järnvägsfaciliteter</string>
<string name="type.landuse.reservoir">Vatten</string>
<string name="type.leisure.dog_park">Hundparken</string>
<string name="type.leisure.dog_park">Hundpark</string>
<string name="type.leisure.fitness_centre">Gym</string>
<string name="type.leisure.fitness_station">Fitnesstation</string>
<string name="type.leisure.dance">Danshall</string>
@@ -544,10 +544,10 @@
<string name="type.leisure.miniature_golf">Minigolf</string>
<string name="type.leisure.nature_reserve">Naturreservat</string>
<string name="type.leisure.outdoor_seating">Sittplatser utomhus</string>
<string name="type.leisure.park">Parken</string>
<string name="type.leisure.park.no.access">Parken</string>
<string name="type.leisure.park.permissive">Parken</string>
<string name="type.leisure.park.private">Parken</string>
<string name="type.leisure.park">Park</string>
<string name="type.leisure.park.no.access">Privat park</string>
<string name="type.leisure.park.permissive">Park</string>
<string name="type.leisure.park.private">Privat park</string>
<string name="type.leisure.picnic_table">Picknickbord</string>
<string name="type.leisure.pitch">Idrottsplats</string>
<string name="type.leisure.playground">Lekplats</string>
@@ -586,7 +586,7 @@
<string name="type.natural.scree">Stenig rasbrant</string>
<string name="type.natural.bay">Bukt</string>
<string name="type.natural.beach">Strand</string>
<string name="type.natural.beach.sand">Sandig strand</string>
<string name="type.natural.beach.sand">Sandstrand</string>
<string name="type.natural.beach.gravel">Grusstrand</string>
<string name="type.natural.cape">Udde</string>
<string name="type.natural.cave_entrance">Grotta</string>
@@ -611,7 +611,7 @@
<string name="type.natural.peak">Bergstopp</string>
<string name="type.natural.saddle">Fjällsadel</string>
<string name="type.natural.rock">Bergart</string>
<string name="type.natural.scrub">Ruggen</string>
<string name="type.natural.scrub">Rugge</string>
<string name="type.natural.spring">Vattenkälla</string>
<string name="type.natural.spring.drinking_water_no">Vattenkälla</string>
<string name="type.natural.strait">Sund</string>
@@ -1148,10 +1148,10 @@
<string name="type.wheelchair.limited">Delvis utrustad för handikappade</string>
<string name="type.wheelchair.no">Ej utrustad för handikappade</string>
<string name="type.wheelchair.yes">Utrustad för handikappade</string>
<string name="type.piste_type.snow_park">Snöparken</string>
<string name="type.piste_type.snow_park">Snöpark</string>
<string name="type.piste_type.hike">Vandringsled i snö</string>
<string name="type.piste_type.connection">Piste Anslutning</string>
<string name="type.piste_type.skitour">Skitourleden</string>
<string name="type.piste_type.skitour">Skitourled</string>
<string name="type.amenity.events_venue">Evenemangslokal</string>
<string name="type.shop.auction">Auktion</string>
<string name="type.shop.collector">Samlingsföremål</string>
@@ -1341,4 +1341,7 @@
<string name="type.leisure.hackerspace">Hackerspace</string>
<string name="type.shop.kiosk">Kiosk</string>
<string name="type.tourism.museum">Museum</string>
<string name="type.amenity.waste_transfer_station">Återvinningscentral</string>
<string name="type.barrier.guard_rail">Vägräcke</string>
<string name="type.highway.ladder">Stege</string>
</resources>

View File

@@ -219,7 +219,7 @@
<!-- Speed camera settings menu option - Never warn (about speedcams) -->
<string name="pref_tts_speedcams_never">Kamwe usionye</string>
<string name="power_managment_title">Mtindo wa kuokoa nishati</string>
<string name="power_managment_description">Pindi mtindo wa kiotomatiki unapochaguliwa programu tumizi inaanza kuzima sifa za kumaliza betri kulingana na kiwango cha chaji cha sasa cha betri</string>
<string name="power_managment_description">Pindi mtindo wa kiotomatiki unapochaguliwa programu tumizi inaanza kuzima sifa za kumaliza betri kulingana na kiwango cha chaji cha sasa cha betri.</string>
<string name="power_managment_setting_never">Kamwe</string>
<string name="power_managment_setting_auto">Kiotomatiki</string>
<string name="power_managment_setting_manual_max">Upeo wa kuhifadhi nishati</string>

View File

@@ -819,4 +819,5 @@
<string name="translated_om_site_url">https://comaps.app/</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">วิกิมีเดียคอมมอนส์</string>
</resources>

View File

@@ -885,7 +885,7 @@
<string name="instagram">Instagram</string>
<string name="level_value_generic">Поверх: %s</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Вікісховище</string>
<string name="editor_add_phone">Додати телефон</string>
<string name="comma_separated_pair">%1$s, %2$s</string>
<string name="telegram_url">https://t.me/CoMapsApp/</string>

View File

@@ -13,7 +13,6 @@
<string name="pref_enable_logging" translatable="false">EnableLogging</string>
<string name="pref_emulate_bad_external_storage" translatable="false">EmulateBadExternalStorage</string>
<string name="pref_about" translatable="false">AboutOrganicMaps</string>
<string name="pref_help" translatable="false">Help</string>
<string name="pref_file_name" translatable="false">OrganicMapsPrefs</string>
<string name="pref_map_style" translatable="false">MapStyle</string>
<string name="pref_tts_screen" translatable="false">TtsScreen</string>
@@ -41,6 +40,7 @@
<string name="pref_keep_screen_on" translatable="false">KeepScreenOn</string>
<string name="pref_show_on_lock_screen" translatable="false">ShowOnLockScreen</string>
<string name="pref_map_locale" translatable="false">MapLanguage</string>
<string name="pref_backup" translatable="false">Backup</string>
<string name="pref_left_button" translatable="false">LeftButton</string>
<string name="notification_ticker_ltr" translatable="false">%1$s: %2$s</string>

View File

@@ -23,7 +23,29 @@
<item>0</item>
<item>1</item>
</string-array>
<string-array name="backup_interval_entries">
<item>@string/backup_interval_every_day</item>
<item>@string/backup_interval_every_week</item>
<item>@string/backup_interval_manual_only</item>
</string-array>
<string-array name="backup_interval_values">
<item>86400000</item> <!-- Every day -->
<item>604800000</item> <!-- Every week -->
<item>0</item> <!-- Manual only -->
</string-array>
<string-array name="backup_history_entries">
<item>3</item>
<item>10</item>
</string-array>
<string-array name="backup_history_values">
<item>3</item>
<item>10</item>
</string-array>
<string-array name="map_style">
<item>@string/off</item>
<item>@string/on</item>

View File

@@ -291,6 +291,8 @@
<string name="vk">VK</string>
<!-- Text in menu -->
<string name="bluesky">Bluesky</string>
<!-- Text on the place page -->
<string name="panoramax">Panoramax Picture</string>
<!-- Text in the editor -->
<string name="editor_line_social_network">LINE</string>
<!-- Text in menu -->
@@ -934,6 +936,32 @@
<string name="codeberg">Codeberg</string>
<string name="pref_left_button_title">Left button setup</string>
<string name="pref_left_button_disable">Disable</string>
<!-- Settings "Backup" category: "Backup" title -->
<string name="pref_backup_title">Bookmarks and tracks backup</string>
<string name="pref_backup_summary">Automatically backup to a folder on your device</string>
<string name="pref_backup_now_title">Backup now</string>
<string name="pref_backup_now_summary">Create a backup immediately</string>
<string name="pref_backup_now_summary_progress">Backup in progress…</string>
<string name="pref_backup_now_summary_ok">Backup completed successfully</string>
<string name="pref_backup_now_summary_empty_lists">Nothing to back up</string>
<string name="pref_backup_now_summary_failed">Backup failed</string>
<string name="pref_backup_now_summary_folder_unavailable">The backup folder is not available</string>
<string name="pref_backup_status_summary_success">Last successful backup</string>
<string name="pref_backup_location_title">Backup location</string>
<string name="pref_backup_location_summary_initial">Please select a folder first and grant permission</string>
<string name="pref_backup_history_title">Number of backups to keep</string>
<string name="pref_backup_interval_title">Automatic backup</string>
<string name="backup_interval_every_day">Daily</string>
<string name="backup_interval_every_week">Weekly</string>
<string name="backup_interval_manual_only">Off (manual only)</string>
<string name="dialog_report_error_missing_folder">The selected backup location is not available or writable. Select a different location, please.</string>
<string name="dialog_report_error_with_logs">Please send us an error report:\n
- \"Enable logging\" in the settings\n
- reproduce the problem\n
- in the \"Help/About\" screen press a \"Report a bug\" button and send it to us via email or chat\n
- disable logging
</string>
<string name="clear">Clear</string>
<string name="route_type">Route type</string>
<string name="vehicle">Vehicle</string>
@@ -941,4 +969,5 @@
<string name="bicycle">Bicycle</string>
<string name="ruler">Ruler</string>
<string name="bookmark_color">Bookmark color</string>
<string name="about_help">About &amp; Help</string>
</resources>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="backup_location"
android:summary="@string/pref_backup_location_summary_initial"
android:title="@string/pref_backup_location_title" />
<Preference
android:key="backup_now"
android:summary="@string/pref_backup_now_summary"
android:title="@string/pref_backup_now_title" />
<ListPreference
android:defaultValue="86400000"
android:entries="@array/backup_interval_entries"
android:entryValues="@array/backup_interval_values"
android:key="backup_history_interval"
android:title="@string/pref_backup_interval_title" />
<ListPreference
android:defaultValue="10"
android:entries="@array/backup_history_entries"
android:entryValues="@array/backup_history_values"
android:key="backup_history_count"
android:title="@string/pref_backup_history_title" />
</PreferenceScreen>

View File

@@ -112,6 +112,13 @@
app:singleLineTitle="false"
android:persistent="false"
android:order="18"/>
<Preference
android:key="@string/pref_backup"
android:title="@string/pref_backup_title"
android:summary="@string/pref_backup_summary"
app:singleLineTitle="false"
android:persistent="false"
android:order="19"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
@@ -171,15 +178,4 @@
android:defaultValue="true"
android:order="2"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_information"
android:title="@string/prefs_group_information"
android:order="7">
<Preference
android:key="@string/pref_help"
android:title="@string/help"
app:singleLineTitle="false"
android:order="1">
</Preference>
</androidx.preference.PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -410,7 +410,7 @@ pl:4Atrakcje turystyczne|Osobliwości miasta|Turystyka|zwiedzanie
pt:4Atrações turísticas|3Turismo|Miradouros
pt-BR:4Atraçãos|3Turismo
ro:5Obiective turistice|4Turism
es:4Turismo
es:5Atracciones turísticas|4Turismo
et:Vaatamisväärsused
eu:4Turismoa
sr:5Туристичка атракција|5Атракција|5Атракције|6Знаменитости|5Туризам|5Turistička atrakcija|5Atrakcija|5Atrakcije|6Znamenitosti|5Turizam

View File

@@ -307,7 +307,6 @@
16119285
16169823
16173957
16248287
16372627
16391736
16431936
@@ -315,6 +314,7 @@
16440736
16445666
16557154
16577252
16579778
16579836
16728450
@@ -340,10 +340,15 @@
16777215
221978645
222898459
223036995
223300167
233867264
234004016
234879733
234881023
307054404
318765813
318767103
436602368
437326080
438572045
@@ -370,8 +375,6 @@
452983541
452984574
452984831
575358531
587201269
609045837
654706176
655629312

View File

@@ -275,6 +275,8 @@
<li>Code2000 Font<br>
&copy; 1998&ndash;2003 James Kass; Shareware</li>
</ul>
<li><a href="https://upload.wikimedia.org/wikipedia/commons/a/a9/Panoramax.svg">Panoramax</a><br>
&copy; 2023 Adrien Pavie; <a href="license" class="license">CC BY 4.0 License</a></li>
<p id="icons">We also use these icons on the map:</p>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -23166,7 +23166,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23187,7 +23187,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23207,7 +23207,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23297,7 +23297,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23322,7 +23322,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23346,7 +23346,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23606,7 +23606,7 @@ cont {
}
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23633,7 +23633,7 @@ cont {
}
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23665,7 +23665,7 @@ cont {
}
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23784,7 +23784,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23796,7 +23796,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23847,7 +23847,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23859,7 +23859,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23910,7 +23910,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23931,7 +23931,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23951,7 +23951,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -24137,7 +24137,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -24161,7 +24161,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -26904,19 +26904,6 @@ cont {
}
cont {
name: "highway-path"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27049,16 +27036,6 @@ cont {
priority: 219
cap: BUTTCAP
}
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.7
}
priority: 220
cap: BUTTCAP
}
}
element {
scale: 15
@@ -27215,19 +27192,6 @@ cont {
}
cont {
name: "highway-path-bridge"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27412,19 +27376,6 @@ cont {
}
cont {
name: "highway-path-difficult"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 1.0
dd: 2.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27549,19 +27500,6 @@ cont {
}
cont {
name: "highway-path-expert"
element {
scale: 14
lines {
width: 0.9
color: 1716665907
dashdot {
dd: 1.0
dd: 4.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27686,19 +27624,6 @@ cont {
}
cont {
name: "highway-path-horse"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27823,19 +27748,6 @@ cont {
}
cont {
name: "highway-path-tunnel"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -28083,7 +27995,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28103,7 +28015,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -28249,7 +28161,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28273,7 +28185,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -28469,7 +28381,7 @@ cont {
}
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28501,7 +28413,7 @@ cont {
}
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -34329,7 +34241,7 @@ cont {
scale: 15
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34342,7 +34254,7 @@ cont {
scale: 16
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -34451,7 +34363,7 @@ cont {
}
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34470,7 +34382,7 @@ cont {
}
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -34621,7 +34533,7 @@ cont {
scale: 15
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34634,7 +34546,7 @@ cont {
scale: 16
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -35974,19 +35886,6 @@ cont {
}
cont {
name: "highway-track"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36111,19 +36010,6 @@ cont {
}
cont {
name: "highway-track-area"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36248,19 +36134,6 @@ cont {
}
cont {
name: "highway-track-bridge"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36445,19 +36318,6 @@ cont {
}
cont {
name: "highway-track-no-access"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36582,19 +36442,6 @@ cont {
}
cont {
name: "highway-track-tunnel"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -63404,19 +63251,6 @@ cont {
}
cont {
name: "piste:type-hike"
element {
scale: 14
lines {
width: 0.9
color: 2573352319
dashdot {
dd: 3.5
dd: 2.0
}
priority: 120
cap: BUTTCAP
}
}
element {
scale: 15
lines {

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -25613,7 +25613,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -25637,7 +25637,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -29978,7 +29978,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -29998,7 +29998,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -30144,7 +30144,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -30168,7 +30168,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -30364,7 +30364,7 @@ cont {
}
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -30396,7 +30396,7 @@ cont {
}
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<title>train-m</title>
<g id="Page-2:-Night" fill="none" fill-rule="evenodd" opacity="1">
<g id="train-m" fill-rule="nonzero">
<rect id="Rectangle" width="24" height="24" rx="2.5" fill="#000" opacity=".6"/>
<rect id="Rectangle" x="1" y="1" width="22" height="22" rx="2" fill="#2F6499"/>
<path id="Shape" d="m11.895 5c-2.9474 0-5.8947 0.36842-5.8947 2.9474v7c0 1.4221 1.1568 2.5789 2.5789 2.5789l-1.1053 1.1053v0.36842h1.6432l1.4737-1.4737h2.7779l1.4737 1.4737h1.4737v-0.36842l-1.1053-1.1053c1.4221 0 2.5789-1.1568 2.5789-2.5789v-7c0-2.5789-2.6379-2.9474-5.8947-2.9474zm-3.3158 11.053c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053s1.1053 0.49368 1.1053 1.1053c0 0.61158-0.49368 1.1053-1.1053 1.1053zm2.5789-5.1579h-3.6842v-2.9474h3.6842v2.9474zm1.4737 0v-2.9474h3.6842v2.9474h-3.6842zm2.5789 5.1579c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053 0.61158 0 1.1053 0.49368 1.1053 1.1053 0 0.61158-0.49368 1.1053-1.1053 1.1053z" fill="#000"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 24 24"
width="18"
height="18"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-m</title>
<g
id="Page-2:-Night"
fill="none"
fill-rule="evenodd"
opacity="1">
<g
id="train-m"
fill-rule="nonzero">
<rect
id="Rectangle"
width="24"
height="24"
rx="2.5"
fill="#000"
opacity=".6" />
<rect
id="rect1"
x="1"
y="1"
width="22"
height="22"
rx="2"
fill="#2F6499" />
<path
id="train-m-a"
d="m 9.033318,18 0.66667,-1 h -1.7 l -2,3 h 0.62963 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 8.366652,19 h 7.2667 l 0.07293,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z m 0.3535,-14 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 15.972778,16.999485 15.947148,17 15.921518,17 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.926e-4,-0.05126 0.00148,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z m -0.46364,2.5 c -0.52136,0 -0.95524,0.40055 -0.99682,0.92025 l -0.24,3 c -0.00212,0.02653 -0.00318,0.05313 -0.00318,0.07975 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.02661,0 0.05322,-0.0011 0.07974,-0.0032 0.55053,-0.04404 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 8.999983,15 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
style="fill:#000000;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-m</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 16 16" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<title>train-s</title>
<g id="Page-2:-Night" fill="none" fill-rule="evenodd" opacity="1">
<g id="train-s" fill-rule="nonzero">
<rect id="Rectangle" width="16" height="16" rx="2.5" fill="#000" opacity=".6"/>
<rect id="Rectangle" x=".66667" y=".66667" width="14.667" height="14.667" rx="2" fill="#2F6499"/>
<path id="Shape" d="m7.9298 3.3333c-1.9649 0-3.9298 0.24561-3.9298 1.9649v4.6667c0 0.94807 0.77123 1.7193 1.7193 1.7193l-0.73684 0.73684v0.24561h1.0954l0.98246-0.98246h1.8519l0.98246 0.98246h0.98246v-0.24561l-0.73684-0.73684c0.94807 0 1.7193-0.77123 1.7193-1.7193v-4.6667c0-1.7193-1.7586-1.9649-3.9298-1.9649zm-2.2105 7.3684c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684zm1.7193-3.4386h-2.4561v-1.9649h2.4561v1.9649zm0.98246 0v-1.9649h2.4561v1.9649h-2.4561zm1.7193 3.4386c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684z" fill="#000"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 16 16"
width="12"
height="12"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-s</title>
<g
id="Page-2:-Night"
fill="none"
fill-rule="evenodd"
opacity="1">
<g
id="train-s"
fill-rule="nonzero">
<rect
id="Rectangle"
width="16"
height="16"
rx="2.5"
fill="#000"
opacity=".6" />
<rect
id="rect1"
x=".66667"
y=".66667"
width="14.667"
height="14.667"
rx="2"
fill="#2F6499" />
<path
id="train-m-a"
d="M 6.0222132,12 6.4666598,11.333333 H 5.3333265 l -1.333333,2 h 0.419753 c 0.445807,0 0.862133,-0.2228 1.1094,-0.593733 l 0.04862,-0.07293 h 4.8444665 l 0.04862,0.07293 c 0.247287,0.370933 0.663593,0.593733 1.1094,0.593733 h 0.419753 l -1.333333,-2 H 9.5333398 L 9.9777865,12 H 6.0222532 Z M 6.2578798,2.6666669 h 3.4842001 c 1.0746661,0 1.9572001,0.8492666 1.9985331,1.9231332 l 0.206113,5.3589334 C 11.975026,10.6846 11.40146,11.304 10.665593,11.332333 c -0.01707,6.57e-4 -0.03416,10e-4 -0.05125,10e-4 H 5.3855465 c -0.7364,0 -1.333333,-0.596953 -1.333333,-1.333333 0,-0.017087 3.28e-4,-0.034173 0.001,-0.051247 l 0.206113,-5.3589336 c 0.0413,-1.0738667 0.923867,-1.9231333 1.998533,-1.9231333 z M 5.9487865,4.3333334 c -0.347573,0 -0.636827,0.2670334 -0.664547,0.6135 l -0.16,2 c -0.0014,0.017687 -0.0021,0.03542 -0.0021,0.053167 0,0.3681867 0.29848,0.6666667 0.666667,0.6666667 h 4.4223995 c 0.01774,0 0.03548,-7.334e-4 0.05316,-0.00213 0.36702,-0.02936 0.64074,-0.3506866 0.61138,-0.7177333 l -0.16,-2 c -0.02775,-0.3464704 -0.317,-0.6135037 -0.66458,-0.6135037 H 5.9487665 Z M 5.9999935,10 c 0.3681863,0 0.6666663,-0.2984798 0.6666663,-0.6666665 0,-0.3681866 -0.29848,-0.6666666 -0.6666663,-0.6666666 -0.368187,0 -0.666667,0.29848 -0.666667,0.6666666 C 5.3333265,9.7015202 5.6318065,10 5.9999935,10 Z m 3.9999997,0 C 10.36818,10 10.66666,9.7015202 10.66666,9.3333335 c 0,-0.3681866 -0.29848,-0.6666666 -0.6666668,-0.6666666 -0.3681868,0 -0.6666667,0.29848 -0.6666667,0.6666666 C 9.3333265,9.7015202 9.6318064,10 9.9999932,10 Z M 6.8333265,3.3333334 c -0.092047,0 -0.1666667,0.07462 -0.1666667,0.1666667 0,0.092047 0.07462,0.1666667 0.1666667,0.1666667 h 2.3333333 c 0.092047,0 0.1666667,-0.07462 0.1666667,-0.1666667 0,-0.092047 -0.07462,-0.1666667 -0.1666667,-0.1666667 z"
style="fill:#000000;fill-opacity:1;stroke-width:0.666667" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-s</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -683,6 +683,9 @@ line|z19-[highway=busway],
line|z13-[highway=pedestrian],
line|z13-[highway=ford]
{color: @pedestrian;opacity: 0.9;}
line|z16-[highway=pedestrian],
line|z16-[highway=ford],
{opacity: 0.93;}
line|z13-[highway=cycleway],
line|z14-[highway=path][bicycle=designated]::cycleline,
@@ -711,7 +714,7 @@ line|z17-[highway=steps][bridge?]::bridgeblack,
line|z16-[highway=road][bridge?]::bridgeblack,
line|z16-[highway=service][bridge?]::bridgeblack
{casing-linecap: butt;casing-color:@bridge_casing;casing-opacity: 0.7;}
line|z14-[highway=track],
line|z15-[highway=track],
{color: @track;opacity: 0.6;}
line|z14-[highway=raceway],
{color: @track;opacity: 0.7;}
@@ -720,14 +723,16 @@ line|z15-[leisure=track][!area],
line|z14-[highway=bridleway]
{color: @bridleway;opacity: 0.6;}
line|z15-[highway=footway],
{color: @footway;opacity: 0.87;}
line|z15-[highway=steps],
{color: @footway;opacity: 0.9;}
line|z14-[highway=path],
line|z16-[highway=footway],
{opacity: 0.95;}
line|z15-[highway=steps],
{color: @residential;opacity: 1;}
line|z15-[highway=path],
{color: @path;opacity: 0.6;}
line|z14-[highway=path][_path_grade=expert],
line|z15-[highway=path][_path_grade=expert],
{color: @path_expert; opacity: 0.6;}
line|z14-[piste:type=hike],
line|z15-[piste:type=hike],
{color: @piste; opacity: 0.4;}
line|z17-[highway=footway][tunnel?]::tunnelBackground,
line|z17-[highway=cycleway][tunnel?]::tunnelBackground,
@@ -911,8 +916,6 @@ line|z19-[highway=raceway],
line|z19-[leisure=track][!area]
{width:4; opacity: 0.8;}
line|z14[highway=track],
{width: 1.1; dashes: 6,2.5;}
line|z15[highway=track],
{width: 1.4; dashes: 6,2.5;}
line|z16[highway=track],
@@ -924,9 +927,6 @@ line|z18[highway=track],
line|z19-[highway=track],
{width: 4.2; dashes: 12,3.5; opacity: 0.8;}
line|z14[highway=path],
line|z14[piste:type=hike],
{width: 0.9; dashes: 3.5,2;}
line|z15[highway=path],
line|z15[piste:type=hike],
{width: 1.1; dashes: 3.5,2;}
@@ -941,8 +941,6 @@ line|z18[highway=path],
line|z19-[highway=path],
{width: 3.7; dashes: 8,4.5; opacity: 0.8;}
line|z14[highway=path][bicycle=designated],
{width: 0.9; dashes: 3.5,2.7;}
line|z15[highway=path][bicycle=designated],
{width: 1.1; dashes: 3.5,2.7;}
line|z16[highway=path][bicycle=designated],
@@ -954,8 +952,6 @@ line|z18[highway=path][bicycle=designated],
line|z19-[highway=path][bicycle=designated],
{width: 3.7; dashes: 8,6.2; opacity: 0.8;}
line|z14[highway=path][_path_grade=difficult],
{width: 0.9; dashes: 1,2;}
line|z15[highway=path][_path_grade=difficult],
{width: 1.1; dashes: 1,2;}
line|z16[highway=path][_path_grade=difficult],
@@ -965,8 +961,6 @@ line|z17[highway=path][_path_grade=difficult],
line|z18-[highway=path][_path_grade=difficult],
{width: 2.8; dashes: 2.8,3.5;}
line|z14[highway=path][_path_grade=expert],
{width: 0.9; dashes: 1,4;}
line|z15[highway=path][_path_grade=expert],
{width: 1.1; dashes: 1,4;}
line|z16[highway=path][_path_grade=expert],

View File

@@ -224,11 +224,11 @@ railway-subway-bridge::dash # line::dash z16- (also has
=== 221
highway-footway-bicycle # line z15- (also has line::cycleline z15-, pathtext z15-)
highway-path-bicycle # line z14- (also has line::cycleline z14-, pathtext z15-)
highway-path-bicycle # line z15- (also has line::cycleline z14-, pathtext z15-)
=== 220
highway-footway-bicycle::cycleline # line::cycleline z15- (also has line z15-, pathtext z15-)
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z14-, pathtext z15-)
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z15-, pathtext z15-)
=== 219
highway-cycleway # line z13- (also has pathtext z15-)
@@ -276,15 +276,15 @@ highway-bridleway-tunnel # line z14- (also has line::
highway-footway # line z15- (also has pathtext z15-)
highway-footway-area # line z15- and area z14- (also has pathtext z15-)
highway-footway-crossing # line z16-
highway-path # line z14- (also has pathtext z15-)
highway-path-difficult # line z14- (also has pathtext z15-)
highway-path-expert # line z14- (also has pathtext z15-)
highway-path # line z15- (also has pathtext z15-)
highway-path-difficult # line z15- (also has pathtext z15-)
highway-path-expert # line z15- (also has pathtext z15-)
highway-raceway # line z14- (also has pathtext z16-)
highway-track # line z14- (also has pathtext z15-)
highway-track-area # line z14- (also has pathtext z15-)
highway-track-bridge # line z14- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-track-no-access # line z14- (also has pathtext z15-)
highway-track-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-track # line z15- (also has pathtext z15-)
highway-track-area # line z15- (also has pathtext z15-)
highway-track-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-track-no-access # line z15- (also has pathtext z15-)
highway-track-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
=== 180
highway-construction # line z13- (also has pathtext z15-)
@@ -302,25 +302,25 @@ railway-preserved-tunnel # line z15-
highway-footway-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-footway-sidewalk # line z16-
highway-footway-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-path-bridge # line z14- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-path-horse # line z14- (also has pathtext z15-)
highway-path-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-path-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-path-horse # line z15- (also has pathtext z15-)
highway-path-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
=== 155
highway-bridleway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-cycleway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z13-, line::tunnelCasing z17-, pathtext z15-)
highway-footway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
highway-path-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-path-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
highway-steps-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z16-)
highway-track-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-track-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
=== 154
highway-bridleway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-cycleway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z13-, line::tunnelBackground z17-, pathtext z15-)
highway-footway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
highway-path-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-path-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
highway-steps-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z16-)
highway-track-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-track-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
=== 153
highway-bridleway-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
@@ -328,7 +328,7 @@ highway-cycleway-bridge::bridgewhite # line::bridgewhite z15- (al
highway-footway-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-motorway-bridge::bridgewhite # line::bridgewhite z13- (also has line z6-, line::bridgeblack z13-, pathtext z10-, shield::shield z10-)
highway-motorway_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z10-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-path-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
highway-path-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-pedestrian-bridge::bridgewhite # line::bridgewhite z13- (also has line z13-, line::bridgeblack z14-, pathtext z14-)
highway-primary-bridge::bridgewhite # line::bridgewhite z14- (also has line z8-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-primary_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z11-, shield::shield z11-)
@@ -340,7 +340,7 @@ highway-service-bridge::bridgewhite # line::bridgewhite z16- (al
highway-steps-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z16-)
highway-tertiary-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z12-, shield::shield z13-)
highway-tertiary_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z14-, line::bridgeblack z14-, pathtext z18-)
highway-track-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
highway-track-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-trunk-bridge::bridgewhite # line::bridgewhite z13- (also has line z6-, line::bridgeblack z13-, pathtext z10-, shield::shield z10-)
highway-trunk_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z10-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-unclassified-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z13-)
@@ -363,7 +363,7 @@ highway-cycleway-bridge::bridgeblack # line::bridgeblack z17- (al
highway-footway-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-motorway-bridge::bridgeblack # line::bridgeblack z13- (also has line z6-, line::bridgewhite z13-, pathtext z10-, shield::shield z10-)
highway-motorway_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z10-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-path-bridge::bridgeblack # line::bridgeblack z17- (also has line z14-, line::bridgewhite z15-, pathtext z15-)
highway-path-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-pedestrian-bridge::bridgeblack # line::bridgeblack z14- (also has line z13-, line::bridgewhite z13-, pathtext z14-)
highway-primary-bridge::bridgeblack # line::bridgeblack z14- (also has line z8-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-primary_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z11-, shield::shield z11-)
@@ -375,7 +375,7 @@ highway-service-bridge::bridgeblack # line::bridgeblack z16- (al
highway-steps-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z16-)
highway-tertiary-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z12-, shield::shield z13-)
highway-tertiary_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z14-, line::bridgewhite z14-, pathtext z18-)
highway-track-bridge::bridgeblack # line::bridgeblack z17- (also has line z14-, line::bridgewhite z15-, pathtext z15-)
highway-track-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-trunk-bridge::bridgeblack # line::bridgeblack z13- (also has line z6-, line::bridgewhite z13-, pathtext z10-, shield::shield z10-)
highway-trunk_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z10-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-unclassified-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z13-)
@@ -407,7 +407,7 @@ piste:type-downhill-expert # line z14- (also has pathte
piste:type-downhill-freeride # line z14- (also has pathtext z15-)
piste:type-downhill-intermediate # line z14- (also has pathtext z15-)
piste:type-downhill-novice # line z14- (also has pathtext z15-)
piste:type-hike # line z14- (also has pathtext z15-)
piste:type-hike # line z15- (also has pathtext z15-)
piste:type-nordic # line z14- (also has pathtext z15-)
piste:type-skitour # line z14- (also has pathtext z15-)
piste:type-sled # line z14- (also has pathtext z15-)

View File

@@ -705,13 +705,13 @@ natural-rock # icon z17- (also has captio
highway-bridleway # pathtext z15- (also has line z14-)
highway-bridleway-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-bridleway-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-path # pathtext z15- (also has line z14-)
highway-path-bicycle # pathtext z15- (also has line z14-, line::cycleline z14-)
highway-path-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-path-difficult # pathtext z15- (also has line z14-)
highway-path-expert # pathtext z15- (also has line z14-)
highway-path-horse # pathtext z15- (also has line z14-)
highway-path-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-path # pathtext z15- (also has line z15-)
highway-path-bicycle # pathtext z15- (also has line z15-, line::cycleline z14-)
highway-path-bridge # pathtext z15- (also has line z15-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-path-difficult # pathtext z15- (also has line z15-)
highway-path-expert # pathtext z15- (also has line z15-)
highway-path-horse # pathtext z15- (also has line z15-)
highway-path-tunnel # pathtext z15- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2820
highway-steps # pathtext z16- (also has line z15-)
@@ -719,11 +719,11 @@ highway-steps-bridge # pathtext z16- (also has li
highway-steps-tunnel # pathtext z16- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2810
highway-track # pathtext z15- (also has line z14-)
highway-track-area # pathtext z15- (also has line z14-)
highway-track-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-track-no-access # pathtext z15- (also has line z14-)
highway-track-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-track # pathtext z15- (also has line z15-)
highway-track-area # pathtext z15- (also has line z15-)
highway-track-bridge # pathtext z15- (also has line z15-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-track-no-access # pathtext z15- (also has line z15-)
highway-track-tunnel # pathtext z15- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2780
highway-service # pathtext z16- (also has line z15-)
@@ -739,7 +739,7 @@ piste:type-downhill-expert # pathtext z15- (also has li
piste:type-downhill-freeride # pathtext z15- (also has line z14-)
piste:type-downhill-intermediate # pathtext z15- (also has line z14-)
piste:type-downhill-novice # pathtext z15- (also has line z14-)
piste:type-hike # pathtext z15- (also has line z14-)
piste:type-hike # pathtext z15- (also has line z15-)
piste:type-nordic # pathtext z15- (also has line z14-)
piste:type-skitour # pathtext z15- (also has line z14-)
piste:type-sled # pathtext z15- (also has line z14-)

View File

@@ -65,8 +65,8 @@
/* 4.LANDUSE */
/*4.1 Main landuse*/
@pedestrian_area: #F7EDDF;
@pedestrian_area_light: #FAF0E2;
@pedestrian_area: #FAF0E2;
@pedestrian_area_light: #FCF2E4;
@railway_platform: #ECE3D6;
@university: #F5DFBC;
@hospital: #FFDAD6;

View File

@@ -1,10 +1,58 @@
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<title>train-m</title>
<g fill="none" fill-rule="evenodd">
<g id="train-m" fill-rule="nonzero">
<rect id="Rectangle" width="24" height="24" rx="2.5" fill="#fff" opacity=".6"/>
<rect id="Rectangle" x="1" y="1" width="22" height="22" rx="2" fill="#2F6499"/>
<path id="Shape" d="m11.895 5c-2.9474 0-5.8947 0.36842-5.8947 2.9474v7c0 1.4221 1.1568 2.5789 2.5789 2.5789l-1.1053 1.1053v0.36842h1.6432l1.4737-1.4737h2.7779l1.4737 1.4737h1.4737v-0.36842l-1.1053-1.1053c1.4221 0 2.5789-1.1568 2.5789-2.5789v-7c0-2.5789-2.6379-2.9474-5.8947-2.9474zm-3.3158 11.053c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053s1.1053 0.49368 1.1053 1.1053c0 0.61158-0.49368 1.1053-1.1053 1.1053zm2.5789-5.1579h-3.6842v-2.9474h3.6842v2.9474zm1.4737 0v-2.9474h3.6842v2.9474h-3.6842zm2.5789 5.1579c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053 0.61158 0 1.1053 0.49368 1.1053 1.1053 0 0.61158-0.49368 1.1053-1.1053 1.1053z" fill="#fff"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 24 24"
width="18"
height="18"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-m</title>
<g
fill="none"
fill-rule="evenodd"
id="g1"
transform="matrix(-1,0,0,1,24,0)">
<g
id="train-m"
fill-rule="nonzero">
<rect
id="Rectangle"
width="24"
height="24"
rx="2.5"
fill="#ffffff"
opacity="0.6"
x="0"
y="0" />
<rect
id="rect1"
x="1"
y="1"
width="22"
height="22"
rx="2"
fill="#2f6499" />
<path
id="train-m-a"
d="m 3.0333,14 0.66667,-1 h -1.7 l -2,3 H 0.6296 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 2.366634,15 h 7.2667 l 0.072934,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z M 3.3868,0 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 9.97276,12.999485 9.947133,13 9.921504,13 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.9264e-4,-0.05126 0.0014777,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z M 2.92316,2.5 C 2.4018,2.5 1.96792,2.90055 1.92634,3.42025 l -0.24,3 C 1.68422,6.446779 1.68316,6.473382 1.68316,6.499995 c 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.026614,0 0.053216,-0.00106 0.079745,-0.00318 0.55053,-0.044042 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 2.999965,11 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
transform="matrix(-1,0,0,1,17.999984,4)"
style="fill:#ffffff;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-m</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 16 16" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<title>train-s</title>
<g fill="none" fill-rule="evenodd">
<g id="train-s" fill-rule="nonzero">
<rect id="Rectangle" width="16" height="16" rx="2.5" fill="#fff" opacity=".6"/>
<rect id="Rectangle" x=".66667" y=".66667" width="14.667" height="14.667" rx="2" fill="#2F6499"/>
<path id="Shape" d="m7.9298 3.3333c-1.9649 0-3.9298 0.24561-3.9298 1.9649v4.6667c0 0.94807 0.77123 1.7193 1.7193 1.7193l-0.73684 0.73684v0.24561h1.0954l0.98246-0.98246h1.8519l0.98246 0.98246h0.98246v-0.24561l-0.73684-0.73684c0.94807 0 1.7193-0.77123 1.7193-1.7193v-4.6667c0-1.7193-1.7586-1.9649-3.9298-1.9649zm-2.2105 7.3684c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684zm1.7193-3.4386h-2.4561v-1.9649h2.4561v1.9649zm0.98246 0v-1.9649h2.4561v1.9649h-2.4561zm1.7193 3.4386c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684z" fill="#fff"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 16 16"
width="12"
height="12"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-s</title>
<g
fill="none"
fill-rule="evenodd"
id="g1">
<g
id="train-s"
fill-rule="nonzero">
<rect
id="Rectangle"
width="16"
height="16"
rx="2.5"
fill="#fff"
opacity=".6" />
<rect
id="rect1"
x=".66667"
y=".66667"
width="14.667"
height="14.667"
rx="2"
fill="#2F6499" />
<path
id="train-m-a-8"
d="m 3.0333,14 0.66667,-1 h -1.7 l -2,3 H 0.6296 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 2.366634,15 h 7.2667 l 0.072934,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z M 3.3868,0 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 9.97276,12.999485 9.947133,13 9.921504,13 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.9264e-4,-0.05126 0.0014777,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z M 2.92316,2.5 C 2.4018,2.5 1.96792,2.90055 1.92634,3.42025 l -0.24,3 C 1.68422,6.446779 1.68316,6.473382 1.68316,6.499995 c 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.026614,0 0.053216,-0.00106 0.079745,-0.00318 0.55053,-0.044042 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 2.999965,11 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
transform="matrix(0.66666667,0,0,0.66666667,4.0001807,2.6668367)"
style="fill:#ffffff;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-s</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -270,6 +270,7 @@ public:
string const opening_hours(meta.Get(feature::Metadata::FMD_OPEN_HOURS));
string const wikipedia(meta.Get(feature::Metadata::FMD_WIKIPEDIA));
string const wikimedia_commons(meta.Get(feature::Metadata::FMD_WIKIMEDIA_COMMONS));
string const panoramax(meta.Get(feature::Metadata::FMD_PANORAMAX));
string const floor(meta.Get(feature::Metadata::FMD_LEVEL));
string const fee = category.ends_with("-fee") ? "yes" : "";
string const atm = HasAtm(f) ? "yes" : "";
@@ -278,7 +279,7 @@ public:
osmId, uid, lat, lon, mwmName, category, name, std::string(city),
addrStreet, addrHouse, phone, website, stars, std::string(metaOperator), internet,
denomination, wheelchair, opening_hours, wikipedia, floor, fee, atm, contact_facebook,
contact_instagram, contact_twitter, contact_vk, contact_line, contact_fediverse, contact_bluesky, wikimedia_commons};
contact_instagram, contact_twitter, contact_vk, contact_line, contact_fediverse, contact_bluesky, wikimedia_commons, panoramax};
AppendNames(f, columns);
PrintAsCSV(columns, ';', cout);
@@ -292,7 +293,7 @@ void PrintHeader()
"phone", "website", "cuisines", "stars", "operator",
"internet", "denomination", "wheelchair", "opening_hours", "wikipedia",
"floor", "fee", "atm", "contact_facebook", "contact_instagram",
"contact_twitter", "contact_vk", "contact_line", "contact_fediverse", "contact_bluesky", "wikimedia_commons"};
"contact_twitter", "contact_vk", "contact_line", "contact_fediverse", "contact_bluesky", "wikimedia_commons", "panoramax"};
// Append all supported name languages in order.
for (uint8_t idx = 1; idx < kLangCount; idx++)
columns.push_back("name_" + string(StringUtf8Multilang::GetLangByCode(idx)));

View File

@@ -17,6 +17,7 @@
#include <cmath>
#include <cstdlib>
#include <optional>
#include <regex>
#include <unordered_map>
#include <unordered_set>
@@ -309,6 +310,22 @@ std::string MetadataTagProcessorImpl::ValidateAndFormat_wikimedia_commons(std::s
return {};
}
std::string MetadataTagProcessorImpl::ValidateAndFormat_panoramax(std::string v)
{
static auto const s_panoramaxRegex = std::regex(R"(^([a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12})$)");
if (std::regex_match(v, s_panoramaxRegex))
return v;
url::Url const parsedUrl = url::Url::FromString(v);
if (const std::string* paramValue = parsedUrl.GetParamValue("pic"))
{
if (std::regex_match(*paramValue, s_panoramaxRegex))
return v;
}
LOG(LDEBUG, ("Invalid Panoramax tag value:", v));
return {};
}
std::string MetadataTagProcessorImpl::ValidateAndFormat_airport_iata(std::string const & v) const
{
if (!ftypes::IsAirportChecker::Instance()(m_params.m_types))
@@ -548,6 +565,7 @@ void MetadataTagProcessor::operator()(std::string const & k, std::string const &
case Metadata::FMD_POSTCODE: valid = ValidateAndFormat_postcode(v); break;
case Metadata::FMD_WIKIPEDIA: valid = ValidateAndFormat_wikipedia(v); break;
case Metadata::FMD_WIKIMEDIA_COMMONS: valid = ValidateAndFormat_wikimedia_commons(v); break;
case Metadata::FMD_PANORAMAX: valid = ValidateAndFormat_panoramax(v); break;
case Metadata::FMD_FLATS: valid = ValidateAndFormat_flats(v); break;
case Metadata::FMD_MIN_HEIGHT: // The same validator as for height.
case Metadata::FMD_HEIGHT: valid = ValidateAndFormat_height(v); break;

View File

@@ -33,6 +33,7 @@ struct MetadataTagProcessorImpl
static std::string ValidateAndFormat_denomination(std::string const & v) ;
static std::string ValidateAndFormat_wikipedia(std::string v) ;
static std::string ValidateAndFormat_wikimedia_commons(std::string v) ;
static std::string ValidateAndFormat_panoramax(std::string v) ;
std::string ValidateAndFormat_airport_iata(std::string const & v) const;
static std::string ValidateAndFormat_brand(std::string const & v);
std::string ValidateAndFormat_duration(std::string const & v) const;

View File

@@ -124,6 +124,8 @@ bool Metadata::TypeFromString(string_view k, Metadata::EType & outType)
outType = Metadata::FMD_WIKIPEDIA;
else if (k == "wikimedia_commons")
outType = Metadata::FMD_WIKIMEDIA_COMMONS;
else if (k == "panoramax")
outType = Metadata::FMD_PANORAMAX;
else if (k == "addr:flats")
outType = Metadata::FMD_FLATS;
else if (k == "height")
@@ -275,6 +277,7 @@ string ToString(Metadata::EType type)
case Metadata::FMD_JUNCTION_REF: return "junction:ref";
case Metadata::FMD_BUILDING_MIN_LEVEL: return "building:min_level";
case Metadata::FMD_WIKIMEDIA_COMMONS: return "wikimedia_commons";
case Metadata::FMD_PANORAMAX: return "panoramax";
case Metadata::FMD_CAPACITY: return "capacity";
case Metadata::FMD_WHEELCHAIR: return "wheelchair";
case Metadata::FMD_LOCAL_REF: return "local_ref";

View File

@@ -157,6 +157,7 @@ public:
FMD_NETWORK = 49,
FMD_CONTACT_FEDIVERSE = 50,
FMD_CONTACT_BLUESKY = 51,
FMD_PANORAMAX = 52,
FMD_COUNT
};

View File

@@ -54,6 +54,7 @@ constexpr string_view kUrlTwitter{"https://twitter.com/"};
constexpr string_view kUrlVk{"https://vk.com/"};
constexpr string_view kUrlLine{"https://line.me/R/ti/p/@"};
constexpr string_view kUrlBluesky{"https://bsky.app/profile/"};
constexpr string_view kUrlPanoramax{"https://api.panoramax.xyz/?pic="};
constexpr string_view kHttp{"http://"};
constexpr string_view kHttps{"https://"};
@@ -673,6 +674,8 @@ string socialContactToURL(MapObject::MetadataID metaID, string_view value)
return string{kUrlLine}.append(value);
else // 'value' is an URL.
return string{kHttps}.append(value);
case MapObject::MetadataID::FMD_PANORAMAX:
return string{kUrlPanoramax}.append(value);
default:
return string{value};
}

View File

@@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, readonly, nullable) NSString *vk;
@property(nonatomic, readonly, nullable) NSString *line;
@property(nonatomic, readonly, nullable) NSString *bluesky;
@property(nonatomic, readonly, nullable) NSString *panoramax;
@property(nonatomic, readonly, nullable) NSString *email;
@property(nonatomic, readonly, nullable) NSURL *emailUrl;
@property(nonatomic, readonly, nullable) NSString *cuisine;

View File

@@ -75,6 +75,7 @@ NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::st
case MetadataID::FMD_CONTACT_VK: _vk = ToNSString(value); break;
case MetadataID::FMD_CONTACT_LINE: _line = ToNSString(value); break;
case MetadataID::FMD_CONTACT_BLUESKY: _bluesky = ToNSString(value); break;
case MetadataID::FMD_PANORAMAX: _panoramax = ToNSString(value); break;
case MetadataID::FMD_OPERATOR: _ppOperator = [NSString stringWithFormat:NSLocalizedString(@"operator", nil), ToNSString(value)]; break;
case MetadataID::FMD_INTERNET:
_wifiAvailable = (rawData.GetInternet() == feature::Internet::No)

View File

@@ -1,5 +1,6 @@
#import "MWMSideButtonsView.h"
#import "MWMButton.h"
#import "MWMRouter.h"
#import "MWMMapViewControlsCommon.h"
#include "base/math.hpp"
@@ -32,6 +33,10 @@ CGFloat const kButtonsBottomOffset = 6;
CGFloat spacing = self.availableHeight - self.zoomOut.maxY - self.location.height;
spacing = base::Clamp(spacing, kLocationButtonSpacingMin, kLocationButtonSpacingMax);
if (!IPAD && (UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeLeft || UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeRight) && [MWMRouter isRoutingActive]) {
spacing = spacing - 36;
}
self.location.minY = self.zoomOut.maxY + spacing;
self.bounds = {{}, {self.zoomOut.width, self.location.maxY}};
if (self.zoomHidden)
@@ -62,6 +67,9 @@ CGFloat const kButtonsBottomOffset = 6;
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
self.midY = centerShift + self.superview.height / 2;
if ([MWMRouter isRoutingActive]) {
self.midY = self.midY - 18;
}
if (self.maxY > self.bottomBound)
self.maxY = self.bottomBound;
}];

View File

@@ -200,6 +200,8 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
}
- (void)onRouteStart {
[MWMSearch clear];
[self.searchManager close];
self.state = MWMNavigationDashboardStateNavigation;
}
- (void)onRouteStop {

View File

@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "ic_panoramax.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -276,6 +276,12 @@
/* Text in the editor */
"bluesky" = "Bluesky";
/* Text in menu */
"panoramax" = "Panoramax";
/* Text in menu */
"panoramax_picture" = "Panoramax Picture";
/* Text in menu */
"rate_the_app" = "Gradeer die toep";

View File

@@ -276,6 +276,12 @@
/* Text in the editor */
"bluesky" = "Bluesky";
/* Text in menu */
"panoramax" = "Panoramax";
/* Text in menu */
"panoramax_picture" = "Panoramax Picture";
/* Text in menu */
"rate_the_app" = "قيّم التطبيق";
@@ -476,7 +482,7 @@
"read_in_wikipedia" = "ويكيبيديا";
/* Place Page link to Wikimedia Commons. */
"wikimedia_commons" = "Wikimedia Commons";
"wikimedia_commons" = "ويكيميديا كومنز";
"p2p_your_location" = "موقعك";
"p2p_start" = "ابدأ";
"p2p_from_here" = "الطريق من هنا";

Some files were not shown because too many files have changed in this diff Show More