diff --git a/.gitignore b/.gitignore
index eabc43ecf4a..cf296c9d454 100644
--- a/.gitignore
+++ b/.gitignore
@@ -187,3 +187,4 @@ screenshots/
android/src/google/play/listings/
keywords/
iphone/metadata/**/keywords.txt
+*.cache
\ No newline at end of file
diff --git a/README.md b/README.md
index a685f7db655..33000137a7f 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[Organic Maps](https://organicmaps.app) is a free Android & iOS offline maps app for travellers, tourists, drivers, hikers, and cyclists.
It uses crowd-sourced [OpenStreetMap](https://www.openstreetmap.org) data and is developed with love by the creators of **MapsWithMe** (later renamed to **Maps.Me**) and by our community.
-No ads, no tracking, no data collection, no crapware. Your [donations](https://organicmaps.app/donate/) and positive reviews motivate and inspire us, thanks ❤️!
+No ads, no tracking, no crapware. Your [donations](https://organicmaps.app/donate/) and positive reviews motivate and inspire us, thanks ❤️!
@@ -54,7 +54,6 @@ Organic Maps is free from trackers and other bad stuff:
- No ads
- No tracking
-- No data collection
- No phoning home
- No annoying registration
- No mandatory tutorials
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 3b7dc6cff76..797b911f686 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -24,9 +24,9 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:8.4.1'
- if (googleFirebaseServicesEnabled) {
- println('Building with Google Firebase Services')
classpath 'com.google.gms:google-services:4.4.1'
+ println('Building with Google Firebase Services')
+ if (googleFirebaseServicesEnabled) {
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.2.0'
} else {
@@ -46,8 +46,8 @@ repositories {
apply plugin: 'com.android.application'
apply from: 'secure.properties'
-if (googleFirebaseServicesEnabled) {
apply plugin: 'com.google.gms.google-services'
+if (googleFirebaseServicesEnabled) {
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.firebase.appdistribution'
}
@@ -82,7 +82,7 @@ def getCommitMessage() {
def osName = System.properties['os.name'].toLowerCase()
project.ext.appId = 'app.organicmaps'
-project.ext.appName = 'Organic Maps'
+project.ext.appName = 'DRIMS'
java {
toolchain {
@@ -263,7 +263,7 @@ android {
jniDebuggable true // Enable jni debug build
zipAlignEnabled true
signingConfig signingConfigs.debug
- resValue 'string', 'app_name', 'Debug Organic Maps'
+ resValue 'string', 'app_name', 'DRIMS'
// Do not generate separate debug symbols for debug apps, because we don't distribute them.
ndk.debugSymbolLevel = 'none'
@@ -347,7 +347,10 @@ android {
}
dependencies {
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
+ implementation 'com.google.firebase:firebase-messaging:24.0.0'
+ implementation 'androidx.activity:activity:1.8.0'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
+ implementation 'com.google.android.flexbox:flexbox:3.0.0'
// Google Play Location Services
//
@@ -361,16 +364,17 @@ dependencies {
webImplementation 'com.google.android.gms:play-services-location:21.2.0'
googleImplementation 'com.google.android.gms:play-services-location:21.2.0'
huaweiImplementation 'com.google.android.gms:play-services-location:21.2.0'
-
+ implementation platform('com.google.firebase:firebase-bom:33.1.2')
// Google Firebase Services
if (googleFirebaseServicesEnabled) {
// Import the BoM for the Firebase platform
- implementation platform('com.google.firebase:firebase-bom:32.8.0')
+
// Add the dependencies for the Crashlytics and Analytics libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-crashlytics-ndk'
}
+ implementation 'com.google.firebase:firebase-messaging'
// This line is added as a workaround for duplicate classes error caused by some outdated dependency:
// > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
diff --git a/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 25cea1a699b..00000000000
Binary files a/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png
deleted file mode 100644
index 7c95ae3b834..00000000000
Binary files a/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c39a6ea6e14..00000000000
Binary files a/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index e049c0bc1e9..00000000000
Binary files a/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index d0aeb2ccc8a..00000000000
Binary files a/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png
deleted file mode 100644
index bead024b021..00000000000
Binary files a/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index bcf93bd22ff..00000000000
Binary files a/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index caff93fb958..00000000000
Binary files a/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 856ae7f43ad..00000000000
Binary files a/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index c21da8b401f..00000000000
Binary files a/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 5edfb32bb28..8a22371e8ef 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,31 +1,30 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ //
+ -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/cpp/app/organicmaps/Framework.cpp b/android/app/src/main/cpp/app/organicmaps/Framework.cpp
index 8f377c6b245..addf8a2a2f4 100644
--- a/android/app/src/main/cpp/app/organicmaps/Framework.cpp
+++ b/android/app/src/main/cpp/app/organicmaps/Framework.cpp
@@ -1,19 +1,13 @@
#include "app/organicmaps/Framework.hpp"
-#include "app/organicmaps/core/jni_helper.hpp"
-#include "app/organicmaps/UserMarkHelper.hpp"
-#include "app/organicmaps/opengl/androidoglcontextfactory.hpp"
-#include "app/organicmaps/platform/AndroidPlatform.hpp"
-#include "app/organicmaps/util/Distance.hpp"
-#include "app/organicmaps/util/FeatureIdBuilder.hpp"
-#include "app/organicmaps/util/NetworkPolicy.hpp"
-#include "app/organicmaps/vulkan/android_vulkan_context_factory.hpp"
-
#include "map/bookmark_helpers.hpp"
#include "map/chart_generator.hpp"
#include "map/everywhere_search_params.hpp"
#include "map/user_mark.hpp"
+#include "routing/following_info.hpp"
+#include "routing/speed_camera_manager.hpp"
+
#include "storage/storage_defines.hpp"
#include "storage/storage_helpers.hpp"
@@ -24,25 +18,16 @@
#include "drape/support_manager.hpp"
#include "drape/visual_scale.hpp"
-#include "coding/files_container.hpp"
-
-#include "geometry/angles.hpp"
-#include "geometry/mercator.hpp"
-#include "geometry/point_with_altitude.hpp"
-
#include "indexer/feature_altitude.hpp"
#include "indexer/kayak.hpp"
#include "indexer/validate_and_format_contacts.hpp"
-#include "routing/following_info.hpp"
-#include "routing/speed_camera_manager.hpp"
-
#include "platform/country_file.hpp"
#include "platform/local_country_file.hpp"
#include "platform/local_country_file_utils.hpp"
#include "platform/locale.hpp"
-#include "platform/location.hpp"
#include "platform/localization.hpp"
+#include "platform/location.hpp"
#include "platform/measurement_utils.hpp"
#include "platform/network_policy.hpp"
#include "platform/platform.hpp"
@@ -50,19 +35,38 @@
#include "platform/settings.hpp"
#include "platform/utm_mgrs_utils.hpp"
+#include "coding/files_container.hpp"
+
+#include "geometry/angles.hpp"
+#include "geometry/mercator.hpp"
+#include "geometry/point_with_altitude.hpp"
+
#include "base/assert.hpp"
#include "base/file_name_utils.hpp"
#include "base/logging.hpp"
#include "base/math.hpp"
#include "base/sunrise_sunset.hpp"
-#include "3party/open-location-code/openlocationcode.h"
+#include "app/organicmaps/util/Distance.hpp"
+#include "app/organicmaps/util/FeatureIdBuilder.hpp"
+#include "app/organicmaps/util/NetworkPolicy.hpp"
+
+#include "app/organicmaps/platform/AndroidPlatform.hpp"
+
+#include "app/organicmaps/opengl/androidoglcontextfactory.hpp"
+
+#include "app/organicmaps/vulkan/android_vulkan_context_factory.hpp"
+
+#include "app/organicmaps/core/jni_helper.hpp"
+#include
#include
#include
#include
-#include
+#include "3party/open-location-code/openlocationcode.h"
+
+#include "app/organicmaps/UserMarkHelper.hpp"
using namespace std;
using namespace std::placeholders;
@@ -102,14 +106,13 @@ namespace android
enum MultiTouchAction
{
- MULTITOUCH_UP = 0x00000001,
- MULTITOUCH_DOWN = 0x00000002,
- MULTITOUCH_MOVE = 0x00000003,
- MULTITOUCH_CANCEL = 0x00000004
+ MULTITOUCH_UP = 0x00000001,
+ MULTITOUCH_DOWN = 0x00000002,
+ MULTITOUCH_MOVE = 0x00000003,
+ MULTITOUCH_CANCEL = 0x00000004
};
-Framework::Framework(std::function && afterMapsLoaded)
-: m_work({} /* params */, false /* loadMaps */)
+Framework::Framework(std::function && afterMapsLoaded) : m_work({} /* params */, false /* loadMaps */)
{
m_work.LoadMapsAsync(std::move(afterMapsLoaded));
@@ -124,10 +127,7 @@ void Framework::OnLocationError(int errorCode)
m_work.OnLocationError(static_cast(errorCode));
}
-void Framework::OnLocationUpdated(location::GpsInfo const & info)
-{
- m_work.OnLocationUpdate(info);
-}
+void Framework::OnLocationUpdated(location::GpsInfo const & info) { m_work.OnLocationUpdate(info); }
void Framework::OnCompassUpdated(location::CompassInfo const & info, bool forceRedraw)
{
@@ -181,15 +181,14 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi
int constexpr kMinSdkVersionForVulkan = 26;
int const sdkVersion = android_get_device_api_level();
LOG(LINFO, ("Android SDK version in the Drape Engine:", sdkVersion));
- auto const vulkanForbidden = sdkVersion < kMinSdkVersionForVulkan ||
- dp::SupportManager::Instance().IsVulkanForbidden();
+ auto const vulkanForbidden =
+ sdkVersion < kMinSdkVersionForVulkan || dp::SupportManager::Instance().IsVulkanForbidden();
if (vulkanForbidden)
LOG(LWARNING, ("Vulkan API is forbidden on this device."));
if (m_work.LoadPreferredGraphicsAPI() == dp::ApiVersion::Vulkan && !vulkanForbidden)
{
- m_vulkanContextFactory =
- make_unique_dp(appVersionCode, sdkVersion);
+ m_vulkanContextFactory = make_unique_dp(appVersionCode, sdkVersion);
if (!CastFactory(m_vulkanContextFactory)->IsVulkanSupported())
{
LOG(LWARNING, ("Vulkan API is not supported."));
@@ -211,8 +210,7 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi
AndroidOGLContextFactory * oglFactory = nullptr;
if (!m_vulkanContextFactory)
{
- m_oglContextFactory = make_unique_dp(
- new AndroidOGLContextFactory(env, jSurface));
+ m_oglContextFactory = make_unique_dp(new AndroidOGLContextFactory(env, jSurface));
oglFactory = m_oglContextFactory->CastFactory();
if (!oglFactory->IsValid())
{
@@ -232,8 +230,7 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi
else
{
CHECK(oglFactory != nullptr, ());
- p.m_apiVersion = oglFactory->IsSupportedOpenGLES3() ? dp::ApiVersion::OpenGLES3 :
- dp::ApiVersion::OpenGLES2;
+ p.m_apiVersion = oglFactory->IsSupportedOpenGLES3() ? dp::ApiVersion::OpenGLES3 : dp::ApiVersion::OpenGLES2;
p.m_surfaceWidth = oglFactory->GetWidth();
p.m_surfaceHeight = oglFactory->GetHeight();
}
@@ -256,10 +253,7 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi
return true;
}
-bool Framework::IsDrapeEngineCreated() const
-{
- return m_work.IsDrapeEngineCreated();
-}
+bool Framework::IsDrapeEngineCreated() const { return m_work.IsDrapeEngineCreated(); }
void Framework::UpdateDpi(int dpi)
{
@@ -413,10 +407,7 @@ void Framework::ResumeSurfaceRendering()
LOG(LINFO, ("Resume surface rendering."));
}
-void Framework::SetMapStyle(MapStyle mapStyle)
-{
- m_work.SetMapStyle(mapStyle);
-}
+void Framework::SetMapStyle(MapStyle mapStyle) { m_work.SetMapStyle(mapStyle); }
void Framework::MarkMapStyle(MapStyle mapStyle)
{
@@ -428,43 +419,25 @@ void Framework::MarkMapStyle(MapStyle mapStyle)
m_work.MarkMapStyle(mapStyle);
}
-MapStyle Framework::GetMapStyle() const
-{
- return m_work.GetMapStyle();
-}
+MapStyle Framework::GetMapStyle() const { return m_work.GetMapStyle(); }
-void Framework::Save3dMode(bool allow3d, bool allow3dBuildings)
-{
- m_work.Save3dMode(allow3d, allow3dBuildings);
-}
+void Framework::Save3dMode(bool allow3d, bool allow3dBuildings) { m_work.Save3dMode(allow3d, allow3dBuildings); }
-void Framework::Set3dMode(bool allow3d, bool allow3dBuildings)
-{
- m_work.Allow3dMode(allow3d, allow3dBuildings);
-}
+void Framework::Set3dMode(bool allow3d, bool allow3dBuildings) { m_work.Allow3dMode(allow3d, allow3dBuildings); }
-void Framework::Get3dMode(bool & allow3d, bool & allow3dBuildings)
-{
- m_work.Load3dMode(allow3d, allow3dBuildings);
-}
+void Framework::Get3dMode(bool & allow3d, bool & allow3dBuildings) { m_work.Load3dMode(allow3d, allow3dBuildings); }
-void Framework::SetChoosePositionMode(ChoosePositionMode mode, bool isBusiness,
- bool hasPosition, m2::PointD const & position)
+void Framework::SetChoosePositionMode(ChoosePositionMode mode, bool isBusiness, bool hasPosition,
+ m2::PointD const & position)
{
m_isChoosePositionMode = mode;
m_work.BlockTapEvents(mode != ChoosePositionMode::None);
m_work.EnableChoosePositionMode(mode != ChoosePositionMode::None, isBusiness, hasPosition, position);
}
-ChoosePositionMode Framework::GetChoosePositionMode()
-{
- return m_isChoosePositionMode;
-}
+ChoosePositionMode Framework::GetChoosePositionMode() { return m_isChoosePositionMode; }
-Storage & Framework::GetStorage()
-{
- return m_work.GetStorage();
-}
+Storage & Framework::GetStorage() { return m_work.GetStorage(); }
DataSource const & Framework::GetDataSource() { return m_work.GetDataSource(); }
@@ -481,37 +454,22 @@ void Framework::ShowNode(CountryId const & idx, bool zoomToDownloadButton)
}
}
-void Framework::Scale(double factor, m2::PointD const & pxPoint, bool isAnim)
-{
- m_work.Scale(factor, pxPoint, isAnim);
-}
+void Framework::Scale(double factor, m2::PointD const & pxPoint, bool isAnim) { m_work.Scale(factor, pxPoint, isAnim); }
-void Framework::Scroll(double distanceX, double distanceY)
-{
- m_work.Scroll(distanceX, distanceY);
-}
+void Framework::Scroll(double distanceX, double distanceY) { m_work.Scroll(distanceX, distanceY); }
void Framework::Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer)
{
MultiTouchAction eventType = static_cast(action);
df::TouchEvent event;
- switch(eventType)
+ switch (eventType)
{
- case MULTITOUCH_DOWN:
- event.SetTouchType(df::TouchEvent::TOUCH_DOWN);
- break;
- case MULTITOUCH_MOVE:
- event.SetTouchType(df::TouchEvent::TOUCH_MOVE);
- break;
- case MULTITOUCH_UP:
- event.SetTouchType(df::TouchEvent::TOUCH_UP);
- break;
- case MULTITOUCH_CANCEL:
- event.SetTouchType(df::TouchEvent::TOUCH_CANCEL);
- break;
- default:
- return;
+ case MULTITOUCH_DOWN: event.SetTouchType(df::TouchEvent::TOUCH_DOWN); break;
+ case MULTITOUCH_MOVE: event.SetTouchType(df::TouchEvent::TOUCH_MOVE); break;
+ case MULTITOUCH_UP: event.SetTouchType(df::TouchEvent::TOUCH_UP); break;
+ case MULTITOUCH_CANCEL: event.SetTouchType(df::TouchEvent::TOUCH_CANCEL); break;
+ default: return;
}
df::Touch touch;
@@ -527,20 +485,11 @@ void Framework::Touch(int action, Finger const & f1, Finger const & f2, uint8_t
m_work.TouchEvent(event);
}
-m2::PointD Framework::GetViewportCenter() const
-{
- return m_work.GetViewportCenter();
-}
+m2::PointD Framework::GetViewportCenter() const { return m_work.GetViewportCenter(); }
-void Framework::AddString(string const & name, string const & value)
-{
- m_work.AddString(name, value);
-}
+void Framework::AddString(string const & name, string const & value) { m_work.AddString(name, value); }
-void Framework::Scale(::Framework::EScaleMode mode)
-{
- m_work.Scale(mode, true);
-}
+void Framework::Scale(::Framework::EScaleMode mode) { m_work.Scale(mode, true); }
void Framework::Scale(m2::PointD const & centerPt, int targetZoom, bool animate)
{
@@ -549,10 +498,7 @@ void Framework::Scale(m2::PointD const & centerPt, int targetZoom, bool animate)
engine->SetModelViewCenter(centerPt, targetZoom, animate, false);
}
-::Framework * Framework::NativeFramework()
-{
- return &m_work;
-}
+::Framework * Framework::NativeFramework() { return &m_work; }
bool Framework::Search(search::EverywhereSearchParams const & params)
{
@@ -560,15 +506,11 @@ bool Framework::Search(search::EverywhereSearchParams const & params)
return m_work.GetSearchAPI().SearchEverywhere(params);
}
-void Framework::AddLocalMaps()
-{
- m_work.RegisterAllMaps();
-}
+void Framework::SendDeviceToken(std::string const & token) { m_work.HandleDeviceToken(token); }
-void Framework::RemoveLocalMaps()
-{
- m_work.DeregisterAllMaps();
-}
+void Framework::AddLocalMaps() { m_work.RegisterAllMaps(); }
+
+void Framework::RemoveLocalMaps() { m_work.DeregisterAllMaps(); }
void Framework::ReloadWorldMaps()
{
@@ -587,15 +529,9 @@ void Framework::MoveBookmark(kml::MarkId markId, kml::MarkGroupId curCat, kml::M
m_work.GetBookmarkManager().GetEditSession().MoveBookmark(markId, curCat, newCat);
}
-void Framework::ExecuteMapApiRequest()
-{
- return m_work.ExecuteMapApiRequest();
-}
+void Framework::ExecuteMapApiRequest() { return m_work.ExecuteMapApiRequest(); }
-void Framework::DeactivatePopup()
-{
- m_work.DeactivateMapSelection();
-}
+void Framework::DeactivatePopup() { m_work.DeactivateMapSelection(); }
/*
string Framework::GetOutdatedCountriesString()
@@ -636,10 +572,7 @@ void Framework::SetIsolinesListener(IsolinesManager::IsolinesStateChangedFn cons
m_onIsolinesStateChangedFn = function;
}
-bool Framework::IsTrafficEnabled()
-{
- return m_work.GetTrafficManager().IsEnabled();
-}
+bool Framework::IsTrafficEnabled() { return m_work.GetTrafficManager().IsEnabled(); }
void Framework::EnableTraffic()
{
@@ -653,15 +586,12 @@ void Framework::DisableTraffic()
NativeFramework()->SaveTrafficEnabled(false);
}
-void Framework::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn)
-{
- m_myPositionModeSignal = fn;
-}
+void Framework::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn) { m_myPositionModeSignal = fn; }
location::EMyPositionMode Framework::GetMyPositionMode() const
{
// No need in assertion here, return location::PendingPosition if no engine created.
- //ASSERT(IsDrapeEngineCreated(), ());
+ // ASSERT(IsDrapeEngineCreated(), ());
return m_work.GetMyPositionMode();
}
@@ -691,35 +621,17 @@ void Framework::ApplyWidgets()
m_work.SetWidgetLayout(std::move(layout));
}
-void Framework::CleanWidgets()
-{
- m_guiPositions.clear();
-}
+void Framework::CleanWidgets() { m_guiPositions.clear(); }
-void Framework::SetupMeasurementSystem()
-{
- m_work.SetupMeasurementSystem();
-}
+void Framework::SetupMeasurementSystem() { m_work.SetupMeasurementSystem(); }
-place_page::Info & Framework::GetPlacePageInfo()
-{
- return m_work.GetCurrentPlacePageInfo();
-}
+place_page::Info & Framework::GetPlacePageInfo() { return m_work.GetCurrentPlacePageInfo(); }
-bool Framework::IsAutoRetryDownloadFailed()
-{
- return m_work.GetDownloadingPolicy().IsAutoRetryDownloadFailed();
-}
+bool Framework::IsAutoRetryDownloadFailed() { return m_work.GetDownloadingPolicy().IsAutoRetryDownloadFailed(); }
-bool Framework::IsDownloadOn3gEnabled()
-{
- return m_work.GetDownloadingPolicy().IsCellularDownloadEnabled();
-}
+bool Framework::IsDownloadOn3gEnabled() { return m_work.GetDownloadingPolicy().IsCellularDownloadEnabled(); }
-void Framework::EnableDownloadOn3g()
-{
- m_work.GetDownloadingPolicy().EnableCellularDownload(true);
-}
+void Framework::EnableDownloadOn3g() { m_work.GetDownloadingPolicy().EnableCellularDownload(true); }
/*
int Framework::ToDoAfterUpdate() const
@@ -759,233 +671,230 @@ FeatureID Framework::BuildFeatureId(JNIEnv * env, jobject featureId)
extern "C"
{
-void CallRoutingListener(shared_ptr listener, int errorCode,
- storage::CountriesSet const & absentMaps)
-{
- JNIEnv * env = jni::GetEnv();
- jmethodID const method = jni::GetMethodID(env, *listener, "onRoutingEvent", "(I[Ljava/lang/String;)V");
- ASSERT(method, ());
+ void CallRoutingListener(shared_ptr listener, int errorCode, storage::CountriesSet const & absentMaps)
+ {
+ JNIEnv * env = jni::GetEnv();
+ jmethodID const method = jni::GetMethodID(env, *listener, "onRoutingEvent", "(I[Ljava/lang/String;)V");
+ ASSERT(method, ());
- env->CallVoidMethod(*listener, method, errorCode, jni::TScopedLocalObjectArrayRef(env, jni::ToJavaStringArray(env, absentMaps)).get());
-}
+ env->CallVoidMethod(*listener, method, errorCode,
+ jni::TScopedLocalObjectArrayRef(env, jni::ToJavaStringArray(env, absentMaps)).get());
+ }
-void CallRouteProgressListener(shared_ptr listener, float progress)
-{
- JNIEnv * env = jni::GetEnv();
- jmethodID const methodId = jni::GetMethodID(env, *listener, "onRouteBuildingProgress", "(F)V");
- env->CallVoidMethod(*listener, methodId, progress);
-}
+ void CallRouteProgressListener(shared_ptr listener, float progress)
+ {
+ JNIEnv * env = jni::GetEnv();
+ jmethodID const methodId = jni::GetMethodID(env, *listener, "onRouteBuildingProgress", "(F)V");
+ env->CallVoidMethod(*listener, methodId, progress);
+ }
-void CallRouteRecommendationListener(shared_ptr listener,
- RoutingManager::Recommendation recommendation)
-{
- JNIEnv * env = jni::GetEnv();
- jmethodID const methodId = jni::GetMethodID(env, *listener, "onRecommend", "(I)V");
- env->CallVoidMethod(*listener, methodId, static_cast(recommendation));
-}
+ void CallRouteRecommendationListener(shared_ptr listener, RoutingManager::Recommendation recommendation)
+ {
+ JNIEnv * env = jni::GetEnv();
+ jmethodID const methodId = jni::GetMethodID(env, *listener, "onRecommend", "(I)V");
+ env->CallVoidMethod(*listener, methodId, static_cast(recommendation));
+ }
-void CallSetRoutingLoadPointsListener(shared_ptr listener, bool success)
-{
- JNIEnv * env = jni::GetEnv();
- jmethodID const methodId = jni::GetMethodID(env, *listener, "onRoutePointsLoaded", "(Z)V");
- env->CallVoidMethod(*listener, methodId, static_cast(success));
-}
+ void CallSetRoutingLoadPointsListener(shared_ptr listener, bool success)
+ {
+ JNIEnv * env = jni::GetEnv();
+ jmethodID const methodId = jni::GetMethodID(env, *listener, "onRoutePointsLoaded", "(Z)V");
+ env->CallVoidMethod(*listener, methodId, static_cast(success));
+ }
-RoutingManager::LoadRouteHandler g_loadRouteHandler;
+ RoutingManager::LoadRouteHandler g_loadRouteHandler;
-/// @name JNI EXPORTS
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetAddress(JNIEnv * env, jclass clazz, jdouble lat, jdouble lon)
-{
- auto const info = frm()->GetAddressAtPoint(mercator::FromLatLon(lat, lon));
- return jni::ToJavaString(env, info.FormatAddress());
-}
+ /// @name JNI EXPORTS
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetAddress(JNIEnv * env, jclass clazz, jdouble lat,
+ jdouble lon)
+ {
+ auto const info = frm()->GetAddressAtPoint(mercator::FromLatLon(lat, lon));
+ return jni::ToJavaString(env, info.FormatAddress());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeClearApiPoints(JNIEnv * env, jclass clazz)
-{
- frm()->GetBookmarkManager().GetEditSession().ClearGroup(UserMark::Type::API);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_PushNotificationService_nativeSendTokenToCpp(JNIEnv * env, jobject thiz,
+ jstring token)
+ {
+ g_framework->SendDeviceToken(jni::ToNativeString(env, token));
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeParseAndSetApiUrl(JNIEnv * env, jclass clazz, jstring url)
-{
- return static_cast(frm()->ParseAndSetApiURL(jni::ToNativeString(env, url)));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeClearApiPoints(JNIEnv * env, jclass clazz)
+ {
+ frm()->GetBookmarkManager().GetEditSession().ClearGroup(UserMark::Type::API);
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetParsedRoutingData(JNIEnv * env, jclass clazz)
-{
- using namespace url_scheme;
- static jclass const pointClazz = jni::GetGlobalClassRef(env, "app/organicmaps/api/RoutePoint");
- // Java signature : RoutePoint(double lat, double lon, String name)
- static jmethodID const pointConstructor = jni::GetConstructorID(env, pointClazz, "(DDLjava/lang/String;)V");
-
- static jclass const routeDataClazz = jni::GetGlobalClassRef(env, "app/organicmaps/api/ParsedRoutingData");
- // Java signature : ParsedRoutingData(RoutePoint[] points, int routerType) {
- static jmethodID const routeDataConstructor = jni::GetConstructorID(env, routeDataClazz, "([Lapp/organicmaps/api/RoutePoint;I)V");
-
- auto const & routingData = frm()->GetParsedRoutingData();
- jobjectArray points = jni::ToJavaArray(env, pointClazz, routingData.m_points,
- [](JNIEnv * env, RoutePoint const & point)
- {
- jni::TScopedLocalRef const name(env, jni::ToJavaString(env, point.m_name));
- return env->NewObject(pointClazz, pointConstructor,
- mercator::YToLat(point.m_org.y),
- mercator::XToLon(point.m_org.x), name.get());
- });
-
- return env->NewObject(routeDataClazz, routeDataConstructor, points, routingData.m_type);
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeParseAndSetApiUrl(JNIEnv * env, jclass clazz, jstring url)
+ {
+ return static_cast(frm()->ParseAndSetApiURL(jni::ToNativeString(env, url)));
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetParsedSearchRequest(JNIEnv * env, jclass clazz)
-{
- using namespace url_scheme;
- static jclass const cl = jni::GetGlobalClassRef(env, "app/organicmaps/api/ParsedSearchRequest");
- // Java signature : ParsedSearchRequest(String query, String locale, double lat, double lon, boolean isSearchOnMap)
- static jmethodID const ctor = jni::GetConstructorID(env, cl, "(Ljava/lang/String;Ljava/lang/String;DDZ)V");
- auto const & r = frm()->GetParsedSearchRequest();
- ms::LatLon const center = frm()->GetParsedCenterLatLon();
- return env->NewObject(cl, ctor, jni::ToJavaString(env, r.m_query), jni::ToJavaString(env, r.m_locale), center.m_lat, center.m_lon, r.m_isSearchOnMap);
-}
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetParsedRoutingData(JNIEnv * env, jclass clazz)
+ {
+ using namespace url_scheme;
+ static jclass const pointClazz = jni::GetGlobalClassRef(env, "app/organicmaps/api/RoutePoint");
+ // Java signature : RoutePoint(double lat, double lon, String name)
+ static jmethodID const pointConstructor = jni::GetConstructorID(env, pointClazz, "(DDLjava/lang/String;)V");
+
+ static jclass const routeDataClazz = jni::GetGlobalClassRef(env, "app/organicmaps/api/ParsedRoutingData");
+ // Java signature : ParsedRoutingData(RoutePoint[] points, int routerType) {
+ static jmethodID const routeDataConstructor =
+ jni::GetConstructorID(env, routeDataClazz, "([Lapp/organicmaps/api/RoutePoint;I)V");
+
+ auto const & routingData = frm()->GetParsedRoutingData();
+ jobjectArray points =
+ jni::ToJavaArray(env, pointClazz, routingData.m_points,
+ [](JNIEnv * env, RoutePoint const & point)
+ {
+ jni::TScopedLocalRef const name(env, jni::ToJavaString(env, point.m_name));
+ return env->NewObject(pointClazz, pointConstructor, mercator::YToLat(point.m_org.y),
+ mercator::XToLon(point.m_org.x), name.get());
+ });
+
+ return env->NewObject(routeDataClazz, routeDataConstructor, points, routingData.m_type);
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetParsedAppName(JNIEnv * env, jclass)
-{
- std::string const & appName = frm()->GetParsedAppName();
- return (appName.empty()) ? nullptr : jni::ToJavaString(env, appName);
-}
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetParsedSearchRequest(JNIEnv * env, jclass clazz)
+ {
+ using namespace url_scheme;
+ static jclass const cl = jni::GetGlobalClassRef(env, "app/organicmaps/api/ParsedSearchRequest");
+ // Java signature : ParsedSearchRequest(String query, String locale, double lat, double lon, boolean isSearchOnMap)
+ static jmethodID const ctor = jni::GetConstructorID(env, cl, "(Ljava/lang/String;Ljava/lang/String;DDZ)V");
+ auto const & r = frm()->GetParsedSearchRequest();
+ ms::LatLon const center = frm()->GetParsedCenterLatLon();
+ return env->NewObject(cl, ctor, jni::ToJavaString(env, r.m_query), jni::ToJavaString(env, r.m_locale), center.m_lat,
+ center.m_lon, r.m_isSearchOnMap);
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetParsedBackUrl(JNIEnv * env, jclass)
-{
- std::string const & backUrl = frm()->GetParsedBackUrl();
- return (backUrl.empty()) ? nullptr : jni::ToJavaString(env, backUrl);
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetParsedAppName(JNIEnv * env, jclass)
+ {
+ std::string const & appName = frm()->GetParsedAppName();
+ return (appName.empty()) ? nullptr : jni::ToJavaString(env, appName);
+ }
-JNIEXPORT jdoubleArray JNICALL
-Java_app_organicmaps_Framework_nativeGetParsedCenterLatLon(JNIEnv * env, jclass)
-{
- ms::LatLon const center = frm()->GetParsedCenterLatLon();
- if (!center.IsValid())
- return nullptr;
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetParsedBackUrl(JNIEnv * env, jclass)
+ {
+ std::string const & backUrl = frm()->GetParsedBackUrl();
+ return (backUrl.empty()) ? nullptr : jni::ToJavaString(env, backUrl);
+ }
- double latlon[] = {center.m_lat, center.m_lon};
- jdoubleArray jLatLon = env->NewDoubleArray(2);
- env->SetDoubleArrayRegion(jLatLon, 0, 2, latlon);
+ JNIEXPORT jdoubleArray JNICALL Java_app_organicmaps_Framework_nativeGetParsedCenterLatLon(JNIEnv * env, jclass)
+ {
+ ms::LatLon const center = frm()->GetParsedCenterLatLon();
+ if (!center.IsValid())
+ return nullptr;
- return jLatLon;
-}
+ double latlon[] = {center.m_lat, center.m_lon};
+ jdoubleArray jLatLon = env->NewDoubleArray(2);
+ env->SetDoubleArrayRegion(jLatLon, 0, 2, latlon);
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativePlacePageActivationListener(JNIEnv *env, jclass, jobject jListener)
-{
- LOG(LINFO, ("Set global map object listener"));
- g_placePageActivationListener = env->NewGlobalRef(jListener);
- // void onPlacePageActivated(MapObject object);
- jmethodID const activatedId = jni::GetMethodID(env, g_placePageActivationListener,
- "onPlacePageActivated",
- "(Lapp/organicmaps/widget/placepage/PlacePageData;)V");
- // void onPlacePageDeactivated();
- jmethodID const deactivateId = jni::GetMethodID(env, g_placePageActivationListener,
- "onPlacePageDeactivated", "()V");
- // void onPlacePageDeactivated();
- jmethodID const switchFullscreenId = jni::GetMethodID(env, g_placePageActivationListener,
- "onSwitchFullScreenMode", "()V");
- auto const fillPlacePage = [activatedId]()
+ return jLatLon;
+ }
+
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativePlacePageActivationListener(JNIEnv * env, jclass,
+ jobject jListener)
{
- JNIEnv * env = jni::GetEnv();
- auto const & info = frm()->GetCurrentPlacePageInfo();
- jni::TScopedLocalRef placePageDataRef(env, nullptr);
- if (info.IsTrack())
+ LOG(LINFO, ("Set global map object listener"));
+ g_placePageActivationListener = env->NewGlobalRef(jListener);
+ // void onPlacePageActivated(MapObject object);
+ jmethodID const activatedId = jni::GetMethodID(env, g_placePageActivationListener, "onPlacePageActivated",
+ "(Lapp/organicmaps/widget/placepage/PlacePageData;)V");
+ // void onPlacePageDeactivated();
+ jmethodID const deactivateId =
+ jni::GetMethodID(env, g_placePageActivationListener, "onPlacePageDeactivated", "()V");
+ // void onPlacePageDeactivated();
+ jmethodID const switchFullscreenId =
+ jni::GetMethodID(env, g_placePageActivationListener, "onSwitchFullScreenMode", "()V");
+ auto const fillPlacePage = [activatedId]()
{
- auto const elevationInfo = frm()->GetBookmarkManager().MakeElevationInfo(info.GetTrackId());
- placePageDataRef.reset(usermark_helper::CreateElevationInfo(env, elevationInfo));
- }
- else
+ JNIEnv * env = jni::GetEnv();
+ auto const & info = frm()->GetCurrentPlacePageInfo();
+ jni::TScopedLocalRef placePageDataRef(env, nullptr);
+ if (info.IsTrack())
+ {
+ auto const elevationInfo = frm()->GetBookmarkManager().MakeElevationInfo(info.GetTrackId());
+ placePageDataRef.reset(usermark_helper::CreateElevationInfo(env, elevationInfo));
+ }
+ else
+ {
+ placePageDataRef.reset(usermark_helper::CreateMapObject(env, info));
+ }
+ env->CallVoidMethod(g_placePageActivationListener, activatedId, placePageDataRef.get());
+ };
+ auto const closePlacePage = [deactivateId]()
{
- placePageDataRef.reset(usermark_helper::CreateMapObject(env, info));
- }
- env->CallVoidMethod(g_placePageActivationListener, activatedId, placePageDataRef.get());
- };
- auto const closePlacePage = [deactivateId]()
- {
- JNIEnv * env = jni::GetEnv();
- env->CallVoidMethod(g_placePageActivationListener, deactivateId);
- };
- auto const switchFullscreen = [switchFullscreenId]()
- {
- JNIEnv * env = jni::GetEnv();
- env->CallVoidMethod(g_placePageActivationListener, switchFullscreenId);
- };
+ JNIEnv * env = jni::GetEnv();
+ env->CallVoidMethod(g_placePageActivationListener, deactivateId);
+ };
+ auto const switchFullscreen = [switchFullscreenId]()
+ {
+ JNIEnv * env = jni::GetEnv();
+ env->CallVoidMethod(g_placePageActivationListener, switchFullscreenId);
+ };
- frm()->SetPlacePageListeners(fillPlacePage, closePlacePage, fillPlacePage, switchFullscreen);
-}
+ frm()->SetPlacePageListeners(fillPlacePage, closePlacePage, fillPlacePage, switchFullscreen);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeRemovePlacePageActivationListener(JNIEnv *env, jclass, jobject jListener)
-{
- if (g_placePageActivationListener == nullptr)
- return;
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeRemovePlacePageActivationListener(JNIEnv * env, jclass,
+ jobject jListener)
+ {
+ if (g_placePageActivationListener == nullptr)
+ return;
- if (!env->IsSameObject(g_placePageActivationListener, jListener))
- return;
+ if (!env->IsSameObject(g_placePageActivationListener, jListener))
+ return;
- frm()->SetPlacePageListeners({} /* onOpen */, {} /* onClose */, {} /* onUpdate */, {} /* onSwitchFullScreen */);
- LOG(LINFO, ("Remove global map object listener"));
- env->DeleteGlobalRef(g_placePageActivationListener);
- g_placePageActivationListener = nullptr;
-}
+ frm()->SetPlacePageListeners({} /* onOpen */, {} /* onClose */, {} /* onUpdate */, {} /* onSwitchFullScreen */);
+ LOG(LINFO, ("Remove global map object listener"));
+ env->DeleteGlobalRef(g_placePageActivationListener);
+ g_placePageActivationListener = nullptr;
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetGe0Url(JNIEnv * env, jclass, jdouble lat, jdouble lon, jdouble zoomLevel, jstring name)
-{
- ::Framework * fr = frm();
- double const scale = (zoomLevel > 0 ? zoomLevel : fr->GetDrawScale());
- string const url = fr->CodeGe0url(lat, lon, scale, jni::ToNativeString(env, name));
- return jni::ToJavaString(env, url);
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetGe0Url(JNIEnv * env, jclass, jdouble lat,
+ jdouble lon, jdouble zoomLevel, jstring name)
+ {
+ ::Framework * fr = frm();
+ double const scale = (zoomLevel > 0 ? zoomLevel : fr->GetDrawScale());
+ string const url = fr->CodeGe0url(lat, lon, scale, jni::ToNativeString(env, name));
+ return jni::ToJavaString(env, url);
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuth(
- JNIEnv * env, jclass, jdouble merX, jdouble merY, jdouble cLat, jdouble cLon, jdouble north)
-{
- platform::Distance distance;
- double azimut = -1.0;
- frm()->GetDistanceAndAzimut(m2::PointD(merX, merY), cLat, cLon, north, distance, azimut);
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuth(JNIEnv * env, jclass,
+ jdouble merX, jdouble merY,
+ jdouble cLat, jdouble cLon,
+ jdouble north)
+ {
+ platform::Distance distance;
+ double azimut = -1.0;
+ frm()->GetDistanceAndAzimut(m2::PointD(merX, merY), cLat, cLon, north, distance, azimut);
- static jclass const daClazz = jni::GetGlobalClassRef(env, "app/organicmaps/bookmarks/data/DistanceAndAzimut");
- // Java signature : DistanceAndAzimut(Distance distance, double azimuth)
- static jmethodID const methodID = jni::GetConstructorID(env, daClazz, "(Lapp/organicmaps/util/Distance;D)V");
+ static jclass const daClazz = jni::GetGlobalClassRef(env, "app/organicmaps/bookmarks/data/DistanceAndAzimut");
+ // Java signature : DistanceAndAzimut(Distance distance, double azimuth)
+ static jmethodID const methodID = jni::GetConstructorID(env, daClazz, "(Lapp/organicmaps/util/Distance;D)V");
- return env->NewObject(daClazz, methodID,
- ToJavaDistance(env, distance),
- static_cast(azimut));
-}
+ return env->NewObject(daClazz, methodID, ToJavaDistance(env, distance), static_cast(azimut));
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuthFromLatLon(
- JNIEnv * env, jclass clazz, jdouble lat, jdouble lon, jdouble cLat, jdouble cLon, jdouble north)
-{
- double const merY = mercator::LatToY(lat);
- double const merX = mercator::LonToX(lon);
- return Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuth(env, clazz, merX, merY, cLat, cLon, north);
-}
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuthFromLatLon(
+ JNIEnv * env, jclass clazz, jdouble lat, jdouble lon, jdouble cLat, jdouble cLon, jdouble north)
+ {
+ double const merY = mercator::LatToY(lat);
+ double const merX = mercator::LonToX(lon);
+ return Java_app_organicmaps_Framework_nativeGetDistanceAndAzimuth(env, clazz, merX, merY, cLat, cLon, north);
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeFormatLatLon(JNIEnv * env, jclass, jdouble lat, jdouble lon, int coordsFormat)
-{
- switch (static_cast(coordsFormat))
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeFormatLatLon(JNIEnv * env, jclass, jdouble lat,
+ jdouble lon, int coordsFormat)
{
+ switch (static_cast(coordsFormat))
+ {
default:
- case android::CoordinatesFormat::LatLonDMS: // DMS, comma separated
+ case android::CoordinatesFormat::LatLonDMS: // DMS, comma separated
return jni::ToJavaString(env, measurement_utils::FormatLatLonAsDMS(lat, lon, true /*withComma*/, 2));
- case android::CoordinatesFormat::LatLonDecimal: // Decimal, comma separated
+ case android::CoordinatesFormat::LatLonDecimal: // Decimal, comma separated
return jni::ToJavaString(env, measurement_utils::FormatLatLon(lat, lon, true /* withComma */, 6));
- case android::CoordinatesFormat::OLCFull: // Open location code, long format
+ case android::CoordinatesFormat::OLCFull: // Open location code, long format
return jni::ToJavaString(env, openlocationcode::Encode({lat, lon}));
- case android::CoordinatesFormat::OSMLink: // Link to osm.org
+ case android::CoordinatesFormat::OSMLink: // Link to osm.org
return jni::ToJavaString(env, measurement_utils::FormatOsmLink(lat, lon, 14));
case android::CoordinatesFormat::UTM: // Universal Transverse Mercator
{
@@ -995,951 +904,867 @@ Java_app_organicmaps_Framework_nativeFormatLatLon(JNIEnv * env, jclass, jdouble
else
return nullptr;
}
- case android::CoordinatesFormat::MGRS: // Military Grid Reference System
+ case android::CoordinatesFormat::MGRS: // Military Grid Reference System
{
string mgrsFormat = utm_mgrs_utils::FormatMGRS(lat, lon, 5);
if (!mgrsFormat.empty())
- return jni::ToJavaString(env, mgrsFormat);
+ return jni::ToJavaString(env, mgrsFormat);
else
- return nullptr;
+ return nullptr;
+ }
}
}
-}
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeFormatAltitude(JNIEnv * env, jclass, jdouble alt)
-{
- return jni::ToJavaString(env, platform::Distance::FormatAltitude(alt));
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeFormatAltitude(JNIEnv * env, jclass, jdouble alt)
+ {
+ return jni::ToJavaString(env, platform::Distance::FormatAltitude(alt));
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeFormatSpeed(JNIEnv * env, jclass, jdouble speed)
-{
- auto const units = measurement_utils::GetMeasurementUnits();
- return jni::ToJavaString(env, measurement_utils::FormatSpeedNumeric(speed, units) + " " +
- platform::GetLocalizedSpeedUnits(units));
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeFormatSpeed(JNIEnv * env, jclass, jdouble speed)
+ {
+ auto const units = measurement_utils::GetMeasurementUnits();
+ return jni::ToJavaString(
+ env, measurement_utils::FormatSpeedNumeric(speed, units) + " " + platform::GetLocalizedSpeedUnits(units));
+ }
-/*
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetOutdatedCountriesString(JNIEnv * env, jclass)
-{
- return jni::ToJavaString(env, g_framework->GetOutdatedCountriesString());
-}
+ /*
+ JNIEXPORT jobject JNICALL
+ Java_app_organicmaps_Framework_nativeGetOutdatedCountriesString(JNIEnv * env, jclass)
+ {
+ return jni::ToJavaString(env, g_framework->GetOutdatedCountriesString());
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGetOutdatedCountries(JNIEnv * env, jclass)
-{
- vector countries;
- Storage const & storage = g_framework->GetStorage();
- storage.GetOutdatedCountries(countries);
+ JNIEXPORT jobjectArray JNICALL
+ Java_app_organicmaps_Framework_nativeGetOutdatedCountries(JNIEnv * env, jclass)
+ {
+ vector countries;
+ Storage const & storage = g_framework->GetStorage();
+ storage.GetOutdatedCountries(countries);
- vector ids;
- for (auto country : countries)
- ids.push_back(country->Name());
+ vector ids;
+ for (auto country : countries)
+ ids.push_back(country->Name());
- return jni::ToJavaStringArray(env, ids);
-}
+ return jni::ToJavaStringArray(env, ids);
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeToDoAfterUpdate(JNIEnv * env, jclass)
-{
- return g_framework->ToDoAfterUpdate();
-}
+ JNIEXPORT jint JNICALL
+ Java_app_organicmaps_Framework_nativeToDoAfterUpdate(JNIEnv * env, jclass)
+ {
+ return g_framework->ToDoAfterUpdate();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsDataVersionChanged(JNIEnv * env, jclass)
-{
- return frm()->IsDataVersionUpdated() ? JNI_TRUE : JNI_FALSE;
-}
+ JNIEXPORT jboolean JNICALL
+ Java_app_organicmaps_Framework_nativeIsDataVersionChanged(JNIEnv * env, jclass)
+ {
+ return frm()->IsDataVersionUpdated() ? JNI_TRUE : JNI_FALSE;
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeUpdateSavedDataVersion(JNIEnv * env, jclass)
-{
- frm()->UpdateSavedDataVersion();
-}
-*/
+ JNIEXPORT void JNICALL
+ Java_app_organicmaps_Framework_nativeUpdateSavedDataVersion(JNIEnv * env, jclass)
+ {
+ frm()->UpdateSavedDataVersion();
+ }
+ */
-JNIEXPORT jlong JNICALL
-Java_app_organicmaps_Framework_nativeGetDataVersion(JNIEnv * env, jclass)
-{
- return frm()->GetCurrentDataVersion();
-}
+ JNIEXPORT jlong JNICALL Java_app_organicmaps_Framework_nativeGetDataVersion(JNIEnv * env, jclass)
+ {
+ return frm()->GetCurrentDataVersion();
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetDrawScale(JNIEnv * env, jclass)
-{
- return static_cast(frm()->GetDrawScale());
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetDrawScale(JNIEnv * env, jclass)
+ {
+ return static_cast(frm()->GetDrawScale());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativePokeSearchInViewport(JNIEnv * env, jclass)
-{
- frm()->GetSearchAPI().PokeSearchInViewport();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativePokeSearchInViewport(JNIEnv * env, jclass)
+ {
+ frm()->GetSearchAPI().PokeSearchInViewport();
+ }
-JNIEXPORT jdoubleArray JNICALL
-Java_app_organicmaps_Framework_nativeGetScreenRectCenter(JNIEnv * env, jclass)
-{
- m2::PointD const center = frm()->GetViewportCenter();
+ JNIEXPORT jdoubleArray JNICALL Java_app_organicmaps_Framework_nativeGetScreenRectCenter(JNIEnv * env, jclass)
+ {
+ m2::PointD const center = frm()->GetViewportCenter();
- double latlon[] = {mercator::YToLat(center.y), mercator::XToLon(center.x)};
- jdoubleArray jLatLon = env->NewDoubleArray(2);
- env->SetDoubleArrayRegion(jLatLon, 0, 2, latlon);
+ double latlon[] = {mercator::YToLat(center.y), mercator::XToLon(center.x)};
+ jdoubleArray jLatLon = env->NewDoubleArray(2);
+ env->SetDoubleArrayRegion(jLatLon, 0, 2, latlon);
- return jLatLon;
-}
+ return jLatLon;
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeShowTrackRect(JNIEnv * env, jclass, jlong track)
-{
- frm()->ShowTrack(static_cast(track));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeShowTrackRect(JNIEnv * env, jclass, jlong track)
+ {
+ frm()->ShowTrack(static_cast(track));
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetBookmarkDir(JNIEnv * env, jclass)
-{
- return jni::ToJavaString(env, GetPlatform().SettingsDir().c_str());
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetBookmarkDir(JNIEnv * env, jclass)
+ {
+ return jni::ToJavaString(env, GetPlatform().SettingsDir().c_str());
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetWritableDir(JNIEnv * env, jclass)
-{
- return jni::ToJavaString(env, GetPlatform().WritableDir().c_str());
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetWritableDir(JNIEnv * env, jclass)
+ {
+ return jni::ToJavaString(env, GetPlatform().WritableDir().c_str());
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetSettingsDir(JNIEnv * env, jclass)
-{
- return jni::ToJavaString(env, GetPlatform().SettingsDir().c_str());
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetSettingsDir(JNIEnv * env, jclass)
+ {
+ return jni::ToJavaString(env, GetPlatform().SettingsDir().c_str());
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetDataFileExt(JNIEnv * env, jclass)
-{
- return jni::ToJavaString(env, DATA_FILE_EXTENSION);
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetDataFileExt(JNIEnv * env, jclass)
+ {
+ return jni::ToJavaString(env, DATA_FILE_EXTENSION);
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGetMovableFilesExts(JNIEnv * env, jclass)
-{
- vector exts = { DATA_FILE_EXTENSION, FONT_FILE_EXTENSION };
- platform::CountryIndexes::GetIndexesExts(exts);
- return jni::ToJavaStringArray(env, exts);
-}
+ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGetMovableFilesExts(JNIEnv * env, jclass)
+ {
+ vector exts = {DATA_FILE_EXTENSION, FONT_FILE_EXTENSION};
+ platform::CountryIndexes::GetIndexesExts(exts);
+ return jni::ToJavaStringArray(env, exts);
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGetBookmarksFilesExts(JNIEnv * env, jclass)
-{
- static std::array const kBookmarkExtensions = {
- std::string{kKmzExtension},
- std::string{kKmlExtension},
- std::string{kKmbExtension},
- std::string{kGpxExtension}
- };
-
- return jni::ToJavaStringArray(env, kBookmarkExtensions);
-}
+ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGetBookmarksFilesExts(JNIEnv * env, jclass)
+ {
+ static std::array const kBookmarkExtensions = {
+ std::string{kKmzExtension}, std::string{kKmlExtension}, std::string{kKmbExtension}, std::string{kGpxExtension}};
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeChangeWritableDir(JNIEnv * env, jclass, jstring jNewPath)
-{
- string newPath = jni::ToNativeString(env, jNewPath);
- g_framework->RemoveLocalMaps();
- android::Platform::Instance().SetWritableDir(newPath);
- g_framework->AddLocalMaps();
-}
+ return jni::ToJavaStringArray(env, kBookmarkExtensions);
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsRoutingActive(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().IsRoutingActive();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeChangeWritableDir(JNIEnv * env, jclass, jstring jNewPath)
+ {
+ string newPath = jni::ToNativeString(env, jNewPath);
+ g_framework->RemoveLocalMaps();
+ android::Platform::Instance().SetWritableDir(newPath);
+ g_framework->AddLocalMaps();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsRouteBuilding(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().IsRouteBuilding();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsRoutingActive(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().IsRoutingActive();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsRouteBuilt(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().IsRouteBuilt();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsRouteBuilding(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().IsRouteBuilding();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeCloseRouting(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().CloseRouting(true /* remove route points */);
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsRouteBuilt(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().IsRouteBuilt();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeBuildRoute(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().BuildRoute();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeCloseRouting(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().CloseRouting(true /* remove route points */);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeRemoveRoute(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().RemoveRoute(false /* deactivateFollowing */);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeBuildRoute(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().BuildRoute();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeFollowRoute(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().FollowRoute();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeRemoveRoute(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().RemoveRoute(false /* deactivateFollowing */);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeDisableFollowing(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().DisableFollowMode();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeFollowRoute(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().FollowRoute();
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGenerateNotifications(JNIEnv * env, jclass, bool announceStreets)
-{
- ::Framework * fr = frm();
- if (!fr->GetRoutingManager().IsRoutingActive())
- return nullptr;
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeDisableFollowing(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().DisableFollowMode();
+ }
- vector notifications;
- fr->GetRoutingManager().GenerateNotifications(notifications, announceStreets);
- if (notifications.empty())
- return nullptr;
+ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGenerateNotifications(JNIEnv * env, jclass,
+ bool announceStreets)
+ {
+ ::Framework * fr = frm();
+ if (!fr->GetRoutingManager().IsRoutingActive())
+ return nullptr;
- return jni::ToJavaStringArray(env, notifications);
-}
+ vector notifications;
+ fr->GetRoutingManager().GenerateNotifications(notifications, announceStreets);
+ if (notifications.empty())
+ return nullptr;
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetSpeedCamManagerMode(JNIEnv * env, jclass, jint mode)
-{
- frm()->GetRoutingManager().GetSpeedCamManager().SetMode(
- static_cast(mode));
-}
+ return jni::ToJavaStringArray(env, notifications);
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetSpeedCamManagerMode(JNIEnv * env, jclass)
-{
- return static_cast(frm()->GetRoutingManager().GetSpeedCamManager().GetMode());
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetSpeedCamManagerMode(JNIEnv * env, jclass, jint mode)
+ {
+ frm()->GetRoutingManager().GetSpeedCamManager().SetMode(static_cast(mode));
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jclass)
-{
- ::Framework * fr = frm();
- if (!fr->GetRoutingManager().IsRoutingActive())
- return nullptr;
-
- routing::FollowingInfo info;
- fr->GetRoutingManager().GetRouteFollowingInfo(info);
- if (!info.IsValid())
- return nullptr;
-
- static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/RoutingInfo");
- // Java signature : RoutingInfo(Distance distToTarget, Distance distToTurn,
- // String currentStreet, String nextStreet,
- // double completionPercent, int vehicleTurnOrdinal, int
- // vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum,
- // int totalTime, SingleLaneInfo[] lanes)
- static jmethodID const ctorRouteInfoID =
- jni::GetConstructorID(env, klass,
- "(Lapp/organicmaps/util/Distance;Lapp/organicmaps/util/Distance;"
- "Ljava/lang/String;Ljava/lang/String;DIIIII"
- "[Lapp/organicmaps/routing/SingleLaneInfo;ZZ)V");
-
- vector const & lanes = info.m_lanes;
- jobjectArray jLanes = nullptr;
- if (!lanes.empty())
- {
- static jclass const laneClass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/SingleLaneInfo");
- auto const lanesSize = static_cast(lanes.size());
- jLanes = env->NewObjectArray(lanesSize, laneClass, nullptr);
- ASSERT(jLanes, (jni::DescribeException()));
- static jmethodID const ctorSingleLaneInfoID = jni::GetConstructorID(env, laneClass, "([BZ)V");
-
- for (jsize j = 0; j < lanesSize; ++j)
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetSpeedCamManagerMode(JNIEnv * env, jclass)
+ {
+ return static_cast(frm()->GetRoutingManager().GetSpeedCamManager().GetMode());
+ }
+
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jclass)
+ {
+ ::Framework * fr = frm();
+ if (!fr->GetRoutingManager().IsRoutingActive())
+ return nullptr;
+
+ routing::FollowingInfo info;
+ fr->GetRoutingManager().GetRouteFollowingInfo(info);
+ if (!info.IsValid())
+ return nullptr;
+
+ static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/RoutingInfo");
+ // Java signature : RoutingInfo(Distance distToTarget, Distance distToTurn,
+ // String currentStreet, String nextStreet,
+ // double completionPercent, int vehicleTurnOrdinal, int
+ // vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum,
+ // int totalTime, SingleLaneInfo[] lanes)
+ static jmethodID const ctorRouteInfoID =
+ jni::GetConstructorID(env, klass,
+ "(Lapp/organicmaps/util/Distance;Lapp/organicmaps/util/Distance;"
+ "Ljava/lang/String;Ljava/lang/String;DIIIII"
+ "[Lapp/organicmaps/routing/SingleLaneInfo;ZZ)V");
+
+ vector const & lanes = info.m_lanes;
+ jobjectArray jLanes = nullptr;
+ if (!lanes.empty())
{
- auto const laneSize = static_cast(lanes[j].m_lane.size());
- jni::TScopedLocalByteArrayRef singleLane(env, env->NewByteArray(laneSize));
- ASSERT(singleLane.get(), (jni::DescribeException()));
- env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data());
-
- jni::TScopedLocalRef singleLaneInfo(
- env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(),
- lanes[j].m_isRecommended));
- ASSERT(singleLaneInfo.get(), (jni::DescribeException()));
- env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get());
+ static jclass const laneClass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/SingleLaneInfo");
+ auto const lanesSize = static_cast(lanes.size());
+ jLanes = env->NewObjectArray(lanesSize, laneClass, nullptr);
+ ASSERT(jLanes, (jni::DescribeException()));
+ static jmethodID const ctorSingleLaneInfoID = jni::GetConstructorID(env, laneClass, "([BZ)V");
+
+ for (jsize j = 0; j < lanesSize; ++j)
+ {
+ auto const laneSize = static_cast(lanes[j].m_lane.size());
+ jni::TScopedLocalByteArrayRef singleLane(env, env->NewByteArray(laneSize));
+ ASSERT(singleLane.get(), (jni::DescribeException()));
+ env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data());
+
+ jni::TScopedLocalRef singleLaneInfo(
+ env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(), lanes[j].m_isRecommended));
+ ASSERT(singleLaneInfo.get(), (jni::DescribeException()));
+ env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get());
+ }
}
- }
- auto const & rm = frm()->GetRoutingManager();
- auto const isSpeedCamLimitExceeded = rm.IsRoutingActive() ? rm.IsSpeedCamLimitExceeded() : false;
- auto const shouldPlaySignal = frm()->GetRoutingManager().GetSpeedCamManager().ShouldPlayBeepSignal();
- jobject const result = env->NewObject(
- klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget),
- ToJavaDistance(env, info.m_distToTurn), jni::ToJavaString(env, info.m_sourceName),
- jni::ToJavaString(env, info.m_displayedStreetName), info.m_completionPercent, info.m_turn,
- info.m_nextTurn, info.m_pedestrianTurn, info.m_exitNum, info.m_time, jLanes,
- static_cast(isSpeedCamLimitExceeded), static_cast(shouldPlaySignal));
- ASSERT(result, (jni::DescribeException()));
- return result;
-}
+ auto const & rm = frm()->GetRoutingManager();
+ auto const isSpeedCamLimitExceeded = rm.IsRoutingActive() ? rm.IsSpeedCamLimitExceeded() : false;
+ auto const shouldPlaySignal = frm()->GetRoutingManager().GetSpeedCamManager().ShouldPlayBeepSignal();
+ jobject const result = env->NewObject(
+ klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget), ToJavaDistance(env, info.m_distToTurn),
+ jni::ToJavaString(env, info.m_sourceName), jni::ToJavaString(env, info.m_displayedStreetName),
+ info.m_completionPercent, info.m_turn, info.m_nextTurn, info.m_pedestrianTurn, info.m_exitNum, info.m_time,
+ jLanes, static_cast(isSpeedCamLimitExceeded), static_cast(shouldPlaySignal));
+ ASSERT(result, (jni::DescribeException()));
+ return result;
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGetRouteJunctionPoints(JNIEnv * env, jclass)
-{
- vector junctionPoints;
- if (!frm()->GetRoutingManager().RoutingSession().GetRouteJunctionPoints(junctionPoints))
+ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGetRouteJunctionPoints(JNIEnv * env, jclass)
{
- LOG(LWARNING, ("Can't get the route junction points"));
- return nullptr;
+ vector junctionPoints;
+ if (!frm()->GetRoutingManager().RoutingSession().GetRouteJunctionPoints(junctionPoints))
+ {
+ LOG(LWARNING, ("Can't get the route junction points"));
+ return nullptr;
+ }
+
+ static jclass const junctionClazz = jni::GetGlobalClassRef(env, "app/organicmaps/routing/JunctionInfo");
+ // Java signature : JunctionInfo(double lat, double lon)
+ static jmethodID const junctionConstructor = jni::GetConstructorID(env, junctionClazz, "(DD)V");
+
+ return jni::ToJavaArray(env, junctionClazz, junctionPoints,
+ [](JNIEnv * env, m2::PointD const & point) {
+ return env->NewObject(junctionClazz, junctionConstructor, mercator::YToLat(point.y),
+ mercator::XToLon(point.x));
+ });
}
- static jclass const junctionClazz = jni::GetGlobalClassRef(env, "app/organicmaps/routing/JunctionInfo");
- // Java signature : JunctionInfo(double lat, double lon)
- static jmethodID const junctionConstructor = jni::GetConstructorID(env, junctionClazz, "(DD)V");
+ JNIEXPORT jintArray JNICALL Java_app_organicmaps_Framework_nativeGenerateRouteAltitudeChartBits(
+ JNIEnv * env, jclass, jint width, jint height, jobject routeAltitudeLimits)
+ {
+ RoutingManager::DistanceAltitude altitudes;
+ if (!frm()->GetRoutingManager().GetRouteAltitudesAndDistancesM(altitudes))
+ {
+ LOG(LWARNING, ("Can't get distance to route points and altitude."));
+ return nullptr;
+ }
- return jni::ToJavaArray(env, junctionClazz, junctionPoints,
- [](JNIEnv * env, m2::PointD const & point)
+ altitudes.Simplify();
+
+ vector imageRGBAData;
+ if (!altitudes.GenerateRouteAltitudeChart(width, height, imageRGBAData))
{
- return env->NewObject(junctionClazz, junctionConstructor,
- mercator::YToLat(point.y),
- mercator::XToLon(point.x));
- });
-}
+ LOG(LWARNING, ("Can't generate route altitude image."));
+ return nullptr;
+ }
-JNIEXPORT jintArray JNICALL
-Java_app_organicmaps_Framework_nativeGenerateRouteAltitudeChartBits(JNIEnv * env, jclass, jint width, jint height, jobject routeAltitudeLimits)
-{
- RoutingManager::DistanceAltitude altitudes;
- if (!frm()->GetRoutingManager().GetRouteAltitudesAndDistancesM(altitudes))
- {
- LOG(LWARNING, ("Can't get distance to route points and altitude."));
- return nullptr;
- }
+ uint32_t totalAscent, totalDescent;
+ altitudes.CalculateAscentDescent(totalAscent, totalDescent);
+
+ // Android platform code has specific result string formatting, so make conversion here.
+ using namespace measurement_utils;
+ auto units = Units::Metric;
+ if (settings::Get(settings::kMeasurementUnits, units) && units == Units::Imperial)
+ {
+ totalAscent = measurement_utils::MetersToFeet(totalAscent);
+ totalDescent = measurement_utils::MetersToFeet(totalDescent);
+ }
- altitudes.Simplify();
+ jni::TScopedLocalRef const totalAscentString(env, jni::ToJavaString(env, ToStringPrecision(totalAscent, 0)));
- vector imageRGBAData;
- if (!altitudes.GenerateRouteAltitudeChart(width, height, imageRGBAData))
- {
- LOG(LWARNING, ("Can't generate route altitude image."));
- return nullptr;
- }
+ jni::TScopedLocalRef const totalDescentString(env, jni::ToJavaString(env, ToStringPrecision(totalDescent, 0)));
- uint32_t totalAscent, totalDescent;
- altitudes.CalculateAscentDescent(totalAscent, totalDescent);
+ // Passing route limits.
+ // Do not use jni::GetGlobalClassRef, because this class is used only to init static fieldId vars.
+ static jclass const routeAltitudeLimitsClass = env->GetObjectClass(routeAltitudeLimits);
+ ASSERT(routeAltitudeLimitsClass, ());
- // Android platform code has specific result string formatting, so make conversion here.
- using namespace measurement_utils;
- auto units = Units::Metric;
- if (settings::Get(settings::kMeasurementUnits, units) && units == Units::Imperial)
- {
- totalAscent = measurement_utils::MetersToFeet(totalAscent);
- totalDescent = measurement_utils::MetersToFeet(totalDescent);
- }
+ static jfieldID const totalAscentField = env->GetFieldID(routeAltitudeLimitsClass, "totalAscent", "I");
+ ASSERT(totalAscentField, ());
+ env->SetIntField(routeAltitudeLimits, totalAscentField, static_cast(totalAscent));
- jni::TScopedLocalRef const totalAscentString(env, jni::ToJavaString(env, ToStringPrecision(totalAscent, 0)));
+ static jfieldID const totalDescentField = env->GetFieldID(routeAltitudeLimitsClass, "totalDescent", "I");
+ ASSERT(totalDescentField, ());
+ env->SetIntField(routeAltitudeLimits, totalDescentField, static_cast(totalDescent));
- jni::TScopedLocalRef const totalDescentString(env, jni::ToJavaString(env, ToStringPrecision(totalDescent, 0)));
+ static jfieldID const totalAscentStringField =
+ env->GetFieldID(routeAltitudeLimitsClass, "totalAscentString", "Ljava/lang/String;");
+ ASSERT(totalAscentStringField, ());
+ env->SetObjectField(routeAltitudeLimits, totalAscentStringField, totalAscentString.get());
- // Passing route limits.
- // Do not use jni::GetGlobalClassRef, because this class is used only to init static fieldId vars.
- static jclass const routeAltitudeLimitsClass = env->GetObjectClass(routeAltitudeLimits);
- ASSERT(routeAltitudeLimitsClass, ());
+ static jfieldID const totalDescentStringField =
+ env->GetFieldID(routeAltitudeLimitsClass, "totalDescentString", "Ljava/lang/String;");
+ ASSERT(totalDescentStringField, ());
+ env->SetObjectField(routeAltitudeLimits, totalDescentStringField, totalDescentString.get());
- static jfieldID const totalAscentField = env->GetFieldID(routeAltitudeLimitsClass, "totalAscent", "I");
- ASSERT(totalAscentField, ());
- env->SetIntField(routeAltitudeLimits, totalAscentField, static_cast(totalAscent));
+ static jfieldID const isMetricUnitsField = env->GetFieldID(routeAltitudeLimitsClass, "isMetricUnits", "Z");
+ ASSERT(isMetricUnitsField, ());
+ env->SetBooleanField(routeAltitudeLimits, isMetricUnitsField, units == Units::Metric);
- static jfieldID const totalDescentField = env->GetFieldID(routeAltitudeLimitsClass, "totalDescent", "I");
- ASSERT(totalDescentField, ());
- env->SetIntField(routeAltitudeLimits, totalDescentField, static_cast(totalDescent));
+ size_t const imageRGBADataSize = imageRGBAData.size();
+ ASSERT_NOT_EQUAL(imageRGBADataSize, 0,
+ ("GenerateRouteAltitudeChart returns true but the vector with altitude image bits is empty."));
- static jfieldID const totalAscentStringField = env->GetFieldID(routeAltitudeLimitsClass, "totalAscentString", "Ljava/lang/String;");
- ASSERT(totalAscentStringField, ());
- env->SetObjectField(routeAltitudeLimits, totalAscentStringField, totalAscentString.get());
+ size_t const pxlCount = width * height;
+ if (maps::kAltitudeChartBPP * pxlCount != imageRGBADataSize)
+ {
+ LOG(LWARNING, ("Wrong size of vector with altitude image bits. Expected size:", pxlCount,
+ ". Real size:", imageRGBADataSize));
+ return nullptr;
+ }
- static jfieldID const totalDescentStringField = env->GetFieldID(routeAltitudeLimitsClass, "totalDescentString", "Ljava/lang/String;");
- ASSERT(totalDescentStringField, ());
- env->SetObjectField(routeAltitudeLimits, totalDescentStringField, totalDescentString.get());
+ jintArray imageRGBADataArray = env->NewIntArray(static_cast(pxlCount));
+ ASSERT(imageRGBADataArray, ());
+ jint * arrayElements = env->GetIntArrayElements(imageRGBADataArray, 0);
+ ASSERT(arrayElements, ());
- static jfieldID const isMetricUnitsField = env->GetFieldID(routeAltitudeLimitsClass, "isMetricUnits", "Z");
- ASSERT(isMetricUnitsField, ());
- env->SetBooleanField(routeAltitudeLimits, isMetricUnitsField, units == Units::Metric);
+ for (size_t i = 0; i < pxlCount; ++i)
+ {
+ size_t const shiftInBytes = i * maps::kAltitudeChartBPP;
+ // Type of |imageRGBAData| elements is uint8_t. But uint8_t is promoted to unsinged int in code below before
+ // shifting. So there's no data lost in code below.
+ arrayElements[i] = (imageRGBAData[shiftInBytes + 3] << 24) /* alpha */
+ | (imageRGBAData[shiftInBytes] << 16) /* red */
+ | (imageRGBAData[shiftInBytes + 1] << 8) /* green */
+ | (imageRGBAData[shiftInBytes + 2]); /* blue */
+ }
+ env->ReleaseIntArrayElements(imageRGBADataArray, arrayElements, 0);
- size_t const imageRGBADataSize = imageRGBAData.size();
- ASSERT_NOT_EQUAL(imageRGBADataSize, 0, ("GenerateRouteAltitudeChart returns true but the vector with altitude image bits is empty."));
+ return imageRGBADataArray;
+ }
- size_t const pxlCount = width * height;
- if (maps::kAltitudeChartBPP * pxlCount != imageRGBADataSize)
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeShowCountry(JNIEnv * env, jclass, jstring countryId,
+ jboolean zoomToDownloadButton)
{
- LOG(LWARNING, ("Wrong size of vector with altitude image bits. Expected size:", pxlCount, ". Real size:", imageRGBADataSize));
- return nullptr;
+ g_framework->ShowNode(jni::ToNativeString(env, countryId), (bool)zoomToDownloadButton);
}
- jintArray imageRGBADataArray = env->NewIntArray(static_cast(pxlCount));
- ASSERT(imageRGBADataArray, ());
- jint * arrayElements = env->GetIntArrayElements(imageRGBADataArray, 0);
- ASSERT(arrayElements, ());
-
- for (size_t i = 0; i < pxlCount; ++i)
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetRoutingListener(JNIEnv * env, jclass, jobject listener)
{
- size_t const shiftInBytes = i * maps::kAltitudeChartBPP;
- // Type of |imageRGBAData| elements is uint8_t. But uint8_t is promoted to unsinged int in code below before shifting.
- // So there's no data lost in code below.
- arrayElements[i] = (imageRGBAData[shiftInBytes + 3] << 24) /* alpha */
- | (imageRGBAData[shiftInBytes] << 16) /* red */
- | (imageRGBAData[shiftInBytes + 1] << 8) /* green */
- | (imageRGBAData[shiftInBytes + 2]); /* blue */
+ CHECK(g_framework, ("Framework isn't created yet!"));
+ frm()->GetRoutingManager().SetRouteBuildingListener(
+ [rf = jni::make_global_ref(listener)](routing::RouterResultCode e, storage::CountriesSet const & countries)
+ { CallRoutingListener(rf, static_cast(e), countries); });
}
- env->ReleaseIntArrayElements(imageRGBADataArray, arrayElements, 0);
-
- return imageRGBADataArray;
-}
-
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeShowCountry(JNIEnv * env, jclass, jstring countryId, jboolean zoomToDownloadButton)
-{
- g_framework->ShowNode(jni::ToNativeString(env, countryId), (bool) zoomToDownloadButton);
-}
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetRoutingListener(JNIEnv * env, jclass, jobject listener)
-{
- CHECK(g_framework, ("Framework isn't created yet!"));
- frm()->GetRoutingManager().SetRouteBuildingListener(
- [rf = jni::make_global_ref(listener)](routing::RouterResultCode e, storage::CountriesSet const & countries) {
- CallRoutingListener(rf, static_cast(e), countries);
- });
-}
-
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetRouteProgressListener(JNIEnv * env, jclass, jobject listener)
-{
- CHECK(g_framework, ("Framework isn't created yet!"));
- frm()->GetRoutingManager().SetRouteProgressListener(
- bind(&CallRouteProgressListener, jni::make_global_ref(listener), _1));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetRouteProgressListener(JNIEnv * env, jclass,
+ jobject listener)
+ {
+ CHECK(g_framework, ("Framework isn't created yet!"));
+ frm()->GetRoutingManager().SetRouteProgressListener(
+ bind(&CallRouteProgressListener, jni::make_global_ref(listener), _1));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetRoutingRecommendationListener(JNIEnv * env, jclass,
- jobject listener)
-{
- CHECK(g_framework, ("Framework isn't created yet!"));
- frm()->GetRoutingManager().SetRouteRecommendationListener(
- bind(&CallRouteRecommendationListener, jni::make_global_ref(listener), _1));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetRoutingRecommendationListener(JNIEnv * env, jclass,
+ jobject listener)
+ {
+ CHECK(g_framework, ("Framework isn't created yet!"));
+ frm()->GetRoutingManager().SetRouteRecommendationListener(
+ bind(&CallRouteRecommendationListener, jni::make_global_ref(listener), _1));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetRoutingLoadPointsListener(
- JNIEnv *, jclass, jobject listener)
-{
- CHECK(g_framework, ("Framework isn't created yet!"));
- if (listener != nullptr)
- g_loadRouteHandler = bind(&CallSetRoutingLoadPointsListener, jni::make_global_ref(listener), _1);
- else
- g_loadRouteHandler = nullptr;
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetRoutingLoadPointsListener(JNIEnv *, jclass,
+ jobject listener)
+ {
+ CHECK(g_framework, ("Framework isn't created yet!"));
+ if (listener != nullptr)
+ g_loadRouteHandler = bind(&CallSetRoutingLoadPointsListener, jni::make_global_ref(listener), _1);
+ else
+ g_loadRouteHandler = nullptr;
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeDeactivatePopup(JNIEnv * env, jclass)
-{
- return g_framework->DeactivatePopup();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeDeactivatePopup(JNIEnv * env, jclass)
+ {
+ return g_framework->DeactivatePopup();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetMapStyle(JNIEnv * env, jclass, jint mapStyle)
-{
- MapStyle const val = static_cast(mapStyle);
- if (val != g_framework->GetMapStyle())
- g_framework->SetMapStyle(val);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetMapStyle(JNIEnv * env, jclass, jint mapStyle)
+ {
+ MapStyle const val = static_cast(mapStyle);
+ if (val != g_framework->GetMapStyle())
+ g_framework->SetMapStyle(val);
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetMapStyle(JNIEnv * env, jclass)
-{
- return g_framework->GetMapStyle();
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetMapStyle(JNIEnv * env, jclass)
+ {
+ return g_framework->GetMapStyle();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeMarkMapStyle(JNIEnv * env, jclass, jint mapStyle)
-{
- MapStyle const val = static_cast(mapStyle);
- if (val != g_framework->GetMapStyle())
- g_framework->MarkMapStyle(val);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeMarkMapStyle(JNIEnv * env, jclass, jint mapStyle)
+ {
+ MapStyle const val = static_cast(mapStyle);
+ if (val != g_framework->GetMapStyle())
+ g_framework->MarkMapStyle(val);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetRouter(JNIEnv * env, jclass, jint routerType)
-{
- using Type = routing::RouterType;
- Type type = Type::Vehicle;
- switch (routerType)
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetRouter(JNIEnv * env, jclass, jint routerType)
{
+ using Type = routing::RouterType;
+ Type type = Type::Vehicle;
+ switch (routerType)
+ {
case 0: break;
case 1: type = Type::Pedestrian; break;
case 2: type = Type::Bicycle; break;
case 3: type = Type::Transit; break;
case 4: type = Type::Ruler; break;
default: assert(false); break;
+ }
+ g_framework->GetRoutingManager().SetRouter(type);
}
- g_framework->GetRoutingManager().SetRouter(type);
-}
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetRouter(JNIEnv * env, jclass)
-{
- return static_cast(g_framework->GetRoutingManager().GetRouter());
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetRouter(JNIEnv * env, jclass)
+ {
+ return static_cast(g_framework->GetRoutingManager().GetRouter());
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetLastUsedRouter(JNIEnv * env, jclass)
-{
- return static_cast(g_framework->GetRoutingManager().GetLastUsedRouter());
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetLastUsedRouter(JNIEnv * env, jclass)
+ {
+ return static_cast(g_framework->GetRoutingManager().GetLastUsedRouter());
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetBestRouter(JNIEnv * env, jclass,
- jdouble srcLat, jdouble srcLon,
- jdouble dstLat, jdouble dstLon)
-{
- return static_cast(frm()->GetRoutingManager().GetBestRouter(
- mercator::FromLatLon(srcLat, srcLon), mercator::FromLatLon(dstLat, dstLon)));
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetBestRouter(JNIEnv * env, jclass, jdouble srcLat,
+ jdouble srcLon, jdouble dstLat,
+ jdouble dstLon)
+ {
+ return static_cast(frm()->GetRoutingManager().GetBestRouter(mercator::FromLatLon(srcLat, srcLon),
+ mercator::FromLatLon(dstLat, dstLon)));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeAddRoutePoint(JNIEnv * env, jclass, jstring title,
- jstring subtitle, jint markType,
- jint intermediateIndex,
- jboolean isMyPosition,
- jdouble lat, jdouble lon)
-{
- RouteMarkData data;
- data.m_title = jni::ToNativeString(env, title);
- data.m_subTitle = jni::ToNativeString(env, subtitle);
- data.m_pointType = static_cast(markType);
- data.m_intermediateIndex = static_cast(intermediateIndex);
- data.m_isMyPosition = static_cast(isMyPosition);
- data.m_position = m2::PointD(mercator::FromLatLon(lat, lon));
-
- frm()->GetRoutingManager().AddRoutePoint(std::move(data));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeAddRoutePoint(JNIEnv * env, jclass, jstring title,
+ jstring subtitle, jint markType,
+ jint intermediateIndex,
+ jboolean isMyPosition, jdouble lat,
+ jdouble lon)
+ {
+ RouteMarkData data;
+ data.m_title = jni::ToNativeString(env, title);
+ data.m_subTitle = jni::ToNativeString(env, subtitle);
+ data.m_pointType = static_cast(markType);
+ data.m_intermediateIndex = static_cast(intermediateIndex);
+ data.m_isMyPosition = static_cast(isMyPosition);
+ data.m_position = m2::PointD(mercator::FromLatLon(lat, lon));
+
+ frm()->GetRoutingManager().AddRoutePoint(std::move(data));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeRemoveRoutePoint(JNIEnv * env, jclass,
- jint markType, jint intermediateIndex)
-{
- frm()->GetRoutingManager().RemoveRoutePoint(static_cast(markType),
- static_cast(intermediateIndex));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeRemoveRoutePoint(JNIEnv * env, jclass, jint markType,
+ jint intermediateIndex)
+ {
+ frm()->GetRoutingManager().RemoveRoutePoint(static_cast(markType),
+ static_cast(intermediateIndex));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeRemoveIntermediateRoutePoints(JNIEnv * env, jclass)
-{
- frm()->GetRoutingManager().RemoveIntermediateRoutePoints();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeRemoveIntermediateRoutePoints(JNIEnv * env, jclass)
+ {
+ frm()->GetRoutingManager().RemoveIntermediateRoutePoints();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeCouldAddIntermediatePoint(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().CouldAddIntermediatePoint();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeCouldAddIntermediatePoint(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().CouldAddIntermediatePoint();
+ }
-JNIEXPORT jobjectArray JNICALL
-Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass)
-{
- auto const points = frm()->GetRoutingManager().GetRoutePoints();
-
- static jclass const pointClazz = jni::GetGlobalClassRef(env,
- "app/organicmaps/routing/RouteMarkData");
- // Java signature : RouteMarkData(String title, String subtitle,
- // @RoutePointInfo.RouteMarkType int pointType,
- // int intermediateIndex, boolean isVisible, boolean isMyPosition,
- // boolean isPassed, double lat, double lon)
- static jmethodID const pointConstructor = jni::GetConstructorID(env, pointClazz,
- "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V");
- return jni::ToJavaArray(env, pointClazz, points, [&](JNIEnv * jEnv, RouteMarkData const & data)
- {
- jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title));
- jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle));
- return env->NewObject(pointClazz, pointConstructor,
- title.get(), subtitle.get(),
- static_cast(data.m_pointType),
- static_cast(data.m_intermediateIndex),
- static_cast(data.m_isVisible),
- static_cast(data.m_isMyPosition),
- static_cast(data.m_isPassed),
- mercator::YToLat(data.m_position.y),
- mercator::XToLon(data.m_position.x));
- });
-}
+ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass)
+ {
+ auto const points = frm()->GetRoutingManager().GetRoutePoints();
+
+ static jclass const pointClazz = jni::GetGlobalClassRef(env, "app/organicmaps/routing/RouteMarkData");
+ // Java signature : RouteMarkData(String title, String subtitle,
+ // @RoutePointInfo.RouteMarkType int pointType,
+ // int intermediateIndex, boolean isVisible, boolean isMyPosition,
+ // boolean isPassed, double lat, double lon)
+ static jmethodID const pointConstructor =
+ jni::GetConstructorID(env, pointClazz, "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V");
+ return jni::ToJavaArray(env, pointClazz, points,
+ [&](JNIEnv * jEnv, RouteMarkData const & data)
+ {
+ jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title));
+ jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle));
+ return env->NewObject(
+ pointClazz, pointConstructor, title.get(), subtitle.get(),
+ static_cast(data.m_pointType), static_cast(data.m_intermediateIndex),
+ static_cast(data.m_isVisible), static_cast(data.m_isMyPosition),
+ static_cast(data.m_isPassed), mercator::YToLat(data.m_position.y),
+ mercator::XToLon(data.m_position.x));
+ });
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeGetTransitRouteInfo(JNIEnv * env, jclass)
-{
- auto const routeInfo = frm()->GetRoutingManager().GetTransitRouteInfo();
-
- static jclass const transitStepClass = jni::GetGlobalClassRef(env,
- "app/organicmaps/routing/TransitStepInfo");
- // Java signature : TransitStepInfo(@TransitType int type, @Nullable String distance, @Nullable String distanceUnits,
- // int timeInSec, @Nullable String number, int color, int intermediateIndex)
- static jmethodID const transitStepConstructor = jni::GetConstructorID(env, transitStepClass,
- "(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V");
-
- jni::TScopedLocalRef const steps(env, jni::ToJavaArray(env, transitStepClass,
- routeInfo.m_steps,
- [&](JNIEnv * jEnv, TransitStepInfo const & stepInfo)
- {
- jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr));
- jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix));
- jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number));
- return env->NewObject(transitStepClass, transitStepConstructor,
- static_cast(stepInfo.m_type),
- distance.get(),
- distanceUnits.get(),
- static_cast(stepInfo.m_timeInSec),
- number.get(),
- static_cast(stepInfo.m_colorARGB),
- static_cast(stepInfo.m_intermediateIndex));
- }));
-
- static jclass const transitRouteInfoClass = jni::GetGlobalClassRef(env,
- "app/organicmaps/routing/TransitRouteInfo");
- // Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits, int totalTimeInSec,
- // @NonNull String totalPedestrianDistance, @NonNull String totalPedestrianDistanceUnits,
- // int totalPedestrianTimeInSec, @NonNull TransitStepInfo[] steps)
- static jmethodID const transitRouteInfoConstructor = jni::GetConstructorID(env, transitRouteInfoClass,
- "(Ljava/lang/String;Ljava/lang/String;I"
- "Ljava/lang/String;Ljava/lang/String;I"
- "[Lapp/organicmaps/routing/TransitStepInfo;)V");
- jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr));
- jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix));
- jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr));
- jni::TScopedLocalRef const distancePedestrianUnits(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianUnitsSuffix));
- return env->NewObject(transitRouteInfoClass, transitRouteInfoConstructor,
- distance.get(), distanceUnits.get(), static_cast(routeInfo.m_totalTimeInSec),
- distancePedestrian.get(), distancePedestrianUnits.get(), static_cast(routeInfo.m_totalPedestrianTimeInSec),
- steps.get());
-}
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeGetTransitRouteInfo(JNIEnv * env, jclass)
+ {
+ auto const routeInfo = frm()->GetRoutingManager().GetTransitRouteInfo();
+
+ static jclass const transitStepClass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/TransitStepInfo");
+ // Java signature : TransitStepInfo(@TransitType int type, @Nullable String distance, @Nullable String
+ // distanceUnits,
+ // int timeInSec, @Nullable String number, int color, int intermediateIndex)
+ static jmethodID const transitStepConstructor =
+ jni::GetConstructorID(env, transitStepClass, "(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V");
+
+ jni::TScopedLocalRef const steps(
+ env, jni::ToJavaArray(
+ env, transitStepClass, routeInfo.m_steps,
+ [&](JNIEnv * jEnv, TransitStepInfo const & stepInfo)
+ {
+ jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr));
+ jni::TScopedLocalRef const distanceUnits(env,
+ jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix));
+ jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number));
+ return env->NewObject(transitStepClass, transitStepConstructor, static_cast(stepInfo.m_type),
+ distance.get(), distanceUnits.get(), static_cast(stepInfo.m_timeInSec),
+ number.get(), static_cast(stepInfo.m_colorARGB),
+ static_cast(stepInfo.m_intermediateIndex));
+ }));
+
+ static jclass const transitRouteInfoClass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/TransitRouteInfo");
+ // Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits, int
+ // totalTimeInSec,
+ // @NonNull String totalPedestrianDistance, @NonNull String
+ // totalPedestrianDistanceUnits, int totalPedestrianTimeInSec, @NonNull
+ // TransitStepInfo[] steps)
+ static jmethodID const transitRouteInfoConstructor =
+ jni::GetConstructorID(env, transitRouteInfoClass,
+ "(Ljava/lang/String;Ljava/lang/String;I"
+ "Ljava/lang/String;Ljava/lang/String;I"
+ "[Lapp/organicmaps/routing/TransitStepInfo;)V");
+ jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr));
+ jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix));
+ jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr));
+ jni::TScopedLocalRef const distancePedestrianUnits(env,
+ jni::ToJavaString(env, routeInfo.m_totalPedestrianUnitsSuffix));
+ return env->NewObject(transitRouteInfoClass, transitRouteInfoConstructor, distance.get(), distanceUnits.get(),
+ static_cast(routeInfo.m_totalTimeInSec), distancePedestrian.get(),
+ distancePedestrianUnits.get(), static_cast(routeInfo.m_totalPedestrianTimeInSec),
+ steps.get());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeReloadWorldMaps(JNIEnv * env, jclass)
-{
- g_framework->ReloadWorldMaps();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeReloadWorldMaps(JNIEnv * env, jclass)
+ {
+ g_framework->ReloadWorldMaps();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsDayTime(JNIEnv * env, jclass, jlong utcTimeSeconds, jdouble lat, jdouble lon)
-{
- DayTimeType const dt = GetDayTime(static_cast(utcTimeSeconds), lat, lon);
- return (dt == DayTimeType::Day || dt == DayTimeType::PolarDay);
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsDayTime(JNIEnv * env, jclass, jlong utcTimeSeconds,
+ jdouble lat, jdouble lon)
+ {
+ DayTimeType const dt = GetDayTime(static_cast(utcTimeSeconds), lat, lon);
+ return (dt == DayTimeType::Day || dt == DayTimeType::PolarDay);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSet3dMode(JNIEnv * env, jclass, jboolean allow, jboolean allowBuildings)
-{
- bool const allow3d = static_cast(allow);
- bool const allow3dBuildings = static_cast(allowBuildings);
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSet3dMode(JNIEnv * env, jclass, jboolean allow,
+ jboolean allowBuildings)
+ {
+ bool const allow3d = static_cast(allow);
+ bool const allow3dBuildings = static_cast(allowBuildings);
- g_framework->Save3dMode(allow3d, allow3dBuildings);
- g_framework->Set3dMode(allow3d, allow3dBuildings);
-}
+ g_framework->Save3dMode(allow3d, allow3dBuildings);
+ g_framework->Set3dMode(allow3d, allow3dBuildings);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeGet3dMode(JNIEnv * env, jclass, jobject result)
-{
- bool enabled;
- bool buildings;
- g_framework->Get3dMode(enabled, buildings);
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeGet3dMode(JNIEnv * env, jclass, jobject result)
+ {
+ bool enabled;
+ bool buildings;
+ g_framework->Get3dMode(enabled, buildings);
- static jclass const resultClass = env->GetObjectClass(result);
+ static jclass const resultClass = env->GetObjectClass(result);
- static jfieldID const enabledField = env->GetFieldID(resultClass, "enabled", "Z");
- env->SetBooleanField(result, enabledField, enabled);
+ static jfieldID const enabledField = env->GetFieldID(resultClass, "enabled", "Z");
+ env->SetBooleanField(result, enabledField, enabled);
- static jfieldID const buildingsField = env->GetFieldID(resultClass, "buildings", "Z");
- env->SetBooleanField(result, buildingsField, buildings);
-}
+ static jfieldID const buildingsField = env->GetFieldID(resultClass, "buildings", "Z");
+ env->SetBooleanField(result, buildingsField, buildings);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetAutoZoomEnabled(JNIEnv * env, jclass, jboolean enabled)
-{
- bool const autoZoomEnabled = static_cast(enabled);
- frm()->SaveAutoZoom(autoZoomEnabled);
- frm()->AllowAutoZoom(autoZoomEnabled);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetAutoZoomEnabled(JNIEnv * env, jclass, jboolean enabled)
+ {
+ bool const autoZoomEnabled = static_cast(enabled);
+ frm()->SaveAutoZoom(autoZoomEnabled);
+ frm()->AllowAutoZoom(autoZoomEnabled);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetTransitSchemeEnabled(JNIEnv * env, jclass, jboolean enabled)
-{
- frm()->GetTransitManager().EnableTransitSchemeMode(static_cast(enabled));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetTransitSchemeEnabled(JNIEnv * env, jclass,
+ jboolean enabled)
+ {
+ frm()->GetTransitManager().EnableTransitSchemeMode(static_cast(enabled));
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsTransitSchemeEnabled(JNIEnv * env, jclass)
-{
- return static_cast(frm()->LoadTransitSchemeEnabled());
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsTransitSchemeEnabled(JNIEnv * env, jclass)
+ {
+ return static_cast(frm()->LoadTransitSchemeEnabled());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetIsolinesLayerEnabled(JNIEnv * env, jclass, jboolean enabled)
-{
- auto const isolinesEnabled = static_cast(enabled);
- frm()->GetIsolinesManager().SetEnabled(isolinesEnabled);
- frm()->SaveIsolinesEnabled(isolinesEnabled);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetIsolinesLayerEnabled(JNIEnv * env, jclass,
+ jboolean enabled)
+ {
+ auto const isolinesEnabled = static_cast(enabled);
+ frm()->GetIsolinesManager().SetEnabled(isolinesEnabled);
+ frm()->SaveIsolinesEnabled(isolinesEnabled);
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsIsolinesLayerEnabled(JNIEnv * env, jclass)
-{
- return static_cast(frm()->LoadIsolinesEnabled());
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsIsolinesLayerEnabled(JNIEnv * env, jclass)
+ {
+ return static_cast(frm()->LoadIsolinesEnabled());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetOutdoorsLayerEnabled(JNIEnv * env, jclass, jboolean enabled)
-{
- frm()->SaveOutdoorsEnabled(enabled);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetOutdoorsLayerEnabled(JNIEnv * env, jclass,
+ jboolean enabled)
+ {
+ frm()->SaveOutdoorsEnabled(enabled);
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsOutdoorsLayerEnabled(JNIEnv * env, jclass)
-{
- return static_cast(frm()->LoadOutdoorsEnabled());
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsOutdoorsLayerEnabled(JNIEnv * env, jclass)
+ {
+ return static_cast(frm()->LoadOutdoorsEnabled());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSaveSettingSchemeEnabled(JNIEnv * env, jclass, jboolean enabled)
-{
- frm()->SaveTransitSchemeEnabled(static_cast(enabled));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSaveSettingSchemeEnabled(JNIEnv * env, jclass,
+ jboolean enabled)
+ {
+ frm()->SaveTransitSchemeEnabled(static_cast(enabled));
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeGetAutoZoomEnabled(JNIEnv *, jclass)
-{
- return frm()->LoadAutoZoom();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeGetAutoZoomEnabled(JNIEnv *, jclass)
+ {
+ return frm()->LoadAutoZoom();
+ }
-// static void nativeZoomToPoint(double lat, double lon, int zoom, boolean animate);
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeZoomToPoint(JNIEnv * env, jclass, jdouble lat, jdouble lon, jint zoom, jboolean animate)
-{
- g_framework->Scale(m2::PointD(mercator::FromLatLon(lat, lon)), zoom, animate);
-}
+ // static void nativeZoomToPoint(double lat, double lon, int zoom, boolean animate);
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeZoomToPoint(JNIEnv * env, jclass, jdouble lat,
+ jdouble lon, jint zoom, jboolean animate)
+ {
+ g_framework->Scale(m2::PointD(mercator::FromLatLon(lat, lon)), zoom, animate);
+ }
-JNIEXPORT jobject JNICALL
-Java_app_organicmaps_Framework_nativeDeleteBookmarkFromMapObject(JNIEnv * env, jclass)
-{
- if (!frm()->HasPlacePageInfo())
- return nullptr;
+ JNIEXPORT jobject JNICALL Java_app_organicmaps_Framework_nativeDeleteBookmarkFromMapObject(JNIEnv * env, jclass)
+ {
+ if (!frm()->HasPlacePageInfo())
+ return nullptr;
- place_page::Info const & info = g_framework->GetPlacePageInfo();
- auto const bookmarkId = info.GetBookmarkId();
- frm()->GetBookmarkManager().GetEditSession().DeleteBookmark(bookmarkId);
+ place_page::Info const & info = g_framework->GetPlacePageInfo();
+ auto const bookmarkId = info.GetBookmarkId();
+ frm()->GetBookmarkManager().GetEditSession().DeleteBookmark(bookmarkId);
- auto buildInfo = info.GetBuildInfo();
- buildInfo.m_match = place_page::BuildInfo::Match::FeatureOnly;
- buildInfo.m_userMarkId = kml::kInvalidMarkId;
- buildInfo.m_source = place_page::BuildInfo::Source::Other;
- frm()->UpdatePlacePageInfoForCurrentSelection(buildInfo);
+ auto buildInfo = info.GetBuildInfo();
+ buildInfo.m_match = place_page::BuildInfo::Match::FeatureOnly;
+ buildInfo.m_userMarkId = kml::kInvalidMarkId;
+ buildInfo.m_source = place_page::BuildInfo::Source::Other;
+ frm()->UpdatePlacePageInfoForCurrentSelection(buildInfo);
- return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo());
-}
+ return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo());
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetPoiContactUrl(JNIEnv *env, jclass, jint id)
-{
- auto const metaID = static_cast(id);
- string_view const value = g_framework->GetPlacePageInfo().GetMetadata(metaID);
- if (osm::isSocialContactTag(metaID))
- return jni::ToJavaString(env, osm::socialContactToURL(metaID, value));
- return jni::ToJavaString(env, value);
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetPoiContactUrl(JNIEnv * env, jclass, jint id)
+ {
+ auto const metaID = static_cast(id);
+ string_view const value = g_framework->GetPlacePageInfo().GetMetadata(metaID);
+ if (osm::isSocialContactTag(metaID))
+ return jni::ToJavaString(env, osm::socialContactToURL(metaID, value));
+ return jni::ToJavaString(env, value);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetChoosePositionMode(JNIEnv *, jclass, jint mode, jboolean isBusiness,
- jboolean applyPosition)
-{
- auto const pos = applyPosition && frm()->HasPlacePageInfo()
- ? g_framework->GetPlacePageInfo().GetMercator()
- : m2::PointD();
- g_framework->SetChoosePositionMode(static_cast(mode), isBusiness, applyPosition, pos);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetChoosePositionMode(JNIEnv *, jclass, jint mode,
+ jboolean isBusiness,
+ jboolean applyPosition)
+ {
+ auto const pos =
+ applyPosition && frm()->HasPlacePageInfo() ? g_framework->GetPlacePageInfo().GetMercator() : m2::PointD();
+ g_framework->SetChoosePositionMode(static_cast(mode), isBusiness, applyPosition, pos);
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetChoosePositionMode(JNIEnv *, jclass)
-{
- return static_cast(g_framework->GetChoosePositionMode());
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetChoosePositionMode(JNIEnv *, jclass)
+ {
+ return static_cast(g_framework->GetChoosePositionMode());
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsDownloadedMapAtScreenCenter(JNIEnv *, jclass)
-{
- ::Framework * fr = frm();
- return storage::IsPointCoveredByDownloadedMaps(fr->GetViewportCenter(), fr->GetStorage(), fr->GetCountryInfoGetter());
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsDownloadedMapAtScreenCenter(JNIEnv *, jclass)
+ {
+ ::Framework * fr = frm();
+ return storage::IsPointCoveredByDownloadedMaps(fr->GetViewportCenter(), fr->GetStorage(),
+ fr->GetCountryInfoGetter());
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetActiveObjectFormattedCuisine(JNIEnv * env, jclass)
-{
- ::Framework * frm = g_framework->NativeFramework();
- if (!frm->HasPlacePageInfo())
- return {};
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetActiveObjectFormattedCuisine(JNIEnv * env, jclass)
+ {
+ ::Framework * frm = g_framework->NativeFramework();
+ if (!frm->HasPlacePageInfo())
+ return {};
- return jni::ToJavaString(env, g_framework->GetPlacePageInfo().FormatCuisines());
-}
+ return jni::ToJavaString(env, g_framework->GetPlacePageInfo().FormatCuisines());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetVisibleRect(JNIEnv * env, jclass, jint left, jint top, jint right, jint bottom)
-{
- frm()->SetVisibleViewport(m2::RectD(left, top, right, bottom));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetVisibleRect(JNIEnv * env, jclass, jint left, jint top,
+ jint right, jint bottom)
+ {
+ frm()->SetVisibleViewport(m2::RectD(left, top, right, bottom));
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeIsRouteFinished(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().IsRouteFinished();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeIsRouteFinished(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().IsRouteFinished();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeRunFirstLaunchAnimation(JNIEnv * env, jclass)
-{
- frm()->RunFirstLaunchAnimation();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeRunFirstLaunchAnimation(JNIEnv * env, jclass)
+ {
+ frm()->RunFirstLaunchAnimation();
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeOpenRoutePointsTransaction(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().OpenRoutePointsTransaction();
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeOpenRoutePointsTransaction(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().OpenRoutePointsTransaction();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeApplyRoutePointsTransaction(JNIEnv * env, jclass,
- jint transactionId)
-{
- frm()->GetRoutingManager().ApplyRoutePointsTransaction(transactionId);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeApplyRoutePointsTransaction(JNIEnv * env, jclass,
+ jint transactionId)
+ {
+ frm()->GetRoutingManager().ApplyRoutePointsTransaction(transactionId);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeCancelRoutePointsTransaction(JNIEnv * env, jclass,
- jint transactionId)
-{
- frm()->GetRoutingManager().CancelRoutePointsTransaction(transactionId);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeCancelRoutePointsTransaction(JNIEnv * env, jclass,
+ jint transactionId)
+ {
+ frm()->GetRoutingManager().CancelRoutePointsTransaction(transactionId);
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeInvalidRoutePointsTransactionId(JNIEnv * env, jclass)
-{
- return frm()->GetRoutingManager().InvalidRoutePointsTransactionId();
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeInvalidRoutePointsTransactionId(JNIEnv * env, jclass)
+ {
+ return frm()->GetRoutingManager().InvalidRoutePointsTransactionId();
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeHasSavedRoutePoints(JNIEnv *, jclass)
-{
- return frm()->GetRoutingManager().HasSavedRoutePoints();
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeHasSavedRoutePoints(JNIEnv *, jclass)
+ {
+ return frm()->GetRoutingManager().HasSavedRoutePoints();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeLoadRoutePoints(JNIEnv *, jclass)
-{
- frm()->GetRoutingManager().LoadRoutePoints(g_loadRouteHandler);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeLoadRoutePoints(JNIEnv *, jclass)
+ {
+ frm()->GetRoutingManager().LoadRoutePoints(g_loadRouteHandler);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSaveRoutePoints(JNIEnv *, jclass)
-{
- frm()->GetRoutingManager().SaveRoutePoints();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSaveRoutePoints(JNIEnv *, jclass)
+ {
+ frm()->GetRoutingManager().SaveRoutePoints();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeDeleteSavedRoutePoints(JNIEnv *, jclass)
-{
- frm()->GetRoutingManager().DeleteSavedRoutePoints();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeDeleteSavedRoutePoints(JNIEnv *, jclass)
+ {
+ frm()->GetRoutingManager().DeleteSavedRoutePoints();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeShowFeature(JNIEnv * env, jclass, jobject featureId)
-{
- auto const f = g_framework->BuildFeatureId(env, featureId);
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeShowFeature(JNIEnv * env, jclass, jobject featureId)
+ {
+ auto const f = g_framework->BuildFeatureId(env, featureId);
- if (f.IsValid())
- frm()->ShowFeature(f);
-}
+ if (f.IsValid())
+ frm()->ShowFeature(f);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeMakeCrash(JNIEnv *env, jclass type)
-{
- CHECK(false, ("Diagnostic native crash!"));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeMakeCrash(JNIEnv * env, jclass type)
+ {
+ CHECK(false, ("Diagnostic native crash!"));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetPowerManagerFacility(JNIEnv *, jclass,
- jint facilityType, jboolean state)
-{
- frm()->GetPowerManager().SetFacility(static_cast(facilityType),
- static_cast(state));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetPowerManagerFacility(JNIEnv *, jclass,
+ jint facilityType, jboolean state)
+ {
+ frm()->GetPowerManager().SetFacility(static_cast(facilityType),
+ static_cast(state));
+ }
-JNIEXPORT jint JNICALL
-Java_app_organicmaps_Framework_nativeGetPowerManagerScheme(JNIEnv *, jclass)
-{
- return static_cast(frm()->GetPowerManager().GetScheme());
-}
+ JNIEXPORT jint JNICALL Java_app_organicmaps_Framework_nativeGetPowerManagerScheme(JNIEnv *, jclass)
+ {
+ return static_cast(frm()->GetPowerManager().GetScheme());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetPowerManagerScheme(JNIEnv *, jclass, jint schemeType)
-{
- frm()->GetPowerManager().SetScheme(static_cast(schemeType));
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetPowerManagerScheme(JNIEnv *, jclass, jint schemeType)
+ {
+ frm()->GetPowerManager().SetScheme(static_cast(schemeType));
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetViewportCenter(JNIEnv *, jclass, jdouble lat, jdouble lon, jint zoom)
-{
- // isAnim = true because of previous nativeSetChoosePositionMode animations.
- frm()->SetViewportCenter(mercator::FromLatLon(lat, lon), static_cast(zoom), true /* isAnim */);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetViewportCenter(JNIEnv *, jclass, jdouble lat,
+ jdouble lon, jint zoom)
+ {
+ // isAnim = true because of previous nativeSetChoosePositionMode animations.
+ frm()->SetViewportCenter(mercator::FromLatLon(lat, lon), static_cast(zoom), true /* isAnim */);
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeStopLocationFollow(JNIEnv *, jclass)
-{
- frm()->StopLocationFollow();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeStopLocationFollow(JNIEnv *, jclass)
+ {
+ frm()->StopLocationFollow();
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeSetSearchViewport(JNIEnv *, jclass, jdouble lat,
- jdouble lon, jint zoom)
-{
- auto const center = mercator::FromLatLon(static_cast(lat),
- static_cast(lon));
- auto const rect = df::GetRectForDrawScale(static_cast(zoom), center);
- frm()->GetSearchAPI().OnViewportChanged(rect);
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeSetSearchViewport(JNIEnv *, jclass, jdouble lat,
+ jdouble lon, jint zoom)
+ {
+ auto const center = mercator::FromLatLon(static_cast(lat), static_cast(lon));
+ auto const rect = df::GetRectForDrawScale(static_cast(zoom), center);
+ frm()->GetSearchAPI().OnViewportChanged(rect);
+ }
-JNIEXPORT jboolean JNICALL
-Java_app_organicmaps_Framework_nativeHasPlacePageInfo(JNIEnv *, jclass)
-{
- return static_cast(frm()->HasPlacePageInfo());
-}
+ JNIEXPORT jboolean JNICALL Java_app_organicmaps_Framework_nativeHasPlacePageInfo(JNIEnv *, jclass)
+ {
+ return static_cast(frm()->HasPlacePageInfo());
+ }
-JNIEXPORT void JNICALL
-Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
-{
- return frm()->MemoryWarning();
-}
+ JNIEXPORT void JNICALL Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
+ {
+ return frm()->MemoryWarning();
+ }
-JNIEXPORT jstring JNICALL
-Java_app_organicmaps_Framework_nativeGetKayakHotelLink(JNIEnv * env, jclass, jstring countryIsoCode, jstring uri,
- jlong firstDaySec, jlong lastDaySec, jboolean isReferral)
-{
- string const url = osm::GetKayakHotelURLFromURI(jni::ToNativeString(env, countryIsoCode),
- jni::ToNativeString(env, uri),
- static_cast(firstDaySec),
- static_cast(lastDaySec),
- isReferral);
- return url.empty() ? nullptr : jni::ToJavaString(env, url);
-}
+ JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetKayakHotelLink(JNIEnv * env, jclass,
+ jstring countryIsoCode, jstring uri,
+ jlong firstDaySec, jlong lastDaySec,
+ jboolean isReferral)
+ {
+ string const url =
+ osm::GetKayakHotelURLFromURI(jni::ToNativeString(env, countryIsoCode), jni::ToNativeString(env, uri),
+ static_cast(firstDaySec), static_cast(lastDaySec), isReferral);
+ return url.empty() ? nullptr : jni::ToJavaString(env, url);
+ }
} // extern "C"
diff --git a/android/app/src/main/cpp/app/organicmaps/Framework.hpp b/android/app/src/main/cpp/app/organicmaps/Framework.hpp
index b88fabac5f3..e49fb566542 100644
--- a/android/app/src/main/cpp/app/organicmaps/Framework.hpp
+++ b/android/app/src/main/cpp/app/organicmaps/Framework.hpp
@@ -142,7 +142,7 @@ namespace android
void Scroll(double distanceX, double distanceY);
void Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer);
-
+ void SendDeviceToken(std::string const & token);
bool Search(search::EverywhereSearchParams const & params);
std::string GetLastSearchQuery() { return m_searchQuery; }
void ClearLastSearchQuery() { m_searchQuery.clear(); }
diff --git a/android/app/src/main/cpp/app/organicmaps/Notification.cpp b/android/app/src/main/cpp/app/organicmaps/Notification.cpp
new file mode 100644
index 00000000000..ab4180dfd17
--- /dev/null
+++ b/android/app/src/main/cpp/app/organicmaps/Notification.cpp
@@ -0,0 +1,11 @@
+#include "app/organicmaps/core/jni_helper.hpp"
+#include
+//
+//extern "C"
+//JNIEXPORT void JNICALL
+//Java_app_organicmaps_PushNotificationService_nativeSendTokenToCpp(JNIEnv *env, jobject thiz,
+// jstring token) {
+// // TODO: implement nativeSendTokenToCpp()std::string tokenCpp = jni::ToNativeString(env, token);
+// //framework::SendTokenToCpp(tokenCpp);
+// g_framework->SendTokenToCpp(tokenCpp);
+//}
diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 00000000000..0eb96de4ed3
Binary files /dev/null and b/android/app/src/main/ic_launcher-playstore.png differ
diff --git a/android/app/src/main/java/app/organicmaps/Alerts.java b/android/app/src/main/java/app/organicmaps/Alerts.java
new file mode 100644
index 00000000000..5e319140133
--- /dev/null
+++ b/android/app/src/main/java/app/organicmaps/Alerts.java
@@ -0,0 +1,37 @@
+package app.organicmaps;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import app.organicmaps.base.BaseMwmFragment;
+import app.organicmaps.util.Constants;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * create an instance of this fragment.
+ */
+public class Alerts extends BaseMwmFragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ View root = inflater.inflate(R.layout.fragment_alerts, container, false);
+ new WebContainerDelegate(root, Constants.Url.DRIMS_PUBLIC_ALERTS)
+ {
+ @Override
+ protected void doStartActivity(Intent intent)
+ {
+ startActivity(intent);
+ }
+ };
+
+ return root;
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/app/organicmaps/AlertsActivity.java b/android/app/src/main/java/app/organicmaps/AlertsActivity.java
new file mode 100644
index 00000000000..5ef099044ce
--- /dev/null
+++ b/android/app/src/main/java/app/organicmaps/AlertsActivity.java
@@ -0,0 +1,23 @@
+package app.organicmaps;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.fragment.app.Fragment;
+
+import app.organicmaps.base.BaseMwmFragmentActivity;
+import app.organicmaps.help.HelpFragment;
+import app.organicmaps.util.Constants;
+
+public class AlertsActivity extends BaseMwmFragmentActivity {
+ @Override
+ protected Class extends Fragment> getFragmentClass()
+ {
+ return Alerts.class;
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/app/organicmaps/LiveFeeds.java b/android/app/src/main/java/app/organicmaps/LiveFeeds.java
new file mode 100644
index 00000000000..3283e0bc123
--- /dev/null
+++ b/android/app/src/main/java/app/organicmaps/LiveFeeds.java
@@ -0,0 +1,37 @@
+package app.organicmaps;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import app.organicmaps.base.BaseMwmFragment;
+import app.organicmaps.util.Constants;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * create an instance of this fragment.
+ */
+public class LiveFeeds extends BaseMwmFragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ View root = inflater.inflate(R.layout.fragment_live_feeds, container, false);
+ new WebContainerDelegate(root, Constants.Url.DRIMS_LIVE)
+ {
+ @Override
+ protected void doStartActivity(Intent intent)
+ {
+ startActivity(intent);
+ }
+ };
+
+ return root;
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/app/organicmaps/LiveFeedsWebview.java b/android/app/src/main/java/app/organicmaps/LiveFeedsWebview.java
new file mode 100644
index 00000000000..c345aa9ac96
--- /dev/null
+++ b/android/app/src/main/java/app/organicmaps/LiveFeedsWebview.java
@@ -0,0 +1,24 @@
+package app.organicmaps;
+
+import android.os.Bundle;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+public class LiveFeedsWebview extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_live_feeds_webview);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/app/organicmaps/MapFragment.java b/android/app/src/main/java/app/organicmaps/MapFragment.java
index 958aa564f2f..1d9b9e86a17 100644
--- a/android/app/src/main/java/app/organicmaps/MapFragment.java
+++ b/android/app/src/main/java/app/organicmaps/MapFragment.java
@@ -19,7 +19,10 @@
import app.organicmaps.display.DisplayType;
import app.organicmaps.util.log.Logger;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.firebase.messaging.FirebaseMessaging;
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
{
@@ -107,6 +110,20 @@ public void onCreate(Bundle b)
Bundle args = getArguments();
if (args != null)
launchByDeepLink = args.getBoolean(Map.ARG_LAUNCH_BY_DEEP_LINK);
+
+
+ FirebaseMessaging.getInstance().getToken()
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ if (!task.isSuccessful()) {
+ return;
+ }
+ String token = task.getResult();
+ PushNotificationService.nativeSendTokenToCpp(token);
+
+ }
+ });
mMap.onCreate(launchByDeepLink);
}
diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java
index 9c9bdfcc105..fe9d155e789 100644
--- a/android/app/src/main/java/app/organicmaps/MwmActivity.java
+++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java
@@ -167,6 +167,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private NavigationController mNavigationController;
+
private MainMenu mMainMenu;
private PanelAnimator mPanelAnimator;
@@ -387,6 +388,11 @@ private void showHelp()
startActivity(intent);
}
+ private void showAlerts(){
+ Intent intent = new Intent(this, AlertsActivity.class);
+ startActivity(intent);
+ }
+
private void showSearch(String query)
{
closeSearchToolbar(false, true);
@@ -774,6 +780,7 @@ public void onMapButtonClick(MapButtonsController.MapButtons button)
showBottomSheet(MAIN_MENU_ID);
}
case help -> showHelp();
+ case alerts -> showAlerts();
}
}
@@ -2169,8 +2176,8 @@ public ArrayList getMenuBottomSheetItems(String id)
this::onDownloadMapsOptionSelected
));
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
- if (!TextUtils.isEmpty(mDonatesUrl))
- items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
+ // if (!TextUtils.isEmpty(mDonatesUrl))
+ // 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.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
return items;
diff --git a/android/app/src/main/java/app/organicmaps/PushNotificationService.java b/android/app/src/main/java/app/organicmaps/PushNotificationService.java
new file mode 100644
index 00000000000..01a04d04783
--- /dev/null
+++ b/android/app/src/main/java/app/organicmaps/PushNotificationService.java
@@ -0,0 +1,32 @@
+package app.organicmaps;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.*;
+
+public class PushNotificationService extends FirebaseMessagingService {
+
+ public PushNotificationService() {
+ super();
+ Log.d("Firebase","SERVICE INTIALIZED");
+ }
+
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Log.d("Firebase","ON MESSAGE RECEIVED CALLED" + remoteMessage.toString());
+
+ }
+ @Override
+ public void onNewToken(@NonNull String token) {
+ Log.d(this.getClass().getSimpleName(),"Refreshed token: " + token);
+ // Pass the token to native code
+ nativeSendTokenToCpp(token);
+ }
+
+ public static native void nativeSendTokenToCpp(String token);
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/app/organicmaps/SplashActivity.java b/android/app/src/main/java/app/organicmaps/SplashActivity.java
index f46babb9063..a620d0a810e 100644
--- a/android/app/src/main/java/app/organicmaps/SplashActivity.java
+++ b/android/app/src/main/java/app/organicmaps/SplashActivity.java
@@ -2,11 +2,15 @@
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
+import static android.Manifest.permission.POST_NOTIFICATIONS;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Build;
import android.os.Bundle;
+import android.util.Log;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
@@ -15,6 +19,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
import app.organicmaps.display.DisplayManager;
import app.organicmaps.location.LocationHelper;
@@ -40,6 +45,35 @@ public class SplashActivity extends AppCompatActivity
@NonNull
private ActivityResultLauncher mPermissionRequest;
+ // Declare the launcher at the top of your Activity/Fragment:
+ private final ActivityResultLauncher requestPermissionLauncher =
+ registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
+ if (isGranted) {
+ // FCM SDK (and your app) can post notifications.
+ } else {
+ // TODO: Inform user that that your app will not show notifications.
+ }
+ });
+
+ private void askNotificationPermission() {
+ // This is only necessary for API level >= 33 (TIRAMISU)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ if (ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) ==
+ PackageManager.PERMISSION_GRANTED) {
+ Log.d(TAG, "PERMISSION_GRANTED");
+ // FCM SDK (and your app) can post notifications.
+ } else if (shouldShowRequestPermissionRationale(POST_NOTIFICATIONS)) {
+ // TODO: display an educational UI explaining to the user the features that will be enabled
+ // by them granting the POST_NOTIFICATION permission. This UI should provide the user
+ // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
+ // If the user selects "No thanks," allow the user to continue without notifications.
+ } else {
+ // Directly ask for the permission
+ requestPermissionLauncher.launch(POST_NOTIFICATIONS);
+ }
+ }
+ }
+
@NonNull
private final Runnable mInitCoreDelayedTask = this::init;
@@ -61,6 +95,7 @@ else if (ThemeUtils.isNightTheme(context, theme))
setContentView(R.layout.activity_splash);
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
result -> Config.setLocationRequested());
+ this.askNotificationPermission();
if (DisplayManager.from(this).isCarDisplayUsed())
{
diff --git a/android/app/src/main/java/app/organicmaps/help/HelpFragment.java b/android/app/src/main/java/app/organicmaps/help/HelpFragment.java
index c6c128537e3..acfb0c76c53 100644
--- a/android/app/src/main/java/app/organicmaps/help/HelpFragment.java
+++ b/android/app/src/main/java/app/organicmaps/help/HelpFragment.java
@@ -52,40 +52,40 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
osmPresentationView.setText(getString(R.string.osm_presentation, dataVersion));
setupItem(R.id.news, true, root);
- setupItem(R.id.web, true, root);
- setupItem(R.id.email, true, root);
- setupItem(R.id.github, true, root);
- setupItem(R.id.telegram, false, root);
- setupItem(R.id.instagram, false, root);
- setupItem(R.id.facebook, false, root);
- setupItem(R.id.twitter, true, root);
- setupItem(R.id.matrix, true, root);
- setupItem(R.id.mastodon, false, root);
- setupItem(R.id.openstreetmap, true, root);
- setupItem(R.id.faq, true, root);
- setupItem(R.id.report, isLandscape, root);
-
- final TextView supportUsView = root.findViewById(R.id.support_us);
- if (BuildConfig.FLAVOR.equals("google") && !TextUtils.isEmpty(mDonateUrl))
- supportUsView.setVisibility(View.GONE);
- else
- setupItem(R.id.support_us, true, root);
-
- final TextView donateView = root.findViewById(R.id.donate);
- if (TextUtils.isEmpty(mDonateUrl))
- donateView.setVisibility(View.GONE);
- else
- {
- if (Config.isNY())
- donateView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_christmas_tree, 0,
- R.drawable.ic_christmas_tree, 0);
- setupItem(R.id.donate, isLandscape, root);
- }
-
- if (BuildConfig.REVIEW_URL.isEmpty())
- root.findViewById(R.id.rate).setVisibility(View.GONE);
- else
- setupItem(R.id.rate, true, root);
+// setupItem(R.id.web, true, root);
+// setupItem(R.id.email, true, root);
+// setupItem(R.id.github, true, root);
+// setupItem(R.id.telegram, false, root);
+// setupItem(R.id.instagram, false, root);
+// setupItem(R.id.facebook, false, root);
+// setupItem(R.id.twitter, true, root);
+// setupItem(R.id.matrix, true, root);
+// setupItem(R.id.mastodon, false, root);
+// setupItem(R.id.openstreetmap, true, root);
+// setupItem(R.id.faq, true, root);
+// setupItem(R.id.report, isLandscape, root);
+
+// final TextView supportUsView = root.findViewById(R.id.support_us);
+// if (BuildConfig.FLAVOR.equals("google") && !TextUtils.isEmpty(mDonateUrl))
+// supportUsView.setVisibility(View.GONE);
+// else
+// setupItem(R.id.support_us, true, root);
+//
+// final TextView donateView = root.findViewById(R.id.donate);
+// if (TextUtils.isEmpty(mDonateUrl))
+// donateView.setVisibility(View.GONE);
+// else
+// {
+// if (Config.isNY())
+// donateView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_christmas_tree, 0,
+// R.drawable.ic_christmas_tree, 0);
+// setupItem(R.id.donate, isLandscape, root);
+// }
+//
+// if (BuildConfig.REVIEW_URL.isEmpty())
+// root.findViewById(R.id.rate).setVisibility(View.GONE);
+// else
+// setupItem(R.id.rate, true, root);
setupItem(R.id.copyright, false, root);
View termOfUseView = root.findViewById(R.id.term_of_use_link);
diff --git a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java
index 94cbbc6f9c6..651e5a931a4 100644
--- a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java
+++ b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java
@@ -64,8 +64,7 @@ public class MapButtonsController extends Fragment
@Nullable
@Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
- {
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final FragmentActivity activity = requireActivity();
mMapButtonClickListener = (MwmActivity) activity;
mPlacePageViewModel = new ViewModelProvider(activity).get(PlacePageViewModel.class);
@@ -83,22 +82,23 @@ else if (layoutMode == LayoutMode.planning)
mBottomButtonsFrame = mFrame.findViewById(R.id.map_buttons_bottom);
final FloatingActionButton helpButton = mFrame.findViewById(R.id.help_button);
- if (helpButton != null)
- {
- if (Config.isNY() && !TextUtils.isEmpty(Config.getDonateUrl(requireContext())))
- helpButton.setImageResource(R.drawable.ic_christmas_tree);
- else
- helpButton.setImageResource(R.drawable.logo);
+ if (helpButton != null) {
// Keep this button colorful in normal theme.
if (!ThemeUtils.isNightTheme(requireContext()))
helpButton.getDrawable().setTintList(null);
}
+ final FloatingActionButton alertsButton = mFrame.findViewById(R.id.alerts_button);
+ if (alertsButton != null) {
+ // i want to navigate to the alerts page and there is no callback from menu buttons;
+ alertsButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.menu));
+ }
+
final View zoomFrame = mFrame.findViewById(R.id.zoom_buttons_container);
mFrame.findViewById(R.id.nav_zoom_in)
- .setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomIn));
+ .setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomIn));
mFrame.findViewById(R.id.nav_zoom_out)
- .setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomOut));
+ .setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomOut));
final View bookmarksButton = mFrame.findViewById(R.id.btn_bookmarks);
bookmarksButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.bookmarks));
final View myPosition = mFrame.findViewById(R.id.my_position);
@@ -106,25 +106,28 @@ else if (layoutMode == LayoutMode.planning)
// Some buttons do not exist in navigation mode
mToggleMapLayerButton = mFrame.findViewById(R.id.layers_button);
- if (mToggleMapLayerButton != null)
- {
+ if (mToggleMapLayerButton != null) {
mToggleMapLayerButton.setOnClickListener(view -> mMapButtonClickListener.onMapButtonClick(MapButtons.toggleMapLayer));
mToggleMapLayerButton.setVisibility(View.VISIBLE);
}
final View menuButton = mFrame.findViewById(R.id.menu_button);
- if (menuButton != null)
- {
+ if (menuButton != null) {
menuButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.menu));
// This hack is needed to show the badge on the initial startup. For some reason, updateMenuBadge does not work from onResume() there.
menuButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
- public void onGlobalLayout()
- {
+ public void onGlobalLayout() {
updateMenuBadge();
menuButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
+
+ final View alertButton = mFrame.findViewById(R.id.alerts_button);
+ if (alertButton != null) {
+ alertButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.alerts));
+ }
+
if (helpButton != null)
helpButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
@@ -350,7 +353,8 @@ public enum MapButtons
search,
bookmarks,
menu,
- help
+ help,
+ alerts
}
public interface MapButtonClickListener
diff --git a/android/app/src/main/java/app/organicmaps/util/Constants.java b/android/app/src/main/java/app/organicmaps/util/Constants.java
index e26115ab004..4ac69141053 100644
--- a/android/app/src/main/java/app/organicmaps/util/Constants.java
+++ b/android/app/src/main/java/app/organicmaps/util/Constants.java
@@ -33,6 +33,10 @@ public static class Url
public static final String OSM_REGISTER = "https://www.openstreetmap.org/user/new";
public static final String OSM_RECOVER_PASSWORD = "https://www.openstreetmap.org/user/forgot-password";
+ public static final String DRIMS_PUBLIC_ALERTS = "https://drimsplatform.com/alerts";
+ public static final String DRIMS_LIVE = "https://drimsplatform.com/home";
+ public static final String DRIMS_LOGIN = "https://drimsplatform.com";
+
private Url() {}
}
diff --git a/android/app/src/main/res/drawable/asset_1_3.xml b/android/app/src/main/res/drawable/asset_1_3.xml
new file mode 100644
index 00000000000..44abf2e6e90
--- /dev/null
+++ b/android/app/src/main/res/drawable/asset_1_3.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/layout-land/about.xml b/android/app/src/main/res/layout-land/about.xml
index 56017f1543e..2236a6182e2 100644
--- a/android/app/src/main/res/layout-land/about.xml
+++ b/android/app/src/main/res/layout-land/about.xml
@@ -57,7 +57,7 @@
android:layout_width="@dimen/about_logo"
android:layout_height="@dimen/about_logo"
android:contentDescription="@string/app_name"
- app:srcCompat="@drawable/logo"
+ app:srcCompat="@drawable/asset_1_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/linearLayout2"
app:layout_constraintHorizontal_bias="0.5"
diff --git a/android/app/src/main/res/layout-land/map_buttons_bottom.xml b/android/app/src/main/res/layout-land/map_buttons_bottom.xml
index 2d3d0995295..0d17b4f9408 100644
--- a/android/app/src/main/res/layout-land/map_buttons_bottom.xml
+++ b/android/app/src/main/res/layout-land/map_buttons_bottom.xml
@@ -22,13 +22,21 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btn_bookmarks"
app:layout_constraintStart_toEndOf="@+id/help_button" />
+
+
+ android:contentDescription="DRIMS"
+ app:srcCompat="@drawable/asset_1_3" />
-
-
-
-
-
-
-
-
-
+ android:text="DRIMS"/>
-
-
-
-
-
-
-
-
-
-
-
-
+ android:selectAllOnFocus="true"
+ android:text="Disaster Response Information Management System (DRIMS)"
+ />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/activity_live_feeds_webview.xml b/android/app/src/main/res/layout/activity_live_feeds_webview.xml
new file mode 100644
index 00000000000..f783229a26f
--- /dev/null
+++ b/android/app/src/main/res/layout/activity_live_feeds_webview.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/activity_splash.xml b/android/app/src/main/res/layout/activity_splash.xml
index 94da3281a23..b28cb16e70e 100644
--- a/android/app/src/main/res/layout/activity_splash.xml
+++ b/android/app/src/main/res/layout/activity_splash.xml
@@ -12,7 +12,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:contentDescription="@null"
- app:srcCompat="@drawable/splash"
+ app:srcCompat="@drawable/asset_1_3"
android:layout_weight="1000"
android:layout_margin="@dimen/margin_double"/>
@@ -28,20 +28,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_eighth"
- android:text="@string/app_name"
+ android:text="DRIMS"
android:gravity="center_horizontal"
android:textAppearance="@style/MwmTextAppearance.Title.Splash" />
-
-
diff --git a/android/app/src/main/res/layout/button_live_feeds.xml b/android/app/src/main/res/layout/button_live_feeds.xml
new file mode 100644
index 00000000000..bbe2b8c808b
--- /dev/null
+++ b/android/app/src/main/res/layout/button_live_feeds.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/fragment_alerts.xml b/android/app/src/main/res/layout/fragment_alerts.xml
new file mode 100644
index 00000000000..324e75a2a40
--- /dev/null
+++ b/android/app/src/main/res/layout/fragment_alerts.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/layout/fragment_live_feeds.xml b/android/app/src/main/res/layout/fragment_live_feeds.xml
new file mode 100644
index 00000000000..324e75a2a40
--- /dev/null
+++ b/android/app/src/main/res/layout/fragment_live_feeds.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/layout/map_buttons_alerts.xml b/android/app/src/main/res/layout/map_buttons_alerts.xml
new file mode 100644
index 00000000000..30c5135b9d9
--- /dev/null
+++ b/android/app/src/main/res/layout/map_buttons_alerts.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/map_buttons_bottom.xml b/android/app/src/main/res/layout/map_buttons_bottom.xml
index 39420003b56..a5cb67f4016 100644
--- a/android/app/src/main/res/layout/map_buttons_bottom.xml
+++ b/android/app/src/main/res/layout/map_buttons_bottom.xml
@@ -5,40 +5,60 @@
android:id="@+id/map_buttons_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
-
+ app:justifyContent="space_evenly"
+ >
+
+ layout="@layout/map_buttons_help"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ layout="@layout/map_buttons_alerts"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/btn_search"
+ app:layout_constraintStart_toEndOf="@+id/help_button" />
+
+
-
+ layout="@layout/map_buttons_search_square"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/live_feeds_button"
+ app:layout_constraintStart_toEndOf="@+id/alerts_button" />
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/map_buttons_help.xml b/android/app/src/main/res/layout/map_buttons_help.xml
index 563961dd5d8..fbc37e84c17 100644
--- a/android/app/src/main/res/layout/map_buttons_help.xml
+++ b/android/app/src/main/res/layout/map_buttons_help.xml
@@ -6,4 +6,4 @@
style="@style/MwmWidget.MapButton.Square"
android:contentDescription="@string/help"
app:shapeAppearanceOverlay="@style/MwmWidget.MapButton.Square"
- app:srcCompat="@drawable/ic_question_mark" />
\ No newline at end of file
+ app:srcCompat="@drawable/asset_1_3" />
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index 65291b96e87..036d09bc5fd 100644
--- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -2,5 +2,4 @@
-
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index cd97ff66a86..d4cf81a23a2 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index 18f0eebcc9a..434872655d9 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index fcc540971f0..014d1037cf9 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 204e74be211..b8c8e28a5d3 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index 6599daac93e..ff15f6483fc 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index f6caea0ef71..41b2743b682 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index d43591034c0..04126d1de11 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 3d42fe7fadc..98a417ad6d2 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 54f863ed941..1e061e0304c 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 1d62d6f83bd..d4d731fbae6 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index be6bb916133..37f5be3532e 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 0df45ff75a1..fbbd453503e 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index c3d72d8648b..6465fd7d757 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index 5d82bdb1038..65c365d7636 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index 8e880871cf6..5d8848c36b9 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml
index a012476ad6b..c5d5899fdf0 100644
--- a/android/app/src/main/res/values/ic_launcher_background.xml
+++ b/android/app/src/main/res/values/ic_launcher_background.xml
@@ -1,4 +1,4 @@
- @color/logo
+ #FFFFFF
\ No newline at end of file
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 865ab42cf99..f94c65ed4dc 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,2209 +1,2210 @@
-
-
+
-
-
- Back
-
- Cancel
-
- Delete
- Download Maps
-
- Download has failed. Touch to try again.
-
- Downloading…
-
- Kilometers
-
- MB
- GB
-
- Miles
-
- My Position
-
- Later
-
- Search
-
- Search Map
-
- You currently have all Location Services for this device or application disabled. Please enable them in Settings.
-
- Show on the map
-
- Download has failed
-
- Try Again
- About Organic Maps
-
- Free for everyone, made with love
-
- • No ads, no tracking, no data collection
-
- • No battery drain, works offline
-
- • Fast, minimalist, developed by community
-
- Open-source application created by enthusiasts and volunteers.
-
- Location Settings
- Close
- The app requires hardware accelerated OpenGL. Unfortunately, your device is not supported.
- Download
-
- Please disconnect USB cable or insert memory card to use Organic Maps
-
- Please free up some space on the SD card/USB storage first in order to use the app
- Before you start using the app, please download the general world map to your device.\nIt will use %s of storage.
- Go to Map
- Downloading %s. You can now\nproceed to the map.
- Download %s?
- Update %s?
-
- Pause
-
- Continue
-
- %s download has failed
-
- Add a New List
-
- Bookmark Color
-
- Bookmark List Name
-
- Bookmarks
-
- Bookmarks and Tracks
-
- My Places
-
- Name
-
- Address
-
- List
-
- Settings
-
- Save maps to
-
- Select the folder to download maps to.
-
- Downloaded maps
-
- Internal private storage
-
- Internal shared storage
-
- SD card
-
- External shared storage
-
- %1$s free of %2$s
-
- Move maps?
-
- Error moving map files
-
- This can take several minutes.\nPlease wait…
-
- Measurement units
-
- Choose between miles and kilometers
+
+
+ Back
+
+ Cancel
+
+ Delete
+ Download Maps
+
+ Download has failed. Touch to try again.
+
+ Downloading…
+
+ Kilometers
+
+ MB
+ GB
+
+ Miles
+
+ My Position
+
+ Later
+
+ Search
+
+ Search Map
+
+ You currently have all Location Services for this device or application disabled. Please enable them in Settings.
+
+ Show on the map
+
+ Download has failed
+
+ Try Again
+ About DRIMS
+
+ Free for everyone, made with love
+
+ • No ads, no tracking, no data collection
+
+ • No battery drain, works offline
+
+ • Fast, minimalist, developed by community
+
+ Open-source application created by enthusiasts and volunteers.
+
+ Location Settings
+ Close
+ The app requires hardware accelerated OpenGL. Unfortunately, your device is not supported.
+ Download
+
+ Please disconnect USB cable or insert memory card to use DRIMS Maps
+
+ Please free up some space on the SD card/USB storage first in order to use the app
+ Before you start using the app, please download the general world map to your device.\nIt will use %s of storage.
+ Go to Map
+ Downloading %s. You can now\nproceed to the map.
+ Download %s?
+ Update %s?
+
+ Pause
+
+ Continue
+
+ %s download has failed
+
+ Add a New List
+
+ Bookmark Color
+
+ Bookmark List Name
+
+ Bookmarks
+
+ Bookmarks and Tracks
+
+ My Places
+
+ Name
+
+ Address
+
+ List
+
+ Settings
+
+ Save maps to
+
+ Select the folder to download maps to.
+
+ Downloaded maps
+
+ Internal private storage
+
+ Internal shared storage
+
+ SD card
+
+ External shared storage
+
+ %1$s free of %2$s
+
+ Move maps?
+
+ Error moving map files
+
+ This can take several minutes.\nPlease wait…
+
+ Measurement units
+
+ Choose between miles and kilometers
-
-
- Where to eat
-
- Groceries
-
- Transport
-
- Gas
-
- Parking
-
- Shopping
-
- Second Hand
-
- Hotel
-
- Sights
-
- Entertainment
-
- ATM
-
- Nightlife
-
- Family holiday
-
- Bank
-
- Pharmacy
-
- Hospital
-
- Toilet
-
- Post
-
- Police
-
- WiFi
-
- Recycling
-
- Water
-
- RV Facilities
+
+
+ Where to eat
+
+ Groceries
+
+ Transport
+
+ Gas
+
+ Parking
+
+ Shopping
+
+ Second Hand
+
+ Hotel
+
+ Sights
+
+ Entertainment
+
+ ATM
+
+ Nightlife
+
+ Family holiday
+
+ Bank
+
+ Pharmacy
+
+ Hospital
+
+ Toilet
+
+ Post
+
+ Police
+
+ WiFi
+
+ Recycling
+
+ Water
+
+ RV Facilities
-
-
- Notes
-
- Organic Maps bookmarks were shared with you
- Hello!\n\nAttached are my bookmarks; please open them in Organic Maps. If you don\'t have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!
-
- Loading Bookmarks
-
- Bookmarks loaded successfully! You can find them on the map or on the Bookmarks Manager screen.
-
- Failed to load bookmarks. The file may be corrupted or defective.
-
- The file type is not recognized by the app:\n%1$s
-
- Failed to open file %1$s\n\n%2$s
-
- Edit
-
- Your location hasn\'t been determined yet
-
- Sorry, Map Storage settings are currently disabled.
-
- Map download is in progress now.
-
- Check out my current location in Organic Maps! %1$s or %2$s Don\'t have offline maps? Download here: https://omaps.app/get
-
- Hey, check out my pin in Organic Maps!
-
- Hey, check out my current location on the Organic Maps map!
-
- Hi,\n\nI\'m here now: %1$s. Click this link %2$s or this one %3$s to see the place on the map.\n\nThanks.
-
- Share
-
- Email
-
- Copied to clipboard: %s
-
- Done
-
- OpenStreetMap data: %s
-
- Are you sure you want to continue?
-
- Tracks
-
- Length
- Share My Location
-
- General settings
-
- Information
- Navigation
- Zoom buttons
- Display on the map
-
- Night Mode
-
- Off
-
- On
-
- Auto
-
- Perspective view
-
- 3D buildings
-
- 3D buildings are disabled in power saving mode
-
- Voice Instructions
-
- Announce Street Names
-
- When enabled, the name of the street or exit to turn onto will be spoken aloud.
-
- Voice Language
-
- Test Voice Directions (TTS, Text-To-Speech)
-
- Check the volume or system Text-To-Speech settings if you don\'t hear the voice now.
-
- Not Available
- Auto zoom
- Off
- 1 hour
- 2 hours
- 6 hours
- 12 hours
- 1 day
- Distance
- View on map
-
- Menu
-
- Website
-
- News
-
- GitHub
-
- Telegram
-
- [Matrix]
-
- Mastodon
-
- Facebook
-
- X (Twitter)
-
- Instagram
-
- VK
-
- LINE
-
- OpenStreetMap
-
- Feedback
-
- Rate the app
-
- Help
-
- Frequently Asked Questions
-
- Donate
-
- Support the project
-
- Copyright
-
- Report a bug
-
- Improve arrow direction by moving the phone in a figure-eight motion to calibrate the compass.
-
- Move the phone in a figure-eight motion to calibrate the compass and fix the arrow direction on the map.
-
- Long-tap on the map again to see the interface
-
- Update All
-
- Cancel All
-
- Downloaded
-
- Queued
- Near me
-
- Maps
- Download All
- Downloading:
-
- To delete map, please stop navigation.
-
- Routes can only be created that are fully contained within a map of a single region.
-
- Download map
-
- Retry
-
- Delete Map
-
- Update Map
-
- Google Play Location Services
-
- Quickly determine your approximate location using Bluetooth, WiFi, or mobile network
-
- Download all of the maps along your route
-
- In order to create a route, we need to download and update all the maps from your location to your destination.
-
- Not enough space
-
- Please enable Location Services
- Save
- Your descriptions (text or html)
- create
-
- Red
-
- Yellow
-
- Blue
-
- Green
-
- Purple
-
- Orange
-
- Brown
-
- Pink
-
- Deep Purple
-
- Light Blue
-
- Cyan
-
- Teal
-
- Lime
-
- Deep Orange
-
- Gray
-
- Blue Gray
+
+
+ Notes
+
+ DRIMS bookmarks were shared with you
+ Hello!\n\nAttached are my bookmarks; please open them in DRIMS. If you don\'t have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!
+
+ Loading Bookmarks
+
+ Bookmarks loaded successfully! You can find them on the map or on the Bookmarks Manager screen.
+
+ Failed to load bookmarks. The file may be corrupted or defective.
+
+ The file type is not recognized by the app:\n%1$s
+
+ Failed to open file %1$s\n\n%2$s
+
+ Edit
+
+ Your location hasn\'t been determined yet
+
+ Sorry, Map Storage settings are currently disabled.
+
+ Map download is in progress now.
+
+ Check out my current location in DRIMS! %1$s or %2$s Don\'t have offline maps? Download here: https://omaps.app/get
+
+ Hey, check out my pin in DRIMS!
+
+ Hey, check out my current location on the DRIMS map!
+
+ Hi,\n\nI\'m here now: %1$s. Click this link %2$s or this one %3$s to see the place on the map.\n\nThanks.
+
+ Share
+
+ Email
+
+ Copied to clipboard: %s
+
+ Done
+
+ OpenStreetMap data: %s
+
+ Are you sure you want to continue?
+
+ Tracks
+
+ Length
+ Share My Location
+
+ General settings
+
+ Information
+ Navigation
+ Zoom buttons
+ Display on the map
+
+ Night Mode
+
+ Off
+
+ On
+
+ Auto
+
+ Perspective view
+
+ 3D buildings
+
+ 3D buildings are disabled in power saving mode
+
+ Voice Instructions
+
+ Announce Street Names
+
+ When enabled, the name of the street or exit to turn onto will be spoken aloud.
+
+ Voice Language
+
+ Test Voice Directions (TTS, Text-To-Speech)
+
+ Check the volume or system Text-To-Speech settings if you don\'t hear the voice now.
+
+ Not Available
+ Auto zoom
+ Off
+ 1 hour
+ 2 hours
+ 6 hours
+ 12 hours
+ 1 day
+ Distance
+ View on map
+
+ Menu
+
+ Website
+
+ News
+
+ GitHub
+
+ Telegram
+
+ [Matrix]
+
+ Mastodon
+
+ Facebook
+
+ X (Twitter)
+
+ Instagram
+
+ VK
+
+ LINE
+
+ OpenStreetMap
+
+ Feedback
+
+ Rate the app
+
+ Help
+
+ Frequently Asked Questions
+
+ Donate
+
+ Support the project
+
+ Copyright
+
+ Report a bug
+
+ Improve arrow direction by moving the phone in a figure-eight motion to calibrate the compass.
+
+ Move the phone in a figure-eight motion to calibrate the compass and fix the arrow direction on the map.
+
+ Long-tap on the map again to see the interface
+
+ Update All
+
+ Cancel All
+
+ Downloaded
+
+ Queued
+ Near me
+
+ Maps
+ Download All
+ Downloading:
+
+ To delete map, please stop navigation.
+
+ Routes can only be created that are fully contained within a map of a single region.
+
+ Download map
+
+ Retry
+
+ Delete Map
+
+ Update Map
+
+ Google Play Location Services
+
+ Quickly determine your approximate location using Bluetooth, WiFi, or mobile network
+
+ Download all of the maps along your route
+
+ In order to create a route, we need to download and update all the maps from your location to your destination.
+
+ Not enough space
+
+ Please enable Location Services
+ Save
+ Your descriptions (text or html)
+ create
+
+ Red
+
+ Yellow
+
+ Blue
+
+ Green
+
+ Purple
+
+ Orange
+
+ Brown
+
+ Pink
+
+ Deep Purple
+
+ Light Blue
+
+ Cyan
+
+ Teal
+
+ Lime
+
+ Deep Orange
+
+ Gray
+
+ Blue Gray
-
- When following the route, please keep in mind:
- — Road conditions, traffic laws, and road signs always take priority over the navigation hints;
- — The map might be inaccurate, and the suggested route might not always be the most optimal way to reach the destination;
- — Suggested routes should only be understood as recommendations;
- — Exercise caution with routes in border zones: the routes created by our app may sometimes cross country borders in unauthorized places.
- Please stay alert and safe on the roads!
- Check GPS signal
- Unable to create route. Current GPS coordinates could not be identified.
- Please check your GPS signal. Enabling Wi-Fi will improve your location accuracy.
- Enable location services
- Unable to locate current GPS coordinates. Enable location services to calculate route.
- Unable to locate route
- Unable to create route.
- Please adjust your starting point or destination.
- Adjust starting point
- Route was not created. Unable to locate starting point.
- Please select a starting point closer to a road.
- Adjust destination
- Route was not created. Unable to locate the destination.
- Please select a destination point located closer to a road.
- Unable to locate the intermediate point.
- Please adjust your intermediate point.
- System error
- Unable to create route due to an application error.
- Please try again
- Would you like to download the map and create a more optimal route spanning more than one map?
- Download additional maps to create a better route that crosses the boundaries of this map.
+
+ When following the route, please keep in mind:
+ — Road conditions, traffic laws, and road signs always take priority over the navigation hints;
+ — The map might be inaccurate, and the suggested route might not always be the most optimal way to reach the destination;
+ — Suggested routes should only be understood as recommendations;
+ — Exercise caution with routes in border zones: the routes created by our app may sometimes cross country borders in unauthorized places.
+ Please stay alert and safe on the roads!
+ Check GPS signal
+ Unable to create route. Current GPS coordinates could not be identified.
+ Please check your GPS signal. Enabling Wi-Fi will improve your location accuracy.
+ Enable location services
+ Unable to locate current GPS coordinates. Enable location services to calculate route.
+ Unable to locate route
+ Unable to create route.
+ Please adjust your starting point or destination.
+ Adjust starting point
+ Route was not created. Unable to locate starting point.
+ Please select a starting point closer to a road.
+ Adjust destination
+ Route was not created. Unable to locate the destination.
+ Please select a destination point located closer to a road.
+ Unable to locate the intermediate point.
+ Please adjust your intermediate point.
+ System error
+ Unable to create route due to an application error.
+ Please try again
+ Would you like to download the map and create a more optimal route spanning more than one map?
+ Download additional maps to create a better route that crosses the boundaries of this map.
-
- To start searching and creating routes, please download the map. After that you will no longer need an Internet connection.
- Select Map
-
- Show
-
- Hide
- Categories
- History
- Oops, no results found.
- Try changing your search criteria.
- Search History
- View your recent searches.
- Clear Search History
-
- Wikipedia
-
- Wikimedia Commons
- Your Location
- Start
- Route from
- Route to
- Navigation is only available from your current location.
- Do you want to plan a route from your current location?
-
- Next
-
- From
-
- To
- Add Schedule
- Delete Schedule
-
- All Day (24 hours)
- Open
- Closed
- Add Non-Business Hours
- Business Hours
- Advanced Mode
- Simple Mode
- Non-Business Hours
- Example Values
- Correct mistake
- Location
- Please describe the problem in detail so that the OpenStreetMap community can fix it.
- Or do it yourself at https://www.openstreetmap.org/
- Send
- Issue
- This place does not exist
- Сlosed for maintenance
- Duplicate place
- Auto-download maps
-
- Daily
- 24/7
- Closed today
- Closed
- Today
- Opens in %s
- Closes in %s
- Closed
- Edit business hours
- Don\'t have an OpenStreetMap account?
- Register at OpenStreetMap
- Login
- Login to OpenStreetMap
- Password
- Forgot your password?
- Log Out
- Edit Place
- Add a language
- Street
-
- Building number
- Details
-
- Add a street
-
- Please enter a street name
- Choose a language
- Choose a street
- Postal Code
- Cuisine
- Select cuisine
-
- Email or username
- Add Phone
- Floor
-
- Level: %s
- All of your map edits will be deleted with the map.
- Update Maps
- To create a route, you need to update all maps and then plan the route again.
- Find map
- Please make sure your device is connected to the Internet.
- Not enough space
- Please delete any unnecessary data
- Login error.
- Verified Changes
- Drag the map to select the correct location of the object.
- Editing
- Adding
- Name of the place
-
- As it is written in the local language
- Category
- Detailed description of the issue
- Different problem
- Add business
- No object can be located here
-
- Community-created OpenStreetMap data as of %s. Learn more about how to edit and update the map at OpenStreetMap.org
- Log in to openstreetmap.org to publish your changes to the world.
-
- %1$d of %2$d
- Download over a cellular network connection?
- This could be considerably expensive with some plans or if roaming.
- Enter a valid building number
- Number of floors (maximum of %d)
-
- The number of floors must non exceed %d
- ZIP Code
- Enter a valid ZIP code
-
- Unknown Place
- Send a note to OSM editors
- Detailed comment
- Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in Organic Maps.
- More about OpenStreetMap
- Owner
- Can\'t find a suitable category?
- Organic Maps allows to add simple point categories only, that means no towns, roads, lakes, building outlines, etc. Please add such categories directly to OpenStreetMap.org . Check our guide for detailed step by step instructions.
- You haven\'t downloaded any maps
- Download maps to search and navigate offline.
-
- m
-
- km
-
- km/h
-
- mi
-
- ft
- mph
- h
- min
- More
-
- Photos, reviews, booking
-
- The referral bonus received for each booking through this link goes towards the development of Organic Maps.
-
- Details on Kayak
- Edit Bookmark
- Comment…
- Discard all local changes?
- Discard
- Delete added place?
- Delete
- Place does not exist
-
- Please indicate the reason for deleting the place
-
- Enter a valid phone number
- Enter a valid web address
- Enter a valid email
- Enter a valid Facebook web address, account, or page name
- Enter a valid Instagram username or web address
- Enter a valid Twitter username or web address
- Enter a valid VK username or web address
- Enter a valid LINE ID or web address
- Add Place to OpenStreetMap
-
- Do you want to send it to all users?
-
- Make sure you did not enter any private or personal data.
- OpenStreetMap editors will check the changes and contact you if they have any questions.
- Stop
-
- Accept
-
- Decline
- Use mobile internet to show detailed information?
- Use Always
- Only Today
- Do not Use Today
- Mobile Internet
-
- Mobile internet is required for map update notifications and uploading edits.
- Never Use
- Always Ask
- To display traffic data, maps must be updated.
- Increase size for map labels
- Please update Organic Maps
-
- Traffic data is not available
- Enable logging
-
- General Feedback
- We use system TTS for voice instructions. Many Android devices use Google TTS, you can download or update it from Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)
- For some languages, you will need to install a speech synthesizer or an additional language pack from the app store (Google Play, Galaxy Store, App Gallery, FDroid).\nOpen your device\'s settings → Language and input → Speech → Text to speech output.\nHere you can manage settings for speech synthesis (for example, download language pack for offline use) and select another text-to-speech engine.
- For more information please check this guide.
- Transliteration into Latin alphabet
- Learn more
-
- Exit
-
- Use search or tap on the map to add a route starting point
-
- Use search or tap on the map to add a destination point
- Remove
- Add Stop
-
- Please login to OpenStreetMap to automatically upload all your map edits. Learn more here .
- Storage access problem
- External storage is not accessible. The SD Card may have been removed, damaged, or the file system is read-only. Please, check your SD Card or contact us at support\@organicmaps.app
- Emulate bad storage
- Entrance
- Please enter a correct name
- Lists
-
- Hide all
- Show all
-
- - %d bookmark
- - %d bookmarks
-
- Create a new list
-
- Import Bookmarks and Tracks
- Unable to share due to an application error
- Sharing error
- Cannot share an empty list
- The name can\'t be empty
- Please enter the list name
- New list
- This name is already taken
- Please choose another name
- Please wait…
- Phone number
- OpenStreetMap profile
-
- - %d file was found. You can see it after conversion.
- - %d files were found. You can see them after conversion.
-
- Restore
-
- - %d track
- - %d tracks
-
-
- Privacy
- Privacy policy
- Terms of use
- Traffic
- Subway
- Map Styles and Layers
- Subway map is unavailable
- This list is empty
- To add a bookmark, tap a place on the map and then tap the star icon
- …more
- Export KMZ
- Export GPX
- Delete list
- Public access
- Limited access
- Enter a description (text or html)
- Private
- Speed cameras
- Place Description
-
- Map downloader
-
- Warn if speeding
-
- Always warn
-
- Never warn
- Power saving mode
- Try to reduce power usage at the expense of some functionality.
- Never
- When battery is low
- Always
- Enable this option temporarily to record and manually send detailed diagnostic logs about your issue to us using \"Report a bug\" in the Help dialog. Logs may include location info.
- Online editing
- Routing options
-
- Avoid tolls
-
- Avoid unpaved roads
-
- Avoid ferries
- Avoid freeways
- Unable to calculate route
- A route could not be found. This may be caused by your routing options or incomplete OpenStreetMap data. Please change your routing options and retry.
- Define roads to avoid
- Routing options enabled
- Toll road
- Unpaved road
- Ferry crossing
-
- Yes
-
- No
-
- Yes
-
- No
-
- Capacity: %s
- You have arrived!
- OK
-
- Sort…
-
- Sort bookmarks
-
- By default
-
- By type
-
- By distance
-
- By date
-
- By name
- A week ago
- A month ago
- More than a month ago
- More than a year ago
- Near me
- Others
+
+ To start searching and creating routes, please download the map. After that you will no longer need an Internet connection.
+ Select Map
+
+ Show
+
+ Hide
+ Categories
+ History
+ Oops, no results found.
+ Try changing your search criteria.
+ Search History
+ View your recent searches.
+ Clear Search History
+
+ Wikipedia
+
+ Wikimedia Commons
+ Your Location
+ Start
+ Route from
+ Route to
+ Navigation is only available from your current location.
+ Do you want to plan a route from your current location?
+
+ Next
+
+ From
+
+ To
+ Add Schedule
+ Delete Schedule
+
+ All Day (24 hours)
+ Open
+ Closed
+ Add Non-Business Hours
+ Business Hours
+ Advanced Mode
+ Simple Mode
+ Non-Business Hours
+ Example Values
+ Correct mistake
+ Location
+ Please describe the problem in detail so that the OpenStreetMap community can fix it.
+ Or do it yourself at https://www.openstreetmap.org/
+ Send
+ Issue
+ This place does not exist
+ Сlosed for maintenance
+ Duplicate place
+ Auto-download maps
+
+ Daily
+ 24/7
+ Closed today
+ Closed
+ Today
+ Opens in %s
+ Closes in %s
+ Closed
+ Edit business hours
+ Don\'t have an OpenStreetMap account?
+ Register at OpenStreetMap
+ Login
+ Login to OpenStreetMap
+ Password
+ Forgot your password?
+ Log Out
+ Edit Place
+ Add a language
+ Street
+
+ Building number
+ Details
+
+ Add a street
+
+ Please enter a street name
+ Choose a language
+ Choose a street
+ Postal Code
+ Cuisine
+ Select cuisine
+
+ Email or username
+ Add Phone
+ Floor
+
+ Level: %s
+ All of your map edits will be deleted with the map.
+ Update Maps
+ To create a route, you need to update all maps and then plan the route again.
+ Find map
+ Please make sure your device is connected to the Internet.
+ Not enough space
+ Please delete any unnecessary data
+ Login error.
+ Verified Changes
+ Drag the map to select the correct location of the object.
+ Editing
+ Adding
+ Name of the place
+
+ As it is written in the local language
+ Category
+ Detailed description of the issue
+ Different problem
+ Add business
+ No object can be located here
+
+ Community-created OpenStreetMap data as of %s. Learn more about how to edit and update the map at OpenStreetMap.org
+ Log in to openstreetmap.org to publish your changes to the world.
+
+ %1$d of %2$d
+ Download over a cellular network connection?
+ This could be considerably expensive with some plans or if roaming.
+ Enter a valid building number
+ Number of floors (maximum of %d)
+
+ The number of floors must non exceed %d
+ ZIP Code
+ Enter a valid ZIP code
+
+ Unknown Place
+ Send a note to OSM editors
+ Detailed comment
+ Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in Organic Maps.
+ More about OpenStreetMap
+ Owner
+ Can\'t find a suitable category?
+ Organic Maps allows to add simple point categories only, that means no towns, roads, lakes, building outlines, etc. Please add such categories directly to OpenStreetMap.org . Check our guide for detailed step by step instructions.
+ You haven\'t downloaded any maps
+ Download maps to search and navigate offline.
+
+ m
+
+ km
+
+ km/h
+
+ mi
+
+ ft
+ mph
+ h
+ min
+ More
+
+ Photos, reviews, booking
+
+ The referral bonus received for each booking through this link goes towards the development of DRIMS.
+
+ Details on Kayak
+ Edit Bookmark
+ Comment…
+ Discard all local changes?
+ Discard
+ Delete added place?
+ Delete
+ Place does not exist
+
+ Please indicate the reason for deleting the place
+
+ Enter a valid phone number
+ Enter a valid web address
+ Enter a valid email
+ Enter a valid Facebook web address, account, or page name
+ Enter a valid Instagram username or web address
+ Enter a valid Twitter username or web address
+ Enter a valid VK username or web address
+ Enter a valid LINE ID or web address
+ Add Place to OpenStreetMap
+
+ Do you want to send it to all users?
+
+ Make sure you did not enter any private or personal data.
+ OpenStreetMap editors will check the changes and contact you if they have any questions.
+ Stop
+
+ Accept
+
+ Decline
+ Use mobile internet to show detailed information?
+ Use Always
+ Only Today
+ Do not Use Today
+ Mobile Internet
+
+ Mobile internet is required for map update notifications and uploading edits.
+ Never Use
+ Always Ask
+ To display traffic data, maps must be updated.
+ Increase size for map labels
+ Please update Organic Maps
+
+ Traffic data is not available
+ Enable logging
+
+ General Feedback
+ We use system TTS for voice instructions. Many Android devices use Google TTS, you can download or update it from Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)
+ For some languages, you will need to install a speech synthesizer or an additional language pack from the app store (Google Play, Galaxy Store, App Gallery, FDroid).\nOpen your device\'s settings → Language and input → Speech → Text to speech output.\nHere you can manage settings for speech synthesis (for example, download language pack for offline use) and select another text-to-speech engine.
+ For more information please check this guide.
+ Transliteration into Latin alphabet
+ Learn more
+
+ Exit
+
+ Use search or tap on the map to add a route starting point
+
+ Use search or tap on the map to add a destination point
+ Remove
+ Add Stop
+
+ Please login to OpenStreetMap to automatically upload all your map edits. Learn more here .
+ Storage access problem
+ External storage is not accessible. The SD Card may have been removed, damaged, or the file system is read-only. Please, check your SD Card or contact us at support\@organicmaps.app
+ Emulate bad storage
+ Entrance
+ Please enter a correct name
+ Lists
+
+ Hide all
+ Show all
+
+ - %d bookmark
+ - %d bookmarks
+
+ Create a new list
+
+ Import Bookmarks and Tracks
+ Unable to share due to an application error
+ Sharing error
+ Cannot share an empty list
+ The name can\'t be empty
+ Please enter the list name
+ New list
+ This name is already taken
+ Please choose another name
+ Please wait…
+ Phone number
+ OpenStreetMap profile
+
+ - %d file was found. You can see it after conversion.
+ - %d files were found. You can see them after conversion.
+
+ Restore
+
+ - %d track
+ - %d tracks
+
+
+ Privacy
+ Privacy policy
+ Terms of use
+ Traffic
+ Subway
+ Map Styles and Layers
+ Subway map is unavailable
+ This list is empty
+ To add a bookmark, tap a place on the map and then tap the star icon
+ …more
+ Export KMZ
+ Export GPX
+ Delete list
+ Public access
+ Limited access
+ Enter a description (text or html)
+ Private
+ Speed cameras
+ Place Description
+
+ Map downloader
+
+ Warn if speeding
+
+ Always warn
+
+ Never warn
+ Power saving mode
+ Try to reduce power usage at the expense of some functionality.
+ Never
+ When battery is low
+ Always
+ Enable this option temporarily to record and manually send detailed diagnostic logs about your issue to us using \"Report a bug\" in the Help dialog. Logs may include location info.
+ Online editing
+ Routing options
+
+ Avoid tolls
+
+ Avoid unpaved roads
+
+ Avoid ferries
+ Avoid freeways
+ Unable to calculate route
+ A route could not be found. This may be caused by your routing options or incomplete OpenStreetMap data. Please change your routing options and retry.
+ Define roads to avoid
+ Routing options enabled
+ Toll road
+ Unpaved road
+ Ferry crossing
+
+ Yes
+
+ No
+
+ Yes
+
+ No
+
+ Capacity: %s
+ You have arrived!
+ OK
+
+ Sort…
+
+ Sort bookmarks
+
+ By default
+
+ By type
+
+ By distance
+
+ By date
+
+ By name
+ A week ago
+ A month ago
+ More than a month ago
+ More than a year ago
+ Near me
+ Others
-
- Food
- Sights
- Museums
- Parks
- Swim
- Mountains
- Animals
- Hotels
- Buildings
- Money
- Shops
- Parking
- Gas Stations
- Medicine
- Search in the list
- Religious places
- Select list
- Subway navigation in this region is not available yet
- No subway route found
- Please choose a start or end point closer to a subway station
- Contour Lines
- Activating contour lines requires downloading map data for this area
- Contour lines are not yet available in this area
- Ascent
- Descent
- Min. altitude
- Max. altitude
- Difficulty
- Dist.:
- Time:
- Zoom in to explore isolines
- Downloading
- Download the world map
-
- Unable to create folder and move files on internal device\'s memory or sdcard
-
- Disk error
-
- Connection failure
-
- Disconnect USB cable
- Keep the screen on
-
- When enabled, the screen will always be on when displaying the map.
-
- Show on the lock screen
-
- When enabled, the app will work on the lockscreen even when the device is locked.
-
- Map data from OpenStreetMap
-
- https://t.me/OrganicMapsApp
-
- https://www.instagram.com/organicmaps.app
-
- https://organicmaps.app/faq/text-to-speech-android-tts/
-
- https://organicmaps.app/
-
- https://wiki.openstreetmap.org/wiki/About_OpenStreetMap
-
- %1$s, %2$s
-
- Thank you for using our community-built maps!
-
- With your donations and support, we can create the best maps in the World!
-
- Do you like our app? Please donate to support the development! Don\'t like it yet? Please let us know why, and we will fix it!
-
- If you know a software developer, you can ask him or her to implement a feature that you need.
-
- Do you know that you can long-tap any place on the map to select it?
-
- Did you know that your current location on the map can be selected?
-
- You can help to translate our app into your language.
-
- Our app is developed by a few enthusiasts and the community.
-
- You can easily fix and improve the map data.
-
- Our main goal is to build fast, privacy-focused, easy-to-use maps that you will love.
-
- You are now using Organic Maps on the phone screen
-
- You are now using Organic Maps on the car screen
-
- You are connected to Android Auto
-
- Continue on the phone
-
- To the car screen
-
- This application requires access to your location for navigation purposes.
-
- Grant Permissions
-
- Connected to car
-
- Outdoors
-
- Web browser is not available
- Volume
-
- Export all Bookmarks and Tracks
-
- Speech synthesis system settings
-
- Speech Synthesis settings were not found, are you sure your device supports it?
- Drive-through
- Clear the search
- Zoom in
-
- Zoom out
-
- Menu Link
-
- View Menu
+
+ Food
+ Sights
+ Museums
+ Parks
+ Swim
+ Mountains
+ Animals
+ Hotels
+ Buildings
+ Money
+ Shops
+ Parking
+ Gas Stations
+ Medicine
+ Search in the list
+ Religious places
+ Select list
+ Subway navigation in this region is not available yet
+ No subway route found
+ Please choose a start or end point closer to a subway station
+ Contour Lines
+ Activating contour lines requires downloading map data for this area
+ Contour lines are not yet available in this area
+ Ascent
+ Descent
+ Min. altitude
+ Max. altitude
+ Difficulty
+ Dist.:
+ Time:
+ Zoom in to explore isolines
+ Downloading
+ Download the world map
+
+ Unable to create folder and move files on internal device\'s memory or sdcard
+
+ Disk error
+
+ Connection failure
+
+ Disconnect USB cable
+ Keep the screen on
+
+ When enabled, the screen will always be on when displaying the map.
+
+ Show on the lock screen
+
+ When enabled, the app will work on the lockscreen even when the device is locked.
+
+ Map data from OpenStreetMap
+
+ https://t.me/OrganicMapsApp
+
+ https://www.instagram.com/organicmaps.app
+
+ https://organicmaps.app/faq/text-to-speech-android-tts/
+
+ https://organicmaps.app/
+
+ https://wiki.openstreetmap.org/wiki/About_OpenStreetMap
+
+ %1$s, %2$s
+
+ Thank you for using our community-built maps!
+
+ With your donations and support, we can create the best maps in the World!
+
+ Do you like our app? Please donate to support the development! Don\'t like it yet? Please let us know why, and we will fix it!
+
+ If you know a software developer, you can ask him or her to implement a feature that you need.
+
+ Do you know that you can long-tap any place on the map to select it?
+
+ Did you know that your current location on the map can be selected?
+
+ You can help to translate our app into your language.
+
+ Our app is developed by a few enthusiasts and the community.
+
+ You can easily fix and improve the map data.
+
+ Our main goal is to build fast, privacy-focused, easy-to-use maps that you will love.
+
+ You are now using Organic Maps on the phone screen
+
+ You are now using Organic Maps on the car screen
+
+ You are connected to Android Auto
+
+ Continue on the phone
+
+ To the car screen
+
+ This application requires access to your location for navigation purposes.
+
+ Grant Permissions
+
+ Connected to car
+
+ Outdoors
+
+ Web browser is not available
+ Volume
+
+ Export all Bookmarks and Tracks
+
+ Speech synthesis system settings
+
+ Speech Synthesis settings were not found, are you sure your device supports it?
+ Drive-through
+ Clear the search
+ Zoom in
+
+ Zoom out
+
+ Menu Link
+
+ View Menu
-
- Address/Block
- Address/Block
- Address/Block
- Aerialway
- Cable Car
- Chair Lift
- Drag Lift
- Gondola
- Mixed Lift
- Aerialway Station
- Airspace Infrastructure
- Airport
- International Airport
- Apron
- Gate
- Helipad
- Runway
- Taxiway
- Terminal
- Amenity
- Arts Center
- ATM
- Bank
- Bar
- Barbecue Grill
- Bench
- Bicycle Parking
- Bicycle Rental
- Bicycle Repair Station
- Biergarten
- Brothel
- Currency Exchange
- Bus Station
- Cafe
- Car Rental
- Car Sharing
- Car Wash
- Casino
- Gambling
- Adult Gaming Centre
- Arcade
- Charging Station
- Bicycle Charging Station
- Car Charging Station
- Nursery
- Cinema
- Bowling Alley
- Clinic
- College
- Community Centre
- Compressed Air
- Conference Center
- Courthouse
- Dentist
- Doctor
- Drinking Water
- Drinking Water
- Driving School
- Exhibition Center
- Money Transfer
- Music School
- Language School
- Embassy
- Fast Food
- Ferry
- Fire Station
- Food Court
- Fountain
- Gas Station
-
- Graveyard
-
- Christian Graveyard
- Hospital
- Hunting Stand
- Ice Cream
- Internet Cafe
- Kindergarten
- Library
- Loading Dock
- Marketplace
- Motorcycle Parking
- Nightclub
- Nursing Home
- Parking
- Parking
- Multi Storey Parking
- Multi Storey Parking
- Private Parking
- Private Parking
- Private Parking
- Park And Ride Parking
- Underground Parking
- Underground Parking
- Private Underground Parking
- Street-Side Parking
- Street-Side Parking
- Private Street-Side Parking
- Lane Parking
- Lane Parking
- Private Lane Parking
- Parking Entrance
- Private Parking Entrance
- Parking Entrance
- Parking Space
- Parking Space
- Parking Space
- Parking Space
- Disabled Parking Space
- Payment Terminal
- Pharmacy
- Place of Worship
- Buddhist Temple
- Church
- Church of Jesus Christ of Latter Day Saints
- Jehovah\'s Witnesses Kingdom Hall
- Hindu Temple
- Synagogue
- Mosque
- Shinto Shrine
- Taoist Temple
- Police
- Mailbox
- Post Office
- Prison
- Pub
- Book Exchange
+
+ Address/Block
+ Address/Block
+ Address/Block
+ Aerialway
+ Cable Car
+ Chair Lift
+ Drag Lift
+ Gondola
+ Mixed Lift
+ Aerialway Station
+ Airspace Infrastructure
+ Airport
+ International Airport
+ Apron
+ Gate
+ Helipad
+ Runway
+ Taxiway
+ Terminal
+ Amenity
+ Arts Center
+ ATM
+ Bank
+ Bar
+ Barbecue Grill
+ Bench
+ Bicycle Parking
+ Bicycle Rental
+ Bicycle Repair Station
+ Biergarten
+ Brothel
+ Currency Exchange
+ Bus Station
+ Cafe
+ Car Rental
+ Car Sharing
+ Car Wash
+ Casino
+ Gambling
+ Adult Gaming Centre
+ Arcade
+ Charging Station
+ Bicycle Charging Station
+ Car Charging Station
+ Nursery
+ Cinema
+ Bowling Alley
+ Clinic
+ College
+ Community Centre
+ Compressed Air
+ Conference Center
+ Courthouse
+ Dentist
+ Doctor
+ Drinking Water
+ Drinking Water
+ Driving School
+ Exhibition Center
+ Money Transfer
+ Music School
+ Language School
+ Embassy
+ Fast Food
+ Ferry
+ Fire Station
+ Food Court
+ Fountain
+ Gas Station
+
+ Graveyard
+
+ Christian Graveyard
+ Hospital
+ Hunting Stand
+ Ice Cream
+ Internet Cafe
+ Kindergarten
+ Library
+ Loading Dock
+ Marketplace
+ Motorcycle Parking
+ Nightclub
+ Nursing Home
+ Parking
+ Parking
+ Multi Storey Parking
+ Multi Storey Parking
+ Private Parking
+ Private Parking
+ Private Parking
+ Park And Ride Parking
+ Underground Parking
+ Underground Parking
+ Private Underground Parking
+ Street-Side Parking
+ Street-Side Parking
+ Private Street-Side Parking
+ Lane Parking
+ Lane Parking
+ Private Lane Parking
+ Parking Entrance
+ Private Parking Entrance
+ Parking Entrance
+ Parking Space
+ Parking Space
+ Parking Space
+ Parking Space
+ Disabled Parking Space
+ Payment Terminal
+ Pharmacy
+ Place of Worship
+ Buddhist Temple
+ Church
+ Church of Jesus Christ of Latter Day Saints
+ Jehovah\'s Witnesses Kingdom Hall
+ Hindu Temple
+ Synagogue
+ Mosque
+ Shinto Shrine
+ Taoist Temple
+ Police
+ Mailbox
+ Post Office
+ Prison
+ Pub
+ Book Exchange
-
- Recycling Center
- Recycling Container
- Recycling Container
- Batteries
- Clothes
- Glass Bottles
- Paper
- Plastic
- Plastic Bottles
- Scrap Metal
- Electronic Waste
- Cardboard
- Cans
- Shoes
- Green/Organic Waste
- Cartons
- Restaurant
- Holding Tank Dump Station
- School
-
- Shelter
-
- Shelter
-
- Bivouac Hut
-
- Lean-to Shelter
- Public Bath
- Shower
- Stripclub
- Taxi Stand
- Phone
- Theatre
- Toilet
- Toilet
- Town Hall
- University
- Vending Machine
- Cigarette Dispenser
- Coffee Dispenser
- Condoms Dispenser
- Drinks Dispenser
- Food Dispenser
- Newspaper Dispenser
- Parking Meter
- Ticket Machine
- Sweets Dispenser
- Excrement Bags Dispenser
- Parcel Locker
- Vehicle Inspection
- Fuel Pump
- Veterinary Doctor
- Trash Bin
- Dumpster
- Waste Transfer Station
- Water Tank Refill Point
- Barrier
- Block
- Bollard
- Border Control
- Chain
- City Wall
- Cycle Barrier
- Drainage Ditch
- Moat
- Wastewater
- Entrance
- Fence
- Gate
- Hedge
- Kissing Gate
- Lift Gate
- Retaining Wall
- Stile
- Turnstile
- Swing Gate
- Toll Booth
- Wall
- Boundary
- Administrative Boundary
-
- National Border
-
- Regional Boundary
-
- Regional Boundary
- National Park
- Indigenous Lands
- Protected Area
- Protected Area
- Protected Area
- Protected Area
- Protected Area
- Protected Area
- Protected Area
- Building
-
- Address
- Building
- Building
- Garage
- Train Station
- Warehouse
- Grave
- Craft
- Beekeeper
- Blacksmith
- Craft Brewery
- Caterer
- Carpenter
- Confectioner
- Electrician
- Electronics Repair
- Gardener
- Grinding Mill
- Handicraft
-
- HVAC Shop
- Key Cutting
- Locksmith
- Metal Worker
- House Painter
- Photographer
- Camera Shop
- Plumber
- Sawmill
- Shoe Repair
- Winery
- Tailor
- African
- American
- Arab
- Argentinian
- Asian
- Austrian
- Bagel
- Balkan
- Barbecue
- Bavarian
- Beef Bowl
- Brazilian
- Breakfast
- Bubble Tea
- Burger
- Buschenschank
- Cake
- Caribbean
- Chicken
- Chinese
- Coffee
- Crepe
- Croatian
- Curry
- Deli
- Diner
- Donut
- Ethiopian
- Filipino
- Fine Dining
- Fish
- Fish and Chips
- French
- Friture
- Georgian
- German
- Greek
- Grill
- Heuriger
- Hotdog
- Hungarian
- Ice Cream
- Indian
- Indonesian
- International
- Irish
- Italian
- Italian, Pizza
- Japanese
- Kebab
- Korean
- Lao
- Lebanese
- Local
- Malagasy
- Malaysian
- Mediterranean
- Mexican
- Moroccan
- Noodles
- East Asian
- Pancake
- Pasta
- Persian
- Peruvian
- Pizza
- Polish
- Portuguese
- Ramen
- Regional
- Russian
- Sandwich
- Sausage
- Savory Pancakes
- Seafood
- Soba
- Spanish
- Steak House
- Sushi
- Tapas
- Tea
- Thai
- Turkish
- Vegan
- Vegetarian
- Vietnamese
- Emergency
- Emergency Assembly Point
- Defibrillator
- Fire Hydrant
- Emergency Phone
-
- Entrance
-
- Main Entrance
- Exit
- $
- Free
- Medical Laboratory
- Physiotherapist
- Alternative Medicine
- Audiologist
- Blood Donation Center
- Optometrist
- Podiatrist
- Psychotherapist
- Sample Collection Centre
- Logopedics
+
+ Recycling Center
+ Recycling Container
+ Recycling Container
+ Batteries
+ Clothes
+ Glass Bottles
+ Paper
+ Plastic
+ Plastic Bottles
+ Scrap Metal
+ Electronic Waste
+ Cardboard
+ Cans
+ Shoes
+ Green/Organic Waste
+ Cartons
+ Restaurant
+ Holding Tank Dump Station
+ School
+
+ Shelter
+
+ Shelter
+
+ Bivouac Hut
+
+ Lean-to Shelter
+ Public Bath
+ Shower
+ Stripclub
+ Taxi Stand
+ Phone
+ Theatre
+ Toilet
+ Toilet
+ Town Hall
+ University
+ Vending Machine
+ Cigarette Dispenser
+ Coffee Dispenser
+ Condoms Dispenser
+ Drinks Dispenser
+ Food Dispenser
+ Newspaper Dispenser
+ Parking Meter
+ Ticket Machine
+ Sweets Dispenser
+ Excrement Bags Dispenser
+ Parcel Locker
+ Vehicle Inspection
+ Fuel Pump
+ Veterinary Doctor
+ Trash Bin
+ Dumpster
+ Waste Transfer Station
+ Water Tank Refill Point
+ Barrier
+ Block
+ Bollard
+ Border Control
+ Chain
+ City Wall
+ Cycle Barrier
+ Drainage Ditch
+ Moat
+ Wastewater
+ Entrance
+ Fence
+ Gate
+ Hedge
+ Kissing Gate
+ Lift Gate
+ Retaining Wall
+ Stile
+ Turnstile
+ Swing Gate
+ Toll Booth
+ Wall
+ Boundary
+ Administrative Boundary
+
+ National Border
+
+ Regional Boundary
+
+ Regional Boundary
+ National Park
+ Indigenous Lands
+ Protected Area
+ Protected Area
+ Protected Area
+ Protected Area
+ Protected Area
+ Protected Area
+ Protected Area
+ Building
+
+ Address
+ Building
+ Building
+ Garage
+ Train Station
+ Warehouse
+ Grave
+ Craft
+ Beekeeper
+ Blacksmith
+ Craft Brewery
+ Caterer
+ Carpenter
+ Confectioner
+ Electrician
+ Electronics Repair
+ Gardener
+ Grinding Mill
+ Handicraft
+
+ HVAC Shop
+ Key Cutting
+ Locksmith
+ Metal Worker
+ House Painter
+ Photographer
+ Camera Shop
+ Plumber
+ Sawmill
+ Shoe Repair
+ Winery
+ Tailor
+ African
+ American
+ Arab
+ Argentinian
+ Asian
+ Austrian
+ Bagel
+ Balkan
+ Barbecue
+ Bavarian
+ Beef Bowl
+ Brazilian
+ Breakfast
+ Bubble Tea
+ Burger
+ Buschenschank
+ Cake
+ Caribbean
+ Chicken
+ Chinese
+ Coffee
+ Crepe
+ Croatian
+ Curry
+ Deli
+ Diner
+ Donut
+ Ethiopian
+ Filipino
+ Fine Dining
+ Fish
+ Fish and Chips
+ French
+ Friture
+ Georgian
+ German
+ Greek
+ Grill
+ Heuriger
+ Hotdog
+ Hungarian
+ Ice Cream
+ Indian
+ Indonesian
+ International
+ Irish
+ Italian
+ Italian, Pizza
+ Japanese
+ Kebab
+ Korean
+ Lao
+ Lebanese
+ Local
+ Malagasy
+ Malaysian
+ Mediterranean
+ Mexican
+ Moroccan
+ Noodles
+ East Asian
+ Pancake
+ Pasta
+ Persian
+ Peruvian
+ Pizza
+ Polish
+ Portuguese
+ Ramen
+ Regional
+ Russian
+ Sandwich
+ Sausage
+ Savory Pancakes
+ Seafood
+ Soba
+ Spanish
+ Steak House
+ Sushi
+ Tapas
+ Tea
+ Thai
+ Turkish
+ Vegan
+ Vegetarian
+ Vietnamese
+ Emergency
+ Emergency Assembly Point
+ Defibrillator
+ Fire Hydrant
+ Emergency Phone
+
+ Entrance
+
+ Main Entrance
+ Exit
+ $
+ Free
+ Medical Laboratory
+ Physiotherapist
+ Alternative Medicine
+ Audiologist
+ Blood Donation Center
+ Optometrist
+ Podiatrist
+ Psychotherapist
+ Sample Collection Centre
+ Logopedics
-
- Highway
- Bridle Path
-
- Bridge
- Bridle Path
-
- Tunnel
- Dedicated Bus Road
-
- Bridge
-
- Tunnel
- Bus Stop
- Road Under Construction
- Cycle Path
-
- Bridge
- Cycle Path
-
- Tunnel
- Elevator
- Foot Path
- Sidewalk
- Pedestrian Crossing
- Pedestrian Area
-
- Pedestrian Bridge
-
- Pedestrian Tunnel
- Ford
- Living Street
-
- Bridge
-
- Tunnel
- Motorway
-
- Motorway Bridge
-
- Motorway Tunnel
- Road Exit
- Motorway Ramp
-
- Bridge
-
- Tunnel
- Path
-
- Difficult or Indistinct Trail
-
- Expert or Indiscernible Trail
- Cycle & Foot Path
- Cycle & Foot Path
-
- Bridge
- Bridle Path
-
- Tunnel
- Pedestrian Street
- Pedestrian Area
-
- Pedestrian Bridge
-
- Pedestrian Tunnel
- Primary Road
-
- Bridge
-
- Tunnel
- Primary Road Ramp
-
- Bridge
-
- Tunnel
- Racetrack
- Residential Street
- Residential Street
-
- Bridge
-
- Tunnel
- Rest Area
- Road
-
- Bridge
-
- Bridge
-
- Tunnel
- Secondary Road
-
- Bridge
-
- Tunnel
- Secondary Road Ramp
-
- Bridge
-
- Tunnel
- Service Road
- Service Road
-
- Bridge
- Driveway
- Parking Aisle
-
- Tunnel
- Service Area
- Speed Camera
- Stairs
-
- Bridge
-
- Tunnel
- Tertiary Road
-
- Bridge
-
- Tunnel
- Tertiary Road Ramp
-
- Bridge
-
- Tunnel
- Track
- Track
-
- Bridge
- Track
- Track
-
- Tunnel
- Traffic Lights
- Trunk Road
-
- Bridge
-
- Tunnel
- Trunk Road Ramp
-
- Bridge
-
- Tunnel
- Minor Road
- Minor Road
-
- Bridge
-
- Tunnel
- Cycle Path
- Foot Path
- Living Street
- Motorway
- Path
- Pedestrian Street
- Primary Road
- Residential Street
- Secondary Road
- Service Road
- Tertiary Road
- Stairs
- Track
- Trunk Road
- Minor Road
- highway-world_level
- highway-world_towns_level
+
+ Highway
+ Bridle Path
+
+ Bridge
+ Bridle Path
+
+ Tunnel
+ Dedicated Bus Road
+
+ Bridge
+
+ Tunnel
+ Bus Stop
+ Road Under Construction
+ Cycle Path
+
+ Bridge
+ Cycle Path
+
+ Tunnel
+ Elevator
+ Foot Path
+ Sidewalk
+ Pedestrian Crossing
+ Pedestrian Area
+
+ Pedestrian Bridge
+
+ Pedestrian Tunnel
+ Ford
+ Living Street
+
+ Bridge
+
+ Tunnel
+ Motorway
+
+ Motorway Bridge
+
+ Motorway Tunnel
+ Road Exit
+ Motorway Ramp
+
+ Bridge
+
+ Tunnel
+ Path
+
+ Difficult or Indistinct Trail
+
+ Expert or Indiscernible Trail
+ Cycle & Foot Path
+ Cycle & Foot Path
+
+ Bridge
+ Bridle Path
+
+ Tunnel
+ Pedestrian Street
+ Pedestrian Area
+
+ Pedestrian Bridge
+
+ Pedestrian Tunnel
+ Primary Road
+
+ Bridge
+
+ Tunnel
+ Primary Road Ramp
+
+ Bridge
+
+ Tunnel
+ Racetrack
+ Residential Street
+ Residential Street
+
+ Bridge
+
+ Tunnel
+ Rest Area
+ Road
+
+ Bridge
+
+ Bridge
+
+ Tunnel
+ Secondary Road
+
+ Bridge
+
+ Tunnel
+ Secondary Road Ramp
+
+ Bridge
+
+ Tunnel
+ Service Road
+ Service Road
+
+ Bridge
+ Driveway
+ Parking Aisle
+
+ Tunnel
+ Service Area
+ Speed Camera
+ Stairs
+
+ Bridge
+
+ Tunnel
+ Tertiary Road
+
+ Bridge
+
+ Tunnel
+ Tertiary Road Ramp
+
+ Bridge
+
+ Tunnel
+ Track
+ Track
+
+ Bridge
+ Track
+ Track
+
+ Tunnel
+ Traffic Lights
+ Trunk Road
+
+ Bridge
+
+ Tunnel
+ Trunk Road Ramp
+
+ Bridge
+
+ Tunnel
+ Minor Road
+ Minor Road
+
+ Bridge
+
+ Tunnel
+ Cycle Path
+ Foot Path
+ Living Street
+ Motorway
+ Path
+ Pedestrian Street
+ Primary Road
+ Residential Street
+ Secondary Road
+ Service Road
+ Tertiary Road
+ Stairs
+ Track
+ Trunk Road
+ Minor Road
+ highway-world_level
+ highway-world_towns_level
-
- Historic Object
- Historic Aircraft
- Historic Anchor
- Archaeological Site
- Historic Battlefield
- Boundary Stone
- Cannon
- Castle
- Roman Fort
- Stronghold Castle
- Fortified Church
- Fortress
- Hillfort
- Kremlin
- Manor House
- Palace
- Japanese Castle
- Stately Castle
- City Gate
- City Wall
- Fort
- Gallows
- Historic Locomotive
- Memorial
- Memorial Cross
- Commemorative Plaque
- Sculpture
- Statue
- Stolperstein
- Historic Stone
- War Memorial
- Historic Mine
- Monument
- Pillory
- Historic Ruins
- Ship
- Historic Tank
- Tomb
- Wayside Cross
- Wayside Shrine
- Shipwreck
- hwtag
- hwtag-bidir_bicycle
- hwtag-onedir_bicycle
- hwtag-lit
- hwtag-nobicycle
- hwtag-nocar
- hwtag-nofoot
- hwtag-oneway
- hwtag-private
- hwtag-toll
- hwtag-yesbicycle
- hwtag-yescar
- hwtag-yesfoot
- Internet
- Internet
- Junction
- Roundabout
- Roundabout
- Landuse
- Allotments
- Basin
- Brownfield
-
- Cemetery
-
- Christian Cemetery
- Churchyard
- Commercial Area
- Construction Area
- Educational Facility
- Farmland
- Farmyard
- Field
- Flowerbed
- Forest
- Coniferous Forest
- Deciduous Forest
- Mixed-Leaf Forest
- Garages
- Grass
- Greenfield
- Greenhouse
- Industrial Area
- Landfill
- Meadow
- Military Area
- Orchard
- Quarry
- Railway Premises
- Recreation Ground
- Reservoir
- Residential Area
- Retail Area
- Salt Pond
- Land
- Vineyard
- Leisure
- Public Land
- Dog Park
- Fitness Centre
- Fitness Station
- Dance Hall
- Garden
- Residential Garden
- Golf Course
- Minigolf
- Hackerspace
- Ice Rink
- Marina
- Nature Reserve
- Outdoor Seating
- Park
- Private Park
- Park
- Private Park
- Picnic Table
- Sport Pitch
- Playground
- Recreation Ground
- Sauna
- Slipway
- Sports Center
- Climbing Centre
- Yoga Studio
- Stadium
- Swimming Pool
- Swimming Pool
- Track
- Track
- Water Park
- Beach Resort
- Man Made
- Breakwater
- Cairn
- Chimney
- Cutline
- Survey Point
- Flagpole
- Lighthouse
- Mast
- Pier
- Pipeline
- Overground Pipeline
- Silo
- Storage Tank
- Surveillance Camera
- Tower
- Communications Tower
- Wastewater Treatment Plant
- Water Tap
- Water Tower
- Water Well
- Windmill
- Industrial Works
- mapswithme
- mapswithme-grid
- Military
- Bunker
- Mountain Pass
- Nature
-
- Bare Rock
-
- Shingle
-
- Scree
- Bay
- Beach
- Sandy Beach
- Gravel Beach
- Cape
- Cave Entrance
- Cliff
- Earth Bank
- Embankment
- Coastline
- Desert
- Geyser
- Glacier
- Grassland
- Heath
- Hot Spring
- Lake
- Lock Chamber
- Pond
- Reservoir
- Basin
- River
- Land
- Meadow
- Orchard
- Peak
- Mountain Saddle
- Rock
- Scrub
- Natural Spring
- Strait
- Tree Row
- Vineyard
- Volcano
- Water
- Wetland
- Bog
- Marsh
- Dead End
- Office
- Company Office
- Estate Agent
- Government Office
- Insurance Office
- Lawyer
- Non-Governmental Organization
- Telecom Company
- Organic
- Organic
- City
- Capital
- City
- City
- Capital
- City
- City
- City
- City
- City
- City
- City
- Continent
- Country
- County
- Farm
- Hamlet
- Island
- Islet
- Isolated Dwelling
- Locality
- Neighbourhood
- Ocean
- Region
- Sea
- Square
- State
- State
- Suburb
- Town
- Village
- Power
- Power Generator
- Solar Generator
- Wind Generator
- Gas Turbine Power Plant
- Hydroelectric Power Plant
- Power Line
- Underground Power Line
- Minor Power Line
- Power Plant
- Coal Power Plant
- Gas Turbine Power Plant
- Hydroelectric Power Plant
- Solar Power Plant
- Wind Power Plant
- Power Station
- Substation
- Power Tower
- psurface
- psurface-paved_bad
- psurface-paved_good
- psurface-unpaved_bad
- psurface-unpaved_good
- Public Transport
- Platform
- Railway
- Abandoned Railway
- Abandoned Railway Bridge
- Abandoned Railway Tunnel
- Railway Construction
- Railway Crossing
- Disused Railway
- Funicular
- Funicular Bridge
- Funicular Tunnel
- Rail Halt
- Level Crossing
- Light Rail
- Light Rail Bridge
- Light Rail Tunnel
- Monorail
- Monorail Bridge
- Monorail Tunnel
- Narrow Gauge Rail
- Narrow Gauge Rail Bridge
- Narrow Gauge Rail Tunnel
- Railway Platform
- Preserved Rail
- Preserved Rail Bridge
- Preserved Rail Tunnel
- Railway
- High-Speed Railway
- Touristic Railway
- Railway
-
- Railway Branch
-
- Utility Railway
- Railway Spur
-
- Service Rail Track
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Bridge
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Railway Tunnel
- Train Station
- Funicular
- Light Rail Station
- DLR Station
- Porto Metro
- Monorail Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Underground Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Station
- Subway Line
- Subway Line Bridge
- Subway Line Tunnel
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Metro Station Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Subway Entrance
- Tram Line
- Tram Line Bridge
- Tram Line Tunnel
- Tram Stop
- Route
- Ferry
- route-shuttle_train
- Shop
- Liquor Shop
- Bakery
- Bathroom Furnishings
- Beauty Shop
- Beverages
- Bicycle Shop
- Bookmaker
- Bookstore
- Butcher
- Cannabis Shop
- Car Dealership
- Car Parts Shop
- Car Repair Workshop
- Tyre Repair
- RV Dealership
- Carpet Shop
- Chemist
- Chocolate Shop
- Clothes Shop
- Coffee Shop
- Computer Store
- Candy Shop
- Convenience Store
- Copyshop
- Cosmetics Shop
- Curtain Shop
- Delicatessen
- Department Store
- Home Improvement Store
- Dry Cleaner
- Electronics Shop
- Erotic Shop
- Fabric Shop
- Farm Food Shop
- Fashion Accessories
- Florist
- Funeral Directors
- Furniture Store
- Garden Center
- Gas Store
- Gift Shop
- Greengrocer
- Grocery Store
- Hairdresser
- Hardware Store
- Health Food Shop
- Herbalist
- HiFi Audio Shop
- Housewares Store
- Jewelry Store
- Kiosk
- Kitchen Store
- Laundry
- Mall
- Massage Salon
- Cell Phone Store
- Money Lender
- Motorcycle Shop
- Motorcycle Repair
- Record Store
- Musical Instrument Shop
- Newspaper Stand
- Optician
- Outdoor Equipment Shop
- Pickup Point
- Pastry Shop
- Pawnbroker
- Pet Store
- Pet Grooming
- Photo Shop
- Rental Shop
- Bicycle Rental Shop
- Fishmonger
- Second Hand Shop
- Shoe Shop
- Sports Shop
- Stationery Shop
- Supermarket
- Tattoo Parlour
- Tea Shop
- Ticket Shop
- Toy Store
- Travel Agency
- Tyre Shop
- Variety Store
- Video Shop
- Video Game Shop
- Wine Shop
- Agricultural Shop
- Antiques Shop
- Appliance Shop
-
- Artwork Shop
- Baby Goods Shop
- Bag Shop
- Bed Shop
- Boutique
- Charity Shop
- Cheese Shop
- Craft Supplies Store
- Dairy Shop
- Electrical Supplies Store
- Fishing Store
- Interior Decorations Store
- Lottery Tickets
- Medical Supplies Store
- Nutrition Supplement Store
- Paint Shop
- Perfume Shop
- Sewing Supplies Shop
- Storage Rental
- Smoke Shop
- Trade Supplies
- Watch Store
- Wholesale Store
- Sport
- American Football
- Archery
- Athletics
- Australian Football
- Baseball
- Basketball
- Beach Volleyball
- Bowls
- Chess
- Cricket
- Curling
- Equestrian Sports
- Golf
- Gymnastics
- Handball
- Various Sports
-
- Scuba Diving Site
- Shooting
- Skateboarding
- Skiing
- Soccer
- Swimming
- Table Tennis
- Tennis Court
- Volleyball
- Bowling
- Bowling
- Padel
- Futsal
- Ice Hockey
- Field Hockey
- Badminton
- Basque Pelota
- Tourism
- Aquarium
-
- Mountain Lodge
- Holiday Apartment
- Artwork
- Architectural Artwork
- Painting
- Sculpture
- Statue
- Attraction
- Animal Enclosure
- Attraction
- Campground
- RV Park
-
- Holiday Cottage
- Art Gallery
- Guest House
- Hostel
- Hotel
- Tourist Information
- Information Board
- Guidepost
- Tourist Map
- Tourist Office
- Visitor Centre
- Motel
- Museum
- Picnic Site
- Resort
- Theme Park
- Viewpoint
-
- Wilderness Hut
- Zoo
- Petting Zoo
- Traffic Calming
- Traffic Bump
- Traffic Hump
- Waterway
- Canal
- Canal Tunnel
- Fish Pass
- Dam
- Ditch
- Drainage Ditch
- Culvert
- Waterway Dock
- Drain
- Drain
- Culvert
- Lock Gate
- River
- River
- Stream
- Ephemeral Stream
- Intermittent Stream
- Stream
- Waterfall
- Weir
- Wheelchair
- Limited Wheelchair Access
- No Wheelchair Access
- Full Wheelchair Access
- J-bar Lift
- Magic Carpet
- Platter Lift
- Rope Tow
- T-bar Lift
- Downhill Ski Run
- Downhill Ski Run
- Advanced Downhill Ski Run
- Advanced Downhill Ski Run
- Easy Downhill Ski Run
- Easy Downhill Ski Run
- Expert Downhill Ski Run
- Expert Downhill Ski Run
- Freeride Downhill Ski Run
- Intermediate Downhill Ski Run
- Intermediate Downhill Ski Run
- Novice Downhill Ski Run
- Novice Downhill Ski Run
- Nordic Ski Trail
- Sledding Piste
- Sledding Piste
- Snow Park
- Snow Hiking Trail
- Piste Connection
- Skitour Trail
- Events Venue
- Auction
- Collectables
+
+ Historic Object
+ Historic Aircraft
+ Historic Anchor
+ Archaeological Site
+ Historic Battlefield
+ Boundary Stone
+ Cannon
+ Castle
+ Roman Fort
+ Stronghold Castle
+ Fortified Church
+ Fortress
+ Hillfort
+ Kremlin
+ Manor House
+ Palace
+ Japanese Castle
+ Stately Castle
+ City Gate
+ City Wall
+ Fort
+ Gallows
+ Historic Locomotive
+ Memorial
+ Memorial Cross
+ Commemorative Plaque
+ Sculpture
+ Statue
+ Stolperstein
+ Historic Stone
+ War Memorial
+ Historic Mine
+ Monument
+ Pillory
+ Historic Ruins
+ Ship
+ Historic Tank
+ Tomb
+ Wayside Cross
+ Wayside Shrine
+ Shipwreck
+ hwtag
+ hwtag-bidir_bicycle
+ hwtag-onedir_bicycle
+ hwtag-lit
+ hwtag-nobicycle
+ hwtag-nocar
+ hwtag-nofoot
+ hwtag-oneway
+ hwtag-private
+ hwtag-toll
+ hwtag-yesbicycle
+ hwtag-yescar
+ hwtag-yesfoot
+ Internet
+ Internet
+ Junction
+ Roundabout
+ Roundabout
+ Landuse
+ Allotments
+ Basin
+ Brownfield
+
+ Cemetery
+
+ Christian Cemetery
+ Churchyard
+ Commercial Area
+ Construction Area
+ Educational Facility
+ Farmland
+ Farmyard
+ Field
+ Flowerbed
+ Forest
+ Coniferous Forest
+ Deciduous Forest
+ Mixed-Leaf Forest
+ Garages
+ Grass
+ Greenfield
+ Greenhouse
+ Industrial Area
+ Landfill
+ Meadow
+ Military Area
+ Orchard
+ Quarry
+ Railway Premises
+ Recreation Ground
+ Reservoir
+ Residential Area
+ Retail Area
+ Salt Pond
+ Land
+ Vineyard
+ Leisure
+ Public Land
+ Dog Park
+ Fitness Centre
+ Fitness Station
+ Dance Hall
+ Garden
+ Residential Garden
+ Golf Course
+ Minigolf
+ Hackerspace
+ Ice Rink
+ Marina
+ Nature Reserve
+ Outdoor Seating
+ Park
+ Private Park
+ Park
+ Private Park
+ Picnic Table
+ Sport Pitch
+ Playground
+ Recreation Ground
+ Sauna
+ Slipway
+ Sports Center
+ Climbing Centre
+ Yoga Studio
+ Stadium
+ Swimming Pool
+ Swimming Pool
+ Track
+ Track
+ Water Park
+ Beach Resort
+ Man Made
+ Breakwater
+ Cairn
+ Chimney
+ Cutline
+ Survey Point
+ Flagpole
+ Lighthouse
+ Mast
+ Pier
+ Pipeline
+ Overground Pipeline
+ Silo
+ Storage Tank
+ Surveillance Camera
+ Tower
+ Communications Tower
+ Wastewater Treatment Plant
+ Water Tap
+ Water Tower
+ Water Well
+ Windmill
+ Industrial Works
+ mapswithme
+ mapswithme-grid
+ Military
+ Bunker
+ Mountain Pass
+ Nature
+
+ Bare Rock
+
+ Shingle
+
+ Scree
+ Bay
+ Beach
+ Sandy Beach
+ Gravel Beach
+ Cape
+ Cave Entrance
+ Cliff
+ Earth Bank
+ Embankment
+ Coastline
+ Desert
+ Geyser
+ Glacier
+ Grassland
+ Heath
+ Hot Spring
+ Lake
+ Lock Chamber
+ Pond
+ Reservoir
+ Basin
+ River
+ Land
+ Meadow
+ Orchard
+ Peak
+ Mountain Saddle
+ Rock
+ Scrub
+ Natural Spring
+ Strait
+ Tree Row
+ Vineyard
+ Volcano
+ Water
+ Wetland
+ Bog
+ Marsh
+ Dead End
+ Office
+ Company Office
+ Estate Agent
+ Government Office
+ Insurance Office
+ Lawyer
+ Non-Governmental Organization
+ Telecom Company
+ Organic
+ Organic
+ City
+ Capital
+ City
+ City
+ Capital
+ City
+ City
+ City
+ City
+ City
+ City
+ City
+ Continent
+ Country
+ County
+ Farm
+ Hamlet
+ Island
+ Islet
+ Isolated Dwelling
+ Locality
+ Neighbourhood
+ Ocean
+ Region
+ Sea
+ Square
+ State
+ State
+ Suburb
+ Town
+ Village
+ Power
+ Power Generator
+ Solar Generator
+ Wind Generator
+ Gas Turbine Power Plant
+ Hydroelectric Power Plant
+ Power Line
+ Underground Power Line
+ Minor Power Line
+ Power Plant
+ Coal Power Plant
+ Gas Turbine Power Plant
+ Hydroelectric Power Plant
+ Solar Power Plant
+ Wind Power Plant
+ Power Station
+ Substation
+ Power Tower
+ psurface
+ psurface-paved_bad
+ psurface-paved_good
+ psurface-unpaved_bad
+ psurface-unpaved_good
+ Public Transport
+ Platform
+ Railway
+ Abandoned Railway
+ Abandoned Railway Bridge
+ Abandoned Railway Tunnel
+ Railway Construction
+ Railway Crossing
+ Disused Railway
+ Funicular
+ Funicular Bridge
+ Funicular Tunnel
+ Rail Halt
+ Level Crossing
+ Light Rail
+ Light Rail Bridge
+ Light Rail Tunnel
+ Monorail
+ Monorail Bridge
+ Monorail Tunnel
+ Narrow Gauge Rail
+ Narrow Gauge Rail Bridge
+ Narrow Gauge Rail Tunnel
+ Railway Platform
+ Preserved Rail
+ Preserved Rail Bridge
+ Preserved Rail Tunnel
+ Railway
+ High-Speed Railway
+ Touristic Railway
+ Railway
+
+ Railway Branch
+
+ Utility Railway
+ Railway Spur
+
+ Service Rail Track
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Bridge
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Railway Tunnel
+ Train Station
+ Funicular
+ Light Rail Station
+ DLR Station
+ Porto Metro
+ Monorail Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Underground Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Station
+ Subway Line
+ Subway Line Bridge
+ Subway Line Tunnel
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Metro Station Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Subway Entrance
+ Tram Line
+ Tram Line Bridge
+ Tram Line Tunnel
+ Tram Stop
+ Route
+ Ferry
+ route-shuttle_train
+ Shop
+ Liquor Shop
+ Bakery
+ Bathroom Furnishings
+ Beauty Shop
+ Beverages
+ Bicycle Shop
+ Bookmaker
+ Bookstore
+ Butcher
+ Cannabis Shop
+ Car Dealership
+ Car Parts Shop
+ Car Repair Workshop
+ Tyre Repair
+ RV Dealership
+ Carpet Shop
+ Chemist
+ Chocolate Shop
+ Clothes Shop
+ Coffee Shop
+ Computer Store
+ Candy Shop
+ Convenience Store
+ Copyshop
+ Cosmetics Shop
+ Curtain Shop
+ Delicatessen
+ Department Store
+ Home Improvement Store
+ Dry Cleaner
+ Electronics Shop
+ Erotic Shop
+ Fabric Shop
+ Farm Food Shop
+ Fashion Accessories
+ Florist
+ Funeral Directors
+ Furniture Store
+ Garden Center
+ Gas Store
+ Gift Shop
+ Greengrocer
+ Grocery Store
+ Hairdresser
+ Hardware Store
+ Health Food Shop
+ Herbalist
+ HiFi Audio Shop
+ Housewares Store
+ Jewelry Store
+ Kiosk
+ Kitchen Store
+ Laundry
+ Mall
+ Massage Salon
+ Cell Phone Store
+ Money Lender
+ Motorcycle Shop
+ Motorcycle Repair
+ Record Store
+ Musical Instrument Shop
+ Newspaper Stand
+ Optician
+ Outdoor Equipment Shop
+ Pickup Point
+ Pastry Shop
+ Pawnbroker
+ Pet Store
+ Pet Grooming
+ Photo Shop
+ Rental Shop
+ Bicycle Rental Shop
+ Fishmonger
+ Second Hand Shop
+ Shoe Shop
+ Sports Shop
+ Stationery Shop
+ Supermarket
+ Tattoo Parlour
+ Tea Shop
+ Ticket Shop
+ Toy Store
+ Travel Agency
+ Tyre Shop
+ Variety Store
+ Video Shop
+ Video Game Shop
+ Wine Shop
+ Agricultural Shop
+ Antiques Shop
+ Appliance Shop
+
+ Artwork Shop
+ Baby Goods Shop
+ Bag Shop
+ Bed Shop
+ Boutique
+ Charity Shop
+ Cheese Shop
+ Craft Supplies Store
+ Dairy Shop
+ Electrical Supplies Store
+ Fishing Store
+ Interior Decorations Store
+ Lottery Tickets
+ Medical Supplies Store
+ Nutrition Supplement Store
+ Paint Shop
+ Perfume Shop
+ Sewing Supplies Shop
+ Storage Rental
+ Smoke Shop
+ Trade Supplies
+ Watch Store
+ Wholesale Store
+ Sport
+ American Football
+ Archery
+ Athletics
+ Australian Football
+ Baseball
+ Basketball
+ Beach Volleyball
+ Bowls
+ Chess
+ Cricket
+ Curling
+ Equestrian Sports
+ Golf
+ Gymnastics
+ Handball
+ Various Sports
+
+ Scuba Diving Site
+ Shooting
+ Skateboarding
+ Skiing
+ Soccer
+ Swimming
+ Table Tennis
+ Tennis Court
+ Volleyball
+ Bowling
+ Bowling
+ Padel
+ Futsal
+ Ice Hockey
+ Field Hockey
+ Badminton
+ Basque Pelota
+ Tourism
+ Aquarium
+
+ Mountain Lodge
+ Holiday Apartment
+ Artwork
+ Architectural Artwork
+ Painting
+ Sculpture
+ Statue
+ Attraction
+ Animal Enclosure
+ Attraction
+ Campground
+ RV Park
+
+ Holiday Cottage
+ Art Gallery
+ Guest House
+ Hostel
+ Hotel
+ Tourist Information
+ Information Board
+ Guidepost
+ Tourist Map
+ Tourist Office
+ Visitor Centre
+ Motel
+ Museum
+ Picnic Site
+ Resort
+ Theme Park
+ Viewpoint
+
+ Wilderness Hut
+ Zoo
+ Petting Zoo
+ Traffic Calming
+ Traffic Bump
+ Traffic Hump
+ Waterway
+ Canal
+ Canal Tunnel
+ Fish Pass
+ Dam
+ Ditch
+ Drainage Ditch
+ Culvert
+ Waterway Dock
+ Drain
+ Drain
+ Culvert
+ Lock Gate
+ River
+ River
+ Stream
+ Ephemeral Stream
+ Intermittent Stream
+ Stream
+ Waterfall
+ Weir
+ Wheelchair
+ Limited Wheelchair Access
+ No Wheelchair Access
+ Full Wheelchair Access
+ J-bar Lift
+ Magic Carpet
+ Platter Lift
+ Rope Tow
+ T-bar Lift
+ Downhill Ski Run
+ Downhill Ski Run
+ Advanced Downhill Ski Run
+ Advanced Downhill Ski Run
+ Easy Downhill Ski Run
+ Easy Downhill Ski Run
+ Expert Downhill Ski Run
+ Expert Downhill Ski Run
+ Freeride Downhill Ski Run
+ Intermediate Downhill Ski Run
+ Intermediate Downhill Ski Run
+ Novice Downhill Ski Run
+ Novice Downhill Ski Run
+ Nordic Ski Trail
+ Sledding Piste
+ Sledding Piste
+ Snow Park
+ Snow Hiking Trail
+ Piste Connection
+ Skitour Trail
+ Events Venue
+ Auction
+ Collectables
+
+ Hello blank fragment
diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml
index 7de3a8a984c..8bf3d2f2430 100644
--- a/android/app/src/main/res/values/themes.xml
+++ b/android/app/src/main/res/values/themes.xml
@@ -4,8 +4,8 @@
diff --git a/android/app/src/main/res/xml/prefs_main.xml b/android/app/src/main/res/xml/prefs_main.xml
index 93bc6d01da4..c9a70c870bf 100644
--- a/android/app/src/main/res/xml/prefs_main.xml
+++ b/android/app/src/main/res/xml/prefs_main.xml
@@ -3,11 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
-
+
+#import
@class MapViewController;
@class MWMCarPlayService;
NS_ASSUME_NONNULL_BEGIN
-@interface MapsAppDelegate : UIResponder
+@interface MapsAppDelegate : UIResponder
{
NSInteger m_activeDownloadsCounter;
UIBackgroundTaskIdentifier m_backgroundTask;
diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm
index 344d3916e5a..04fc3fe2a93 100644
--- a/iphone/Maps/Classes/MapsAppDelegate.mm
+++ b/iphone/Maps/Classes/MapsAppDelegate.mm
@@ -13,18 +13,17 @@
#import "MapViewController.h"
#import "NSDate+TimeDistance.h"
#import "SwiftBridge.h"
-
-
-#import
-#import
-#import
+#import
+#import
#import
+#import
#import
#import
+#import
+#import
#include "map/gps_tracker.hpp"
-
#include "platform/background_downloader_ios.h"
#include "platform/http_thread_apple.h"
#include "platform/local_country_file_utils.hpp"
@@ -61,8 +60,7 @@ void InitLocalizedStrings() {
using namespace osm_auth_ios;
-@interface MapsAppDelegate ()
+@interface MapsAppDelegate ()
@property(nonatomic) NSInteger standbyCounter;
@property(nonatomic) MWMBackgroundFetchScheduler *backgroundFetchScheduler;
@@ -108,12 +106,23 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
NSLog(@"application:didFinishLaunchingWithOptions: %@", launchOptions);
[HttpThreadImpl setDownloadIndicatorProtocol:self];
+ [FIRApp configure];
+
+ [application registerForRemoteNotifications];
InitLocalizedStrings();
[MWMThemeManager invalidate];
-
[self commonInit];
-
+ [UNUserNotificationCenter currentNotificationCenter].delegate = self;
+ UNAuthorizationOptions authOptions =
+ UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
+ [[UNUserNotificationCenter currentNotificationCenter]
+ requestAuthorizationWithOptions:authOptions
+ completionHandler:^(BOOL granted, NSError *_Nullable error) {
+ LOG(LINFO, ("Firebase Messaging intitialized", granted));
+ }];
+ [application registerForRemoteNotifications];
+ [FIRMessaging messaging].delegate = self;
if ([FirstSession isFirstSession]) {
[self firstLaunchSetup];
} else {
@@ -123,11 +132,22 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
if (![MapsAppDelegate isTestsEnvironment])
[[CloudStorageManager shared] start];
-
+
[[DeepLinkHandler shared] applicationDidFinishLaunching:launchOptions];
+
// application:openUrl:options is called later for deep links if YES is returned.
return YES;
}
+- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
+
+ NSLog(@"FCM registration token: %@", fcmToken);
+ // Notify about received token.
+ NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"FCMToken" object:nil userInfo:dataDict];
+ // TODO: If necessary send token to application server.
+ // // Note: This callback is fired at each app startup and whenever a new token is generated.
+
+}
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
@@ -136,6 +156,23 @@ - (void)application:(UIApplication *)application
completionHandler(YES);
}
+- (void)userNotificationCenter:(UNUserNotificationCenter *)center
+ willPresentNotification:(UNNotification *)notification
+ withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
+ NSDictionary *userInfo = notification.request.content.userInfo;
+
+ // With swizzling disabled you must let Messaging know about the message, for Analytics
+ // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
+
+ // ...
+
+ // Print full message.
+ NSLog(@"%@", userInfo);
+
+ // Change this to your preferred presentation option
+ completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
+}
+
- (void)runBackgroundTasks:(NSArray *_Nonnull)tasks
completionHandler:(void (^_Nullable)(UIBackgroundFetchResult))completionHandler {
self.backgroundFetchScheduler = [[MWMBackgroundFetchScheduler alloc] initWithTasks:tasks
@@ -210,7 +247,7 @@ - (void)applicationWillEnterForeground:(UIApplication *)application {
- (void)applicationDidBecomeActive:(UIApplication *)application {
LOG(LINFO, ("applicationDidBecomeActive - begin"));
- auto & f = GetFramework();
+ auto &f = GetFramework();
f.EnterForeground();
[self.mapViewController onGetFocus:YES];
f.SetRenderingEnabled();
@@ -228,10 +265,11 @@ - (void)applicationDidBecomeActive:(UIApplication *)application {
LOG(LINFO, ("applicationDidBecomeActive - end"));
}
-// TODO: Drape enabling and iCloud sync are skipped during the test run due to the app crashing in teardown. This is a temporary solution. Drape should be properly disabled instead of merely skipping the enabling process.
+// TODO: Drape enabling and iCloud sync are skipped during the test run due to the app crashing in teardown. This is a
+// temporary solution. Drape should be properly disabled instead of merely skipping the enabling process.
+ (BOOL)isTestsEnvironment {
- NSProcessInfo * processInfo = [NSProcessInfo processInfo];
- NSArray * launchArguments = [processInfo arguments];
+ NSProcessInfo *processInfo = [NSProcessInfo processInfo];
+ NSArray *launchArguments = [processInfo arguments];
BOOL isTests = [launchArguments containsObject:@"-IsTests"];
return isTests;
}
@@ -414,7 +452,7 @@ - (BOOL)userIsNew {
- (void)application:(UIApplication *)application
didConnectCarInterfaceController:(CPInterfaceController *)interfaceController
- toWindow:(CPWindow *)window API_AVAILABLE(ios(12.0)) {
+ toWindow:(CPWindow *)window API_AVAILABLE(ios(12.0)) {
[self.carplayService setupWithWindow:window interfaceController:interfaceController];
}
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/100.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/100.png
index fe1e61be5eb..6938e1b4987 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/100.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/100.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/102.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/102.png
new file mode 100644
index 00000000000..99b8dae560e
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/102.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/1024.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/1024.png
index d32f5cb3c52..81d78377f2d 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/1024.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/1024.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/114.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/114.png
index 186e44006fe..95db193f691 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/114.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/114.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/120.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/120.png
index b703bccc5ac..ba7784756fd 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/120.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/120.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/128.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/128.png
new file mode 100644
index 00000000000..d12e8b6f482
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/128.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/144.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/144.png
index 0f848a8d523..88f193d59ff 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/144.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/144.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/152.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/152.png
index be9360e1586..f7c24f3fb8e 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/152.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/152.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/16.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/16.png
new file mode 100644
index 00000000000..bf9983c072a
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/16.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/167.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/167.png
index a09436d571f..f0b3e1ab7a5 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/167.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/167.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/172.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/172.png
new file mode 100644
index 00000000000..75653834f4e
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/172.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/180.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/180.png
index 91eab76448f..316f5ec44db 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/180.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/180.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/196.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/196.png
new file mode 100644
index 00000000000..55112f20f08
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/196.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/20.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/20.png
index c7828389fd2..0aec54a89ea 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/20.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/20.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/216.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/216.png
new file mode 100644
index 00000000000..73b0c00d971
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/216.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/256.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/256.png
new file mode 100644
index 00000000000..23bee2444b2
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/256.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/29.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/29.png
index ad75246a1b0..e91e11f78b7 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/29.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/29.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/32.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/32.png
new file mode 100644
index 00000000000..ca6baf45ebf
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/32.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/40.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/40.png
index 1bcd6ed2420..3da94780a3e 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/40.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/40.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/48.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/48.png
new file mode 100644
index 00000000000..2de792a915b
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/48.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/50.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/50.png
index 848b0a8d405..e055d4e22b7 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/50.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/50.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/512.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/512.png
new file mode 100644
index 00000000000..90dab7a9024
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/512.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/55.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/55.png
new file mode 100644
index 00000000000..0b97cb0c2b9
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/55.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/57.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/57.png
index 39fd8c70533..394e3443f3c 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/57.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/57.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/58.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/58.png
index 5a0cb45f140..518475c6f31 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/58.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/58.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/60.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/60.png
index 04c34d1fddb..cb4ae031840 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/60.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/60.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/64.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/64.png
new file mode 100644
index 00000000000..8015ac9cd1a
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/64.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/66.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/66.png
new file mode 100644
index 00000000000..6b9dab106bc
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/66.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/72.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/72.png
index c3183a824c0..d898c5c133f 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/72.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/72.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/76.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/76.png
index 9fa41ac0a2d..0fc07ba4e97 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/76.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/76.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/80.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/80.png
index ab2bd7f8f1a..602b6ff5f3e 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/80.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/80.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/87.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/87.png
index f01bfa42f7a..6dc80c12f2b 100644
Binary files a/iphone/Maps/Images.xcassets/AppIcon.appiconset/87.png and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/87.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/88.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/88.png
new file mode 100644
index 00000000000..63a299a2e8a
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/88.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/92.png b/iphone/Maps/Images.xcassets/AppIcon.appiconset/92.png
new file mode 100644
index 00000000000..2dc1655dc84
Binary files /dev/null and b/iphone/Maps/Images.xcassets/AppIcon.appiconset/92.png differ
diff --git a/iphone/Maps/Images.xcassets/AppIcon.appiconset/Contents.json b/iphone/Maps/Images.xcassets/AppIcon.appiconset/Contents.json
index 65b74d7ef11..6bf81eb6435 100644
--- a/iphone/Maps/Images.xcassets/AppIcon.appiconset/Contents.json
+++ b/iphone/Maps/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -1 +1,354 @@
-{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]}
\ No newline at end of file
+{
+ "images" : [
+ {
+ "filename" : "40.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "60.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "87.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "57.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "114.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "180.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "20.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "50.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "100.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "72.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "144.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "76.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "152.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "167.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "filename" : "1024.png",
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ },
+ {
+ "filename" : "16.png",
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "16x16"
+ },
+ {
+ "filename" : "32.png",
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "16x16"
+ },
+ {
+ "filename" : "32.png",
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "32x32"
+ },
+ {
+ "filename" : "64.png",
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "32x32"
+ },
+ {
+ "filename" : "128.png",
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "128x128"
+ },
+ {
+ "filename" : "256.png",
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "128x128"
+ },
+ {
+ "filename" : "256.png",
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "256x256"
+ },
+ {
+ "filename" : "512.png",
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "256x256"
+ },
+ {
+ "filename" : "512.png",
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "512x512"
+ },
+ {
+ "filename" : "1024.png",
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "512x512"
+ },
+ {
+ "filename" : "48.png",
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "24x24",
+ "subtype" : "38mm"
+ },
+ {
+ "filename" : "55.png",
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "27.5x27.5",
+ "subtype" : "42mm"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "87.png",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "66.png",
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "33x33",
+ "subtype" : "45mm"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "40x40",
+ "subtype" : "38mm"
+ },
+ {
+ "filename" : "88.png",
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "44x44",
+ "subtype" : "40mm"
+ },
+ {
+ "filename" : "92.png",
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "46x46",
+ "subtype" : "41mm"
+ },
+ {
+ "filename" : "100.png",
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "50x50",
+ "subtype" : "44mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "51x51",
+ "subtype" : "45mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "54x54",
+ "subtype" : "49mm"
+ },
+ {
+ "filename" : "172.png",
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "86x86",
+ "subtype" : "38mm"
+ },
+ {
+ "filename" : "196.png",
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "98x98",
+ "subtype" : "42mm"
+ },
+ {
+ "filename" : "216.png",
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "108x108",
+ "subtype" : "44mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "117x117",
+ "subtype" : "45mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "129x129",
+ "subtype" : "49mm"
+ },
+ {
+ "filename" : "1024.png",
+ "idiom" : "watch-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ },
+ {
+ "filename" : "102.png",
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "45x45",
+ "subtype" : "41mm"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iphone/Maps/Images.xcassets/AppIconDebug.appiconset/1024.png b/iphone/Maps/Images.xcassets/AppIconDebug.appiconset/1024.png
index 09777dda6c9..81d78377f2d 100644
Binary files a/iphone/Maps/Images.xcassets/AppIconDebug.appiconset/1024.png and b/iphone/Maps/Images.xcassets/AppIconDebug.appiconset/1024.png differ
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/Color 1.colorset/Contents.json b/iphone/Maps/Images.xcassets/NavigationDashboard/Color 1.colorset/Contents.json
new file mode 100644
index 00000000000..22c4bb0a8d9
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/NavigationDashboard/Color 1.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/Color.colorset/Contents.json b/iphone/Maps/Images.xcassets/NavigationDashboard/Color.colorset/Contents.json
new file mode 100644
index 00000000000..22c4bb0a8d9
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/NavigationDashboard/Color.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/Image.imageset/Contents.json b/iphone/Maps/Images.xcassets/NavigationDashboard/Image.imageset/Contents.json
new file mode 100644
index 00000000000..a19a5492203
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/NavigationDashboard/Image.imageset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/Contents.json b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/Contents.json
new file mode 100644
index 00000000000..96fea4d87b6
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "ic_alerts_drims@3x 2.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "ic_alerts_drims@3x 3.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "ic_alerts_drims@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 2.png b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 2.png
new file mode 100644
index 00000000000..2a6c44fe37e
Binary files /dev/null and b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 2.png differ
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 3.png b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 3.png
new file mode 100644
index 00000000000..2a6c44fe37e
Binary files /dev/null and b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x 3.png differ
diff --git a/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x.png b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x.png
new file mode 100644
index 00000000000..2a6c44fe37e
Binary files /dev/null and b/iphone/Maps/Images.xcassets/NavigationDashboard/ic_alerts_drims.imageset/ic_alerts_drims@3x.png differ
diff --git a/iphone/Maps/Images.xcassets/logo.imageset/logo.svg b/iphone/Maps/Images.xcassets/logo.imageset/logo.svg
index 14f52eba268..f44df9a0f0b 100644
--- a/iphone/Maps/Images.xcassets/logo.imageset/logo.svg
+++ b/iphone/Maps/Images.xcassets/logo.imageset/logo.svg
@@ -1 +1,78 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
index 2e8882c785a..53a5e3e4fd4 100644
--- a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings
@@ -59,8 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• لا يوجد استنزاف للبطارية، يعمل دون اتصال بالإنترنت";
-/* Text in About screen */
-"about_proposition_3" = "• سريع وبسيط، تم تطويره بواسطة المجتمع";
"close" = "إغلاق";
diff --git a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings
index 82b5f82e5e8..7d5f6c9c59a 100644
--- a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings
@@ -59,8 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Batareyanın boşalması yoxdur, oflayn işləyir";
-/* Text in About screen */
-"about_proposition_3" = "• Sürətli, minimalist, icma tərəfindən hazırlanmışdır";
"close" = "Yaxın";
diff --git a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings
index 6aef09ae14a..abcf36c19e9 100644
--- a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings
@@ -59,8 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Няма разрадкі батарэі, працуе ў аўтаномным рэжыме";
-/* Text in About screen */
-"about_proposition_3" = "• Хуткія, мінімалістычныя, распрацаваныя супольнасцю";
"close" = "Закрыць";
diff --git a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings
index ffb5893dea2..164d68c6571 100644
--- a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings
@@ -59,8 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Без източване на батерията, работи офлайн";
-/* Text in About screen */
-"about_proposition_3" = "• Бързи, минималистични, разработен от общността";
"close" = "Затваряне";
diff --git a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings
index e15fa45db74..45631a7f685 100644
--- a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings
@@ -51,16 +51,14 @@
"country_status_download_failed" = "La baixada ha fallat";
/* Text in About screen */
-"about_headline" = "Free for everyone, made with love";
+"about_headline" = "Disaster Response Information Management System (DRIMS)";
/* Text in About screen */
-"about_proposition_1" = "• No ads, no tracking, no data collection";
+"about_proposition_1" = "• No ads, no tracking";
/* Text in About screen */
"about_proposition_2" = "• Sense consum de bateria, funciona fora de línia";
-/* Text in About screen */
-"about_proposition_3" = "• Ràpid, minimalista, desenvolupat per la comunitat";
"close" = "Tanca";
diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
index 3e4279fb08b..d990321d9a5 100644
--- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Žádné vybíjení baterie, funguje offline";
-/* Text in About screen */
-"about_proposition_3" = "• Rychlé, minimalistické, vyvinutý komunitou";
-
"close" = "Zavřít";
"download" = "Stáhnout";
diff --git a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
index 410a9af4e2d..6c746ae581c 100644
--- a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Intet batteridræn, fungerer offline";
-/* Text in About screen */
-"about_proposition_3" = "• Hurtig, minimalistisk, udviklet af fællesskabet";
-
"close" = "Luk";
"download" = "Download";
@@ -171,7 +168,7 @@
/********** Other translations **********/
-"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in Organic Maps. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!";
+"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in DRIMS. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with DRIMS!";
/* message title of loading file */
"load_kmz_title" = "Indlæser Bogmærker";
@@ -189,10 +186,10 @@
"unknown_current_position" = "Din lokation er ikke blevet bestemt endnu";
/* Subject for emailed bookmark */
-"bookmark_share_email_subject" = "Hey, tjek min knappenål på Organic Maps kortet ud!";
+"bookmark_share_email_subject" = "Hey, tjek min knappenål på DRIMS kortet ud!";
/* Subject for emailed position */
-"my_position_share_email_subject" = "Hey, tjek min nuværende lokation ud på Organic Maps kortet!";
+"my_position_share_email_subject" = "Hey, tjek min nuværende lokation ud på DRIMS kortet!";
/* Share button text which opens menu with more buttons, like Message, EMail, Facebook etc. */
"share" = "Del";
@@ -210,7 +207,7 @@
"done" = "Færdig";
/* Prints version number in About dialog */
-"version" = "Organic Maps version: %@";
+"version" = "DRIMS";
/* Title for tracks category in bookmarks manager */
"tracks_title" = "Ruter";
@@ -295,7 +292,7 @@
/* Text in menu */
"website" = "Hjemmeside";
-/* Text in About menu, opens Organic Maps news website */
+/* Text in About menu, opens DRIMS news website */
"news" = "Nyheder";
/* Text in menu */
@@ -734,7 +731,7 @@
/* Error dialog no space */
"migration_no_space_message" = "For at opdatere app'en skal du bruge mere plads. Slet unødvendig data.";
-"editor_sharing_title" = "Jeg forbedrede Organic Maps kortene";
+"editor_sharing_title" = "Jeg forbedrede DRIMS kortene";
/* Downloaded 10 **of** 20 <- it is that "of" */
"downloader_of" = "%1$d af %2$d";
@@ -761,7 +758,7 @@
"editor_detailed_description_hint" = "Detaljerede bemærkninger";
-"editor_detailed_description" = "Dine foreslåede ændringer vil blive sendt til OpenStreetMap fællesskabet. Beskrive detaljer, som ikke kan redigeres i Organic Maps.";
+"editor_detailed_description" = "Dine foreslåede ændringer vil blive sendt til OpenStreetMap fællesskabet. Beskrive detaljer, som ikke kan redigeres i DRIMS.";
"editor_more_about_osm" = "Mere om OpenStreetMap";
@@ -792,7 +789,7 @@
"location_services_disabled_on_device_4" = "4. Slå placeringstjenester til";
-"location_services_disabled_on_device_additional_message" = "Eller fortsæt med at bruge Organic Maps uden placering";
+"location_services_disabled_on_device_additional_message" = "Eller fortsæt med at bruge DRIMS uden placering";
/* abbreviation for meters */
"m" = "m";
@@ -823,7 +820,7 @@
"more_on_kayak" = "Fotos, anmeldelser, booking";
/* An explanation dialog shown when clicking on more_on_kayak link. */
-"dialog_kayak_disclaimer" = "Henvisningsbonussen, der modtages for hver booking via dette link, går til udviklingen af Organic Maps.";
+"dialog_kayak_disclaimer" = "Henvisningsbonussen, der modtages for hver booking via dette link, går til udviklingen af DRIMS.";
/* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */
"dialog_kayak_button" = "Detaljer på Kayak";
@@ -883,7 +880,7 @@
/* For sharing via SMS and so on */
"sharing_call_action_look" = "Tjek";
-"recent_track_background_dialog_message" = "Organic Maps anvender din geoposition i baggrunden til at gemme din seneste rejserute.";
+"recent_track_background_dialog_message" = "DRIMS anvender din geoposition i baggrunden til at gemme din seneste rejserute.";
"general_settings" = "Generelle indstillinger";
@@ -1055,7 +1052,7 @@
"power_managment_setting_manual_max" = "Maksimum strømbesparelse";
-"enable_logging_warning_message" = "Indstillingen aktiverer logning til diagnostiske formål. Det kan være nyttigt for vores supportere, der fejlfinder problemer med appen. Aktiver kun denne mulighed på anmodning fra Organic Maps support.";
+"enable_logging_warning_message" = "Indstillingen aktiverer logning til diagnostiske formål. Det kan være nyttigt for vores supportere, der fejlfinder problemer med appen. Aktiver kun denne mulighed på anmodning fra DRIMS support.";
"driving_options_title" = "Køre muligheder";
@@ -1137,7 +1134,7 @@
"speedcams_alert_title_carplay_2" = "Radar advarsel";
-"download_map_carplay" = "Download kort i Organic Maps appen, på din enhed";
+"download_map_carplay" = "Download kort i DRIMS appen, på din enhed";
"carplay_roundabout_exit" = "%@ exit";
@@ -1270,7 +1267,7 @@
/* Instagram account url for the "?" About page */
"instagram_url" = "https://www.instagram.com/organicmaps.app";
-/* Translated Organic Maps site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
+/* Translated DRIMS site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
"translated_om_site_url" = "https://organicmaps.app/";
/* Link to OSM wiki for Editor, Profile and About pages */
@@ -1307,10 +1304,10 @@
"app_tip_09" = "Vores hovedmål er at bygge hurtige, privatlivsfokuserede, brugervenlige kort, som du vil elske.";
/* Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen */
-"car_used_on_the_phone_screen" = "Du bruger nu Organic Maps på telefonens skærm.";
+"car_used_on_the_phone_screen" = "Du bruger nu DRIMS på telefonens skærm.";
/* Text on the phone placeholder screen that maps are displayed on the car screen */
-"car_used_on_the_car_screen" = "Du bruger nu Organic Maps på bilens skærm.";
+"car_used_on_the_car_screen" = "Du bruger nu DRIMS på bilens skærm.";
/* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */
"car_continue_on_the_phone" = "Fortsæt i telefonen";
diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
index a93eb20a90b..a33e48186d2 100644
--- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Minimaler Batterieverbrauch, funktioniert offline";
-/* Text in About screen */
-"about_proposition_3" = "• Schnell, minimalistisch, von der Community entwickelt";
-
"close" = "Schließen";
"download" = "Herunterladen";
diff --git a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
index c77e3e54632..f7aecfa3393 100644
--- a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Δεν εξαντλεί τη μπαταρία, λειτουργεί εκτός σύνδεσης";
-/* Text in About screen */
-"about_proposition_3" = "• Γρήγορο, μινιμαλιστικό, αναπτυγμένο από την κοινότητα";
-
"close" = "Κλείσιμο";
"download" = "Λήψη";
diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
index b92a83918b8..12458a1976a 100644
--- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings
@@ -51,17 +51,14 @@
"country_status_download_failed" = "Download has failed";
/* Text in About screen */
-"about_headline" = "Free for everyone, made with love";
+"about_headline" = "Disaster Response Information Management System (DRIMS)";
/* Text in About screen */
-"about_proposition_1" = "• No ads, no tracking, no data collection";
+"about_proposition_1" = "• No ads, no tracking";
/* Text in About screen */
"about_proposition_2" = "• No battery drain, works offline";
-/* Text in About screen */
-"about_proposition_3" = "• Fast, minimalist, developed by community";
-
"close" = "Close";
"download" = "Download";
@@ -171,7 +168,7 @@
/********** Other translations **********/
-"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in Organic Maps. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!";
+"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in DRIMS. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with DRIMS!";
/* message title of loading file */
"load_kmz_title" = "Loading Bookmarks";
@@ -189,10 +186,10 @@
"unknown_current_position" = "Your location hasn't been determined yet";
/* Subject for emailed bookmark */
-"bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!";
+"bookmark_share_email_subject" = "Hey, check out my pin in DRIMS!";
/* Subject for emailed position */
-"my_position_share_email_subject" = "Hey, check out my current location on the Organic Maps map!";
+"my_position_share_email_subject" = "Hey, check out my current location on the DRIMS map!";
/* Share button text which opens menu with more buttons, like Message, EMail, Facebook etc. */
"share" = "Share";
@@ -210,7 +207,7 @@
"done" = "Done";
/* Prints version number in About dialog */
-"version" = "Organic Maps version: %@";
+"version" = "DRIMS";
/* Title for tracks category in bookmarks manager */
"tracks_title" = "Tracks";
@@ -295,7 +292,7 @@
/* Text in menu */
"website" = "Website";
-/* Text in About menu, opens Organic Maps news website */
+/* Text in About menu, opens DRIMS news website */
"news" = "News";
/* Text in menu */
@@ -734,7 +731,7 @@
/* Error dialog no space */
"migration_no_space_message" = "To download, you need more space. Please delete any unnecessary data.";
-"editor_sharing_title" = "I improved the Organic Maps maps";
+"editor_sharing_title" = "I improved the DRIMS maps";
/* Downloaded 10 **of** 20 <- it is that "of" */
"downloader_of" = "%1$d of %2$d";
@@ -761,7 +758,7 @@
"editor_detailed_description_hint" = "Detailed comment";
-"editor_detailed_description" = "Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in Organic Maps.";
+"editor_detailed_description" = "Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in DRIMS.";
"editor_more_about_osm" = "More about OpenStreetMap";
@@ -792,7 +789,7 @@
"location_services_disabled_on_device_4" = "4. Turn on Location Services";
-"location_services_disabled_on_device_additional_message" = "Or continue using Organic Maps without Location";
+"location_services_disabled_on_device_additional_message" = "Or continue using DRIMS without Location";
/* abbreviation for meters */
"m" = "m";
@@ -823,7 +820,7 @@
"more_on_kayak" = "Photos, reviews, booking";
/* An explanation dialog shown when clicking on more_on_kayak link. */
-"dialog_kayak_disclaimer" = "The referral bonus received for each booking through this link goes towards the development of Organic Maps.";
+"dialog_kayak_disclaimer" = "The referral bonus received for each booking through this link goes towards the development of DRIMS.";
/* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */
"dialog_kayak_button" = "Details on Kayak";
@@ -883,7 +880,7 @@
/* For sharing via SMS and so on */
"sharing_call_action_look" = "Check out";
-"recent_track_background_dialog_message" = "Organic Maps uses your location in the background to record your recently travelled route.";
+"recent_track_background_dialog_message" = "DRIMS uses your location in the background to record your recently travelled route.";
"general_settings" = "General settings";
@@ -992,7 +989,7 @@
"bookmarks_error_title_list_name_too_long" = "This name is too long";
-"profile" = "OpenStreetMap profile";
+"profile" = "DRIMS profile";
"bookmarks_detect_title" = "New files detected";
@@ -1270,7 +1267,7 @@
/* Instagram account url for the "?" About page */
"instagram_url" = "https://www.instagram.com/organicmaps.app";
-/* Translated Organic Maps site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
+/* Translated DRIMS site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
"translated_om_site_url" = "https://organicmaps.app/";
/* Link to OSM wiki for Editor, Profile and About pages */
@@ -1307,10 +1304,10 @@
"app_tip_09" = "Our main goal is to build fast, privacy-focused, easy-to-use maps that you will love.";
/* Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen */
-"car_used_on_the_phone_screen" = "You are now using Organic Maps on the phone screen";
+"car_used_on_the_phone_screen" = "You are now using DRIMS on the phone screen";
/* Text on the phone placeholder screen that maps are displayed on the car screen */
-"car_used_on_the_car_screen" = "You are now using Organic Maps on the car screen";
+"car_used_on_the_car_screen" = "You are now using DRIMS on the car screen";
/* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */
"car_continue_on_the_phone" = "Continue on the phone";
diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
index a12fe081de7..f171571d826 100644
--- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings
@@ -51,17 +51,14 @@
"country_status_download_failed" = "Download has failed";
/* Text in About screen */
-"about_headline" = "Free for everyone, made with love";
+"about_headline" = "Disaster Response Information Management System (DRIMS)";
/* Text in About screen */
-"about_proposition_1" = "• No ads, no tracking, no data collection";
+"about_proposition_1" = "• No ads, no tracking";
/* Text in About screen */
"about_proposition_2" = "• No battery drain, works offline";
-/* Text in About screen */
-"about_proposition_3" = "• Fast, minimalist, developed by community";
-
"close" = "Close";
"download" = "Download";
@@ -171,7 +168,7 @@
/********** Other translations **********/
-"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in Organic Maps. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!";
+"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in DRIMS. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with DRIMS!";
/* message title of loading file */
"load_kmz_title" = "Loading Bookmarks";
@@ -189,10 +186,10 @@
"unknown_current_position" = "Your location hasn't been determined yet";
/* Subject for emailed bookmark */
-"bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!";
+"bookmark_share_email_subject" = "Hey, check out my pin in DRIMS!";
/* Subject for emailed position */
-"my_position_share_email_subject" = "Hey, check out my current location on the Organic Maps map!";
+"my_position_share_email_subject" = "Hey, check out my current location on the DRIMS map!";
/* Share button text which opens menu with more buttons, like Message, EMail, Facebook etc. */
"share" = "Share";
@@ -210,7 +207,7 @@
"done" = "Done";
/* Prints version number in About dialog */
-"version" = "Organic Maps version: %@";
+"version" = "DRIMS";
/* Title for tracks category in bookmarks manager */
"tracks_title" = "Tracks";
@@ -295,7 +292,7 @@
/* Text in menu */
"website" = "Website";
-/* Text in About menu, opens Organic Maps news website */
+/* Text in About menu, opens DRIMS news website */
"news" = "News";
/* Text in menu */
@@ -734,7 +731,7 @@
/* Error dialog no space */
"migration_no_space_message" = "To download, you need more space. Please delete any unnecessary data.";
-"editor_sharing_title" = "I improved the Organic Maps maps";
+"editor_sharing_title" = "I improved the DRIMS maps";
/* Downloaded 10 **of** 20 <- it is that "of" */
"downloader_of" = "%1$d of %2$d";
@@ -761,7 +758,7 @@
"editor_detailed_description_hint" = "Detailed comment";
-"editor_detailed_description" = "Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in Organic Maps.";
+"editor_detailed_description" = "Your suggested map changes will be sent to the OpenStreetMap community. Please describe any additional details that cannot be edited in DRIMS.";
"editor_more_about_osm" = "More about OpenStreetMap";
@@ -792,7 +789,7 @@
"location_services_disabled_on_device_4" = "4. Turn on Location Services";
-"location_services_disabled_on_device_additional_message" = "Or continue using Organic Maps without Location";
+"location_services_disabled_on_device_additional_message" = "Or continue using DRIMS without Location";
/* abbreviation for meters */
"m" = "m";
@@ -823,7 +820,7 @@
"more_on_kayak" = "Photos, reviews, booking";
/* An explanation dialog shown when clicking on more_on_kayak link. */
-"dialog_kayak_disclaimer" = "The referral bonus received for each booking through this link goes towards the development of Organic Maps.";
+"dialog_kayak_disclaimer" = "The referral bonus received for each booking through this link goes towards the development of DRIMS.";
/* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */
"dialog_kayak_button" = "Details on Kayak";
@@ -883,7 +880,7 @@
/* For sharing via SMS and so on */
"sharing_call_action_look" = "Check out";
-"recent_track_background_dialog_message" = "Organic Maps uses your location in the background to record your recently travelled route.";
+"recent_track_background_dialog_message" = "DRIMS uses your location in the background to record your recently travelled route.";
"general_settings" = "General settings";
@@ -992,7 +989,7 @@
"bookmarks_error_title_list_name_too_long" = "This name is too long";
-"profile" = "OpenStreetMap profile";
+"profile" = "DRIMS profile";
"bookmarks_detect_title" = "New files detected";
@@ -1270,7 +1267,7 @@
/* Instagram account url for the "?" About page */
"instagram_url" = "https://www.instagram.com/organicmaps.app";
-/* Translated Organic Maps site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
+/* Translated DRIMS site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
"translated_om_site_url" = "https://organicmaps.app/";
/* Link to OSM wiki for Editor, Profile and About pages */
@@ -1307,10 +1304,10 @@
"app_tip_09" = "Our main goal is to build fast, privacy-focused, easy-to-use maps that you will love.";
/* Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen */
-"car_used_on_the_phone_screen" = "You are now using Organic Maps on the phone screen";
+"car_used_on_the_phone_screen" = "You are now using DRIMS on the phone screen";
/* Text on the phone placeholder screen that maps are displayed on the car screen */
-"car_used_on_the_car_screen" = "You are now using Organic Maps on the car screen";
+"car_used_on_the_car_screen" = "You are now using DRIMS on the car screen";
/* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */
"car_continue_on_the_phone" = "Continue on the phone";
diff --git a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings
index 78ab2c46f5e..119829cbcdd 100644
--- a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Sin consumo de batería, funciona sin conexión";
-/* Text in About screen */
-"about_proposition_3" = "• Rápido, minimalista, desarrollado por la comunidad.";
-
"close" = "Cerrar";
"download" = "Descargar";
diff --git a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
index 640d51d3e3b..95dce67423a 100644
--- a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• No consume batería, funciona sin conexión";
-/* Text in About screen */
-"about_proposition_3" = "• Rápido, minimalista, desarrollado por la comunidad";
-
"close" = "Cerrar";
"download" = "Descargar";
diff --git a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings
index 90c572d48c0..da55c32e2fe 100644
--- a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings
@@ -51,17 +51,14 @@
"country_status_download_failed" = "Allalaadimine ebaõnnestus";
/* Text in About screen */
-"about_headline" = "Free for everyone, made with love";
+"about_headline" = "Disaster Response Information Management System (DRIMS)";
/* Text in About screen */
-"about_proposition_1" = "• No ads, no tracking, no data collection";
+"about_proposition_1" = "• No ads, no tracking";
/* Text in About screen */
"about_proposition_2" = "• Ei tühjenda akut, töötab võrguühenduseta";
-/* Text in About screen */
-"about_proposition_3" = "• Kiire, minimalistlik, kogukonna poolt välja töötatud";
-
"close" = "Sulge";
"download" = "Lae alla";
diff --git a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings
index fa35c72ec8a..c2351d414b0 100644
--- a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Ez da bateria deskargatzen, konexiorik gabe funtzionatzen du";
-/* Text in About screen */
-"about_proposition_3" = "• Azkarra, minimalista, komunitateak garatua";
-
"close" = "Itxi";
"download" = "Deskargatu";
diff --git a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings
index 3c302c9e488..b0ffab305a4 100644
--- a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• بدون تخلیه باتری، آفلاین کار می کند";
-/* Text in About screen */
-"about_proposition_3" = "• سریع، مینیمالیستی، توسعه یافته توسط انجمن";
-
"close" = "بستن";
"download" = "دانلود";
diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
index a87280524db..8ce14a987f6 100644
--- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Ei akun tyhjenemistä, toimii offline-tilassa";
-/* Text in About screen */
-"about_proposition_3" = "• Nopea, minimalistinen, yhteisön kehittämä";
-
"close" = "Sulje";
"download" = "Lataa";
diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
index 34fa2d55ed4..8da97b28cfe 100644
--- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Pas d'épuisement de la batterie, fonctionne hors ligne";
-/* Text in About screen */
-"about_proposition_3" = "• Rapide, minimaliste, développé par la communauté";
-
"close" = "Fermer";
"download" = "Télécharger";
diff --git a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
index 096d355f627..366231aaac3 100644
--- a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• אין ריקון סוללה, עובד במצב לא מקוון";
-/* Text in About screen */
-"about_proposition_3" = "• מהיר, מינימליסטי, שפותח על ידי הקהילה";
-
"close" = "סגור";
"download" = "הורדה";
diff --git a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings
index aa95fa95d6a..875c76428dc 100644
--- a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• कोई बैटरी ख़त्म नहीं, ऑफ़लाइन काम करता है";
-/* Text in About screen */
-"about_proposition_3" = "• तेज़, न्यूनतम, समुदाय द्वारा विकसित";
-
"close" = "बंद करना";
"download" = "डाउन लोड करना";
diff --git a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
index fb6ecbf2bfe..9ca9c0178b6 100644
--- a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Nem merül le az akkumulátor, offline működik";
-/* Text in About screen */
-"about_proposition_3" = "• Gyors, minimalista, közösség által fejlesztett";
-
"close" = "Bezár";
"download" = "Letöltés";
diff --git a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
index cce7318b20e..992891ce99c 100644
--- a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Tidak menguras baterai, bekerja secara offline";
-/* Text in About screen */
-"about_proposition_3" = "• Cepat, minimalis, dikembangkan oleh komunitas";
-
"close" = "Tutup";
"download" = "Unduh";
diff --git a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
index d5f48c64b73..f93e7979527 100644
--- a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Non consuma la batteria, funziona anche offline";
-/* Text in About screen */
-"about_proposition_3" = "• Veloce, minimalista, sviluppato dalla comunità";
-
"close" = "Chiudi";
"download" = "Scarica";
diff --git a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
index cd900c9f348..64e921d0135 100644
--- a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• バッテリーの消耗がなく、オフラインで動作する";
-/* Text in About screen */
-"about_proposition_3" = "• 高速、ミニマリスト、コミュニティによる開発";
-
"close" = "閉じる";
"download" = "ダウンロード";
diff --git a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
index 6b13c59e88c..94ea7e57c45 100644
--- a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• 배터리 소모 없음, 오프라인에서 작동";
-/* Text in About screen */
-"about_proposition_3" = "• 빠르고 미니멀한, 커뮤니티가 개발한";
-
"close" = "닫기";
"download" = "다운로드";
diff --git a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings
index d3a47b5e548..65ccbad1388 100644
--- a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings
@@ -51,17 +51,14 @@
"country_status_download_failed" = "डाउनलोड अयशस्वी";
/* Text in About screen */
-"about_headline" = "Free for everyone, made with love";
+"about_headline" = "Disaster Response Information Management System (DRIMS)";
/* Text in About screen */
-"about_proposition_1" = "• No ads, no tracking, no data collection";
+"about_proposition_1" = "• No ads, no tracking";
/* Text in About screen */
"about_proposition_2" = "• बॅटरी संपत नाही, ऑफलाइन कार्य करते";
-/* Text in About screen */
-"about_proposition_3" = "• जलद, मिनिमलिस्ट, समुदायाद्वारे विकसित";
-
"close" = "बंद";
"download" = "डाउनलोड करा";
diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
index 89d023d59b6..83d8b2249fc 100644
--- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Ingen batterislitasje, fungerer offline";
-/* Text in About screen */
-"about_proposition_3" = "• Rask, minimalistisk, utviklet av fellesskapet";
-
"close" = "Lukk";
"download" = "Last ned";
diff --git a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
index b500b9b3993..ffae1b67ff7 100644
--- a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Geen batterijverlies, werkt offline";
-/* Text in About screen */
-"about_proposition_3" = "• Snel, minimalistisch, ontwikkeld door de gemeenschap";
-
"close" = "Sluit";
"download" = "Download";
diff --git a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
index 6d10018c41a..0490bb7b61a 100644
--- a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Nie zużywa baterii, działa w trybie offline";
-/* Text in About screen */
-"about_proposition_3" = "• Szybki, minimalistyczny, opracowany przez społeczność";
-
"close" = "Zamknij";
"download" = "Pobierz";
diff --git a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings
index 5e53c259e47..fccff99a8b0 100644
--- a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Sem consumo de bateria, funciona off-line";
-/* Text in About screen */
-"about_proposition_3" = "• Rápido, minimalista, desenvolvido pela comunidade";
-
"close" = "Fechar";
"download" = "Baixar";
diff --git a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
index 578e81ffb6b..ccc3e3b918a 100644
--- a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Não gasta a bateria, funciona offline";
-/* Text in About screen */
-"about_proposition_3" = "• Rápido, minimalista, desenvolvido pela comunidade";
-
"close" = "Fechar";
"download" = "Descarregar";
diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
index 036e5a0cb89..2fe1b7b22b5 100644
--- a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Nu consumă baterie, funcționează offline";
-/* Text in About screen */
-"about_proposition_3" = "• Rapid, minimalist, dezvoltat de comunitate";
-
"close" = "Închide";
"download" = "Descarcă";
diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
index e0279f02771..22bad94edff 100644
--- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Не разряжает батарею, работает в автономном режиме";
-/* Text in About screen */
-"about_proposition_3" = "• Быстрые, минималистичные, разработанные сообществом";
-
"close" = "Закрыть";
"download" = "Загрузить";
diff --git a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
index 8bf8cfb9980..5af82d68a81 100644
--- a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Žiadne vybíjanie batérie, funguje v režime offline";
-/* Text in About screen */
-"about_proposition_3" = "• Rýchly, minimalistický, vyvinutý komunitou";
-
"close" = "Zavrieť";
"download" = "Stiahnuť";
diff --git a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
index 7cdcf667a62..af216415b0e 100644
--- a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Ingen batteriförbrukning, fungerar offline";
-/* Text in About screen */
-"about_proposition_3" = "• Snabb, minimalistisk, utvecklad av gemenskapen";
-
"close" = "Stäng";
"download" = "Ladda ner";
@@ -171,7 +168,7 @@
/********** Other translations **********/
-"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in Organic Maps. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with Organic Maps!";
+"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in DRIMS. If you don't have it installed you can download it here: https://omaps.app/get?kmz\n\nEnjoy travelling with DRIMS!";
/* message title of loading file */
"load_kmz_title" = "Läser in bokmärken";
@@ -189,10 +186,10 @@
"unknown_current_position" = "Din position har inte bestämts ännu";
/* Subject for emailed bookmark */
-"bookmark_share_email_subject" = "Hej, kolla på min pin på Organic Maps kartan";
+"bookmark_share_email_subject" = "Hej, kolla på min pin på DRIMS kartan";
/* Subject for emailed position */
-"my_position_share_email_subject" = "Hej, kolla på min nuvarande position på Organic Maps kartan!";
+"my_position_share_email_subject" = "Hej, kolla på min nuvarande position på DRIMS kartan!";
/* Share button text which opens menu with more buttons, like Message, EMail, Facebook etc. */
"share" = "Dela";
@@ -210,7 +207,7 @@
"done" = "Klar";
/* Prints version number in About dialog */
-"version" = "Organic Maps version: %@";
+"version" = "DRIMS";
/* Title for tracks category in bookmarks manager */
"tracks_title" = "Rutter";
@@ -295,7 +292,7 @@
/* Text in menu */
"website" = "Webbplats";
-/* Text in About menu, opens Organic Maps news website */
+/* Text in About menu, opens DRIMS news website */
"news" = "Nyheter";
/* Text in menu */
@@ -734,7 +731,7 @@
/* Error dialog no space */
"migration_no_space_message" = "Du behöver mer utrymme för att ladda ned. Radera onödig data.";
-"editor_sharing_title" = "Jag förbättrade kartorna hos Organic Maps";
+"editor_sharing_title" = "Jag förbättrade kartorna hos DRIMS";
/* Downloaded 10 **of** 20 <- it is that "of" */
"downloader_of" = "%1$d av %2$d";
@@ -761,7 +758,7 @@
"editor_detailed_description_hint" = "Detaljerad kommentar";
-"editor_detailed_description" = "Dina föreslagna ändringar kommer att skcikas till OpenStreetMap-communityt. Beskriv detaljerna som inte kan redigeras i Organic Maps.";
+"editor_detailed_description" = "Dina föreslagna ändringar kommer att skcikas till OpenStreetMap-communityt. Beskriv detaljerna som inte kan redigeras i DRIMS.";
"editor_more_about_osm" = "Mer om OpenStreetMap";
@@ -792,7 +789,7 @@
"location_services_disabled_on_device_4" = "4. Aktivera platstjänster";
-"location_services_disabled_on_device_additional_message" = "Eller fortsätt använda Organic Maps utan Plats";
+"location_services_disabled_on_device_additional_message" = "Eller fortsätt använda DRIMS utan Plats";
/* abbreviation for meters */
"m" = "m";
@@ -823,7 +820,7 @@
"more_on_kayak" = "Foton, recensioner, bokning";
/* An explanation dialog shown when clicking on more_on_kayak link. */
-"dialog_kayak_disclaimer" = "Hänvisningsbonusen som erhålls för varje bokning via denna länk går till utvecklingen av Organic Maps.";
+"dialog_kayak_disclaimer" = "Hänvisningsbonusen som erhålls för varje bokning via denna länk går till utvecklingen av DRIMS.";
/* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */
"dialog_kayak_button" = "Information på Kayak";
@@ -883,7 +880,7 @@
/* For sharing via SMS and so on */
"sharing_call_action_look" = "Kolla in";
-"recent_track_background_dialog_message" = "Organic Maps använder din geografiska position i bakgrunden för att spela in din senaste resta rutt.";
+"recent_track_background_dialog_message" = "DRIMS använder din geografiska position i bakgrunden för att spela in din senaste resta rutt.";
"general_settings" = "Allmänna inställningar";
@@ -1055,7 +1052,7 @@
"power_managment_setting_manual_max" = "Maximal energibesparing";
-"enable_logging_warning_message" = "Denna funktion aktiveras för loggning av åtgärder för diagnostiska ändamål. Detta hjälper laget att identifiera problem med applikationen. Slå på funktionen endast på begäran av Organic Maps supporttjänst.";
+"enable_logging_warning_message" = "Denna funktion aktiveras för loggning av åtgärder för diagnostiska ändamål. Detta hjälper laget att identifiera problem med applikationen. Slå på funktionen endast på begäran av DRIMS supporttjänst.";
"driving_options_title" = "Omvägsinställningar";
@@ -1137,7 +1134,7 @@
"speedcams_alert_title_carplay_2" = "Info om kameror";
-"download_map_carplay" = "Ladda ner kartor i applikation Organic Maps på din enhet";
+"download_map_carplay" = "Ladda ner kartor i applikation DRIMS på din enhet";
"carplay_roundabout_exit" = "%@ utgången";
@@ -1270,7 +1267,7 @@
/* Instagram account url for the "?" About page */
"instagram_url" = "https://www.instagram.com/organicmaps.app";
-/* Translated Organic Maps site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
+/* Translated DRIMS site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
"translated_om_site_url" = "https://organicmaps.app/sv/";
/* Link to OSM wiki for Editor, Profile and About pages */
@@ -1307,10 +1304,10 @@
"app_tip_09" = "Vårt huvudmål är att bygga snabba, integritetsfokuserade, lättanvända kartor som du kommer att älska.";
/* Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen */
-"car_used_on_the_phone_screen" = "Du använder nu Organic Maps på telefonens skärm";
+"car_used_on_the_phone_screen" = "Du använder nu DRIMS på telefonens skärm";
/* Text on the phone placeholder screen that maps are displayed on the car screen */
-"car_used_on_the_car_screen" = "Du använder nu Organic Maps på bilskärmen";
+"car_used_on_the_car_screen" = "Du använder nu DRIMS på bilskärmen";
/* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */
"car_continue_on_the_phone" = "Fortsätt i telefonen";
diff --git a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings
index 8a481366928..9b73918c255 100644
--- a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Hakuna betri kuisha, inafanya kazi nje ya mtandao";
-/* Text in About screen */
-"about_proposition_3" = "• Haraka, minimalist, iliyotengenezwa na jumuiya";
-
"close" = "Close";
"download" = "Download";
@@ -992,7 +989,7 @@
"bookmarks_error_title_list_name_too_long" = "Jina hili ni muda mrefu sana";
-"profile" = "OpenStreetMap profile";
+"profile" = "DRIMS profile";
"bookmarks_detect_title" = "Faili mpya zimegunduliwa";
diff --git a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
index 584ec484c4c..00f63bbe013 100644
--- a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• ไม่มีแบตเตอรี่หมด ทำงานแบบออฟไลน์";
-/* Text in About screen */
-"about_proposition_3" = "• รวดเร็ว เรียบง่าย พัฒนาโดยชุมชน";
-
"close" = "ปิด";
"download" = "ดาวน์โหลด";
diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
index fc993c01f08..349471b704a 100644
--- a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Pilinizi tüketmez, çevrimdışı çalışır";
-/* Text in About screen */
-"about_proposition_3" = "• Hızlı, minimalist, topluluk tarafından geliştirilmiş";
-
"close" = "Kapat";
"download" = "İndir";
diff --git a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
index 17342862ced..ecd4957c770 100644
--- a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Не розряджає батарею, працює в автономному режимі";
-/* Text in About screen */
-"about_proposition_3" = "• Швидкий, мінімалістичний, розроблений спільнотою";
-
"close" = "Закрити";
"download" = "Завантажити";
diff --git a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
index c50287f1097..d63f5132300 100644
--- a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• Không hao pin, hoạt động offline";
-/* Text in About screen */
-"about_proposition_3" = "• Nhanh chóng, tối giản, được phát triển bởi cộng đồng";
-
"close" = "Đóng";
"download" = "Tải xuống";
diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
index 6f3e364b70e..14acd69ad02 100644
--- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• 无需耗费电池,可离线工作";
-/* Text in About screen */
-"about_proposition_3" = "• 快速、简约、由社区开发";
-
"close" = "关闭";
"download" = "下载";
diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
index c458216b6d1..14d740ca9b8 100644
--- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings
@@ -59,9 +59,6 @@
/* Text in About screen */
"about_proposition_2" = "• 無電池消耗,離線工作";
-/* Text in About screen */
-"about_proposition_3" = "• 快速、簡約、由社區開發";
-
"close" = "關閉";
"download" = "下載";
diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj
index 990392b11c0..94f1512375d 100644
--- a/iphone/Maps/Maps.xcodeproj/project.pbxproj
+++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj
@@ -468,6 +468,13 @@
CDCA27842245090900167D87 /* ListenerContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCA27832245090900167D87 /* ListenerContainer.swift */; };
CDCA278622451F5000167D87 /* RouteInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCA278522451F5000167D87 /* RouteInfo.swift */; };
CDCA278E2248F34C00167D87 /* MWMRoutingManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDCA278B2248F34C00167D87 /* MWMRoutingManager.mm */; };
+ E99D4FB52C4E38D0003F7B05 /* AlertsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E99D4FB42C4E38D0003F7B05 /* AlertsViewController.swift */; };
+ E99D4FB92C4E4BFA003F7B05 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E99D4FB82C4E4BFA003F7B05 /* LoginViewController.swift */; };
+ E99D4FBB2C4E4F14003F7B05 /* Login.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E99D4FBA2C4E4F14003F7B05 /* Login.storyboard */; };
+ E99D4FBD2C4E8F6A003F7B05 /* LiveFeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E99D4FBC2C4E8F6A003F7B05 /* LiveFeedsViewController.swift */; };
+ E9B435F02C48E8E60031B0B0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9B435EF2C48E8E60031B0B0 /* GoogleService-Info.plist */; };
+ E9B435F12C48E8E60031B0B0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9B435EF2C48E8E60031B0B0 /* GoogleService-Info.plist */; };
+ E9B435F42C48E9A70031B0B0 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = E9B435F32C48E9A70031B0B0 /* FirebaseMessaging */; };
ED0B1C312BC2951F00FB8EDD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = ED0B1C302BC2951F00FB8EDD /* PrivacyInfo.xcprivacy */; };
ED1080A72B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */; };
ED1263AB2B6F99F900AD99F3 /* UIView+AddSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1263AA2B6F99F900AD99F3 /* UIView+AddSeparator.swift */; };
@@ -1381,6 +1388,11 @@
CDCA278C2248F34C00167D87 /* MWMRouterResultCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMRouterResultCode.h; sourceTree = ""; };
CDCA278F2248F3B800167D87 /* MWMLocationModeListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMLocationModeListener.h; sourceTree = ""; };
CDE0F3AD225B8D45008BA5C3 /* MWMSpeedCameraManagerMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMSpeedCameraManagerMode.h; sourceTree = ""; };
+ E99D4FB42C4E38D0003F7B05 /* AlertsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertsViewController.swift; sourceTree = ""; };
+ E99D4FB82C4E4BFA003F7B05 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; };
+ E99D4FBA2C4E4F14003F7B05 /* Login.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Login.storyboard; sourceTree = ""; };
+ E99D4FBC2C4E8F6A003F7B05 /* LiveFeedsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveFeedsViewController.swift; sourceTree = ""; };
+ E9B435EF2C48E8E60031B0B0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../Desktop/GoogleService-Info.plist"; sourceTree = ""; };
ED097E762BB80C320006ED01 /* OMapsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OMapsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
ED0B1C302BC2951F00FB8EDD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialMediaCollectionViewHeader.swift; sourceTree = ""; };
@@ -1767,6 +1779,7 @@
FA853BC326BC3B8A0026D455 /* libopening_hours.a in Frameworks */,
FA853BC526BC3B8A0026D455 /* libplatform.a in Frameworks */,
FA853BC726BC3B8A0026D455 /* libprotobuf.a in Frameworks */,
+ E9B435F42C48E9A70031B0B0 /* FirebaseMessaging in Frameworks */,
FA853BC926BC3B8A0026D455 /* librouting.a in Frameworks */,
FA853BCB26BC3B8A0026D455 /* librouting_common.a in Frameworks */,
FA853BCD26BC3B8A0026D455 /* libsearch.a in Frameworks */,
@@ -1832,6 +1845,7 @@
29B97314FDCFA39411CA2CEA /* Maps */ = {
isa = PBXGroup;
children = (
+ E9B435EF2C48E8E60031B0B0 /* GoogleService-Info.plist */,
FA456C4026BDCC8E00B83C20 /* shaders.xcodeproj */,
FA36B8011540388B004560CC /* Bookmarks */,
3454D7981E07F045004AF2AD /* Categories */,
@@ -2093,6 +2107,7 @@
340E1EE91E2F614400CE49BF /* Storyboard.swift */,
CDB4D4D6222D248900104869 /* CarPlayStoryboard.storyboard */,
340E1EEA1E2F614400CE49BF /* Welcome.storyboard */,
+ E99D4FBA2C4E4F14003F7B05 /* Login.storyboard */,
);
path = Storyboard;
sourceTree = "";
@@ -3363,6 +3378,9 @@
F6E2FCE11E097B9F0083EBEC /* Search */,
F6E2FD361E097BA00083EBEC /* Settings */,
340E1EE31E2F614400CE49BF /* Storyboard */,
+ E99D4FB42C4E38D0003F7B05 /* AlertsViewController.swift */,
+ E99D4FB82C4E4BFA003F7B05 /* LoginViewController.swift */,
+ E99D4FBC2C4E8F6A003F7B05 /* LiveFeedsViewController.swift */,
);
path = UI;
sourceTree = "";
@@ -3860,6 +3878,9 @@
FA456C4D26BDCC9400B83C20 /* PBXTargetDependency */,
);
name = OMaps;
+ packageProductDependencies = (
+ E9B435F32C48E9A70031B0B0 /* FirebaseMessaging */,
+ );
productName = Maps;
productReference = 6741AA5D1BF340DE002C974C /* Organic Maps (Debug).app */;
productType = "com.apple.product-type.application";
@@ -3956,6 +3977,9 @@
hi,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* Maps */;
+ packageReferences = (
+ E9B435F22C48E9A70031B0B0 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
+ );
productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */;
projectDirPath = "";
projectReferences = (
@@ -4001,6 +4025,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ E99D4FBB2C4E4F14003F7B05 /* Login.storyboard in Resources */,
47AEF8402231249E00D20538 /* categories_brands.txt in Resources */,
F6C3A1B221AC22810060EEC8 /* Alert 5.m4a in Resources */,
6741A9531BF340DE002C974C /* 01_dejavusans.ttf in Resources */,
@@ -4066,6 +4091,7 @@
34D3B0331E389D05004100F9 /* MWMEditorCategoryCell.xib in Resources */,
F6E2FDCB1E097BA00083EBEC /* MWMEditorNotesFooter.xib in Resources */,
34D3B0391E389D05004100F9 /* MWMEditorSelectTableViewCell.xib in Resources */,
+ E9B435F02C48E8E60031B0B0 /* GoogleService-Info.plist in Resources */,
34AB663B1FC5AA330078E451 /* RouteManagerViewController.xib in Resources */,
34D3B03F1E389D05004100F9 /* MWMEditorSwitchTableViewCell.xib in Resources */,
467F341B2BCA928B00CDC7DE /* MWMEditorSegmentedTableViewCell.xib in Resources */,
@@ -4169,6 +4195,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ E9B435F12C48E8E60031B0B0 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4271,6 +4298,7 @@
34AB66831FC5AA330078E451 /* NavigationAddPointToastView.swift in Sources */,
F6E2FE4C1E097BA00083EBEC /* MWMPlacePageManager.mm in Sources */,
3404757E1E081B3300C92850 /* iosOGLContext.mm in Sources */,
+ E99D4FBD2C4E8F6A003F7B05 /* LiveFeedsViewController.swift in Sources */,
993F5513237C622700545511 /* DeepLinkHandler.swift in Sources */,
993DF11223F6BDB100AC231A /* UIImageRenderer.swift in Sources */,
F6E2FD5C1E097BA00083EBEC /* MWMMapDownloaderCellHeader.m in Sources */,
@@ -4345,6 +4373,7 @@
99A906E523F6F7030005872B /* ActionBarViewController.swift in Sources */,
47B9065421C7FA400079C85E /* UIImageView+WebImage.m in Sources */,
F6E2FF481E097BA00083EBEC /* SettingsTableViewSelectableCell.swift in Sources */,
+ E99D4FB52C4E38D0003F7B05 /* AlertsViewController.swift in Sources */,
ED63CEB92BDF8F9D006155C4 /* SettingsTableViewiCloudSwitchCell.swift in Sources */,
47CA68D4250043C000671019 /* BookmarksListPresenter.swift in Sources */,
F6E2FF451E097BA00083EBEC /* SettingsTableViewLinkCell.swift in Sources */,
@@ -4542,6 +4571,7 @@
F63AF5061EA6162400A1DB98 /* FilterTypeCell.swift in Sources */,
993DF10623F6BDB100AC231A /* UIColor+rgba.swift in Sources */,
EDC3573B2B7B5029001AE9CA /* CALayer+SetCorner.swift in Sources */,
+ E99D4FB92C4E4BFA003F7B05 /* LoginViewController.swift in Sources */,
47E3C7332111F4D8008B3B27 /* CoverVerticalDismissalAnimator.swift in Sources */,
471AB99423ABA3BD00F56D49 /* SearchMapsDataSource.swift in Sources */,
47CA68F1250B54AF00671019 /* BookmarksListCell.swift in Sources */,
@@ -4819,15 +4849,22 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 0;
- DEVELOPMENT_TEAM = 9Z6432XD7L;
+ DEVELOPMENT_TEAM = 2938MAXZZT;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
+ INFOPLIST_KEY_CFBundleDisplayName = DRIMS;
+ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = NO;
+ INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Determining your location is necessary for navigation and for saving your recently travelled track.";
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UIStatusBarHidden = NO;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2022.11.17;
OTHER_SWIFT_FLAGS = "$(inherited)";
- PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps.debug;
+ PRODUCT_BUNDLE_IDENTIFIER = com.wisflux.drrum;
PROVISIONING_PROFILE_SPECIFIER = "";
};
name = Debug;
@@ -4837,20 +4874,27 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "OMaps-Release.entitlements";
- CODE_SIGN_IDENTITY = "iPhone Developer";
- CODE_SIGN_STYLE = Manual;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 0;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DEVELOPMENT_TEAM = 9Z6432XD7L;
+ DEVELOPMENT_TEAM = 2938MAXZZT;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
+ INFOPLIST_KEY_CFBundleDisplayName = DRIMS;
+ INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = NO;
+ INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Determining your location is necessary for navigation and for saving your recently travelled track.";
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UIStatusBarHidden = NO;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2022.11.17;
OTHER_SWIFT_FLAGS = "$(inherited)";
- PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps;
- PROVISIONING_PROFILE_SPECIFIER = "CarPlay Release";
+ PRODUCT_BUNDLE_IDENTIFIER = com.wisflux.drrum;
+ PROVISIONING_PROFILE_SPECIFIER = "";
};
name = Release;
};
@@ -4992,6 +5036,25 @@
defaultConfigurationName = Debug;
};
/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ E9B435F22C48E9A70031B0B0 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 10.29.0;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ E9B435F32C48E9A70031B0B0 /* FirebaseMessaging */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = E9B435F22C48E9A70031B0B0 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseMessaging;
+ };
+/* End XCSwiftPackageProductDependency section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}
diff --git a/iphone/Maps/OMaps-Debug.entitlements b/iphone/Maps/OMaps-Debug.entitlements
index 06b83f7169c..235c2e62b49 100644
--- a/iphone/Maps/OMaps-Debug.entitlements
+++ b/iphone/Maps/OMaps-Debug.entitlements
@@ -1,29 +1,25 @@
-
- aps-environment
- development
- com.apple.developer.associated-domains
-
- applinks:omaps.app
-
- com.apple.developer.carplay-maps
-
- com.apple.developer.icloud-container-identifiers
-
- iCloud.app.organicmaps.debug
-
- com.apple.developer.icloud-services
-
- CloudDocuments
- CloudKit
-
- com.apple.developer.ubiquity-container-identifiers
-
- iCloud.app.organicmaps.debug
-
- com.apple.developer.ubiquity-kvstore-identifier
- $(TeamIdentifierPrefix)$(CFBundleIdentifier)
-
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+ applinks:omaps.app
+
+
+ com.apple.developer.icloud-container-identifiers
+
+ com.apple.developer.icloud-services
+
+ CloudDocuments
+ CloudKit
+
+ com.apple.developer.ubiquity-container-identifiers
+
+ com.apple.developer.ubiquity-kvstore-identifier
+ $(TeamIdentifierPrefix)$(CFBundleIdentifier)
+
diff --git a/iphone/Maps/OMaps-Release.entitlements b/iphone/Maps/OMaps-Release.entitlements
index 9e52a78a0bf..235c2e62b49 100644
--- a/iphone/Maps/OMaps-Release.entitlements
+++ b/iphone/Maps/OMaps-Release.entitlements
@@ -1,29 +1,25 @@
-
- aps-environment
- development
- com.apple.developer.associated-domains
-
- applinks:omaps.app
-
- com.apple.developer.carplay-maps
-
- com.apple.developer.icloud-container-identifiers
-
- iCloud.app.organicmaps
-
- com.apple.developer.icloud-services
-
- CloudDocuments
- CloudKit
-
- com.apple.developer.ubiquity-container-identifiers
-
- iCloud.app.organicmaps
-
- com.apple.developer.ubiquity-kvstore-identifier
- $(TeamIdentifierPrefix)$(CFBundleIdentifier)
-
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+ applinks:omaps.app
+
+
+ com.apple.developer.icloud-container-identifiers
+
+ com.apple.developer.icloud-services
+
+ CloudDocuments
+ CloudKit
+
+ com.apple.developer.ubiquity-container-identifiers
+
+ com.apple.developer.ubiquity-kvstore-identifier
+ $(TeamIdentifierPrefix)$(CFBundleIdentifier)
+
diff --git a/iphone/Maps/OMaps.plist b/iphone/Maps/OMaps.plist
index 3659f28325f..a5d3dff6689 100644
--- a/iphone/Maps/OMaps.plist
+++ b/iphone/Maps/OMaps.plist
@@ -1,277 +1,248 @@
-
- CFBundleDevelopmentRegion
- en
- CFBundleDisplayName
- ${PRODUCT_NAME}
- CFBundleDocumentTypes
-
-
- CFBundleTypeIconFiles
-
- CFBundleTypeName
- GPS Exchange Format (GPX)
- LSHandlerRank
- Default
- LSItemContentTypes
-
- com.topografix.gpx
-
-
-
- CFBundleTypeIconFiles
-
- 320-pro.png
- 64-pro.png
- 44x58-pro.png
- 22x29-pro.png
-
- CFBundleTypeName
- Google Earth KML Document
- LSHandlerRank
- Default
- LSItemContentTypes
-
- com.google.earth.kml
-
-
-
- CFBundleTypeIconFiles
-
- 320-pro.png
- 64-pro.png
- 44x58-pro.png
- 22x29-pro.png
-
- CFBundleTypeName
- Google Earth KMZ Document
- LSHandlerRank
- Default
- LSItemContentTypes
-
- com.google.earth.kmz
-
-
-
- CFBundleExecutable
- ${EXECUTABLE_NAME}
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- ${PRODUCT_NAME}
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(MARKETING_VERSION)
- CFBundleSignature
- ????
- CFBundleURLTypes
-
+
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeIconFiles
+
+ CFBundleTypeName
+ GPS Exchange Format (GPX)
+ LSHandlerRank
+ Default
+ LSItemContentTypes
+
+ com.topografix.gpx
+
+
+
+ CFBundleTypeIconFiles
+
+ 320-pro.png
+ 64-pro.png
+ 44x58-pro.png
+ 22x29-pro.png
+
+ CFBundleTypeName
+ Google Earth KML Document
+ LSHandlerRank
+ Default
+ LSItemContentTypes
+
+ com.google.earth.kml
+
+
+
+ CFBundleTypeIconFiles
+
+ 320-pro.png
+ 64-pro.png
+ 44x58-pro.png
+ 22x29-pro.png
+
+ CFBundleTypeName
+ Google Earth KMZ Document
+ LSHandlerRank
+ Default
+ LSItemContentTypes
+
+ com.google.earth.kmz
+
+
+
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Viewer
+ CFBundleURLSchemes
+
+ mapswithme
+ mapsme
+ ge0
+ geo
+ om
+ mapswithmepro
+
+
+
+ ITSAppUsesNonExemptEncryption
+
+ LSApplicationQueriesSchemes
+
+ mailto
+
+ NSAppTransportSecurity
- CFBundleTypeRole
- Viewer
- CFBundleURLSchemes
-
- mapswithme
- mapsme
- ge0
- geo
- om
- mapswithmepro
-
+ NSAllowsArbitraryLoads
+
+ NSExceptionDomains
+
+ drumm.app
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+ NSIncludesSubdomains
+
+
+ omaps.app
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+ NSIncludesSubdomains
+
+ NSThirdPartyExceptionRequiresForwardSecrecy
+
+
+ organicmaps.app
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+ NSIncludesSubdomains
+
+ NSThirdPartyExceptionRequiresForwardSecrecy
+
+
+
-
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- ITSAppUsesNonExemptEncryption
-
- LSApplicationQueriesSchemes
-
- mailto
-
- LSRequiresIPhoneOS
-
- LSSupportsOpeningDocumentsInPlace
-
- NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
- NSExceptionDomains
+ NSUbiquitousContainers
- omaps.app
+ iCloud.app.organicmaps
- NSExceptionAllowsInsecureHTTPLoads
+ NSUbiquitousContainerIsDocumentScopePublic
- NSIncludesSubdomains
-
- NSThirdPartyExceptionRequiresForwardSecrecy
-
+ NSUbiquitousContainerName
+ OrganicMaps
+ NSUbiquitousContainerSupportedFolderLevels
+ ANY
- organicmaps.app
+ iCloud.app.organicmaps.debug
- NSExceptionAllowsInsecureHTTPLoads
-
- NSIncludesSubdomains
+ NSUbiquitousContainerIsDocumentScopePublic
- NSThirdPartyExceptionRequiresForwardSecrecy
-
+ NSUbiquitousContainerName
+ OrganicMapsDEBUG
+ NSUbiquitousContainerSupportedFolderLevels
+ ANY
-
- NSLocationWhenInUseUsageDescription
- Determining your location is necessary for navigation and for saving your recently travelled track.
- UIAppFonts
-
- FredokaOne-Regular.ttf
-
- UIApplicationShortcutItems
-
-
- UIApplicationShortcutItemIconFile
- ic_3dtouch_search
- UIApplicationShortcutItemTitle
- search
- UIApplicationShortcutItemType
- app.organicmaps.3daction.search
-
-
- UIApplicationShortcutItemIconFile
- ic_3dtouch_bookmarks
- UIApplicationShortcutItemTitle
- bookmarks_and_tracks
- UIApplicationShortcutItemType
- app.organicmaps.3daction.bookmarks
-
-
- UIApplicationShortcutItemIconFile
- ic_3dtouch_planing_route
- UIApplicationShortcutItemTitle
- route
- UIApplicationShortcutItemType
- app.organicmaps.3daction.route
-
-
- UIBackgroundModes
-
- audio
- fetch
- location
-
- UIFileSharingEnabled
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIPrerenderedIcon
-
- UIStatusBarHidden
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UTImportedTypeDeclarations
-
-
- UTTypeConformsTo
-
- public.xml
-
- UTTypeDescription
- Google Earth KML Document
- UTTypeIdentifier
- com.google.earth.kml
- UTTypeReferenceURL
- http://earth.google.com/kml/
- UTTypeTagSpecification
+ UIAppFonts
+
+ FredokaOne-Regular.ttf
+
+ UIApplicationShortcutItems
+
- com.apple.ostype
- GKml
- public.filename-extension
-
- kml
-
- public.mime-type
- application/vnd.google-earth.kml+xml
+ UIApplicationShortcutItemIconFile
+ ic_3dtouch_search
+ UIApplicationShortcutItemTitle
+ search
+ UIApplicationShortcutItemType
+ app.organicmaps.3daction.search
-
-
- UTTypeConformsTo
-
- com.pkware.zip-archive
-
- UTTypeDescription
- Google Earth KMZ Document
- UTTypeIdentifier
- com.google.earth.kmz
- UTTypeReferenceURL
- http://earth.google.com/kmz/
- UTTypeTagSpecification
- com.apple.ostype
- GKmz
- public.filename-extension
+ UIApplicationShortcutItemIconFile
+ ic_3dtouch_bookmarks
+ UIApplicationShortcutItemTitle
+ bookmarks_and_tracks
+ UIApplicationShortcutItemType
+ app.organicmaps.3daction.bookmarks
+
+
+ UIApplicationShortcutItemIconFile
+ ic_3dtouch_planing_route
+ UIApplicationShortcutItemTitle
+ route
+ UIApplicationShortcutItemType
+ app.organicmaps.3daction.route
+
+
+ UIBackgroundModes
+
+ audio
+ fetch
+ location
+ remote-notification
+
+ UIFileSharingEnabled
+
+ UIPrerenderedIcon
+
+ UTImportedTypeDeclarations
+
+
+ UTTypeConformsTo
- kmz
+ public.xml
- public.mime-type
- application/vnd.google-earth.kmz+xml
+ UTTypeDescription
+ Google Earth KML Document
+ UTTypeIdentifier
+ com.google.earth.kml
+ UTTypeReferenceURL
+ http://earth.google.com/kml/
+ UTTypeTagSpecification
+
+ com.apple.ostype
+ GKml
+ public.filename-extension
+
+ kml
+
+ public.mime-type
+ application/vnd.google-earth.kml+xml
+
-
-
- UTTypeConformsTo
-
- public.xml
-
- UTTypeDescription
- GPS Exchange Format (GPX)
- UTTypeIdentifier
- com.topografix.gpx
- UTTypeReferenceURL
- http://www.topografix.com/GPX/1/
- UTTypeTagSpecification
- public.filename-extension
+ UTTypeConformsTo
- gpx
- GPX
+ com.pkware.zip-archive
- public.mime-type
+ UTTypeDescription
+ Google Earth KMZ Document
+ UTTypeIdentifier
+ com.google.earth.kmz
+ UTTypeReferenceURL
+ http://earth.google.com/kmz/
+ UTTypeTagSpecification
+
+ com.apple.ostype
+ GKmz
+ public.filename-extension
+
+ kmz
+
+ public.mime-type
+ application/vnd.google-earth.kmz+xml
+
+
+
+ UTTypeConformsTo
- application/gpx+xml
+ public.xml
+ UTTypeDescription
+ GPS Exchange Format (GPX)
+ UTTypeIdentifier
+ com.topografix.gpx
+ UTTypeReferenceURL
+ http://www.topografix.com/GPX/1/
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ gpx
+ GPX
+
+ public.mime-type
+
+ application/gpx+xml
+
+
-
-
- NSUbiquitousContainers
-
- iCloud.app.organicmaps
-
- NSUbiquitousContainerIsDocumentScopePublic
-
- NSUbiquitousContainerSupportedFolderLevels
- ANY
- NSUbiquitousContainerName
- OrganicMaps
-
- iCloud.app.organicmaps.debug
-
- NSUbiquitousContainerIsDocumentScopePublic
-
- NSUbiquitousContainerSupportedFolderLevels
- ANY
- NSUbiquitousContainerName
- OrganicMapsDEBUG
-
+
-
diff --git a/iphone/Maps/UI/Alerts/AlertsController.swift b/iphone/Maps/UI/Alerts/AlertsController.swift
new file mode 100644
index 00000000000..12d6f619837
--- /dev/null
+++ b/iphone/Maps/UI/Alerts/AlertsController.swift
@@ -0,0 +1,26 @@
+import UIKit
+import WebKit
+
+final class AlertsViewController: UIViewController {
+ private var webView: WKWebView!
+
+ override func loadView() {
+ let webConfiguration = WKWebViewConfiguration()
+ webView = WKWebView(frame: .zero, configuration: webConfiguration)
+ view = webView
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // Set the title of the screen
+ self.title = "Alerts"
+
+ // Define the URL for Google
+ if let url = URL(string: "https://www.google.com") {
+ // Create a URL request and load it in the web view
+ let request = URLRequest(url: url)
+ webView.load(request)
+ }
+ }
+}
\ No newline at end of file
diff --git a/iphone/Maps/UI/AlertsViewController.swift b/iphone/Maps/UI/AlertsViewController.swift
new file mode 100644
index 00000000000..dc95e84a3b2
--- /dev/null
+++ b/iphone/Maps/UI/AlertsViewController.swift
@@ -0,0 +1,21 @@
+final class AlertsViewController: MWMViewController {
+ override func loadView() {
+ super.loadView()
+
+ // TODO: FAQ?
+ self.title = L("Alerts")
+
+ let webViewController = WebViewController.init(url:URL(string:"https://drimsplatform.com/alerts")!, title: "Alerts")!
+ webViewController.openInSafari = true
+ addChild(webViewController)
+ let aboutView = webViewController.view!
+ view.addSubview(aboutView)
+ aboutView.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ aboutView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+ aboutView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+ aboutView.topAnchor.constraint(equalTo: view.topAnchor),
+ aboutView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+ ])
+ }
+}
diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift
index 924ef31db84..9244ca4a840 100644
--- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift
+++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift
@@ -2,7 +2,7 @@ protocol BottomMenuInteractorProtocol: AnyObject {
func close()
func addPlace()
func downloadMaps()
- func donate()
+ // func donate()
func openSettings()
func shareLocation(cell: BottomMenuItemCell)
}
diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift
index 7b8d950a0c4..991ec150a8b 100644
--- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift
+++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift
@@ -6,7 +6,6 @@ class BottomMenuPresenter: NSObject {
enum CellType: Int, CaseIterable {
case addPlace
case downloadMaps
- case donate
case settings
case share
}
@@ -48,7 +47,7 @@ extension BottomMenuPresenter {
}
private func correctedRow(_ row: Int) -> Int {
- disableDonate && row >= CellType.donate.rawValue ? row + 1 : row
+ row
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
@@ -70,11 +69,6 @@ extension BottomMenuPresenter {
title: L("download_maps"),
badgeCount: MapsAppDelegate.theApp().badgeNumber(),
enabled: true)
- case .donate:
- cell.configure(imageName: Settings.isNY() ? "ic_christmas_tree" : "ic_menu_donate",
- title: L("donate"),
- badgeCount: 0,
- enabled: true)
case .settings:
cell.configure(imageName: "ic_menu_settings",
title: L("settings"),
@@ -104,8 +98,6 @@ extension BottomMenuPresenter {
interactor.addPlace()
case .downloadMaps:
interactor.downloadMaps()
- case .donate:
- interactor.donate()
case .settings:
interactor.openSettings()
case .share:
diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift
index 24daa106074..2f4bfa96efb 100644
--- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift
+++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift
@@ -4,6 +4,8 @@ protocol BottomTabBarInteractorProtocol: AnyObject {
func openFaq()
func openBookmarks()
func openMenu()
+ func openAlerts()
+ func openLiveFeeds()
}
class BottomTabBarInteractor {
@@ -32,6 +34,9 @@ extension BottomTabBarInteractor: BottomTabBarInteractorProtocol {
func openHelp() {
MapViewController.shared()?.navigationController?.pushViewController(AboutController(), animated: true)
}
+ func openAlerts () {
+ MapViewController.shared()?.navigationController?.pushViewController(AlertsViewController(), animated: true)
+ }
func openFaq() {
guard let navigationController = MapViewController.shared()?.navigationController else { return }
@@ -44,6 +49,10 @@ extension BottomTabBarInteractor: BottomTabBarInteractorProtocol {
func openBookmarks() {
mapViewController?.bookmarksCoordinator.open()
}
+
+ func openLiveFeeds() {
+ MapViewController.shared()?.navigationController?.pushViewController(LiveFeedsViewController(), animated: true)
+ }
func openMenu() {
guard let state = controlsManager?.menuState else {
diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift
index b3df38d4625..8949ace6c90 100644
--- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift
+++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift
@@ -4,6 +4,8 @@ protocol BottomTabBarPresenterProtocol: AnyObject {
func onHelpButtonPressed(withBadge: Bool)
func onBookmarksButtonPressed()
func onMenuButtonPressed()
+ func onAlertsButtonPressed()
+ func onLiveFeedsButtonPressed()
}
class BottomTabBarPresenter: NSObject {
@@ -33,5 +35,13 @@ extension BottomTabBarPresenter: BottomTabBarPresenterProtocol {
func onMenuButtonPressed() {
interactor.openMenu()
}
+
+ func onAlertsButtonPressed() {
+ interactor.openAlerts()
+ }
+
+ func onLiveFeedsButtonPressed() {
+ interactor.openLiveFeeds()
+ }
}
diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift
index af3da08ffaa..278052446fd 100644
--- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift
+++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift
@@ -7,7 +7,9 @@ class BottomTabBarViewController: UIViewController {
@IBOutlet var searchButton: MWMButton!
@IBOutlet var helpButton: MWMButton!
@IBOutlet var bookmarksButton: MWMButton!
+ @IBOutlet var AlertsButton: MWMButton!
@IBOutlet var moreButton: MWMButton!
+ @IBOutlet var liveFeedsButton: MWMButton!
@IBOutlet var downloadBadge: UIView!
@IBOutlet var helpBadge: UIView!
@@ -32,7 +34,11 @@ class BottomTabBarViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
presenter.configure()
-
+ var size = CGSize(width: 48, height: 48);
+ AlertsButton.size = size;
+ AlertsButton.applyTheme();
+ liveFeedsButton.size = size;
+ liveFeedsButton.applyTheme();
MWMSearchManager.add(self)
}
@@ -56,7 +62,15 @@ class BottomTabBarViewController: UIViewController {
@IBAction func onSearchButtonPressed(_ sender: Any) {
presenter.onSearchButtonPressed()
}
+
+ @IBAction func onAlertsButtonPressed(_ sender: Any) {
+ presenter.onAlertsButtonPressed()
+ }
+ @IBAction func onLiveFeedsButtonPressed(_ sender: Any) {
+ presenter.onLiveFeedsButtonPressed()
+ }
+
@IBAction func onHelpButtonPressed(_ sender: Any) {
if !helpBadge.isHidden {
presenter.onHelpButtonPressed(withBadge: true)
diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib
index b3d5323f642..5fc151bf369 100644
--- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib
+++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib
@@ -1,19 +1,21 @@
-
+
-
+
+
+
@@ -24,15 +26,14 @@
-
-
+
+
+
-
-
+
+
+
-
-
-
@@ -40,94 +41,78 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
+
+
+
+
-
+
-
+
-
+
+
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -135,13 +120,15 @@
-
+
-
+
+
+
diff --git a/iphone/Maps/UI/Help/AboutController/AboutController.swift b/iphone/Maps/UI/Help/AboutController/AboutController.swift
index 59fd59ccf64..27cb98b42dd 100644
--- a/iphone/Maps/UI/Help/AboutController/AboutController.swift
+++ b/iphone/Maps/UI/Help/AboutController/AboutController.swift
@@ -26,14 +26,14 @@ final class AboutController: MWMViewController {
private let logoImageView = UIImageView()
private let headerTitleLabel = UILabel()
private let additionalInfoStackView = UIStackView()
- private let donationView = DonationView()
- private let osmView = OSMView()
+ // private let donationView = DonationView()
+ // private let osmView = OSMView()
private let infoTableView = UITableView(frame: .zero, style: .plain)
private var infoTableViewHeightAnchor: NSLayoutConstraint?
- private let socialMediaHeaderLabel = UILabel()
- private let socialMediaCollectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
- private lazy var socialMediaCollectionViewHeighConstraint = socialMediaCollectionView.heightAnchor.constraint(equalToConstant: .zero)
- private let termsOfUseAndPrivacyPolicyView = ButtonsStackView()
+ // private let socialMediaHeaderLabel = UILabel()
+ // private let socialMediaCollectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
+ // private lazy var socialMediaCollectionViewHeighConstraint = socialMediaCollectionView.heightAnchor.constraint(equalToConstant: .zero)
+ // private let termsOfUseAndPrivacyPolicyView = ButtonsStackView()
private var infoTableViewData = [AboutInfoTableViewCellModel]()
private var socialMediaCollectionViewData = [SocialMediaCollectionViewCellModel]()
private var onDidAppearCompletionHandler: (() -> Void)?
@@ -58,7 +58,7 @@ final class AboutController: MWMViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
- updateCollection()
+ // updateCollection()
}
override func viewDidAppear(_ animated: Bool) {
@@ -71,7 +71,7 @@ final class AboutController: MWMViewController {
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
- updateCollection()
+ // updateCollection()
}
}
@@ -80,7 +80,7 @@ private extension AboutController {
func setupViews() {
func setupTitle() {
let titleView = UILabel()
- titleView.text = Self.formattedAppVersion()
+ titleView.text = formattedAppVersion()
titleView.textColor = .white
titleView.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
titleView.isUserInteractionEnabled = true
@@ -112,32 +112,32 @@ private extension AboutController {
headerTitleLabel.setStyleAndApply("semibold18:blackPrimaryText")
headerTitleLabel.text = L("about_headline")
headerTitleLabel.textAlignment = .center
- headerTitleLabel.numberOfLines = 1
+ headerTitleLabel.numberOfLines = 2
headerTitleLabel.allowsDefaultTighteningForTruncation = true
headerTitleLabel.adjustsFontSizeToFitWidth = true
- headerTitleLabel.minimumScaleFactor = 0.5
+ headerTitleLabel.minimumScaleFactor = 2
}
func setupAdditionalInfo() {
additionalInfoStackView.axis = .vertical
additionalInfoStackView.spacing = 15
- [AboutInfo.noTracking, .noWifi, .community].forEach({ additionalInfoStackView.addArrangedSubview(InfoView(image: nil, title: $0.title)) })
+ [AboutInfo.noWifi].forEach({ additionalInfoStackView.addArrangedSubview(InfoView(image: nil, title: $0.title)) })
}
- func setupDonation() {
- donationView.donateButtonDidTapHandler = { [weak self] in
- guard let self else { return }
- self.openUrl(self.isDonateEnabled() ? Settings.donateUrl() : L("translated_om_site_url") + "support-us/")
- }
- }
+ // func setupDonation() {
+ // donationView.donateButtonDidTapHandler = { [weak self] in
+ // guard let self else { return }
+ // self.openUrl(self.isDonateEnabled() ? Settings.donateUrl() : L("translated_om_site_url") + "support-us/")
+ // }
+ // }
- func setupOSM() {
- osmView.setMapDate(Self.formattedMapsDataVersion())
- osmView.didTapHandler = { [weak self] in
- self?.openUrl("https://www.openstreetmap.org/")
- }
- }
+ // func setupOSM() {
+ // osmView.setMapDate(formattedMapsDataVersion())
+ // osmView.didTapHandler = { [weak self] in
+ // self?.openUrl("https://www.openstreetmap.org/")
+ // }
+ // }
func setupInfoTable() {
infoTableView.setStyleAndApply("ClearBackground")
@@ -150,32 +150,32 @@ private extension AboutController {
infoTableView.register(cell: InfoTableViewCell.self)
}
- func setupSocialMediaCollection() {
- socialMediaHeaderLabel.setStyleAndApply("regular16:blackPrimaryText")
- socialMediaHeaderLabel.text = L("follow_us")
- socialMediaHeaderLabel.numberOfLines = 1
- socialMediaHeaderLabel.allowsDefaultTighteningForTruncation = true
- socialMediaHeaderLabel.adjustsFontSizeToFitWidth = true
- socialMediaHeaderLabel.minimumScaleFactor = 0.5
-
- socialMediaCollectionView.backgroundColor = .clear
- socialMediaCollectionView.isScrollEnabled = false
- socialMediaCollectionView.dataSource = self
- socialMediaCollectionView.delegate = self
- socialMediaCollectionView.register(cell: SocialMediaCollectionViewCell.self)
- }
-
- func setupTermsAndPrivacy() {
- termsOfUseAndPrivacyPolicyView.addButton(title: L("privacy_policy"), didTapHandler: { [weak self] in
- self?.openUrl(L("translated_om_site_url") + "privacy/")
- })
- termsOfUseAndPrivacyPolicyView.addButton(title: L("terms_of_use"), didTapHandler: { [weak self] in
- self?.openUrl(L("translated_om_site_url") + "terms/")
- })
- termsOfUseAndPrivacyPolicyView.addButton(title: L("copyright"), didTapHandler: { [weak self] in
- self?.showCopyright()
- })
- }
+ // func setupSocialMediaCollection() {
+ // socialMediaHeaderLabel.setStyleAndApply("regular16:blackPrimaryText")
+ // socialMediaHeaderLabel.text = L("follow_us")
+ // socialMediaHeaderLabel.numberOfLines = 1
+ // socialMediaHeaderLabel.allowsDefaultTighteningForTruncation = true
+ // socialMediaHeaderLabel.adjustsFontSizeToFitWidth = true
+ // socialMediaHeaderLabel.minimumScaleFactor = 0.5
+
+ // socialMediaCollectionView.backgroundColor = .clear
+ // socialMediaCollectionView.isScrollEnabled = false
+ // socialMediaCollectionView.dataSource = self
+ // socialMediaCollectionView.delegate = self
+ // socialMediaCollectionView.register(cell: SocialMediaCollectionViewCell.self)
+ // }
+
+ // func setupTermsAndPrivacy() {
+ // termsOfUseAndPrivacyPolicyView.addButton(title: L("privacy_policy"), didTapHandler: { [weak self] in
+ // self?.openUrl(L("translated_om_site_url") + "privacy/")
+ // })
+ // termsOfUseAndPrivacyPolicyView.addButton(title: L("terms_of_use"), didTapHandler: { [weak self] in
+ // self?.openUrl(L("translated_om_site_url") + "terms/")
+ // })
+ // termsOfUseAndPrivacyPolicyView.addButton(title: L("copyright"), didTapHandler: { [weak self] in
+ // self?.showCopyright()
+ // })
+ // }
view.setStyleAndApply("PressBackground")
@@ -184,11 +184,11 @@ private extension AboutController {
setupLogo()
setupHeaderTitle()
setupAdditionalInfo()
- setupDonation()
- setupOSM()
+ // setupDonation()
+ // setupOSM()
setupInfoTable()
- setupSocialMediaCollection()
- setupTermsAndPrivacy()
+ // setupSocialMediaCollection()
+ // setupTermsAndPrivacy()
infoTableViewData = buildInfoTableViewData()
socialMediaCollectionViewData = buildSocialMediaCollectionViewData()
@@ -200,14 +200,14 @@ private extension AboutController {
stackView.addArrangedSubview(logoImageView)
stackView.addArrangedSubview(headerTitleLabel)
stackView.addArrangedSubviewWithSeparator(additionalInfoStackView)
- if isDonateEnabled() {
- stackView.addArrangedSubviewWithSeparator(donationView)
- }
- stackView.addArrangedSubviewWithSeparator(osmView)
+ // if isDonateEnabled() {
+ // stackView.addArrangedSubviewWithSeparator(donationView)
+ // }
+ // stackView.addArrangedSubviewWithSeparator(osmView)
stackView.addArrangedSubviewWithSeparator(infoTableView)
- stackView.addArrangedSubviewWithSeparator(socialMediaHeaderLabel)
- stackView.addArrangedSubview(socialMediaCollectionView)
- stackView.addArrangedSubviewWithSeparator(termsOfUseAndPrivacyPolicyView)
+ // stackView.addArrangedSubviewWithSeparator(socialMediaHeaderLabel)
+ // stackView.addArrangedSubview(socialMediaCollectionView)
+ // stackView.addArrangedSubviewWithSeparator(termsOfUseAndPrivacyPolicyView)
}
func layoutViews() {
@@ -215,10 +215,10 @@ private extension AboutController {
stackView.translatesAutoresizingMaskIntoConstraints = false
logoImageView.translatesAutoresizingMaskIntoConstraints = false
additionalInfoStackView.translatesAutoresizingMaskIntoConstraints = false
- donationView.translatesAutoresizingMaskIntoConstraints = false
+ // donationView.translatesAutoresizingMaskIntoConstraints = false
infoTableView.translatesAutoresizingMaskIntoConstraints = false
- socialMediaCollectionView.translatesAutoresizingMaskIntoConstraints = false
- termsOfUseAndPrivacyPolicyView.translatesAutoresizingMaskIntoConstraints = false
+ // socialMediaCollectionView.translatesAutoresizingMaskIntoConstraints = false
+ // termsOfUseAndPrivacyPolicyView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
@@ -237,60 +237,47 @@ private extension AboutController {
additionalInfoStackView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
- osmView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
+ // osmView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
infoTableView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
infoTableView.heightAnchor.constraint(equalToConstant: Constants.infoTableViewCellHeight * CGFloat(infoTableViewData.count)),
- socialMediaHeaderLabel.leadingAnchor.constraint(equalTo: socialMediaCollectionView.leadingAnchor),
+ // socialMediaHeaderLabel.leadingAnchor.constraint(equalTo: socialMediaCollectionView.leadingAnchor),
- socialMediaCollectionView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
- socialMediaCollectionView.contentLayoutGuide.widthAnchor.constraint(equalTo: stackView.widthAnchor),
- socialMediaCollectionViewHeighConstraint,
+ // socialMediaCollectionView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
+ // socialMediaCollectionView.contentLayoutGuide.widthAnchor.constraint(equalTo: stackView.widthAnchor),
+ // socialMediaCollectionViewHeighConstraint,
- termsOfUseAndPrivacyPolicyView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
+ // termsOfUseAndPrivacyPolicyView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
])
- donationView.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = isDonateEnabled()
+ // donationView.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = isDonateEnabled()
view.layoutIfNeeded()
- updateCollection()
+ // updateCollection()
}
- func updateCollection() {
- socialMediaCollectionView.collectionViewLayout.invalidateLayout()
- // On devices with the iOS 12 the actual collectionView layout update not always occurs during the current layout update cycle.
- // So constraints update should be performed on the next layout update cycle.
- DispatchQueue.main.async {
- self.socialMediaCollectionViewHeighConstraint.constant = self.socialMediaCollectionView.collectionViewLayout.collectionViewContentSize.height
- }
- }
+ // func updateCollection() {
+ // socialMediaCollectionView.collectionViewLayout.invalidateLayout()
+ // // On devices with the iOS 12 the actual collectionView layout update not always occurs during the current layout update cycle.
+ // // So constraints update should be performed on the next layout update cycle.
+ // DispatchQueue.main.async {
+ // self.socialMediaCollectionViewHeighConstraint.constant = self.socialMediaCollectionView.collectionViewLayout.collectionViewContentSize.height
+ // }
+ // }
func isDonateEnabled() -> Bool {
return Settings.donateUrl() != nil
}
func buildInfoTableViewData() -> [AboutInfoTableViewCellModel] {
- let infoContent: [AboutInfo] = [.faq, .reportMapDataProblem, .reportABug, .news, .volunteer, .rateTheApp]
+ let infoContent: [AboutInfo] = [.faq]
let data = infoContent.map { [weak self] aboutInfo in
return AboutInfoTableViewCellModel(title: aboutInfo.title, image: aboutInfo.image, didTapHandler: {
switch aboutInfo {
case .faq:
self?.navigationController?.pushViewController(FaqController(), animated: true)
- case .reportABug:
- guard let link = aboutInfo.link else { fatalError("The recipient link should be provided to report a bug.") }
- UIApplication.shared.showLoadingOverlay {
- let logFileURL = Logger.getLogFileURL()
- UIApplication.shared.hideLoadingOverlay {
- guard let self else { return }
- self.sendEmailWith(header: "Organic Maps Bugreport", toRecipients: [link], attachmentFileURL: logFileURL)
- }
- }
- case .reportMapDataProblem, .volunteer, .news:
- self?.openUrl(aboutInfo.link)
- case .rateTheApp:
- UIApplication.shared.rateApp()
- default:
- break
+ case .noWifi:
+ return
}
})
}
@@ -322,7 +309,7 @@ private extension AboutController {
}
// Returns a human-readable maps data version.
- static func formattedMapsDataVersion() -> String {
+ func formattedMapsDataVersion() -> String {
// First, convert version code like 220131 to a date.
let df = DateFormatter()
df.locale = Locale(identifier:"en_US_POSIX")
@@ -336,7 +323,7 @@ private extension AboutController {
return df.string(from:mapsDate)
}
- static func formattedAppVersion() -> String {
+ func formattedAppVersion() -> String {
let appInfo = AppInfo.shared();
// Use strong left-to-right unicode direction characters for the app version.
return String(format: L("version"), "\u{2066}\(appInfo.bundleVersion)-\(appInfo.buildNumber)\u{2069}")
@@ -361,11 +348,11 @@ private extension AboutController {
// MARK: - Actions
private extension AboutController {
@objc func appVersionButtonTapped() {
- copyToClipboard(Self.formattedAppVersion())
+ copyToClipboard(formattedAppVersion())
}
@objc func osmMapsDataButtonTapped() {
- copyToClipboard(Self.formattedMapsDataVersion())
+ copyToClipboard(formattedMapsDataVersion())
}
}
diff --git a/iphone/Maps/UI/Help/AboutController/Models/AboutInfo.swift b/iphone/Maps/UI/Help/AboutController/Models/AboutInfo.swift
index 85a415cfe72..9c9d34d456f 100644
--- a/iphone/Maps/UI/Help/AboutController/Models/AboutInfo.swift
+++ b/iphone/Maps/UI/Help/AboutController/Models/AboutInfo.swift
@@ -1,35 +1,14 @@
enum AboutInfo {
case faq
- case reportABug
- case reportMapDataProblem
- case volunteer
- case news
- case rateTheApp
- case noTracking
case noWifi
- case community
var title: String {
switch self {
case .faq:
return L("faq")
- case .reportABug:
- return L("report_a_bug")
- case .reportMapDataProblem:
- return L("report_incorrect_map_bug")
- case .volunteer:
- return L("volunteer")
- case .news:
- return L("news")
- case .rateTheApp:
- return L("rate_the_app")
- case .noTracking:
- return L("about_proposition_1")
case .noWifi:
return L("about_proposition_2")
- case .community:
- return L("about_proposition_3")
}
}
@@ -37,17 +16,7 @@ enum AboutInfo {
switch self {
case .faq:
return UIImage(named: "ic_about_faq")!
- case .reportABug:
- return UIImage(named: "ic_about_report_bug")!
- case .reportMapDataProblem:
- return UIImage(named: "ic_about_report_osm")!
- case .volunteer:
- return UIImage(named: "ic_about_volunteer")!
- case .news:
- return UIImage(named: "ic_about_news")!
- case .rateTheApp:
- return UIImage(named: "ic_about_rate_app")!
- case .noTracking, .noWifi, .community:
+ case .noWifi:
// Dots are used for these cases
return nil
}
@@ -55,17 +24,9 @@ enum AboutInfo {
var link: String? {
switch self {
- case .faq, .rateTheApp, .noTracking, .noWifi, .community:
+ case .faq, .noWifi:
// These cases don't provide redirection to the web
return nil
- case .reportABug:
- return "ios@organicmaps.app"
- case .reportMapDataProblem:
- return "https://www.openstreetmap.org/fixthemap"
- case .volunteer:
- return L("translated_om_site_url") + "support-us/"
- case .news:
- return L("translated_om_site_url") + "news/"
}
}
}
diff --git a/iphone/Maps/UI/LiveFeedsViewController.swift b/iphone/Maps/UI/LiveFeedsViewController.swift
new file mode 100644
index 00000000000..4e9b63e019a
--- /dev/null
+++ b/iphone/Maps/UI/LiveFeedsViewController.swift
@@ -0,0 +1,21 @@
+final class LiveFeedsViewController: MWMViewController {
+ override func loadView() {
+ super.loadView()
+
+ // TODO: FAQ?
+ self.title = L("Live Feeds")
+
+ let webViewController = WebViewController.init(url:URL(string:"https://drimsplatform.com/home")!, title: "Live")!
+ webViewController.openInSafari = true
+ addChild(webViewController)
+ let aboutView = webViewController.view!
+ view.addSubview(aboutView)
+ aboutView.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ aboutView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+ aboutView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+ aboutView.topAnchor.constraint(equalTo: view.topAnchor),
+ aboutView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+ ])
+ }
+}
diff --git a/iphone/Maps/UI/LoginViewController.swift b/iphone/Maps/UI/LoginViewController.swift
new file mode 100644
index 00000000000..3b3f5b10d27
--- /dev/null
+++ b/iphone/Maps/UI/LoginViewController.swift
@@ -0,0 +1,21 @@
+final class LoginViewController: MWMViewController {
+ override func loadView() {
+ super.loadView()
+
+ // TODO: FAQ?
+ self.title = L("Login")
+
+ let webViewController = WebViewController.init(url:URL(string:"https://drimsplatform.com/")!, title: "Login")!
+ webViewController.openInSafari = true
+ addChild(webViewController)
+ let aboutView = webViewController.view!
+ view.addSubview(aboutView)
+ aboutView.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ aboutView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+ aboutView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+ aboutView.topAnchor.constraint(equalTo: view.topAnchor),
+ aboutView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+ ])
+ }
+}
diff --git a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm
index 83efc3cd222..192f76273b5 100644
--- a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm
+++ b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm
@@ -196,7 +196,7 @@ - (void)configCommonSection {
[strongSelf.iCloudSynchronizationCell updateWithError:error];
}];
- [self.enableLoggingCell configWithDelegate:self title:L(@"enable_logging") isOn:MWMSettings.isFileLoggingEnabled];
+ // [self.enableLoggingCell configWithDelegate:self title:L(@"enable_logging") isOn:MWMSettings.isFileLoggingEnabled];
[self updateLogFileSize];
}
@@ -391,7 +391,8 @@ - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInte
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
switch (section) {
case 1:
- return L(@"enable_logging_warning_message");
+ // return L(@"enable_logging_warning_message");
+ return nil;
default:
return nil;
}
diff --git a/iphone/Maps/UI/Storyboard/Login.storyboard b/iphone/Maps/UI/Storyboard/Login.storyboard
new file mode 100644
index 00000000000..d6ce1c50b9a
--- /dev/null
+++ b/iphone/Maps/UI/Storyboard/Login.storyboard
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iphone/Maps/UI/Storyboard/Settings.storyboard b/iphone/Maps/UI/Storyboard/Settings.storyboard
index dc2993590b4..8feade0f1a2 100644
--- a/iphone/Maps/UI/Storyboard/Settings.storyboard
+++ b/iphone/Maps/UI/Storyboard/Settings.storyboard
@@ -458,7 +458,7 @@
-
+
@@ -921,7 +921,15 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/iphone/Maps/UI/Storyboard/Storyboard.swift b/iphone/Maps/UI/Storyboard/Storyboard.swift
index 07b3a5daaad..6b2c064beac 100644
--- a/iphone/Maps/UI/Storyboard/Storyboard.swift
+++ b/iphone/Maps/UI/Storyboard/Storyboard.swift
@@ -11,6 +11,7 @@ enum Storyboard: Int {
case drivingOptions
case carPlay
case placePage
+ case login
}
extension UIStoryboard {
@@ -28,6 +29,7 @@ extension UIStoryboard {
case .drivingOptions: name = "DrivingOptions"
case .carPlay: name = "CarPlayStoryboard"
case .placePage: name = "PlacePage"
+ case .login: name = "Login"
}
return UIStoryboard(name: name, bundle: nil)
}
diff --git a/iphone/metadata/ar-SA/description.txt b/iphone/metadata/ar-SA/description.txt
index 6d3c81b6670..240de4f7a03 100644
--- a/iphone/metadata/ar-SA/description.txt
+++ b/iphone/metadata/ar-SA/description.txt
@@ -17,7 +17,6 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/da/description.txt b/iphone/metadata/da/description.txt
index 6d3c81b6670..240de4f7a03 100644
--- a/iphone/metadata/da/description.txt
+++ b/iphone/metadata/da/description.txt
@@ -17,7 +17,6 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/el/description.txt b/iphone/metadata/el/description.txt
index 6d3c81b6670..240de4f7a03 100644
--- a/iphone/metadata/el/description.txt
+++ b/iphone/metadata/el/description.txt
@@ -17,7 +17,6 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/en-AU/description.txt b/iphone/metadata/en-AU/description.txt
index 6d3c81b6670..240de4f7a03 100644
--- a/iphone/metadata/en-AU/description.txt
+++ b/iphone/metadata/en-AU/description.txt
@@ -17,7 +17,6 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/en-CA/description.txt b/iphone/metadata/en-CA/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/en-CA/description.txt
+++ b/iphone/metadata/en-CA/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/en-GB/description.txt b/iphone/metadata/en-GB/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/en-GB/description.txt
+++ b/iphone/metadata/en-GB/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/en-US/description.txt b/iphone/metadata/en-US/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/en-US/description.txt
+++ b/iphone/metadata/en-US/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/es-MX/description.txt b/iphone/metadata/es-MX/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/es-MX/description.txt
+++ b/iphone/metadata/es-MX/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/fi/description.txt b/iphone/metadata/fi/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/fi/description.txt
+++ b/iphone/metadata/fi/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/fr-CA/description.txt b/iphone/metadata/fr-CA/description.txt
index 6d3c81b6670..240de4f7a03 100644
--- a/iphone/metadata/fr-CA/description.txt
+++ b/iphone/metadata/fr-CA/description.txt
@@ -17,7 +17,6 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/he/description.txt b/iphone/metadata/he/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/he/description.txt
+++ b/iphone/metadata/he/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/hr/description.txt b/iphone/metadata/hr/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/hr/description.txt
+++ b/iphone/metadata/hr/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/ja/description.txt b/iphone/metadata/ja/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/ja/description.txt
+++ b/iphone/metadata/ja/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/ko/description.txt b/iphone/metadata/ko/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/ko/description.txt
+++ b/iphone/metadata/ko/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/ms/description.txt b/iphone/metadata/ms/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/ms/description.txt
+++ b/iphone/metadata/ms/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/nl-NL/description.txt b/iphone/metadata/nl-NL/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/nl-NL/description.txt
+++ b/iphone/metadata/nl-NL/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/no/description.txt b/iphone/metadata/no/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/no/description.txt
+++ b/iphone/metadata/no/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/ro/description.txt b/iphone/metadata/ro/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/ro/description.txt
+++ b/iphone/metadata/ro/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/sk/description.txt b/iphone/metadata/sk/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/sk/description.txt
+++ b/iphone/metadata/sk/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/th/description.txt b/iphone/metadata/th/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/th/description.txt
+++ b/iphone/metadata/th/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/iphone/metadata/vi/description.txt b/iphone/metadata/vi/description.txt
index 6d3c81b6670..7f0fa96a7c1 100644
--- a/iphone/metadata/vi/description.txt
+++ b/iphone/metadata/vi/description.txt
@@ -17,7 +17,7 @@ Organic Maps is free from trackers and other bad stuff:
• No ads
• No tracking
-• No data collection
+
• No phoning home
• No annoying registration
• No mandatory tutorials
diff --git a/map/framework.cpp b/map/framework.cpp
index afb6366989c..d221640f4a3 100644
--- a/map/framework.cpp
+++ b/map/framework.cpp
@@ -71,6 +71,10 @@
#include "defines.hpp"
#include
+#include
+#include
+#include
+#include
#include "framework.hpp"
@@ -93,6 +97,7 @@ Framework::FixedPosition::FixedPosition()
namespace
{
+
char const kMapStyleKey[] = "MapStyleKeyV1";
char const kAllow3dKey[] = "Allow3d";
char const kAllow3dBuildingsKey[] = "Buildings3d";
@@ -110,7 +115,6 @@ char const kShowDebugInfo[] = "DebugInfo";
auto constexpr kLargeFontsScaleFactor = 1.6;
size_t constexpr kMaxTrafficCacheSizeBytes = 64 /* Mb */ * 1024 * 1024;
auto constexpr kBuildingCentroidThreshold = 10.0;
-
// TODO!
// To adjust GpsTrackFilter was added secret command "?gpstrackaccuracy:xxx;"
// where xxx is a new value for horizontal accuracy.
@@ -137,6 +141,12 @@ bool ParseSetGpsTrackMinAccuracyCommand(string const & query)
pair Framework::RegisterMap(LocalCountryFile const & file)
{
+ auto storedtoken = GetFcmToken();
+ LOG(LINFO, ("Stored token:", storedtoken));
+ if (!storedtoken.empty())
+ {
+ HandleDeviceToken(storedtoken);
+ }
auto res = m_featuresFetcher.RegisterMap(file);
if (res.second == MwmSet::RegResult::Success)
{
@@ -181,6 +191,7 @@ void Framework::OnLocationUpdate(GpsInfo const & info)
#endif
m_routingManager.OnLocationUpdate(rInfo);
+ SendDeviceTokenWithLocation(rInfo);
}
void Framework::OnCompassUpdate(CompassInfo const & info)
@@ -410,17 +421,37 @@ osm::EditableMapObject Framework::CreateGeoFeatureByMwmId(MwmSet::MwmId const &
return emo;
}
+
+std::string getCurrentTimestamp()
+{
+ // Get current time as time_point
+ auto now = std::chrono::system_clock::now();
+ // Convert to time_t for conversion to tm structure
+ auto now_c = std::chrono::system_clock::to_time_t(now);
+ // Convert to tm structure for formatting
+ std::tm now_tm = *std::localtime(&now_c);
+
+ // Use stringstream to format date
+ std::stringstream ss;
+ // Format: YYYY-MM-DDTHH:MM:SS, compatible with JavaScript Date string
+ ss << std::put_time(&now_tm, "%Y-%m-%dT%H:%M:%S");
+
+ return ss.str();
+}
+
std::string createUrl(m2::RectD rect)
{
- // TODO: Get base url from config/enviroment
- std::string baseUrl = "http://localhost:3000/api/geo-elements/published-transform-element-in-view-port?";
+ auto timestamp = Framework::getLastTimeStamp();
+ LOG(LINFO, ("Last timestamp:", timestamp, getCurrentTimestamp()));
+
+ std::string baseUrl = "https://drimsplatform.com/api/api/geo-elements/published-transform-element-in-view-port?";
std::string southWestLng = "southWest[lng]=" + std::to_string(rect.minX());
std::string southWestLat = "&southWest[lat]=" + std::to_string(rect.minY());
std::string northEastLng = "&northEast[lng]=" + std::to_string(rect.maxX());
std::string northEastLat = "&northEast[lat]=" + std::to_string(rect.maxY());
std::string types = "&types[]=geoCircle&types[]=geoPath&types[]=geoRegion&types[]=geoMarker";
-
- return baseUrl + southWestLng + southWestLat + northEastLng + northEastLat + types;
+ std::string timestampParam = "×tamp=" + timestamp;
+ return baseUrl + southWestLng + southWestLat + northEastLng + northEastLat + types + timestampParam;
}
void Framework::CreateTestMapObjectIfNeeded(MwmSet::MwmId mwmId)
@@ -445,7 +476,6 @@ void Framework::CreateTestMapObjectIfNeeded(MwmSet::MwmId mwmId)
if (element.type == "geoMarker")
{
- // TODO: Add feature type from API
uint32_t featurType = classif().GetTypeByPathSafe({"amenity", "cafe"});
LOG(LINFO, ("Feature Type ID:", featurType));
m2::PointD const point = m2::PointD(mercator::FromLatLon(element.position.lat, element.position.lng));
@@ -460,6 +490,8 @@ void Framework::CreateTestMapObjectIfNeeded(MwmSet::MwmId mwmId)
if (result == osm::Editor::SaveResult::SavedSuccessfully)
{
LOG(LINFO, ("Test map object created successfully"));
+ // Move this to collective success after multiple element types are added.
+ storeLastTimeStamp(getCurrentTimestamp());
}
else
{
@@ -2786,6 +2818,7 @@ void SetHostingBuildingAddress(FeatureID const & hostingBuildingFid, DataSource
}
}
} // namespace
+string m_deviceToken;
bool Framework::CanEditMap() const { return !GetStorage().IsDownloadInProgress(); }
@@ -3163,3 +3196,56 @@ void Framework::OnPowerSchemeChanged(power_management::Scheme const actualScheme
if (actualScheme == power_management::Scheme::EconomyMaximum && GetTrafficManager().IsEnabled())
GetTrafficManager().SetEnabled(false);
}
+
+string BuildPostRequest(std::initializer_list> const & params)
+{
+ string result;
+ for (auto it = params.begin(); it != params.end(); ++it)
+ {
+ if (it != params.begin())
+ result += "&";
+ result += it->first + "=" + url::UrlEncode(it->second);
+ }
+ return result;
+}
+
+void Framework::HandleDeviceToken(std::string const & deviceToken)
+{
+ LOG(LINFO, ("Received device token:", deviceToken));
+
+ // Store the token
+ m_deviceToken = deviceToken;
+}
+void Framework::SendDeviceTokenWithLocation(GpsInfo const & info)
+{
+ if (m_deviceToken.empty())
+ return;
+
+ if (!info.IsValid())
+ {
+ LOG(LINFO, ("Failed to get current position, will try again later"));
+ return;
+ }
+
+ // Send the device token and current lat,lng to the server
+ std::string serverUrl = "https://drimsplatform.com/api/api/device";
+ platform::HttpClient request(serverUrl);
+ auto params = BuildPostRequest({
+ {"deviceId", m_deviceToken},
+ {"lat", std::to_string(info.m_latitude)},
+ {"lng", std::to_string(info.m_longitude)},
+ });
+ request.SetBodyData(std::move(params), "application/x-www-form-urlencoded");
+ LOG(LINFO, ("Sending device token to server:", info.m_latitude, info.m_longitude));
+ request.SetHttpMethod("POST");
+ if (request.RunHttpRequest() && (request.ErrorCode() == 200 || request.ErrorCode() == 304 ||
+ request.ErrorCode() == 201 || request.ErrorCode() == 204))
+ {
+ LOG(LINFO, ("Device token sent successfully"));
+ m_deviceToken.clear(); // Clear the token after successful send
+ }
+ else
+ {
+ LOG(LINFO, ("Failed to send device token", request.ServerResponse(), request.ErrorCode()));
+ }
+}
\ No newline at end of file
diff --git a/map/framework.hpp b/map/framework.hpp
index e4c9aece296..9685c9dd72e 100644
--- a/map/framework.hpp
+++ b/map/framework.hpp
@@ -230,7 +230,22 @@ class Framework : public PositionProvider,
std::string const & name, uint32_t featureType, uint32_t index) const;
void CreateTestMapObjectIfNeeded(MwmSet::MwmId id);
+ void HandleDeviceToken(std::string const & deviceToken);
+ static void storeLastTimeStamp(std::string const & timestamp)
+ {
+ GetPlatform().GetSecureStorage().Save("lastTimeStamp", timestamp);
+ }
+
+ static std::string getLastTimeStamp()
+ {
+ std::string timestamp;
+ GetPlatform().GetSecureStorage().Load("lastTimeStamp", timestamp);
+ return timestamp;
+ }
+ void SendDeviceTokenWithLocation(location::GpsInfo const & info);
+
+ void TrySendDeviceTokenWithLocation();
df::DrapeApi & GetDrapeApi() { return m_drapeApi; }
/// \returns true if there're unsaved changes in map with |countryId| and false otherwise.
@@ -395,6 +410,17 @@ class Framework : public PositionProvider,
void SwitchMyPositionNextMode();
/// Should be set before Drape initialization. Guarantees that fn is called in main thread context.
void SetMyPositionModeListener(location::TMyPositionModeChanged && fn);
+ void StoreFcmToken(std::string const & token)
+ {
+ GetPlatform().GetSecureStorage().Save("fcmToken", token);
+ LOG(LINFO, ("FCM token saved"));
+ };
+ std::string GetFcmToken()
+ {
+ std::string token;
+ GetPlatform().GetSecureStorage().Load("fcmToken", token);
+ return token;
+ };
location::EMyPositionMode GetMyPositionMode() const;
diff --git a/packaging/app.organicmaps.desktop.metainfo.xml b/packaging/app.organicmaps.desktop.metainfo.xml
index 60f75941588..791bdfba97f 100644
--- a/packaging/app.organicmaps.desktop.metainfo.xml
+++ b/packaging/app.organicmaps.desktop.metainfo.xml
@@ -24,8 +24,8 @@
Organic Maps is a free Android & iOS offline maps app for travelers,
tourists, hikers, drivers and cyclists.
It uses crowd-sourced OpenStreetMap data and is developed with love by
- MapsWithMe (MapsMe ) founders and our community.
- No ads, no tracking, no data collection, no crapware.
+ MapsWithMe ( MapsMe ) founders and our community.
+ No ads, no tracking, no crapware.
Your donations and positive reviews motivate and inspire us, thanks ❤️!
## Features
@@ -61,7 +61,6 @@
No ads
No tracking
- No data collection
No phoning home
No annoying registration
No mandatory tutorials
@@ -115,858 +114,858 @@
-
-
- Highlights:
-
- Better address search in the USA based on Topologically Integrated Geographic Encoding and Referencing system (TIGER) data. Map size for the USA has increased from 10Gb to 13Gb (including Wikipedia and elevation data)
- Fixed rendering of texts in Indic (covering Devanagari, Bengali, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu), Arabic (N'Ko, Syriac, Mongolian), Thai and Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew scripts
- New Malayalam and Bengali fonts
- OSM data as of July 2, 2024
- A selected place now shows more types/categories/amenities
- Display major roads earlier on the world overview map
- Display good quality fine gravel pedestrian paths as white dashed
- Support more road/path surface types (bricks, stone, grass paver, soil)
- Mountain search also shows volcanoes
- Better search results for faraway places
- Search now finds places with a number in their names
- Find parcel lockers using their ref numbers
-
- Linux Desktop:
-
- Fix a generic Wayland icon displayed instead of Organic Maps icon on some systems
-
- Translation updates:
-
- Updated Belarusian, Chinese, Dutch, Euskara, Hungarian, Polish, Portuguese, Russian, Ukrainian translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of May 28, 2024
- Search for US zip codes and UK (GB) postcodes
- Fix missing addresses in fitness centers details
- Add "pastry" and "cakes" search keywords
- Fix Wikipedia links that contain a question mark
-
- Linux Desktop:
-
- Improve selected place details dialog
-
- Translation updates:
-
- Updated Czech, German, Portuguese translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of April 29, 2024
- Upgraded to the new OpenStreetMap authentication method (OAuth 2)
- Sort bookmarks and tracks in a list by name
- Ability to toggle Drive-through in the OSM editor
- Show "Can't find a suitable category?" message hint in the OSM editor
- Improve bicycle routing for some cases
-
- Linux Desktop:
-
- Add route marking buttons to place pages
- Add an "Exit" menu option and keyboard shortcuts for all menu entries
- Improve font clarity on MDPI screens
-
- Styles:
-
- Show the availability of Drive-through service for selected POIs
- More feature types could be added to OSM now, e.g. marketplaces, taxi stands, kiosks, wilderness huts, garden centers, historic aircraft, cannons, boundary stones, tombs, etc.
- Elevator icon instead of "stairs" for displaying the level number of selected POI
- Better visible in dark mode $ emoji for paid map features
-
- Translation updates:
-
- Basque, German, Greek and Solvak
- Fix missing local language name versions for selected POIs
- Simplify handling of multiple languages feature names in the OSM editor and fix related bugs
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of March 26, 2024
- Better isolines elevation data for European countries
- Bookmark lists are sorted by modification time (recent at the top)
- Add "wheelchair" to the search input to limit results to wheelchair-accessible
- Searchable orders pickup points (shop=outpost)
-
- Linux Desktop:
-
- Place information page is much more user-friendly
-
- Styles:
-
- Added wind turbines and power plant icons
- Reduced visibilities of many outdoors-specific POIs when in the main map style, e.g., waterfalls, mountain peaks, shelters, power towers, etc. (use the Outdoors style for those!)
- More consistent font sizes and caption appearances
-
- Translation updates:
-
- Slovak, Italian, Spanish, Hindi
- Fixed police, parking, and sights category search for simplified Chinese
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of February 28, 2024
- Export all bookmarks as a single KMZ file
-
- Linux Desktop:
-
- Fixed occasional crash when there was no location service available
-
- Styles:
-
- Fixed small fonts on detailed zooms
- Improved dark style visibility
-
- Translations:
-
- Updated Brazilian Portugues, Hebrew, Hungarian and Spanish and Mexican Spanish translations
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of February 2, 2024
- Restroom emoji for places with toilets
- Display parking operator
- More precise turn notifications for small distances
- Fixed absent speed limit on some speed cameras
- Plus codes search shows results relative to position and to the screen center
- Fixed crash in search
- Name editing for playgrounds
- Parse mlat and mlon parameters from OSM urls
- Allow editing Greek names for Cyprus
- Hindi support
- Better and more precise search on the map, more relevant search results in the list
-
- Styles:
-
- Orange color for secondary roads
- Wider and brighter white tertiary roads
- Nicer looking on- and off-ramp road links joins
- Raised visibility of secondary and tertiary road links
- Less bright farmlands color
- Smaller mountain passes/saddles icons
- Reduced visibilities of mountain saddles (compared to passes)
- New ford icon
- Made hospital and clinic icons look different
- Reduced visibility of light rail stations
- Added Boston and updated Taipei subway icons
- Fixed Delhi subway entrance icons, Minsk & Spb subway captions on detailed zoom
- Increased font size of towns and suburbs labels and decreased for neighborhoods
- Adjust visibilities of many POIs
-
- Outdoor Style:
-
- Increased 50m & 100m contour lines visibilities
- Raised visibility of campsites, survey points, toilets, touristic information features
- New power tower and flagpole/mast icons
- Made bridleways to be the same brown color as paths
- Increased contrast of footways on overview zooms
-
- Translations:
-
- Updated Catalan, Chinese, Czech, Finnish, French, Romanian, Slovak, Ukrainian translations
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of January 5, 2024
- Added Max Capacity for places
-
- Styles:
-
- Added Cairns, updated Singapore subway icon
- Slightly increased contrast of lines on the World overview map
- Make secondary roads a bit brighter than tertiary/etc.
- Car navigation style: fixed some footways/paths/tracks being displayed too early as white dashed lines
- Main style: fix color of footways with a sac_scale=* tag to be same as path
- Fixed very thin lines (e.g. tram lines) having inconsistent transparency/contrast between different devices (driver-dependent)
- Fix bookmarked children playground icon
- Remove labels and decrease visibility of footway crossings and sidewalks
- Tuned contrast of altitude contour lines
- Crisper looking lines (no edge blur)
-
- Outdoor Style:
-
- More contrast-looking paths, tracks, cutlines, rivers, ditches, railways, cycleways, fences, etc.
- Reduce visibility of small streams and canals
- Increase visibility of fences, walls and ditches
- Increase visibilities of bridle/cycle/foot-ways and steps, increase label sizes
- Make bridleways' dashes longer
-
- Pistes improvements:
-
- Add snow parks and new piste types: skitour, winter hike, connection
- Color freeride pistes in yellow-orange, consider ungroomed downhill runs as freeride
- Better piste names and numbers/refs support
- In Outdoors style: increase pistes visibilities and display detailed piste shapes (area fills)
-
- Other:
-
- Display capacity of parkings, bicycle docks and charging stations when they're selected
- Adjust shop, amenity, leisure ranking in search
-
- Linux Desktop:
-
- Set screen update frequency to 60fps
-
- Translations:
-
- New Azerbaijani language
- Updates to Chinese, Polish, Hebrew, Romanian
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of December 13, 2023
- Show Wikipedia articles in a separate dialog
- Touchscreen pinch-zoom support
- Multiple KML files can be imported from a single KMZ file
- A credit card 💳 is displayed for selected places with ATM
- A dollar emoji 💲 is displayed where a fee is required
-
- Search:
-
- Search for village addresses without streets in Austria, Czechia, Germany, Poland, Slovakia and some other countries (addr:place OSM tag support)
- Type "skiing" to find downhill & Nordic pistes
-
- Translations:
-
- Improved Chinese, Dutch, Finnish, Polish, Russian translations
- Added Dutch, French, Polish, Romanian, and Russian translations for edition Opening Hours instructions
- Fixed missing parking translations
-
- Styles:
-
- Outdoors map style for hiking, cycling, and exploring the Nature. Type ?olight or ?odark in the search to enable it, and ?light or ?dark to disable it. Any volunteers to add convenient buttons are welcome!
- Please provide feedback on how to improve the Outdoors style
- Singapore metro icon
- Added Hackerspace
- Fixed Porto metro icon
- Fixed residential leisure garden area fills disappearing on some zoom levels
- Display house numbers regardless of buildings' sizes on zoom level 17
- Fine-tuned priorities of many POIs in the main style
- Less "gaps" in highways on the World map
- Removed very short ferry lines from the World map
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of November 13, 2023
- It is possible to zoom in deeper now and see more POIs in dense areas
- Outdoors map style preview (activate with ?olight or ?odark in search)
- Brands are displayed in the Place Page
-
- Search:
-
- Process platz-pl like strasse-str
- Improved address matching
- Improved search of brands
-
- Translations:
-
- Improved Arabic, Basque, Chinese, Czech, Danish, Finnish, Greek, Hungarian, Indonesian, Italian, Korean, Marathi, Polish, Romanian, Slovak, Spanish, Sweden, Thai, Turkish, Ukrainian, and Vietnamese translations
-
- Styles:
-
- Added flowerbeds, rental shops, bicycle rentals, motorcycle repairs, petting zoo, prison areas, compressed air
- Added nature reserves and military zones rendering to the car navigation mode
- Added Docklands Light Railway, Porto metro
- Display names of ski pistes
- Tuned/updated icons of fitness centre, yoga, theatre, artwork, statue, theme park, bbq, lighthouse, windmill, heliport & helipad, hunting stand, Kingdom Hall of Jehovah's Witnesses, paid & private versions of parkings and parking entrances, convenience / deli / farm / grocery / health_food shops, tobacco shop
- Better farmyard & garage landuse area fills
- Increased scrubs, alpine huts visibility
- Updated sanitary dump station icons and adjusted its priority
- Reduced visibility of cave entrances and improved the icon
- Increased visibility of standalone house numbers
- Reduced Tokyo subway visibility -- kudos to charlie2clarke
- Removed minor road markers/shields cluttering the map in Estonia
- Fix colors of Estonia and Germany road markers / shields
- Increased visibilities of road markers / shields on tertiary and residential road
- Fixed "gaps" in some densely mapped lines
- Fixed "gaps" in the outlines of bridges and other compound lines
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of September 20
- Add positioning support via GeoClue2
- Use OpenGL ES 3.0 instead of desktop OpenGL
- Added new route type "Ruler" (aka Helicopter Routing) to measure straight distances quickly
- Set decimal and grouping separators depending on the system locale
- Caves can be added in the Editor
-
- Search:
-
- Parking entrances are searchable
- Improved street matching and results relevance
- Search for grocery and houseware
-
- Translations:
-
- Improved Arabic, Polish, and Spanish translations
-
- Styles:
-
- New or updated icons for factory, winery, bookcase, library, brothel, bicycle repair station, bicycle rental, bicycle parking, sauna, lottery, bookmaker, massage, sewing, books, underground parking, disabled parking space, gate, excrement bags vending, wholesale shop, outdoor seating, handicraft, grinding mill, caterer, HVAC, key cutter and locksmith
- Added vehicle inspection, public bath, strip club, gambling, cycle barrier, waterways (drain, ditch, moat, wastewater), aquarium, assembly point, adult gaming center, amusement arcade, Mormon churches, visitor center, industrial mine, historical objects (cannon, anchor, stone, aircraft, tank, mine, wreck, locomotive)
- Added bridges and tunnels rendering for cycleways, footways, paths, tracks, bridleways, steps
- Render barrier=ditch differently from waterway=ditch
- Reduced priorities of river names (and of other lower-importance lines) in navigation mode
- Tuned road names and road shield priorities
- Fixed icons display for parking buildings
- Reduced visibility of minor and private parking icons, removed area fill for underground parking
- Reduced fire hydrant visibility
- Display house numbers above icons and main POI captions, and don’t display house numbers for buildings that are too small for the current zoom level
- Don't display star icons for squares
- Fine-tune house numbers font and drawing priority
- Added highway-pedestrian, bridleway, and cycleway lines for detailed zooms (z18-) in navigation mode
- Pedestrian tunnels are not visible in navigation mode
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of August 14, 2023
- Updated more than a year old Wikipedia articles
- Added missing isolines for some regions of Argentina, Chile, Kazakhstan, Tibet, USA, Russia (map sizes increased)
- More dense isolines in many areas
- Removed too small isolines at overview zoom levels
- Reduced many other map sizes
- Import comments from GPX cmt tag
- Treat GPX track segments as part of the singular track they belong to
- Fixed a bug when editing social contacts
- Dog Park can be added in the Editor
- Updated Persian voice directions
-
- Routing:
-
- Updated road surface factors for car routing profile
- Better pedestrian routing in Turkey and Georgia
- Fixed cross-region routing when "avoid …" options are enabled
-
- Search:
-
- Fixed search for addresses in Czech and Slovakia
- Improved street matching
- Remove Tourist Information, Place of Worship, Park, Information Board, and Tourist Map from the Sightseeings category
- Do not filter duplicated search results except for very close bus stops
- Better ranking when searching by category
- Fixed search by a house name
- Faster search on the map screen
-
- Styles:
-
- Added ferry routes to the World map
- Removed square background from parking icons
- Added separate icons for paid and private parking
- Made the bicycle parking icon differ more from the motorcycle one
- Updated parking entrance icon
- Street-side and lane parkings use a smaller icon and appear later when zooming in
- Added motorcycle parking and parking entrance icons to the navigation mode
- Fixed motorway=trunk links visibility in navigation mode
- Improved motorway=trunk colors
- Added Tehran metro icon
- Revamped priorities system, especially for POIs
-
-
-
-
-
- Highlights:
-
- Fresh OpenStreetMap data as of July 10, 2023
- Use Qt6 instead of Qt5, please report any log errors or issues
- Add preference for larger map font size
- Feature's layer is displayed in the Place Page
- Fixed crash when rendering large objects
- Faster loading of bookmarks and tracks
- Support altitude, OsmAnd, and Garmin colors in imported GPX tracks
- Fixed pedestrian ETA for big slopes
- Prefer tertiary roads to service roads in car routing
- Better Devanagari (Marathi) font
-
- Search:
-
- Improved search results ranking
- Fixed shop categories search
- Fixed airport search results with empty names
-
- Translations:
-
- Updated Catalan, Czech, Finnish, French, German, Italian, Polish, Spanish, Swedish, and Turkish translations
-
- Map Styles:
-
- Improve visibility and findability of highway services and rest areas
- Added second-hand category, auction, collectors shops, turnstile & exit
- Fixed underwater tunnels not being visible
- Fixed areal water tunnels being drawn over other areas
- Introduced more detailed railway-rail-* types
- Fixed railway-abandoned/preserved bridges
- Added a bridge structure outline man_made-bridge
- Added community center, conference center, exhibition center, events venue
- Increased shop icons priority
- Added boundary=protected_area
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of June 2, 2023
- GPX import support
- Fixed disappearing bookmark lists when wrong characters were saved in a bookmark name or description
- Improved car and bicycle routing
- Fixed bookmarks dialog color in the dark mode
-
- Map Styles:
-
- Fixed funicular icon
- Changed desert color in the dark mode
- Added Fish Pass
- New Icon for Parcel Locker
- Fixed icon for northernmost Munich underground station
-
- Translations:
-
- Corrected Basque, Belarusian, British, English, and Ukrainian translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of May 3
- Fixed OpenGL issues on some devices
- Search supports addr:interpolation addresses
- Faster rendering of subway layer
- Fixed wrong postcodes in Paris
- Fixed missing Wikipedia links
- Fixed car routing via roundabouts
-
- Map Styles:
-
- Changed gate icon
- Changed Lyon subway icon
- Fixed US road shields
- Fixed priority of water areas
- Added camera shop, interior_decoration, antiques, art, cheese shop
-
- Translations:
-
- Improved English, German, Brazilian Portuguese translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of March 29
- Correctly import KML bookmarks with track data
- Allow adding music and musical_instruments in the Editor
- Sewing shops and haberdasheries are searchable
- Changed displayed name to Organic Maps
- OM version is selectable in About
-
- Map Styles:
-
- Distinguish supermarkets and convenience stores
- New shop types: agrarian, appliance, bed, outpost, gas, key cutter, locksmith, carpet, motorcycle repair, pet grooming, hi-fi, bathroom furnishing, curtain, fashion accessories, cannabis, herbalist
- Added money transfer, bicycle charging stations, power plant
- Made captions mandatory for capitals with a star icon
- Made park, forest, and scrub colors different
- Added metal construction icons
- Improved aerial ways, cable cars, power lines, fences
- Reduce Barcelona subway visibility
- Fixed isolines that are drawn over buildings, roads, etc.
- Fixed some POI captions displayed earlier than their icons
-
- Translations:
-
- Improved German, Turkish, Belarusian, Hungarian translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of February 27
- Fixed and improved search
- Split vegan and vegetarian cuisines in search
-
- Map Styles:
-
- Fixed styles for airports, land uses, waterways, and hatching fill areas
- Some smaller areas are not obscured by large ones anymore
- Added healthcare specialists: alternative, audiologist, blood_donation, optometrist, podiatrist, psychotherapist, sample_collection, speech_therapist
- Added communication towers, loading docks, solar, wind, gas, and hydropower generators
- Fixed the Bilbao metro icon
- Historic ruins can now be added in the Editor
-
- Translations:
-
- Improved Arabic, Norwegian, Portuguese, and Turkish translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of February 10, including changes by the Humanitarian OpenStreetMap Team (HOT) after the earthquake in Turkey and Syria
- Filtered wrong search results in the list and on the map
- Fixed crash on opening
-
- Map Styles:
-
- Better icons for main and secondary building entrances
-
- Translations:
-
- Fixed Persian, Polish, and German translations
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of January 21, 2023
- Fixed import of some KML tracks
- Automatic search for the current position in 30 hours of inactivity instead of 8 hours
- Improved search categories results
- Proper spelling of Australia in search results
- leisure=track is now searchable
-
- Routing:
-
- Proper handling of elevation for hiking and cycling
- Fixed inter-region routing
- Fixed routing via some bridges
- Busways are supported
- Added Croatia to Schengen area
-
- Map Styles:
-
- Fixed Buenos Aires metro icons
- Added Bowling Alley
- Fixed historic=fountain and tourism=information-office icon
- Equal icon sizes for springs & hot springs
-
- Editor:
-
- Allowed editing names with /\°[] symbols
- Added amenity=public_bookcase
- Increased the maximum editable building floors from 25 to 50
-
- Translations:
-
- Fixed Brazil, Czech, French, Hungarian, Spanish (Mexican), Turkish
- Fixed TTS translations for Finnish and Portuguese
-
- Linux:
-
- Import upper-case KML and KMZ files on case-sensitive Linux file systems
- Use Organic Maps server to check if a connection is alive
-
-
-
-
-
- Highlights:
-
- New OpenStreetMap data as of December 16, 2022
- Improved routing algorithm
- Do not route over highway=construction :)
- Support multiple track geometry in KML files
- Fixed KML 2.3 track import from OpenTracks
- Faster parsing and rendering of complex KML tracks
- Allow adding some shops, galleries, music schools in Editor
- Improved city borders in search results
-
- Map Styles:
-
- Improved, less bright icons in Night mode
- Fixed subway icons in some cities
- Properly draw barriers for areas and relations
- Fixed duplicated names on the world map
- Updated cave, mountain pass, peak, volcano, emergency phone, historic ship, ice cream, nightclub, music shop, stadium, video games icons
- Fixed wrong priorities of leisure=pitch, historic, post office
- More consistent filled/round icons (round means some kind of business/service)
-
- Translations:
-
- TTS (Text-To-Speech) for Brazil, Mexican Spanish and Norwegian
- Fixed German and Hungarian search strings
- Updated Czech, Spanish translations
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of November 19
- Fixed map dragging on Linux
- Use "+" key to zoom in
- Improved docs about building OM with WSL
- Use high-resolution icons on high-DPI displays
-
- Routing and Navigation:
-
- Corrected bicycle's speed for better routing
-
- Styles:
-
- Fixed some improperly overlapping types
- Added highway=busway and physiotherapist
- Islands and archipelagos are now visible on World Map
- Draw waterway=dam as background area
- Water draw priority is lesser now than pier
- Fixed leisure areas
-
-
-
-
-
- Highlights:
-
- New OSM maps data as of October 29
- Fixed search indicator in Viewport mode
- Fixed search table update, now old results are always replaced by new ones
- Minor performance improvements
-
- Routing and Navigation:
-
- Dump corrupted KMLs to the log on startup
- Show "Roads to avoid" options and warnings on the route also for walking, cycling, and metro routes
- Fixed some routing issues, including wrong routing via highway exits/links
- Enable Catalan TTS
- Show speed camera on tap
-
- Search:
-
- Show all found results on the map screen
- Improved villages search
- Show only matched categories if they were selected from the list, not names
- Fixed street synonyms for nordic languages
-
- Styles:
-
- Use regional metro/subway icons for entrances and stations
- Added brewery, plumber, tailor, carpenter, sawmill, beekeeper, blacksmith, electrician, painter, and other craft icons
- Added natural=shrubbery, natural=desert, leisure=dance, amenity=charging_station-motorcar, and more barrier types
- Draw international airport icon on z7-9
- Draw metro for major cities starting from z12
- Do not draw railway station icon for building=train_station
- Updated icons for garden, park, forest, national park, nature reserve, power, chimney
- Add historic battlefield, gallows, pillory, memorial cross, stolperstein and war_memorial
- Fixed historic=* priority
- Support sauna=yes tags
- Better colors for natural=scrub
- Draw entrance icon instead of a dot
-
- Translations:
-
- Use larger, more geographically significant names for Oregon maps in Downloader
- Updated Catalan, Chinese, Dutch, Finnish, German, Hungarian, Italian, Polish, Portuguese (European and Brazilian), Turkish translations
-
-
-
-
-
-
- New OSM maps data as of September 12
- Fixed wrong elevation data between -1,-1 and 1,1 latitudes and longitudes
- Fixed crash on startup after editing some OSM objects
- Bookmark lists are now sorted by recently modified time (sorting by name is planned!)
- Improved displaying of the next street name directions
- Show features in the viewport at the top of search results
- Significantly speedup some search scenarios
- Improved category ranking & address search.
- Fixed highlighted hotel search results icon on the map
- Improved German category search
- Added driving_school, music_school, language_school, archaeological_site, craft-painter
- Removed backgrounds from historic cemetery icons
- Added different castle types: castrum, fortified_church, fortress, hillfort, kremlin, manor, palace & shiro
- Increased visibility of education & some sports
- Separated furniture & kitchen types
- Better looking leisure=track
- Fixed vending=fuel icon
-
-
-
-
-
-
- Fixed issue when some found objects were not highlighted on the map
- Removed common street search synonyms like parkway, path, line, walk, trail, etc.
- Fixed coordinates search if the query contains a newline
- Ignore non-relevant search results for coordinates
- Better search for capitals
- Treat 'emergency' as a last-choice feature type
- Added Catalan street search synonyms
- Properly filter equal streets in search results
- Improved visibility of military areas and boundaries
- Show disabled parking spaces
- Do not draw icon for residential gardens
- Render farm yard
- Add parking_entrance
- Add playground and internet cafe icon
- Add second_hand and charity
- Add table_tennis, volleyball, beachvolleyball, skateboard, chess, padel, handball, futsal, hockey, badminton, pelota
- Removed background circles from icons
-
-
-
-
-
-
- New OSM data as of July 18, 2022
- Added missing shop types from OpenStreetMap tags: antiques, art, baby_goods, bag, boutique, charity, cheese, craft, dairy, deli, electrical, farm, fishing, grocery, health_food, houseware, interior_decoration, kitchen, lottery, medical_supply, nutrition_supplements, paint, pastry, perfumery, second_hand, sewing, storage_rental, tobacco, trade, watches, wholesale
- Properly select max speed in some routing cases
- sport=* tags have higher priority than leisure=pitch
- Fill transit mark place page with feature info
- Show text info about the next turn's street longer
- Use building:min_level for 3D buildings
- Allow removing cuisines from selection in the Editor
- Fix Belarusian, German, Russian, and Ukrainian translations
- Add missing translations for OSM natural=* and amenity=events_venue types
- Fix assertion failure in ES3 scenario on Linux, now OM should work on mobile Linux too
-
-
-
-
-
-
- Improved/fixed the drawing of pattern lines
- Icons for information=board/map
- Fixed categories search with stop words
- Made all existing sports searchable
- amenity=parking can be added on the map via Editor
- Fixed place=square visibility at 16+ zoom
- Made streams & rivers visible on the beach
- Made hedges and power lines less contrast
- Improved Portuguese (Brasil), Spanish, Italian, French, and Euskara, enabled Marathi translations
-
-
-
-
-
-
- New OSM data as of June 13, 2022
- Cross-region and other routing fixes
- Nicer fences, city walls, paths/tracks, waterfalls, fountains, and drinking_water
- Added icons for guidepost, plaque, bicycle rental
- Typing category like "food" in the search also matches features' names
- Added cliffs, embankments, bicycle repair stations, graves, water tunnels, craft=*
- Road shields for Cyprus
- Better displaying of the next turn street
- Added Marathi localization
-
-
-
-
-
-
- Do not draw place=region.
- Fix crash on routing.
-
-
-
-
-
-
- Fixed road shields rendering in some places
- Improved car and pedestrian directions
- Improved cross-region routing
- Fixed some pedestrian/bike/car routing issues
- Some performance optimizations
- Fixed some translations
- Added Marathi language
- Added Devanagari font
-
-
-
-
-
-
- New OSM data as of April 15, 2022
- Fixed annoying "Location is Disabled"
- Show search results on map works!
- Experimental Wikipedia articles everywhere
- Improved car directions
- Speed and battery optimizations
- Routing improvements
- Fixed subway in some cities
- Added Euskara (Basque) translations
- Improved Italian and German translations
- Fixed menu colors and refreshed navigation menu
- Added news, matrix, email, OSM links
- RTL layout fixes
-
- The full changelog: organicmaps.app
-
-
-
-
-
- New OSM data as of March 14, 2022
- Wikipedia articles for well-known places
- Search for organic shops and restaurants
- Material style for bottom menus and "show on map"
- Filter inaccurate network locations
- Fixed compass overlapped by layers button for RTL
- Tuned visibility of steps, footways, community_centre
- Brighter roads in dark mode
- Darker farmlands and parkings
- Added bubble_tea and water_well
- Fixed some icons
- Improved routing
- Improved ar, es, ro translations
-
-
-
-
+
+
+ Highlights:
+
+ Better address search in the USA based on Topologically Integrated Geographic Encoding and Referencing system (TIGER) data. Map size for the USA has increased from 10Gb to 13Gb (including Wikipedia and elevation data)
+ Fixed rendering of texts in Indic (covering Devanagari, Bengali, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu), Arabic (N'Ko, Syriac, Mongolian), Thai and Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew scripts
+ New Malayalam and Bengali fonts
+ OSM data as of July 2, 2024
+ A selected place now shows more types/categories/amenities
+ Display major roads earlier on the world overview map
+ Display good quality fine gravel pedestrian paths as white dashed
+ Support more road/path surface types (bricks, stone, grass paver, soil)
+ Mountain search also shows volcanoes
+ Better search results for faraway places
+ Search now finds places with a number in their names
+ Find parcel lockers using their ref numbers
+
+ Linux Desktop:
+
+ Fix a generic Wayland icon displayed instead of Organic Maps icon on some systems
+
+ Translation updates:
+
+ Updated Belarusian, Chinese, Dutch, Euskara, Hungarian, Polish, Portuguese, Russian, Ukrainian translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of May 28, 2024
+ Search for US zip codes and UK (GB) postcodes
+ Fix missing addresses in fitness centers details
+ Add "pastry" and "cakes" search keywords
+ Fix Wikipedia links that contain a question mark
+
+ Linux Desktop:
+
+ Improve selected place details dialog
+
+ Translation updates:
+
+ Updated Czech, German, Portuguese translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of April 29, 2024
+ Upgraded to the new OpenStreetMap authentication method (OAuth 2)
+ Sort bookmarks and tracks in a list by name
+ Ability to toggle Drive-through in the OSM editor
+ Show "Can't find a suitable category?" message hint in the OSM editor
+ Improve bicycle routing for some cases
+
+ Linux Desktop:
+
+ Add route marking buttons to place pages
+ Add an "Exit" menu option and keyboard shortcuts for all menu entries
+ Improve font clarity on MDPI screens
+
+ Styles:
+
+ Show the availability of Drive-through service for selected POIs
+ More feature types could be added to OSM now, e.g. marketplaces, taxi stands, kiosks, wilderness huts, garden centers, historic aircraft, cannons, boundary stones, tombs, etc.
+ Elevator icon instead of "stairs" for displaying the level number of selected POI
+ Better visible in dark mode $ emoji for paid map features
+
+ Translation updates:
+
+ Basque, German, Greek and Solvak
+ Fix missing local language name versions for selected POIs
+ Simplify handling of multiple languages feature names in the OSM editor and fix related bugs
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of March 26, 2024
+ Better isolines elevation data for European countries
+ Bookmark lists are sorted by modification time (recent at the top)
+ Add "wheelchair" to the search input to limit results to wheelchair-accessible
+ Searchable orders pickup points (shop=outpost)
+
+ Linux Desktop:
+
+ Place information page is much more user-friendly
+
+ Styles:
+
+ Added wind turbines and power plant icons
+ Reduced visibilities of many outdoors-specific POIs when in the main map style, e.g., waterfalls, mountain peaks, shelters, power towers, etc. (use the Outdoors style for those!)
+ More consistent font sizes and caption appearances
+
+ Translation updates:
+
+ Slovak, Italian, Spanish, Hindi
+ Fixed police, parking, and sights category search for simplified Chinese
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of February 28, 2024
+ Export all bookmarks as a single KMZ file
+
+ Linux Desktop:
+
+ Fixed occasional crash when there was no location service available
+
+ Styles:
+
+ Fixed small fonts on detailed zooms
+ Improved dark style visibility
+
+ Translations:
+
+ Updated Brazilian Portugues, Hebrew, Hungarian and Spanish and Mexican Spanish translations
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of February 2, 2024
+ Restroom emoji for places with toilets
+ Display parking operator
+ More precise turn notifications for small distances
+ Fixed absent speed limit on some speed cameras
+ Plus codes search shows results relative to position and to the screen center
+ Fixed crash in search
+ Name editing for playgrounds
+ Parse mlat and mlon parameters from OSM urls
+ Allow editing Greek names for Cyprus
+ Hindi support
+ Better and more precise search on the map, more relevant search results in the list
+
+ Styles:
+
+ Orange color for secondary roads
+ Wider and brighter white tertiary roads
+ Nicer looking on- and off-ramp road links joins
+ Raised visibility of secondary and tertiary road links
+ Less bright farmlands color
+ Smaller mountain passes/saddles icons
+ Reduced visibilities of mountain saddles (compared to passes)
+ New ford icon
+ Made hospital and clinic icons look different
+ Reduced visibility of light rail stations
+ Added Boston and updated Taipei subway icons
+ Fixed Delhi subway entrance icons, Minsk & Spb subway captions on detailed zoom
+ Increased font size of towns and suburbs labels and decreased for neighborhoods
+ Adjust visibilities of many POIs
+
+ Outdoor Style:
+
+ Increased 50m & 100m contour lines visibilities
+ Raised visibility of campsites, survey points, toilets, touristic information features
+ New power tower and flagpole/mast icons
+ Made bridleways to be the same brown color as paths
+ Increased contrast of footways on overview zooms
+
+ Translations:
+
+ Updated Catalan, Chinese, Czech, Finnish, French, Romanian, Slovak, Ukrainian translations
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of January 5, 2024
+ Added Max Capacity for places
+
+ Styles:
+
+ Added Cairns, updated Singapore subway icon
+ Slightly increased contrast of lines on the World overview map
+ Make secondary roads a bit brighter than tertiary/etc.
+ Car navigation style: fixed some footways/paths/tracks being displayed too early as white dashed lines
+ Main style: fix color of footways with a sac_scale=* tag to be same as path
+ Fixed very thin lines (e.g. tram lines) having inconsistent transparency/contrast between different devices (driver-dependent)
+ Fix bookmarked children playground icon
+ Remove labels and decrease visibility of footway crossings and sidewalks
+ Tuned contrast of altitude contour lines
+ Crisper looking lines (no edge blur)
+
+ Outdoor Style:
+
+ More contrast-looking paths, tracks, cutlines, rivers, ditches, railways, cycleways, fences, etc.
+ Reduce visibility of small streams and canals
+ Increase visibility of fences, walls and ditches
+ Increase visibilities of bridle/cycle/foot-ways and steps, increase label sizes
+ Make bridleways' dashes longer
+
+ Pistes improvements:
+
+ Add snow parks and new piste types: skitour, winter hike, connection
+ Color freeride pistes in yellow-orange, consider ungroomed downhill runs as freeride
+ Better piste names and numbers/refs support
+ In Outdoors style: increase pistes visibilities and display detailed piste shapes (area fills)
+
+ Other:
+
+ Display capacity of parkings, bicycle docks and charging stations when they're selected
+ Adjust shop, amenity, leisure ranking in search
+
+ Linux Desktop:
+
+ Set screen update frequency to 60fps
+
+ Translations:
+
+ New Azerbaijani language
+ Updates to Chinese, Polish, Hebrew, Romanian
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of December 13, 2023
+ Show Wikipedia articles in a separate dialog
+ Touchscreen pinch-zoom support
+ Multiple KML files can be imported from a single KMZ file
+ A credit card 💳 is displayed for selected places with ATM
+ A dollar emoji 💲 is displayed where a fee is required
+
+ Search:
+
+ Search for village addresses without streets in Austria, Czechia, Germany, Poland, Slovakia and some other countries (addr:place OSM tag support)
+ Type "skiing" to find downhill & Nordic pistes
+
+ Translations:
+
+ Improved Chinese, Dutch, Finnish, Polish, Russian translations
+ Added Dutch, French, Polish, Romanian, and Russian translations for edition Opening Hours instructions
+ Fixed missing parking translations
+
+ Styles:
+
+ Outdoors map style for hiking, cycling, and exploring the Nature. Type ?olight or ?odark in the search to enable it, and ?light or ?dark to disable it. Any volunteers to add convenient buttons are welcome!
+ Please provide feedback on how to improve the Outdoors style
+ Singapore metro icon
+ Added Hackerspace
+ Fixed Porto metro icon
+ Fixed residential leisure garden area fills disappearing on some zoom levels
+ Display house numbers regardless of buildings' sizes on zoom level 17
+ Fine-tuned priorities of many POIs in the main style
+ Less "gaps" in highways on the World map
+ Removed very short ferry lines from the World map
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of November 13, 2023
+ It is possible to zoom in deeper now and see more POIs in dense areas
+ Outdoors map style preview (activate with ?olight or ?odark in search)
+ Brands are displayed in the Place Page
+
+ Search:
+
+ Process platz-pl like strasse-str
+ Improved address matching
+ Improved search of brands
+
+ Translations:
+
+ Improved Arabic, Basque, Chinese, Czech, Danish, Finnish, Greek, Hungarian, Indonesian, Italian, Korean, Marathi, Polish, Romanian, Slovak, Spanish, Sweden, Thai, Turkish, Ukrainian, and Vietnamese translations
+
+ Styles:
+
+ Added flowerbeds, rental shops, bicycle rentals, motorcycle repairs, petting zoo, prison areas, compressed air
+ Added nature reserves and military zones rendering to the car navigation mode
+ Added Docklands Light Railway, Porto metro
+ Display names of ski pistes
+ Tuned/updated icons of fitness centre, yoga, theatre, artwork, statue, theme park, bbq, lighthouse, windmill, heliport & helipad, hunting stand, Kingdom Hall of Jehovah's Witnesses, paid & private versions of parkings and parking entrances, convenience / deli / farm / grocery / health_food shops, tobacco shop
+ Better farmyard & garage landuse area fills
+ Increased scrubs, alpine huts visibility
+ Updated sanitary dump station icons and adjusted its priority
+ Reduced visibility of cave entrances and improved the icon
+ Increased visibility of standalone house numbers
+ Reduced Tokyo subway visibility -- kudos to charlie2clarke
+ Removed minor road markers/shields cluttering the map in Estonia
+ Fix colors of Estonia and Germany road markers / shields
+ Increased visibilities of road markers / shields on tertiary and residential road
+ Fixed "gaps" in some densely mapped lines
+ Fixed "gaps" in the outlines of bridges and other compound lines
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of September 20
+ Add positioning support via GeoClue2
+ Use OpenGL ES 3.0 instead of desktop OpenGL
+ Added new route type "Ruler" (aka Helicopter Routing) to measure straight distances quickly
+ Set decimal and grouping separators depending on the system locale
+ Caves can be added in the Editor
+
+ Search:
+
+ Parking entrances are searchable
+ Improved street matching and results relevance
+ Search for grocery and houseware
+
+ Translations:
+
+ Improved Arabic, Polish, and Spanish translations
+
+ Styles:
+
+ New or updated icons for factory, winery, bookcase, library, brothel, bicycle repair station, bicycle rental, bicycle parking, sauna, lottery, bookmaker, massage, sewing, books, underground parking, disabled parking space, gate, excrement bags vending, wholesale shop, outdoor seating, handicraft, grinding mill, caterer, HVAC, key cutter and locksmith
+ Added vehicle inspection, public bath, strip club, gambling, cycle barrier, waterways (drain, ditch, moat, wastewater), aquarium, assembly point, adult gaming center, amusement arcade, Mormon churches, visitor center, industrial mine, historical objects (cannon, anchor, stone, aircraft, tank, mine, wreck, locomotive)
+ Added bridges and tunnels rendering for cycleways, footways, paths, tracks, bridleways, steps
+ Render barrier=ditch differently from waterway=ditch
+ Reduced priorities of river names (and of other lower-importance lines) in navigation mode
+ Tuned road names and road shield priorities
+ Fixed icons display for parking buildings
+ Reduced visibility of minor and private parking icons, removed area fill for underground parking
+ Reduced fire hydrant visibility
+ Display house numbers above icons and main POI captions, and don’t display house numbers for buildings that are too small for the current zoom level
+ Don't display star icons for squares
+ Fine-tune house numbers font and drawing priority
+ Added highway-pedestrian, bridleway, and cycleway lines for detailed zooms (z18-) in navigation mode
+ Pedestrian tunnels are not visible in navigation mode
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of August 14, 2023
+ Updated more than a year old Wikipedia articles
+ Added missing isolines for some regions of Argentina, Chile, Kazakhstan, Tibet, USA, Russia (map sizes increased)
+ More dense isolines in many areas
+ Removed too small isolines at overview zoom levels
+ Reduced many other map sizes
+ Import comments from GPX cmt tag
+ Treat GPX track segments as part of the singular track they belong to
+ Fixed a bug when editing social contacts
+ Dog Park can be added in the Editor
+ Updated Persian voice directions
+
+ Routing:
+
+ Updated road surface factors for car routing profile
+ Better pedestrian routing in Turkey and Georgia
+ Fixed cross-region routing when "avoid …" options are enabled
+
+ Search:
+
+ Fixed search for addresses in Czech and Slovakia
+ Improved street matching
+ Remove Tourist Information, Place of Worship, Park, Information Board, and Tourist Map from the Sightseeings category
+ Do not filter duplicated search results except for very close bus stops
+ Better ranking when searching by category
+ Fixed search by a house name
+ Faster search on the map screen
+
+ Styles:
+
+ Added ferry routes to the World map
+ Removed square background from parking icons
+ Added separate icons for paid and private parking
+ Made the bicycle parking icon differ more from the motorcycle one
+ Updated parking entrance icon
+ Street-side and lane parkings use a smaller icon and appear later when zooming in
+ Added motorcycle parking and parking entrance icons to the navigation mode
+ Fixed motorway=trunk links visibility in navigation mode
+ Improved motorway=trunk colors
+ Added Tehran metro icon
+ Revamped priorities system, especially for POIs
+
+
+
+
+
+ Highlights:
+
+ Fresh OpenStreetMap data as of July 10, 2023
+ Use Qt6 instead of Qt5, please report any log errors or issues
+ Add preference for larger map font size
+ Feature's layer is displayed in the Place Page
+ Fixed crash when rendering large objects
+ Faster loading of bookmarks and tracks
+ Support altitude, OsmAnd, and Garmin colors in imported GPX tracks
+ Fixed pedestrian ETA for big slopes
+ Prefer tertiary roads to service roads in car routing
+ Better Devanagari (Marathi) font
+
+ Search:
+
+ Improved search results ranking
+ Fixed shop categories search
+ Fixed airport search results with empty names
+
+ Translations:
+
+ Updated Catalan, Czech, Finnish, French, German, Italian, Polish, Spanish, Swedish, and Turkish translations
+
+ Map Styles:
+
+ Improve visibility and findability of highway services and rest areas
+ Added second-hand category, auction, collectors shops, turnstile & exit
+ Fixed underwater tunnels not being visible
+ Fixed areal water tunnels being drawn over other areas
+ Introduced more detailed railway-rail-* types
+ Fixed railway-abandoned/preserved bridges
+ Added a bridge structure outline man_made-bridge
+ Added community center, conference center, exhibition center, events venue
+ Increased shop icons priority
+ Added boundary=protected_area
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of June 2, 2023
+ GPX import support
+ Fixed disappearing bookmark lists when wrong characters were saved in a bookmark name or description
+ Improved car and bicycle routing
+ Fixed bookmarks dialog color in the dark mode
+
+ Map Styles:
+
+ Fixed funicular icon
+ Changed desert color in the dark mode
+ Added Fish Pass
+ New Icon for Parcel Locker
+ Fixed icon for northernmost Munich underground station
+
+ Translations:
+
+ Corrected Basque, Belarusian, British, English, and Ukrainian translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of May 3
+ Fixed OpenGL issues on some devices
+ Search supports addr:interpolation addresses
+ Faster rendering of subway layer
+ Fixed wrong postcodes in Paris
+ Fixed missing Wikipedia links
+ Fixed car routing via roundabouts
+
+ Map Styles:
+
+ Changed gate icon
+ Changed Lyon subway icon
+ Fixed US road shields
+ Fixed priority of water areas
+ Added camera shop, interior_decoration, antiques, art, cheese shop
+
+ Translations:
+
+ Improved English, German, Brazilian Portuguese translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of March 29
+ Correctly import KML bookmarks with track data
+ Allow adding music and musical_instruments in the Editor
+ Sewing shops and haberdasheries are searchable
+ Changed displayed name to Organic Maps
+ OM version is selectable in About
+
+ Map Styles:
+
+ Distinguish supermarkets and convenience stores
+ New shop types: agrarian, appliance, bed, outpost, gas, key cutter, locksmith, carpet, motorcycle repair, pet grooming, hi-fi, bathroom furnishing, curtain, fashion accessories, cannabis, herbalist
+ Added money transfer, bicycle charging stations, power plant
+ Made captions mandatory for capitals with a star icon
+ Made park, forest, and scrub colors different
+ Added metal construction icons
+ Improved aerial ways, cable cars, power lines, fences
+ Reduce Barcelona subway visibility
+ Fixed isolines that are drawn over buildings, roads, etc.
+ Fixed some POI captions displayed earlier than their icons
+
+ Translations:
+
+ Improved German, Turkish, Belarusian, Hungarian translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of February 27
+ Fixed and improved search
+ Split vegan and vegetarian cuisines in search
+
+ Map Styles:
+
+ Fixed styles for airports, land uses, waterways, and hatching fill areas
+ Some smaller areas are not obscured by large ones anymore
+ Added healthcare specialists: alternative, audiologist, blood_donation, optometrist, podiatrist, psychotherapist, sample_collection, speech_therapist
+ Added communication towers, loading docks, solar, wind, gas, and hydropower generators
+ Fixed the Bilbao metro icon
+ Historic ruins can now be added in the Editor
+
+ Translations:
+
+ Improved Arabic, Norwegian, Portuguese, and Turkish translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of February 10, including changes by the Humanitarian OpenStreetMap Team (HOT) after the earthquake in Turkey and Syria
+ Filtered wrong search results in the list and on the map
+ Fixed crash on opening
+
+ Map Styles:
+
+ Better icons for main and secondary building entrances
+
+ Translations:
+
+ Fixed Persian, Polish, and German translations
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of January 21, 2023
+ Fixed import of some KML tracks
+ Automatic search for the current position in 30 hours of inactivity instead of 8 hours
+ Improved search categories results
+ Proper spelling of Australia in search results
+ leisure=track is now searchable
+
+ Routing:
+
+ Proper handling of elevation for hiking and cycling
+ Fixed inter-region routing
+ Fixed routing via some bridges
+ Busways are supported
+ Added Croatia to Schengen area
+
+ Map Styles:
+
+ Fixed Buenos Aires metro icons
+ Added Bowling Alley
+ Fixed historic=fountain and tourism=information-office icon
+ Equal icon sizes for springs & hot springs
+
+ Editor:
+
+ Allowed editing names with /\°[] symbols
+ Added amenity=public_bookcase
+ Increased the maximum editable building floors from 25 to 50
+
+ Translations:
+
+ Fixed Brazil, Czech, French, Hungarian, Spanish (Mexican), Turkish
+ Fixed TTS translations for Finnish and Portuguese
+
+ Linux:
+
+ Import upper-case KML and KMZ files on case-sensitive Linux file systems
+ Use Organic Maps server to check if a connection is alive
+
+
+
+
+
+ Highlights:
+
+ New OpenStreetMap data as of December 16, 2022
+ Improved routing algorithm
+ Do not route over highway=construction :)
+ Support multiple track geometry in KML files
+ Fixed KML 2.3 track import from OpenTracks
+ Faster parsing and rendering of complex KML tracks
+ Allow adding some shops, galleries, music schools in Editor
+ Improved city borders in search results
+
+ Map Styles:
+
+ Improved, less bright icons in Night mode
+ Fixed subway icons in some cities
+ Properly draw barriers for areas and relations
+ Fixed duplicated names on the world map
+ Updated cave, mountain pass, peak, volcano, emergency phone, historic ship, ice cream, nightclub, music shop, stadium, video games icons
+ Fixed wrong priorities of leisure=pitch, historic, post office
+ More consistent filled/round icons (round means some kind of business/service)
+
+ Translations:
+
+ TTS (Text-To-Speech) for Brazil, Mexican Spanish and Norwegian
+ Fixed German and Hungarian search strings
+ Updated Czech, Spanish translations
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of November 19
+ Fixed map dragging on Linux
+ Use "+" key to zoom in
+ Improved docs about building OM with WSL
+ Use high-resolution icons on high-DPI displays
+
+ Routing and Navigation:
+
+ Corrected bicycle's speed for better routing
+
+ Styles:
+
+ Fixed some improperly overlapping types
+ Added highway=busway and physiotherapist
+ Islands and archipelagos are now visible on World Map
+ Draw waterway=dam as background area
+ Water draw priority is lesser now than pier
+ Fixed leisure areas
+
+
+
+
+
+ Highlights:
+
+ New OSM maps data as of October 29
+ Fixed search indicator in Viewport mode
+ Fixed search table update, now old results are always replaced by new ones
+ Minor performance improvements
+
+ Routing and Navigation:
+
+ Dump corrupted KMLs to the log on startup
+ Show "Roads to avoid" options and warnings on the route also for walking, cycling, and metro routes
+ Fixed some routing issues, including wrong routing via highway exits/links
+ Enable Catalan TTS
+ Show speed camera on tap
+
+ Search:
+
+ Show all found results on the map screen
+ Improved villages search
+ Show only matched categories if they were selected from the list, not names
+ Fixed street synonyms for nordic languages
+
+ Styles:
+
+ Use regional metro/subway icons for entrances and stations
+ Added brewery, plumber, tailor, carpenter, sawmill, beekeeper, blacksmith, electrician, painter, and other craft icons
+ Added natural=shrubbery, natural=desert, leisure=dance, amenity=charging_station-motorcar, and more barrier types
+ Draw international airport icon on z7-9
+ Draw metro for major cities starting from z12
+ Do not draw railway station icon for building=train_station
+ Updated icons for garden, park, forest, national park, nature reserve, power, chimney
+ Add historic battlefield, gallows, pillory, memorial cross, stolperstein and war_memorial
+ Fixed historic=* priority
+ Support sauna=yes tags
+ Better colors for natural=scrub
+ Draw entrance icon instead of a dot
+
+ Translations:
+
+ Use larger, more geographically significant names for Oregon maps in Downloader
+ Updated Catalan, Chinese, Dutch, Finnish, German, Hungarian, Italian, Polish, Portuguese (European and Brazilian), Turkish translations
+
+
+
+
+
+
+ New OSM maps data as of September 12
+ Fixed wrong elevation data between -1,-1 and 1,1 latitudes and longitudes
+ Fixed crash on startup after editing some OSM objects
+ Bookmark lists are now sorted by recently modified time (sorting by name is planned!)
+ Improved displaying of the next street name directions
+ Show features in the viewport at the top of search results
+ Significantly speedup some search scenarios
+ Improved category ranking & address search.
+ Fixed highlighted hotel search results icon on the map
+ Improved German category search
+ Added driving_school, music_school, language_school, archaeological_site, craft-painter
+ Removed backgrounds from historic cemetery icons
+ Added different castle types: castrum, fortified_church, fortress, hillfort, kremlin, manor, palace & shiro
+ Increased visibility of education & some sports
+ Separated furniture & kitchen types
+ Better looking leisure=track
+ Fixed vending=fuel icon
+
+
+
+
+
+
+ Fixed issue when some found objects were not highlighted on the map
+ Removed common street search synonyms like parkway, path, line, walk, trail, etc.
+ Fixed coordinates search if the query contains a newline
+ Ignore non-relevant search results for coordinates
+ Better search for capitals
+ Treat 'emergency' as a last-choice feature type
+ Added Catalan street search synonyms
+ Properly filter equal streets in search results
+ Improved visibility of military areas and boundaries
+ Show disabled parking spaces
+ Do not draw icon for residential gardens
+ Render farm yard
+ Add parking_entrance
+ Add playground and internet cafe icon
+ Add second_hand and charity
+ Add table_tennis, volleyball, beachvolleyball, skateboard, chess, padel, handball, futsal, hockey, badminton, pelota
+ Removed background circles from icons
+
+
+
+
+
+
+ New OSM data as of July 18, 2022
+ Added missing shop types from OpenStreetMap tags: antiques, art, baby_goods, bag, boutique, charity, cheese, craft, dairy, deli, electrical, farm, fishing, grocery, health_food, houseware, interior_decoration, kitchen, lottery, medical_supply, nutrition_supplements, paint, pastry, perfumery, second_hand, sewing, storage_rental, tobacco, trade, watches, wholesale
+ Properly select max speed in some routing cases
+ sport=* tags have higher priority than leisure=pitch
+ Fill transit mark place page with feature info
+ Show text info about the next turn's street longer
+ Use building:min_level for 3D buildings
+ Allow removing cuisines from selection in the Editor
+ Fix Belarusian, German, Russian, and Ukrainian translations
+ Add missing translations for OSM natural=* and amenity=events_venue types
+ Fix assertion failure in ES3 scenario on Linux, now OM should work on mobile Linux too
+
+
+
+
+
+
+ Improved/fixed the drawing of pattern lines
+ Icons for information=board/map
+ Fixed categories search with stop words
+ Made all existing sports searchable
+ amenity=parking can be added on the map via Editor
+ Fixed place=square visibility at 16+ zoom
+ Made streams & rivers visible on the beach
+ Made hedges and power lines less contrast
+ Improved Portuguese (Brasil), Spanish, Italian, French, and Euskara, enabled Marathi translations
+
+
+
+
+
+
+ New OSM data as of June 13, 2022
+ Cross-region and other routing fixes
+ Nicer fences, city walls, paths/tracks, waterfalls, fountains, and drinking_water
+ Added icons for guidepost, plaque, bicycle rental
+ Typing category like "food" in the search also matches features' names
+ Added cliffs, embankments, bicycle repair stations, graves, water tunnels, craft=*
+ Road shields for Cyprus
+ Better displaying of the next turn street
+ Added Marathi localization
+
+
+
+
+
+
+ Do not draw place=region.
+ Fix crash on routing.
+
+
+
+
+
+
+ Fixed road shields rendering in some places
+ Improved car and pedestrian directions
+ Improved cross-region routing
+ Fixed some pedestrian/bike/car routing issues
+ Some performance optimizations
+ Fixed some translations
+ Added Marathi language
+ Added Devanagari font
+
+
+
+
+
+
+ New OSM data as of April 15, 2022
+ Fixed annoying "Location is Disabled"
+ Show search results on map works!
+ Experimental Wikipedia articles everywhere
+ Improved car directions
+ Speed and battery optimizations
+ Routing improvements
+ Fixed subway in some cities
+ Added Euskara (Basque) translations
+ Improved Italian and German translations
+ Fixed menu colors and refreshed navigation menu
+ Added news, matrix, email, OSM links
+ RTL layout fixes
+
+ The full changelog: organicmaps.app
+
+
+
+
+
+ New OSM data as of March 14, 2022
+ Wikipedia articles for well-known places
+ Search for organic shops and restaurants
+ Material style for bottom menus and "show on map"
+ Filter inaccurate network locations
+ Fixed compass overlapped by layers button for RTL
+ Tuned visibility of steps, footways, community_centre
+ Brighter roads in dark mode
+ Darker farmlands and parkings
+ Added bubble_tea and water_well
+ Fixed some icons
+ Improved routing
+ Improved ar, es, ro translations
+
+
+
+