From 02a79e1522ed2c2997210512f6a8e5fd0c7abee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Wed, 7 Feb 2024 00:00:03 +0000 Subject: [PATCH 1/7] [packaging] Fix flathub linter findings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit error: [appstream-missing-developer-name]( https://docs.flathub.org/docs/for-app-authors/linter/#appstream-missing-developer-name): Added the `developer_name` name tag. warning: [appstream-summary-too-long]( https://docs.flathub.org/docs/for-app-authors/linter/#appstream-summary-too-long): Shortened the summary to less than 35 characters. Signed-off-by: Ferenc Géczi --- packaging/app.organicmaps.desktop.metainfo.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packaging/app.organicmaps.desktop.metainfo.xml b/packaging/app.organicmaps.desktop.metainfo.xml index c50e032319..296e266eb0 100644 --- a/packaging/app.organicmaps.desktop.metainfo.xml +++ b/packaging/app.organicmaps.desktop.metainfo.xml @@ -3,7 +3,8 @@ app.organicmaps.desktop Organic Maps - A free offline maps app for travelers, tourists, hikers, drivers and cyclists + The Organic Maps Community + Free offline maps for travelers CC0-1.0 Apache-2.0 -- 2.45.3 From 50994bbe0f4c021a0c9166e4496b84a8f36fe6b7 Mon Sep 17 00:00:00 2001 From: Viktor Govako Date: Sun, 4 Feb 2024 09:32:55 -0300 Subject: [PATCH 2/7] [generator][routing] Ignore "highway=construction". Signed-off-by: Viktor Govako --- .../feature_segments_checker.cpp | 8 +-- generator/routing_index_generator.cpp | 26 +++++--- routing/features_road_graph.cpp | 11 ++-- routing/features_road_graph.hpp | 18 +++--- routing/geometry.cpp | 15 ++--- routing/routing_benchmarks/helpers.hpp | 4 +- routing_common/bicycle_model.cpp | 8 +-- routing_common/bicycle_model.hpp | 4 +- routing_common/car_model.cpp | 2 +- routing_common/car_model.hpp | 2 +- routing_common/pedestrian_model.cpp | 2 +- routing_common/pedestrian_model.hpp | 4 +- .../bicycle_model_test.cpp | 2 +- .../vehicle_model_test.cpp | 28 ++++---- routing_common/vehicle_model.cpp | 26 ++------ routing_common/vehicle_model.hpp | 47 ++++++-------- track_analyzing/track_analyzer/cmd_table.cpp | 19 ++---- track_analyzing/track_matcher.cpp | 64 +++++++++---------- traffic/traffic_info.cpp | 14 ++-- 19 files changed, 139 insertions(+), 165 deletions(-) diff --git a/generator/feature_segments_checker/feature_segments_checker.cpp b/generator/feature_segments_checker/feature_segments_checker.cpp index fd8d66120f..ab6ca3f177 100644 --- a/generator/feature_segments_checker/feature_segments_checker.cpp +++ b/generator/feature_segments_checker/feature_segments_checker.cpp @@ -4,18 +4,13 @@ #include "indexer/classificator_loader.hpp" #include "indexer/feature.hpp" -#include "indexer/feature_altitude.hpp" #include "indexer/feature_processor.hpp" -#include "indexer/map_style_reader.hpp" #include "geometry/mercator.hpp" #include "geometry/point2d.hpp" #include "geometry/point_with_altitude.hpp" -#include "platform/platform.hpp" - #include "base/checked_cast.hpp" -#include "base/file_name_utils.hpp" #include "base/logging.hpp" #include "base/math.hpp" @@ -23,7 +18,6 @@ #include #include #include -#include #include #include @@ -166,7 +160,7 @@ public: void operator()(FeatureType & f, uint32_t const & id) { f.ParseHeader2(); - if (!GetBicycleModel().IsRoad(f)) + if (!GetBicycleModel().IsRoad(feature::TypesHolder(f))) { ++m_notRoadCount; return; diff --git a/generator/routing_index_generator.cpp b/generator/routing_index_generator.cpp index c0b70e7820..f080f5b5b5 100644 --- a/generator/routing_index_generator.cpp +++ b/generator/routing_index_generator.cpp @@ -60,6 +60,7 @@ public: : m_pedestrianModel(PedestrianModelFactory(countryParentNameGetterFn).GetVehicleModelForCountry(country)) , m_bicycleModel(BicycleModelFactory(countryParentNameGetterFn).GetVehicleModelForCountry(country)) , m_carModel(CarModelFactory(countryParentNameGetterFn).GetVehicleModelForCountry(country)) + , m_constructionType(classif().GetTypeByPath({"highway", "construction"})) { CHECK(m_pedestrianModel, ()); CHECK(m_bicycleModel, ()); @@ -68,28 +69,35 @@ public: VehicleMask CalcRoadMask(FeatureType & f) const { - return CalcMask(f, [&](VehicleModelInterface const & model, FeatureType & f) { - return model.IsRoad(f); + feature::TypesHolder const types(f); + if (types.HasWithSubclass(m_constructionType)) + return 0; + + return CalcMask([&](VehicleModelInterface const & model) + { + return model.IsRoad(types); }); } VehicleMask CalcOneWayMask(FeatureType & f) const { - return CalcMask(f, [&](VehicleModelInterface const & model, FeatureType & f) { - return model.IsOneWay(f); + feature::TypesHolder const types(f); + return CalcMask([&](VehicleModelInterface const & model) + { + return model.IsOneWay(types); }); } private: template - VehicleMask CalcMask(FeatureType & f, Fn && fn) const + VehicleMask CalcMask(Fn && fn) const { VehicleMask mask = 0; - if (fn(*m_pedestrianModel, f)) + if (fn(*m_pedestrianModel)) mask |= kPedestrianMask; - if (fn(*m_bicycleModel, f)) + if (fn(*m_bicycleModel)) mask |= kBicycleMask; - if (fn(*m_carModel, f)) + if (fn(*m_carModel)) mask |= kCarMask; return mask; @@ -98,6 +106,8 @@ private: std::shared_ptr const m_pedestrianModel; std::shared_ptr const m_bicycleModel; std::shared_ptr const m_carModel; + + uint32_t const m_constructionType; }; class Processor final diff --git a/routing/features_road_graph.cpp b/routing/features_road_graph.cpp index 57e4c9f2f0..2fa96e2b5d 100644 --- a/routing/features_road_graph.cpp +++ b/routing/features_road_graph.cpp @@ -2,7 +2,6 @@ #include "routing/data_source.hpp" #include "routing/nearest_edge_finder.hpp" -#include "routing/route.hpp" #include "routing/routing_helpers.hpp" #include "routing_common/vehicle_model.hpp" @@ -35,12 +34,12 @@ FeaturesRoadGraphBase::CrossCountryVehicleModel::CrossCountryVehicleModel(Vehicl SpeedKMpH FeaturesRoadGraphBase::CrossCountryVehicleModel::GetSpeed(FeatureType & f, SpeedParams const & speedParams) const { - return GetVehicleModel(f.GetID())->GetSpeed(f, speedParams); + return GetVehicleModel(f.GetID())->GetSpeed(FeatureTypes(f), speedParams); } std::optional FeaturesRoadGraphBase::CrossCountryVehicleModel::GetHighwayType(FeatureType & f) const { - return GetVehicleModel(f.GetID())->GetHighwayType(f); + return GetVehicleModel(f.GetID())->GetHighwayType(FeatureTypes(f)); } SpeedKMpH const & FeaturesRoadGraphBase::CrossCountryVehicleModel::GetOffroadSpeed() const @@ -50,17 +49,17 @@ SpeedKMpH const & FeaturesRoadGraphBase::CrossCountryVehicleModel::GetOffroadSpe bool FeaturesRoadGraphBase::CrossCountryVehicleModel::IsOneWay(FeatureType & f) const { - return GetVehicleModel(f.GetID())->IsOneWay(f); + return GetVehicleModel(f.GetID())->IsOneWay(FeatureTypes(f)); } bool FeaturesRoadGraphBase::CrossCountryVehicleModel::IsRoad(FeatureType & f) const { - return GetVehicleModel(f.GetID())->IsRoad(f); + return GetVehicleModel(f.GetID())->IsRoad(FeatureTypes(f)); } bool FeaturesRoadGraphBase::CrossCountryVehicleModel::IsPassThroughAllowed(FeatureType & f) const { - return GetVehicleModel(f.GetID())->IsPassThroughAllowed(f); + return GetVehicleModel(f.GetID())->IsPassThroughAllowed(FeatureTypes(f)); } VehicleModelInterface * FeaturesRoadGraphBase::CrossCountryVehicleModel::GetVehicleModel(FeatureID const & featureId) const diff --git a/routing/features_road_graph.hpp b/routing/features_road_graph.hpp index 1fb3fda4b7..bf14092129 100644 --- a/routing/features_road_graph.hpp +++ b/routing/features_road_graph.hpp @@ -32,19 +32,21 @@ protected: using VehicleModelFactoryPtrT = std::shared_ptr; private: - class CrossCountryVehicleModel : public VehicleModelInterface + class CrossCountryVehicleModel { + using FeatureTypes = VehicleModelInterface::FeatureTypes; + public: explicit CrossCountryVehicleModel(VehicleModelFactoryPtrT modelFactory); // VehicleModelInterface overrides: - SpeedKMpH GetSpeed(FeatureType & f, SpeedParams const & speedParams) const override; - std::optional GetHighwayType(FeatureType & f) const override; - double GetMaxWeightSpeed() const override { return m_maxSpeed; } - SpeedKMpH const & GetOffroadSpeed() const override; - bool IsOneWay(FeatureType & f) const override; - bool IsRoad(FeatureType & f) const override; - bool IsPassThroughAllowed(FeatureType & f) const override; + SpeedKMpH GetSpeed(FeatureType & f, SpeedParams const & speedParams) const; + std::optional GetHighwayType(FeatureType & f) const; + double GetMaxWeightSpeed() const { return m_maxSpeed; } + SpeedKMpH const & GetOffroadSpeed() const; + bool IsOneWay(FeatureType & f) const; + bool IsRoad(FeatureType & f) const; + bool IsPassThroughAllowed(FeatureType & f) const; void Clear(); diff --git a/routing/geometry.cpp b/routing/geometry.cpp index 7556331ed9..a171f3952a 100644 --- a/routing/geometry.cpp +++ b/routing/geometry.cpp @@ -13,7 +13,6 @@ #include "base/assert.hpp" #include "base/string_utils.hpp" -#include #include namespace routing @@ -168,11 +167,12 @@ void RoadGeometry::Load(VehicleModelInterface const & vehicleModel, FeatureType size_t const count = feature.GetPointsCount(); CHECK(altitudes == nullptr || altitudes->size() == count, ()); - m_highwayType = vehicleModel.GetHighwayType(feature); + feature::TypesHolder types(feature); + m_highwayType = vehicleModel.GetHighwayType(types); - m_valid = vehicleModel.IsRoad(feature); - m_isOneWay = vehicleModel.IsOneWay(feature); - m_isPassThroughAllowed = vehicleModel.IsPassThroughAllowed(feature); + m_valid = vehicleModel.IsRoad(types); + m_isOneWay = vehicleModel.IsOneWay(types); + m_isPassThroughAllowed = vehicleModel.IsPassThroughAllowed(types); uint32_t const fID = feature.GetID().m_index; m_inCity = attrs.m_cityRoads.IsCityRoad(fID); @@ -181,11 +181,10 @@ void RoadGeometry::Load(VehicleModelInterface const & vehicleModel, FeatureType m_highwayType ? attrs.m_maxSpeeds.GetDefaultSpeed(m_inCity, *m_highwayType) : kInvalidSpeed, m_inCity); params.m_forward = true; - m_forwardSpeed = vehicleModel.GetSpeed(feature, params); + m_forwardSpeed = vehicleModel.GetSpeed(types, params); params.m_forward = false; - m_backwardSpeed = vehicleModel.GetSpeed(feature, params); + m_backwardSpeed = vehicleModel.GetSpeed(types, params); - feature::TypesHolder types(feature); auto const & optionsClassfier = RoutingOptionsClassifier::Instance(); for (uint32_t type : types) { diff --git a/routing/routing_benchmarks/helpers.hpp b/routing/routing_benchmarks/helpers.hpp index b599be44d0..fe8b432484 100644 --- a/routing/routing_benchmarks/helpers.hpp +++ b/routing/routing_benchmarks/helpers.hpp @@ -67,10 +67,10 @@ public: // some speed depending of road type (0 <= speed <= maxSpeed). For // tests purposes for all allowed features speed must be the same as // max speed. - routing::SpeedKMpH GetSpeed(FeatureType & f, + routing::SpeedKMpH GetSpeed(typename Model::FeatureTypes const & types, routing::SpeedParams const & speedParams) const override { - auto const speed = Model::GetSpeed(f, speedParams); + auto const speed = Model::GetSpeed(types, speedParams); if (speed.m_weight <= 0.0) return routing::SpeedKMpH(); diff --git a/routing_common/bicycle_model.cpp b/routing_common/bicycle_model.cpp index 8a4f8e12d1..52128abb34 100644 --- a/routing_common/bicycle_model.cpp +++ b/routing_common/bicycle_model.cpp @@ -226,22 +226,20 @@ bool BicycleModel::IsBicycleOnedir(feature::TypesHolder const & types) const return types.Has(m_onedirBicycleType); } -SpeedKMpH BicycleModel::GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const +SpeedKMpH BicycleModel::GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const { return GetTypeSpeedImpl(types, speedParams, false /* isCar */); } -bool BicycleModel::IsOneWay(FeatureType & f) const +bool BicycleModel::IsOneWay(FeatureTypes const & types) const { - feature::TypesHolder const types(f); - if (IsBicycleOnedir(types)) return true; if (IsBicycleBidir(types)) return false; - return VehicleModel::IsOneWay(f); + return VehicleModel::IsOneWay(types); } SpeedKMpH const & BicycleModel::GetOffroadSpeed() const { return bicycle_model::kSpeedOffroadKMpH; } diff --git a/routing_common/bicycle_model.hpp b/routing_common/bicycle_model.hpp index c03871f323..7f59a3f256 100644 --- a/routing_common/bicycle_model.hpp +++ b/routing_common/bicycle_model.hpp @@ -13,8 +13,8 @@ public: BicycleModel(VehicleModel::LimitsInitList const & limits, HighwayBasedSpeeds const & speeds); /// VehicleModelInterface overrides: - SpeedKMpH GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const override; - bool IsOneWay(FeatureType & f) const override; + SpeedKMpH GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const override; + bool IsOneWay(FeatureTypes const & types) const override; SpeedKMpH const & GetOffroadSpeed() const override; static BicycleModel const & AllLimitsInstance(); diff --git a/routing_common/car_model.cpp b/routing_common/car_model.cpp index 846b3e337a..db9d0fd687 100644 --- a/routing_common/car_model.cpp +++ b/routing_common/car_model.cpp @@ -126,7 +126,7 @@ CarModel::CarModel(VehicleModel::LimitsInitList const & roadLimits) m_maxModelSpeed = kMaxCarSpeedKMpH; } -SpeedKMpH CarModel::GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const +SpeedKMpH CarModel::GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const { return GetTypeSpeedImpl(types, speedParams, true /* isCar */); } diff --git a/routing_common/car_model.hpp b/routing_common/car_model.hpp index 80d1711bcb..9201d9f255 100644 --- a/routing_common/car_model.hpp +++ b/routing_common/car_model.hpp @@ -12,7 +12,7 @@ public: explicit CarModel(LimitsInitList const & roadLimits); /// VehicleModelInterface overrides: - SpeedKMpH GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const override; + SpeedKMpH GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const override; SpeedKMpH const & GetOffroadSpeed() const override; static CarModel const & AllLimitsInstance(); diff --git a/routing_common/pedestrian_model.cpp b/routing_common/pedestrian_model.cpp index 3e7bf0333d..fc5474c656 100644 --- a/routing_common/pedestrian_model.cpp +++ b/routing_common/pedestrian_model.cpp @@ -178,7 +178,7 @@ PedestrianModel::PedestrianModel(VehicleModel::LimitsInitList const & limits, m_maxModelSpeed = kMaxPedestrianSpeedKMpH; } -SpeedKMpH PedestrianModel::GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const +SpeedKMpH PedestrianModel::GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const { return GetTypeSpeedImpl(types, speedParams, false /* isCar */); } diff --git a/routing_common/pedestrian_model.hpp b/routing_common/pedestrian_model.hpp index 0a186359f1..ab53eabbd6 100644 --- a/routing_common/pedestrian_model.hpp +++ b/routing_common/pedestrian_model.hpp @@ -14,8 +14,8 @@ public: HighwayBasedSpeeds const & speeds); /// VehicleModelInterface overrides: - SpeedKMpH GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & speedParams) const override; - bool IsOneWay(FeatureType &) const override { return false; } + SpeedKMpH GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const override; + bool IsOneWay(FeatureTypes const &) const override { return false; } SpeedKMpH const & GetOffroadSpeed() const override; static PedestrianModel const & AllLimitsInstance(); diff --git a/routing_common/routing_common_tests/bicycle_model_test.cpp b/routing_common/routing_common_tests/bicycle_model_test.cpp index c8fe90d515..89f7149849 100644 --- a/routing_common/routing_common_tests/bicycle_model_test.cpp +++ b/routing_common/routing_common_tests/bicycle_model_test.cpp @@ -36,7 +36,7 @@ UNIT_CLASS_TEST(BicycleModelTest, Turkey) holder.Add(cl.GetTypeByPath({"highway", "footway", "tunnel"})); TEST(model->HasRoadType(holder), ()); - TEST_EQUAL(model->GetTypeSpeed(holder, DefaultSpeedParams()), BicycleModel::DismountSpeed(), ()); + TEST_EQUAL(model->GetSpeed(holder, DefaultSpeedParams()), BicycleModel::DismountSpeed(), ()); } } // namespace bicycle_model_test diff --git a/routing_common/routing_common_tests/vehicle_model_test.cpp b/routing_common/routing_common_tests/vehicle_model_test.cpp index 45000db588..06b28bac53 100644 --- a/routing_common/routing_common_tests/vehicle_model_test.cpp +++ b/routing_common/routing_common_tests/vehicle_model_test.cpp @@ -91,7 +91,7 @@ public: { } - SpeedKMpH GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & params) const override + SpeedKMpH GetSpeed(feature::TypesHolder const & types, SpeedParams const & params) const override { return GetTypeSpeedImpl(types, params, true /* isCar */); } @@ -112,7 +112,7 @@ void CheckSpeedWithParams(initializer_list const & types, SpeedParams for (uint32_t t : types) h.Add(t); - TEST_EQUAL(model.GetTypeSpeed(h, params), expectedSpeed, ()); + TEST_EQUAL(model.GetSpeed(h, params), expectedSpeed, ()); } void CheckSpeed(initializer_list const & types, InOutCitySpeedKMpH const & expectedSpeed) @@ -130,7 +130,7 @@ void CheckOneWay(initializer_list const & types, bool expectedValue) for (uint32_t t : types) h.Add(t); - TEST_EQUAL(model.HasOneWayType(h), expectedValue, ()); + TEST_EQUAL(model.IsOneWay(h), expectedValue, ()); } void CheckPassThroughAllowed(initializer_list const & types, bool expectedValue) @@ -140,7 +140,7 @@ void CheckPassThroughAllowed(initializer_list const & types, bool expe for (uint32_t t : types) h.Add(t); - TEST_EQUAL(model.HasPassThroughType(h), expectedValue, ()); + TEST_EQUAL(model.IsPassThroughAllowed(h), expectedValue, ()); } @@ -271,11 +271,11 @@ UNIT_CLASS_TEST(VehicleModelTest, CarModel_TrackVsGravelTertiary) { SpeedParams p2({measurement_utils::Units::Metric, 60, 60}, kInvalidSpeed, false /* inCity */); - TEST_LESS_SPEED(model.GetTypeSpeed(h1, p), model.GetTypeSpeed(h2, p2)); + TEST_LESS_SPEED(model.GetSpeed(h1, p), model.GetSpeed(h2, p2)); } { - TEST_LESS_SPEED(model.GetTypeSpeed(h1, p), model.GetTypeSpeed(h2, p)); + TEST_LESS_SPEED(model.GetSpeed(h1, p), model.GetSpeed(h2, p)); } } @@ -295,8 +295,8 @@ UNIT_CLASS_TEST(VehicleModelTest, CarModel_Smoke) feature::TypesHolder h3; h3.Add(c.GetTypeByPath({"highway", "tertiary"})); - TEST_EQUAL(model.GetTypeSpeed(h1, p), model.GetTypeSpeed(h2, p), ()); - TEST_LESS_SPEED(model.GetTypeSpeed(h3, p), model.GetTypeSpeed(h2, p)); + TEST_EQUAL(model.GetSpeed(h1, p), model.GetSpeed(h2, p), ()); + TEST_LESS_SPEED(model.GetSpeed(h3, p), model.GetSpeed(h2, p)); } UNIT_CLASS_TEST(VehicleModelTest, BicycleModel_Smoke) @@ -323,10 +323,10 @@ UNIT_CLASS_TEST(VehicleModelTest, BicycleModel_Smoke) h5.Add(secondary); h5.Add(c.GetTypeByPath({"hwtag", "nocycleway"})); - TEST_EQUAL(model.GetTypeSpeed(h1, p), model.GetTypeSpeed(h2, p), ()); - TEST_LESS_SPEED(model.GetTypeSpeed(h3, p), model.GetTypeSpeed(h2, p)); - TEST_LESS_SPEED(model.GetTypeSpeed(h4, p), model.GetTypeSpeed(h3, p)); - TEST_LESS_SPEED(model.GetTypeSpeed(h5, p), model.GetTypeSpeed(h4, p)); + TEST_EQUAL(model.GetSpeed(h1, p), model.GetSpeed(h2, p), ()); + TEST_LESS_SPEED(model.GetSpeed(h3, p), model.GetSpeed(h2, p)); + TEST_LESS_SPEED(model.GetSpeed(h4, p), model.GetSpeed(h3, p)); + TEST_LESS_SPEED(model.GetSpeed(h5, p), model.GetSpeed(h4, p)); } UNIT_CLASS_TEST(VehicleModelTest, PedestrianModel_Smoke) @@ -346,8 +346,8 @@ UNIT_CLASS_TEST(VehicleModelTest, PedestrianModel_Smoke) h3.Add(residential); h3.Add(c.GetTypeByPath({"hwtag", "nosidewalk"})); - TEST_LESS_SPEED(model.GetTypeSpeed(h2, p), model.GetTypeSpeed(h1, p)); - TEST_LESS_SPEED(model.GetTypeSpeed(h3, p), model.GetTypeSpeed(h2, p)); + TEST_LESS_SPEED(model.GetSpeed(h2, p), model.GetSpeed(h1, p)); + TEST_LESS_SPEED(model.GetSpeed(h3, p), model.GetSpeed(h2, p)); } #undef TEST_LESS_SPEED diff --git a/routing_common/vehicle_model.cpp b/routing_common/vehicle_model.cpp index 8f75f3cebb..b6a5c27561 100644 --- a/routing_common/vehicle_model.cpp +++ b/routing_common/vehicle_model.cpp @@ -1,7 +1,6 @@ #include "routing_common/vehicle_model.hpp" #include "indexer/classificator.hpp" -#include "indexer/feature.hpp" #include "indexer/ftypes_matcher.hpp" #include "base/assert.hpp" @@ -69,9 +68,8 @@ void VehicleModel::AddAdditionalRoadTypes(Classificator const & classif, Additio } } -std::optional VehicleModel::GetHighwayType(FeatureType & f) const +std::optional VehicleModel::GetHighwayType(FeatureTypes const & types) const { - feature::TypesHolder const types(f); for (uint32_t t : types) { ftype::TruncValue(t, 2); @@ -123,7 +121,7 @@ void VehicleModel::GetAdditionalRoadSpeed(uint32_t type, bool isCityRoad, } /// @note Saved speed |params| is taken into account only if isCar == true. -SpeedKMpH VehicleModel::GetTypeSpeedImpl(feature::TypesHolder const & types, SpeedParams const & params, bool isCar) const +SpeedKMpH VehicleModel::GetTypeSpeedImpl(FeatureTypes const & types, SpeedParams const & params, bool isCar) const { bool const isCityRoad = params.m_inCity; optional hwType; @@ -195,27 +193,17 @@ SpeedKMpH VehicleModel::GetTypeSpeedImpl(feature::TypesHolder const & types, Spe return speed * surfaceFactor; } -bool VehicleModel::IsOneWay(FeatureType & f) const -{ - return HasOneWayType(feature::TypesHolder(f)); -} - -bool VehicleModel::HasOneWayType(feature::TypesHolder const & types) const +bool VehicleModel::IsOneWay(FeatureTypes const & types) const { return types.Has(m_onewayType); } -bool VehicleModel::IsRoad(FeatureType & f) const +bool VehicleModel::IsRoad(FeatureTypes const & types) const { - return f.GetGeomType() == feature::GeomType::Line && IsRoadImpl(feature::TypesHolder(f)); + return types.GetGeomType() == feature::GeomType::Line && IsRoadImpl(types); } -bool VehicleModel::IsPassThroughAllowed(FeatureType & f) const -{ - return HasPassThroughType(feature::TypesHolder(f)); -} - -bool VehicleModel::HasPassThroughType(feature::TypesHolder const & types) const +bool VehicleModel::IsPassThroughAllowed(FeatureTypes const & types) const { for (uint32_t t : types) { @@ -239,7 +227,7 @@ bool VehicleModel::IsRoadType(uint32_t type) const return m_addRoadTypes.Find(type) || m_roadTypes.Find(type); } -bool VehicleModel::IsRoadImpl(feature::TypesHolder const & types) const +bool VehicleModel::IsRoadImpl(FeatureTypes const & types) const { for (uint32_t const t : types) { diff --git a/routing_common/vehicle_model.hpp b/routing_common/vehicle_model.hpp index 758f73b17f..f72db6529f 100644 --- a/routing_common/vehicle_model.hpp +++ b/routing_common/vehicle_model.hpp @@ -6,7 +6,6 @@ #include "base/small_map.hpp" -#include #include #include #include @@ -205,13 +204,15 @@ class VehicleModelInterface public: virtual ~VehicleModelInterface() = default; + using FeatureTypes = feature::TypesHolder; + /// @return Allowed weight and ETA speed in KMpH. /// 0 means that it's forbidden to move on this feature or it's not a road at all. /// Weight and ETA should be less than max model speed's values respectively. /// @param inCity is true if |f| lies in a city of town. - virtual SpeedKMpH GetSpeed(FeatureType & f, SpeedParams const & speedParams) const = 0; + virtual SpeedKMpH GetSpeed(FeatureTypes const & types, SpeedParams const & speedParams) const = 0; - virtual std::optional GetHighwayType(FeatureType & f) const = 0; + virtual std::optional GetHighwayType(FeatureTypes const & types) const = 0; /// @return Maximum model weight speed (km/h). /// All speeds which the model returns must be less or equal to this speed. @@ -222,10 +223,10 @@ public: /// e.g. to connect start point to nearest feature. virtual SpeedKMpH const & GetOffroadSpeed() const = 0; - virtual bool IsOneWay(FeatureType & f) const = 0; + virtual bool IsOneWay(FeatureTypes const & types) const = 0; /// @returns true iff feature |f| can be used for routing with corresponding vehicle model. - virtual bool IsRoad(FeatureType & f) const = 0; + virtual bool IsRoad(FeatureTypes const & types) const = 0; /// @returns true iff feature |f| can be used for through passage with corresponding vehicle model. /// e.g. in Russia roads tagged "highway = service" are not allowed for through passage; @@ -233,7 +234,7 @@ public: /// point of the route. /// Roads with additional types e.g. "path = ferry", "vehicle_type = yes" considered as allowed /// to pass through. - virtual bool IsPassThroughAllowed(FeatureType & f) const = 0; + virtual bool IsPassThroughAllowed(FeatureTypes const & types) const = 0; }; class VehicleModelFactoryInterface @@ -277,20 +278,19 @@ public: VehicleModel(Classificator const & classif, LimitsInitList const & featureTypeLimits, SurfaceInitList const & featureTypeSurface, HighwayBasedInfo const & info); - virtual SpeedKMpH GetTypeSpeed(feature::TypesHolder const & types, SpeedParams const & params) const = 0; - /// @name VehicleModelInterface overrides. /// @{ - SpeedKMpH GetSpeed(FeatureType & f, SpeedParams const & speedParams) const override - { - return GetTypeSpeed(feature::TypesHolder(f), speedParams); - } - - std::optional GetHighwayType(FeatureType & f) const override; + std::optional GetHighwayType(FeatureTypes const & types) const override; double GetMaxWeightSpeed() const override; - bool IsOneWay(FeatureType & f) const override; - bool IsRoad(FeatureType & f) const override; - bool IsPassThroughAllowed(FeatureType & f) const override; + + /// \returns true if |types| is a oneway feature. + /// \note According to OSM, tag "oneway" could have value "-1". That means it's a oneway feature + /// with reversed geometry. In that case at map generation the geometry of such features + /// is reversed (the order of points is changed) so in vehicle model all oneway feature + /// may be considered as features with forward geometry. + bool IsOneWay(FeatureTypes const & types) const override; + bool IsRoad(FeatureTypes const & types) const override; + bool IsPassThroughAllowed(FeatureTypes const & types) const override; /// @} // Made public to have simple access from unit tests. @@ -313,20 +313,11 @@ public: (m_onewayType == rhs.m_onewayType); } - /// \returns true if |types| is a oneway feature. - /// \note According to OSM, tag "oneway" could have value "-1". That means it's a oneway feature - /// with reversed geometry. In that case at map generation the geometry of such features - /// is reversed (the order of points is changed) so in vehicle model all oneway feature - /// may be considered as features with forward geometry. - bool HasOneWayType(feature::TypesHolder const & types) const; - - bool HasPassThroughType(feature::TypesHolder const & types) const; - protected: uint32_t m_yesType, m_noType; - bool IsRoadImpl(feature::TypesHolder const & types) const; + bool IsRoadImpl(FeatureTypes const & types) const; - SpeedKMpH GetTypeSpeedImpl(feature::TypesHolder const & types, SpeedParams const & params, bool isCar) const; + SpeedKMpH GetTypeSpeedImpl(FeatureTypes const & types, SpeedParams const & params, bool isCar) const; void AddAdditionalRoadTypes(Classificator const & classif, AdditionalRoadsList const & roads); diff --git a/track_analyzing/track_analyzer/cmd_table.cpp b/track_analyzing/track_analyzer/cmd_table.cpp index 22fe4b961a..ff3af8934c 100644 --- a/track_analyzing/track_analyzer/cmd_table.cpp +++ b/track_analyzing/track_analyzer/cmd_table.cpp @@ -8,7 +8,6 @@ #include "routing/city_roads.hpp" #include "routing/data_source.hpp" #include "routing/geometry.hpp" -#include "routing/index_graph.hpp" #include "routing/index_graph_loader.hpp" #include "routing/maxspeeds.hpp" @@ -19,7 +18,6 @@ #include "traffic/speed_groups.hpp" #include "indexer/classificator.hpp" -#include "indexer/feature.hpp" #include "indexer/feature_data.hpp" #include "indexer/features_vector.hpp" @@ -31,15 +29,11 @@ #include "geometry/latlon.hpp" #include "base/assert.hpp" -#include "base/file_name_utils.hpp" #include "base/logging.hpp" #include "base/stl_helpers.hpp" #include "base/sunrise_sunset.hpp" -#include "base/timer.hpp" #include -#include -#include #include #include #include @@ -48,7 +42,6 @@ #include #include #include -#include #include #include "defines.hpp" @@ -128,13 +121,12 @@ public: uint32_t m_surfaceType = 0; }; - Type GetType(FeatureType & feature) const + Type GetType(feature::TypesHolder const & types) const { Type ret; - feature::TypesHolder holder(feature); for (uint32_t type : m_hwtags) { - if (holder.Has(type)) + if (types.Has(type)) { ret.m_hwType = type; break; @@ -143,7 +135,7 @@ public: for (uint32_t type : m_surfaceTags) { - if (holder.Has(type)) + if (types.Has(type)) { ret.m_surfaceType = type; break; @@ -365,9 +357,10 @@ private: kInvalidSpeed; m_prevFeatureId = featureId; - m_prevRoadInfo = {m_carModelTypes.GetType(*feature), maxspeedValueKMpH, - m_cityRoads.IsCityRoad(featureId), m_vehicleModel.IsOneWay(*feature)}; + feature::TypesHolder const types(*feature); + m_prevRoadInfo = {m_carModelTypes.GetType(types), maxspeedValueKMpH, + m_cityRoads.IsCityRoad(featureId), m_vehicleModel.IsOneWay(types)}; return m_prevRoadInfo; } diff --git a/track_analyzing/track_matcher.cpp b/track_analyzing/track_matcher.cpp index 811197f551..7f6ddb443e 100644 --- a/track_analyzing/track_matcher.cpp +++ b/track_analyzing/track_matcher.cpp @@ -2,9 +2,7 @@ #include "track_analyzing/exceptions.hpp" -#include "routing/city_roads.hpp" #include "routing/index_graph_loader.hpp" -#include "routing/maxspeeds.hpp" #include "routing_common/car_model.hpp" @@ -14,6 +12,9 @@ #include "base/stl_helpers.hpp" + +namespace track_analyzing +{ using namespace routing; using namespace std; using namespace track_analyzing; @@ -52,8 +53,6 @@ bool EdgesContain(IndexGraph::SegmentEdgeListT const & edges, Segment const & se } } // namespace -namespace track_analyzing -{ // TrackMatcher ------------------------------------------------------------------------------------ TrackMatcher::TrackMatcher(storage::Storage const & storage, NumMwmId mwmId, platform::CountryFile const & countryFile) @@ -139,40 +138,41 @@ void TrackMatcher::Step::FillCandidatesWithNearbySegments( DataSource const & dataSource, IndexGraph const & graph, VehicleModelInterface const & vehicleModel, NumMwmId mwmId) { - dataSource.ForEachInRect( - [&](FeatureType & ft) { - if (!ft.GetID().IsValid()) - return; + dataSource.ForEachInRect([&](FeatureType & ft) + { + if (!ft.GetID().IsValid()) + return; - if (ft.GetID().m_mwmId.GetInfo()->GetType() != MwmInfo::COUNTRY) - return; + if (ft.GetID().m_mwmId.GetInfo()->GetType() != MwmInfo::COUNTRY) + return; - if (!vehicleModel.IsRoad(ft)) - return; + feature::TypesHolder const types(ft); + if (!vehicleModel.IsRoad(types)) + return; - ft.ParseGeometry(FeatureType::BEST_GEOMETRY); + ft.ParseGeometry(FeatureType::BEST_GEOMETRY); - for (size_t segIdx = 0; segIdx + 1 < ft.GetPointsCount(); ++segIdx) + for (size_t segIdx = 0; segIdx + 1 < ft.GetPointsCount(); ++segIdx) + { + double const distance = + DistanceToSegment(ft.GetPoint(segIdx), ft.GetPoint(segIdx + 1), m_point); + if (distance < kMatchingRange) + { + AddCandidate(Segment(mwmId, ft.GetID().m_index, static_cast(segIdx), + true /* forward */), + distance, graph); + + if (!vehicleModel.IsOneWay(types)) { - double const distance = - DistanceToSegment(ft.GetPoint(segIdx), ft.GetPoint(segIdx + 1), m_point); - if (distance < kMatchingRange) - { - AddCandidate(Segment(mwmId, ft.GetID().m_index, static_cast(segIdx), - true /* forward */), - distance, graph); - - if (!vehicleModel.IsOneWay(ft)) - { - AddCandidate(Segment(mwmId, ft.GetID().m_index, static_cast(segIdx), - false /* forward */), - distance, graph); - } - } + AddCandidate(Segment(mwmId, ft.GetID().m_index, static_cast(segIdx), + false /* forward */), + distance, graph); } - }, - mercator::RectByCenterXYAndSizeInMeters(m_point, kMatchingRange), - scales::GetUpperScale()); + } + } + }, + mercator::RectByCenterXYAndSizeInMeters(m_point, kMatchingRange), + scales::GetUpperScale()); } void TrackMatcher::Step::FillCandidates(Step const & previousStep, IndexGraph & graph) diff --git a/traffic/traffic_info.cpp b/traffic/traffic_info.cpp index 9e383f99ab..526a4e4b37 100644 --- a/traffic/traffic_info.cpp +++ b/traffic/traffic_info.cpp @@ -19,12 +19,10 @@ #include "coding/zlib.hpp" #include "base/assert.hpp" -#include "base/bits.hpp" #include "base/logging.hpp" #include "base/string_utils.hpp" #include -#include #include #include @@ -32,10 +30,10 @@ #include "private.h" -using namespace std; - namespace traffic { +using namespace std; + namespace { bool ReadRemoteFile(string const & url, vector & contents, int & errorCode) @@ -177,13 +175,15 @@ SpeedGroup TrafficInfo::GetSpeedGroup(RoadSegmentId const & id) const void TrafficInfo::ExtractTrafficKeys(string const & mwmPath, vector & result) { result.clear(); - feature::ForEachFeature(mwmPath, [&](FeatureType & ft, uint32_t const fid) { - if (!routing::CarModel::AllLimitsInstance().IsRoad(ft)) + feature::ForEachFeature(mwmPath, [&](FeatureType & ft, uint32_t const fid) + { + feature::TypesHolder const types(ft); + if (!routing::CarModel::AllLimitsInstance().IsRoad(types)) return; ft.ParseGeometry(FeatureType::BEST_GEOMETRY); auto const numPoints = static_cast(ft.GetPointsCount()); - uint8_t const numDirs = routing::CarModel::AllLimitsInstance().IsOneWay(ft) ? 1 : 2; + uint8_t const numDirs = routing::CarModel::AllLimitsInstance().IsOneWay(types) ? 1 : 2; for (uint16_t i = 0; i + 1 < numPoints; ++i) { for (uint8_t dir = 0; dir < numDirs; ++dir) -- 2.45.3 From 1c75b0dac2cabce5f2f3a477f8e7c6c97dffb579 Mon Sep 17 00:00:00 2001 From: Jean-BaptisteC Date: Tue, 30 Jan 2024 12:55:19 +0100 Subject: [PATCH 3/7] [android] Remove legacy implementation in layout Signed-off-by: Jean-BaptisteC --- .../main/res/layout/bottom_sheet_handle.xml | 4 ++-- .../res/layout/current_location_marker.xml | 24 +++++++++---------- .../main/res/layout/edit_bookmark_common.xml | 15 +++++++----- .../res/layout/fragment_bookmark_list.xml | 4 ++-- .../res/layout/fragment_edit_bookmark.xml | 13 +++++----- .../res/layout/fragment_edit_description.xml | 11 +++++---- .../src/main/res/layout/fragment_phone.xml | 14 +++++------ .../layout/fragment_timetable_advanced.xml | 9 ++++--- 8 files changed, 49 insertions(+), 45 deletions(-) diff --git a/android/app/src/main/res/layout/bottom_sheet_handle.xml b/android/app/src/main/res/layout/bottom_sheet_handle.xml index b3fd587f6d..67c3bcfffe 100644 --- a/android/app/src/main/res/layout/bottom_sheet_handle.xml +++ b/android/app/src/main/res/layout/bottom_sheet_handle.xml @@ -1,5 +1,5 @@ - @@ -12,4 +12,4 @@ app:srcCompat="@drawable/bottom_sheet_handle" app:tint="?colorControlHighlight" /> - \ No newline at end of file + diff --git a/android/app/src/main/res/layout/current_location_marker.xml b/android/app/src/main/res/layout/current_location_marker.xml index e4989c7e25..50ec2a1c59 100644 --- a/android/app/src/main/res/layout/current_location_marker.xml +++ b/android/app/src/main/res/layout/current_location_marker.xml @@ -1,20 +1,12 @@ - - + tools:background="@color/black_primary"> - + + + diff --git a/android/app/src/main/res/layout/edit_bookmark_common.xml b/android/app/src/main/res/layout/edit_bookmark_common.xml index c36658e026..052b465ab4 100644 --- a/android/app/src/main/res/layout/edit_bookmark_common.xml +++ b/android/app/src/main/res/layout/edit_bookmark_common.xml @@ -1,5 +1,5 @@ - + android:orientation="vertical" + app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toBottomOf="@+id/ll__bookmark_name" + android:layout_marginStart="@dimen/margin_half" + android:layout_marginEnd="@dimen/margin_half"> + android:textColorHint="?android:textColorSecondary" + app:layout_constraintTop_toBottomOf="@+id/rl__bookmark_set"> - + diff --git a/android/app/src/main/res/layout/fragment_bookmark_list.xml b/android/app/src/main/res/layout/fragment_bookmark_list.xml index 76c27bd6b4..b7e2b56b4b 100644 --- a/android/app/src/main/res/layout/fragment_bookmark_list.xml +++ b/android/app/src/main/res/layout/fragment_bookmark_list.xml @@ -1,5 +1,5 @@ - - + diff --git a/android/app/src/main/res/layout/fragment_edit_bookmark.xml b/android/app/src/main/res/layout/fragment_edit_bookmark.xml index 456ea53fb3..b399d6c39f 100644 --- a/android/app/src/main/res/layout/fragment_edit_bookmark.xml +++ b/android/app/src/main/res/layout/fragment_edit_bookmark.xml @@ -1,5 +1,5 @@ - + android:theme="@style/MwmWidget.ToolbarTheme" + app:layout_constraintTop_toTopOf="parent"> - + android:layout_below="@id/toolbar" + app:layout_constraintTop_toBottomOf="@+id/toolbar"> + - + diff --git a/android/app/src/main/res/layout/fragment_edit_description.xml b/android/app/src/main/res/layout/fragment_edit_description.xml index f82d39d6be..3f136f5fa7 100644 --- a/android/app/src/main/res/layout/fragment_edit_description.xml +++ b/android/app/src/main/res/layout/fragment_edit_description.xml @@ -1,5 +1,5 @@ - + android:theme="@style/MwmWidget.ToolbarTheme" + app:layout_constraintTop_toTopOf="parent"> + android:paddingEnd="@dimen/margin_base" + app:layout_constraintTop_toBottomOf="@+id/toolbar"> - + diff --git a/android/app/src/main/res/layout/fragment_phone.xml b/android/app/src/main/res/layout/fragment_phone.xml index 60b55c8d04..fecbdc8c56 100644 --- a/android/app/src/main/res/layout/fragment_phone.xml +++ b/android/app/src/main/res/layout/fragment_phone.xml @@ -1,6 +1,7 @@ - @@ -9,9 +10,8 @@ style="@style/MwmWidget.FrameLayout.Elevation" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?windowBackgroundForced" - android:layout_above="@+id/tv__mode_switch" - android:layout_below="@id/toolbar"> + android:id="@+id/frameLayout" + android:background="?windowBackgroundForced"> + android:textColor="?colorAccent" + app:layout_constraintBottom_toBottomOf="@+id/frameLayout" /> - \ No newline at end of file + diff --git a/android/app/src/main/res/layout/fragment_timetable_advanced.xml b/android/app/src/main/res/layout/fragment_timetable_advanced.xml index 109d40e525..736b569845 100644 --- a/android/app/src/main/res/layout/fragment_timetable_advanced.xml +++ b/android/app/src/main/res/layout/fragment_timetable_advanced.xml @@ -43,10 +43,11 @@ card_view:cardCornerRadius="2dp" card_view:cardElevation="4dp"> - + android:background="?dividerHorizontal" /> - + -- 2.45.3 From a535f5256caa330a495edd3113b7cfae3a04f59c Mon Sep 17 00:00:00 2001 From: cyber-toad Date: Mon, 22 Jan 2024 01:22:53 +0100 Subject: [PATCH 4/7] [bookmarks] Use list of categories ids in java/cpp Signed-off-by: cyber-toad --- .../bookmarks/data/BookmarkManager.cpp | 22 ++++++++++++------- .../bookmarks/BookmarksSharingHelper.java | 18 ++++++++++++--- .../bookmarks/data/BookmarkManager.java | 6 ++--- .../bookmarks/data/BookmarkSharingResult.java | 10 ++++----- .../CoreApi/Bookmarks/MWMBookmarksManager.mm | 2 +- map/bookmark_manager.cpp | 16 +++++++------- map/bookmark_manager.hpp | 16 +++++++------- qt/bookmark_dialog.cpp | 2 +- 8 files changed, 55 insertions(+), 37 deletions(-) diff --git a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp index 508bc9ae20..fef24a8e6e 100644 --- a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp +++ b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp @@ -188,20 +188,23 @@ void OnPreparedFileForSharing(JNIEnv * env, BookmarkManager::SharingResult const static jclass const classBookmarkSharingResult = jni::GetGlobalClassRef(env, "app/organicmaps/bookmarks/data/BookmarkSharingResult"); - // Java signature : BookmarkSharingResult(long categoryId, @Code int code, + // Java signature : BookmarkSharingResult(long[] categoriesIds, @Code int code, // @NonNull String sharingPath, // @NonNull String errorString) static jmethodID const ctorBookmarkSharingResult = jni::GetConstructorID(env, - classBookmarkSharingResult, "(JILjava/lang/String;Ljava/lang/String;)V"); + classBookmarkSharingResult, "([JILjava/lang/String;Ljava/lang/String;)V"); + jsize const size = static_cast(result.m_categoriesIds.size()); + jni::ScopedLocalRef categoriesIds(env, env->NewLongArray(size)); + std::vector tmp(result.m_categoriesIds.cbegin(), result.m_categoriesIds.cend()); + env->SetLongArrayRegion(categoriesIds.get(), 0, size, tmp.data()); jni::TScopedLocalRef const sharingPath(env, jni::ToJavaString(env, result.m_sharingPath)); jni::TScopedLocalRef const errorString(env, jni::ToJavaString(env, result.m_errorString)); jni::TScopedLocalRef const sharingResult(env, env->NewObject(classBookmarkSharingResult, - ctorBookmarkSharingResult, static_cast(result.m_categoryId), + ctorBookmarkSharingResult, categoriesIds.get(), static_cast(result.m_code), sharingPath.get(), errorString.get())); - env->CallVoidMethod(bookmarkManagerInstance, g_onPreparedFileForSharingMethod, - sharingResult.get()); + env->CallVoidMethod(bookmarkManagerInstance, g_onPreparedFileForSharingMethod, sharingResult.get()); jni::HandleJavaException(env); } @@ -592,10 +595,13 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeSetAllCategoriesVisibi } JNIEXPORT void JNICALL -Java_app_organicmaps_bookmarks_data_BookmarkManager_nativePrepareFileForSharing( - JNIEnv * env, jclass, jlong catId) +Java_app_organicmaps_bookmarks_data_BookmarkManager_nativePrepareFileForSharing(JNIEnv * env, jclass, jlongArray catIds) { - frm()->GetBookmarkManager().PrepareFileForSharing(static_cast(catId), + auto const size = env->GetArrayLength(catIds); + std::vector tmp(size); + env->GetLongArrayRegion(catIds, 0, size, &tmp[0]); + kml::GroupIdCollection catIdsVector(tmp.cbegin(), tmp.cend()); + frm()->GetBookmarkManager().PrepareFileForSharing(catIdsVector, [env](BookmarkManager::SharingResult const & result) { OnPreparedFileForSharing(env, result); diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksSharingHelper.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksSharingHelper.java index 7a60c49b62..f2f90f8727 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksSharingHelper.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksSharingHelper.java @@ -14,6 +14,11 @@ import app.organicmaps.util.SharingUtils; import app.organicmaps.util.log.Logger; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + public enum BookmarksSharingHelper { INSTANCE; @@ -24,6 +29,12 @@ public enum BookmarksSharingHelper private ProgressDialog mProgressDialog; public void prepareBookmarkCategoryForSharing(@NonNull Activity context, long catId) + { + showProgressDialog(context); + BookmarkManager.INSTANCE.prepareCategoriesForSharing(new long[]{catId}); + } + + private void showProgressDialog(@NonNull Activity context) { mProgressDialog = new ProgressDialog(context, R.style.MwmTheme_ProgressDialog); mProgressDialog.setMessage(context.getString(R.string.please_wait)); @@ -31,7 +42,6 @@ public enum BookmarksSharingHelper mProgressDialog.setIndeterminate(true); mProgressDialog.setCancelable(false); mProgressDialog.show(); - BookmarkManager.INSTANCE.prepareCategoryForSharing(catId); } public void onPreparedFileForSharing(@NonNull FragmentActivity context, @@ -57,8 +67,10 @@ public enum BookmarksSharingHelper .setMessage(R.string.bookmarks_error_message_share_general) .setPositiveButton(R.string.ok, null) .show(); - String catName = BookmarkManager.INSTANCE.getCategoryById(result.getCategoryId()).getName(); - Logger.e(TAG, "Failed to share bookmark category '" + catName + "', error code: " + result.getCode()); + List names = new ArrayList<>(); + for (long categoryId : result.getCategoriesIds()) + names.add(BookmarkManager.INSTANCE.getCategoryById(categoryId).getName()); + Logger.e(TAG, "Failed to share bookmark categories " + names + ", error code: " + result.getCode()); } default -> throw new AssertionError("Unsupported bookmark sharing code: " + result.getCode()); } diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java index 8e97301b25..3966e1f36d 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java @@ -559,9 +559,9 @@ public enum BookmarkManager nativeSetChildCategoriesVisibility(catId, visible); } - public void prepareCategoryForSharing(long catId) + public void prepareCategoriesForSharing(long[] catIds) { - nativePrepareFileForSharing(catId); + nativePrepareFileForSharing(catIds); } public void setNotificationsEnabled(boolean enabled) @@ -799,7 +799,7 @@ public enum BookmarkManager private static native void nativeSetAllCategoriesVisibility(boolean visible); - private static native void nativePrepareFileForSharing(long catId); + private static native void nativePrepareFileForSharing(long[] catIds); private static native boolean nativeIsCategoryEmpty(long catId); diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java index 9ed617f27b..dc80a977f2 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java @@ -21,7 +21,7 @@ public class BookmarkSharingResult public static final int ARCHIVE_ERROR = 2; public static final int FILE_ERROR = 3; - private final long mCategoryId; + private final long[] mCategoriesIds; @Code private final int mCode; @NonNull @@ -30,19 +30,19 @@ public class BookmarkSharingResult @SuppressWarnings("unused") private final String mErrorString; - private BookmarkSharingResult(long categoryId, @Code int code, + public BookmarkSharingResult(long[] categoriesIds, @Code int code, @NonNull String sharingPath, @NonNull String errorString) { - mCategoryId = categoryId; + mCategoriesIds = categoriesIds; mCode = code; mSharingPath = sharingPath; mErrorString = errorString; } - public long getCategoryId() + public long[] getCategoriesIds() { - return mCategoryId; + return mCategoriesIds; } public int getCode() diff --git a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm index e10dd71c17..7fdfc90d3e 100644 --- a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm @@ -570,7 +570,7 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting - (void)shareCategory:(MWMMarkGroupID)groupId { - self.bm.PrepareFileForSharing(groupId, [self](auto sharingResult) + self.bm.PrepareFileForSharing({groupId}, [self](auto sharingResult) { MWMBookmarksShareStatus status; switch (sharingResult.m_code) diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 1ec2ed2f47..b62a75d5ba 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -87,13 +87,13 @@ BookmarkManager::SharingResult GetFileForSharing(BookmarkManager::KMLDataCollect auto const categoryId = kmlToShare.second->m_categoryData.m_id; if (!SaveKmlFileSafe(*kmlToShare.second, filePath, KmlFileType::Text)) - return {categoryId, BookmarkManager::SharingResult::Code::FileError, "Bookmarks file does not exist."}; + return {{categoryId}, BookmarkManager::SharingResult::Code::FileError, "Bookmarks file does not exist."}; auto const tmpFilePath = base::JoinPath(GetPlatform().TmpDir(), fileName + std::string{kKmzExtension}); if (!CreateZipFromPathDeflatedAndDefaultCompression(filePath, tmpFilePath)) - return {categoryId, BookmarkManager::SharingResult::Code::ArchiveError, "Could not create archive."}; + return {{categoryId}, BookmarkManager::SharingResult::Code::ArchiveError, "Could not create archive."}; - return {categoryId, tmpFilePath}; + return {{categoryId}, tmpFilePath}; } std::string ToString(BookmarkManager::SortingType type) @@ -2596,20 +2596,20 @@ void BookmarkManager::SaveBookmarks(kml::GroupIdCollection const & groupIdCollec }); } -void BookmarkManager::PrepareFileForSharing(kml::MarkGroupId categoryId, SharingHandler && handler) +void BookmarkManager::PrepareFileForSharing(kml::GroupIdCollection const & categoriesIds, SharingHandler && handler) { CHECK_THREAD_CHECKER(m_threadChecker, ()); ASSERT(handler, ()); - if (IsCategoryEmpty(categoryId)) + if (categoriesIds.size() == 1 && IsCategoryEmpty(categoriesIds.front())) { - handler(SharingResult(categoryId, SharingResult::Code::EmptyCategory)); + handler(SharingResult(categoriesIds, SharingResult::Code::EmptyCategory)); return; } - auto collection = PrepareToSaveBookmarks({categoryId}); + auto collection = PrepareToSaveBookmarks(categoriesIds); if (!collection || collection->empty()) { - handler(SharingResult(categoryId, SharingResult::Code::FileError)); + handler(SharingResult(categoriesIds, SharingResult::Code::FileError)); return; } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index ebfb309b03..0d8ee6161c 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -316,31 +316,31 @@ public: FileError }; - SharingResult(kml::MarkGroupId categoryId, std::string const & sharingPath) - : m_categoryId(categoryId) + SharingResult(kml::GroupIdCollection const & categoriesIds, std::string const & sharingPath) + : m_categoriesIds(categoriesIds) , m_code(Code::Success) , m_sharingPath(sharingPath) {} - SharingResult(kml::MarkGroupId categoryId, Code code) - : m_categoryId(categoryId) + SharingResult(kml::GroupIdCollection const & categoriesIds, Code code) + : m_categoriesIds(categoriesIds) , m_code(code) {} - SharingResult(kml::MarkGroupId categoryId, Code code, std::string const & errorString) - : m_categoryId(categoryId) + SharingResult(kml::GroupIdCollection const & categoriesIds, Code code, std::string const & errorString) + : m_categoriesIds(categoriesIds) , m_code(code) , m_errorString(errorString) {} - kml::MarkGroupId m_categoryId; + kml::MarkIdCollection m_categoriesIds; Code m_code; std::string m_sharingPath; std::string m_errorString; }; using SharingHandler = platform::SafeCallback; - void PrepareFileForSharing(kml::MarkGroupId categoryId, SharingHandler && handler); + void PrepareFileForSharing(kml::GroupIdCollection const & categoriesIds, SharingHandler && handler); bool IsCategoryEmpty(kml::MarkGroupId categoryId) const; diff --git a/qt/bookmark_dialog.cpp b/qt/bookmark_dialog.cpp index 5f650316be..fd10f5d722 100644 --- a/qt/bookmark_dialog.cpp +++ b/qt/bookmark_dialog.cpp @@ -170,7 +170,7 @@ void BookmarkDialog::OnExportClick() if (name.isEmpty()) return; - m_framework.GetBookmarkManager().PrepareFileForSharing(categoryIt->second, + m_framework.GetBookmarkManager().PrepareFileForSharing({categoryIt->second}, [this, name](BookmarkManager::SharingResult const & result) { if (result.m_code == BookmarkManager::SharingResult::Code::Success) -- 2.45.3 From fb22b9336953918113df042adb432a89dcc1b55c Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Mon, 5 Feb 2024 00:18:16 +0200 Subject: [PATCH 5/7] [android] Cast vector to jlong to avoid tmp allocation, and other fixes Signed-off-by: Alexander Borsuk --- .../bookmarks/data/BookmarkManager.cpp | 40 ++++++++----------- .../bookmarks/data/BookmarkSharingResult.java | 4 +- .../CoreApi/Bookmarks/MWMBookmarksManager.mm | 9 ++--- map/bookmark_manager.cpp | 13 +++--- map/bookmark_manager.hpp | 16 ++++---- 5 files changed, 36 insertions(+), 46 deletions(-) diff --git a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp index fef24a8e6e..12b329043e 100644 --- a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp +++ b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp @@ -15,6 +15,7 @@ #include "base/macros.hpp" #include "base/string_utils.hpp" +#include #include using namespace jni; @@ -182,28 +183,22 @@ void OnAsyncLoadingFileError(JNIEnv * env, std::string const & fileName, bool is void OnPreparedFileForSharing(JNIEnv * env, BookmarkManager::SharingResult const & result) { - ASSERT(g_bookmarkManagerClass, ()); - jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, - g_bookmarkManagerInstanceField); + static jclass const classBookmarkSharingResult = jni::GetGlobalClassRef(env, "app/organicmaps/bookmarks/data/BookmarkSharingResult"); + // BookmarkSharingResult(long[] categoriesIds, @Code int code, @NonNull String sharingPath, @NonNull String errorString) + static jmethodID const ctorBookmarkSharingResult = jni::GetConstructorID(env, classBookmarkSharingResult, "([JILjava/lang/String;Ljava/lang/String;)V"); - static jclass const classBookmarkSharingResult = jni::GetGlobalClassRef(env, - "app/organicmaps/bookmarks/data/BookmarkSharingResult"); - // Java signature : BookmarkSharingResult(long[] categoriesIds, @Code int code, - // @NonNull String sharingPath, - // @NonNull String errorString) - static jmethodID const ctorBookmarkSharingResult = jni::GetConstructorID(env, - classBookmarkSharingResult, "([JILjava/lang/String;Ljava/lang/String;)V"); - - jsize const size = static_cast(result.m_categoriesIds.size()); - jni::ScopedLocalRef categoriesIds(env, env->NewLongArray(size)); - std::vector tmp(result.m_categoriesIds.cbegin(), result.m_categoriesIds.cend()); - env->SetLongArrayRegion(categoriesIds.get(), 0, size, tmp.data()); + static_assert(sizeof(jlong) == sizeof(decltype(result.m_categoriesIds)::value_type)); + jsize const categoriesIdsSize = static_cast(result.m_categoriesIds.size()); + jni::ScopedLocalRef categoriesIds(env, env->NewLongArray(categoriesIdsSize)); + env->SetLongArrayRegion(categoriesIds.get(), 0, categoriesIdsSize, reinterpret_cast(result.m_categoriesIds.data())); jni::TScopedLocalRef const sharingPath(env, jni::ToJavaString(env, result.m_sharingPath)); jni::TScopedLocalRef const errorString(env, jni::ToJavaString(env, result.m_errorString)); - jni::TScopedLocalRef const sharingResult(env, env->NewObject(classBookmarkSharingResult, - ctorBookmarkSharingResult, categoriesIds.get(), - static_cast(result.m_code), sharingPath.get(), errorString.get())); + jni::TScopedLocalRef const sharingResult(env, env->NewObject(classBookmarkSharingResult, ctorBookmarkSharingResult, + categoriesIds.get(), static_cast(result.m_code), sharingPath.get(), errorString.get())); + + ASSERT(g_bookmarkManagerClass, ()); + jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, g_bookmarkManagerInstanceField); env->CallVoidMethod(bookmarkManagerInstance, g_onPreparedFileForSharingMethod, sharingResult.get()); jni::HandleJavaException(env); } @@ -598,11 +593,10 @@ JNIEXPORT void JNICALL Java_app_organicmaps_bookmarks_data_BookmarkManager_nativePrepareFileForSharing(JNIEnv * env, jclass, jlongArray catIds) { auto const size = env->GetArrayLength(catIds); - std::vector tmp(size); - env->GetLongArrayRegion(catIds, 0, size, &tmp[0]); - kml::GroupIdCollection catIdsVector(tmp.cbegin(), tmp.cend()); - frm()->GetBookmarkManager().PrepareFileForSharing(catIdsVector, - [env](BookmarkManager::SharingResult const & result) + kml::GroupIdCollection catIdsVector(size); + static_assert(sizeof(jlong) == sizeof(decltype(catIdsVector)::value_type)); + env->GetLongArrayRegion(catIds, 0, size, reinterpret_cast(catIdsVector.data())); + frm()->GetBookmarkManager().PrepareFileForSharing(std::move(catIdsVector), [env](BookmarkManager::SharingResult const & result) { OnPreparedFileForSharing(env, result); }); diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java index dc80a977f2..7fc61cad0c 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkSharingResult.java @@ -30,9 +30,7 @@ public class BookmarkSharingResult @SuppressWarnings("unused") private final String mErrorString; - public BookmarkSharingResult(long[] categoriesIds, @Code int code, - @NonNull String sharingPath, - @NonNull String errorString) + public BookmarkSharingResult(long[] categoriesIds, @Code int code, @NonNull String sharingPath, @NonNull String errorString) { mCategoriesIds = categoriesIds; mCode = code; diff --git a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm index 7fdfc90d3e..6b96c36711 100644 --- a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm @@ -577,8 +577,7 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting { case BookmarkManager::SharingResult::Code::Success: { - self.shareCategoryURL = [NSURL fileURLWithPath:@(sharingResult.m_sharingPath.c_str()) - isDirectory:NO]; + self.shareCategoryURL = [NSURL fileURLWithPath:@(sharingResult.m_sharingPath.c_str()) isDirectory:NO]; ASSERT(self.shareCategoryURL, ("Invalid share category url")); status = MWMBookmarksShareStatusSuccess; break; @@ -593,7 +592,7 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting status = MWMBookmarksShareStatusFileError; break; } - + [self loopObservers:^(id observer) { if ([observer respondsToSelector:@selector(onBookmarksCategoryFilePrepared:)]) [observer onBookmarksCategoryFilePrepared:status]; @@ -611,7 +610,7 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting { if (!self.shareCategoryURL) return; - + base::DeleteFileX(self.shareCategoryURL.path.UTF8String); self.shareCategoryURL = nil; } @@ -693,7 +692,7 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting if (!track) { return; } - + track->SetName(title.UTF8String); } diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index b62a75d5ba..8cbccd4d07 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -89,11 +89,11 @@ BookmarkManager::SharingResult GetFileForSharing(BookmarkManager::KMLDataCollect if (!SaveKmlFileSafe(*kmlToShare.second, filePath, KmlFileType::Text)) return {{categoryId}, BookmarkManager::SharingResult::Code::FileError, "Bookmarks file does not exist."}; - auto const tmpFilePath = base::JoinPath(GetPlatform().TmpDir(), fileName + std::string{kKmzExtension}); + auto tmpFilePath = base::JoinPath(GetPlatform().TmpDir(), fileName + std::string{kKmzExtension}); if (!CreateZipFromPathDeflatedAndDefaultCompression(filePath, tmpFilePath)) return {{categoryId}, BookmarkManager::SharingResult::Code::ArchiveError, "Could not create archive."}; - return {{categoryId}, tmpFilePath}; + return {{categoryId}, std::move(tmpFilePath)}; } std::string ToString(BookmarkManager::SortingType type) @@ -2596,25 +2596,24 @@ void BookmarkManager::SaveBookmarks(kml::GroupIdCollection const & groupIdCollec }); } -void BookmarkManager::PrepareFileForSharing(kml::GroupIdCollection const & categoriesIds, SharingHandler && handler) +void BookmarkManager::PrepareFileForSharing(kml::GroupIdCollection && categoriesIds, SharingHandler && handler) { CHECK_THREAD_CHECKER(m_threadChecker, ()); ASSERT(handler, ()); if (categoriesIds.size() == 1 && IsCategoryEmpty(categoriesIds.front())) { - handler(SharingResult(categoriesIds, SharingResult::Code::EmptyCategory)); + handler(SharingResult(std::move(categoriesIds), SharingResult::Code::EmptyCategory)); return; } auto collection = PrepareToSaveBookmarks(categoriesIds); if (!collection || collection->empty()) { - handler(SharingResult(categoriesIds, SharingResult::Code::FileError)); + handler(SharingResult(std::move(categoriesIds), SharingResult::Code::FileError)); return; } - GetPlatform().RunTask(Platform::Thread::File, - [collection = std::move(collection), handler = std::move(handler)]() mutable + GetPlatform().RunTask(Platform::Thread::File, [collection = std::move(collection), handler = std::move(handler)]() mutable { handler(GetFileForSharing(std::move(collection))); }); diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 0d8ee6161c..e5589847ec 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -316,21 +316,21 @@ public: FileError }; - SharingResult(kml::GroupIdCollection const & categoriesIds, std::string const & sharingPath) + SharingResult(kml::GroupIdCollection && categoriesIds, std::string && sharingPath) : m_categoriesIds(categoriesIds) , m_code(Code::Success) - , m_sharingPath(sharingPath) + , m_sharingPath(std::move(sharingPath)) {} - SharingResult(kml::GroupIdCollection const & categoriesIds, Code code) - : m_categoriesIds(categoriesIds) + SharingResult(kml::GroupIdCollection && categoriesIds, Code code) + : m_categoriesIds(std::move(categoriesIds)) , m_code(code) {} - SharingResult(kml::GroupIdCollection const & categoriesIds, Code code, std::string const & errorString) - : m_categoriesIds(categoriesIds) + SharingResult(kml::GroupIdCollection && categoriesIds, Code code, std::string && errorString) + : m_categoriesIds(std::move(categoriesIds)) , m_code(code) - , m_errorString(errorString) + , m_errorString(std::move(errorString)) {} kml::MarkIdCollection m_categoriesIds; @@ -340,7 +340,7 @@ public: }; using SharingHandler = platform::SafeCallback; - void PrepareFileForSharing(kml::GroupIdCollection const & categoriesIds, SharingHandler && handler); + void PrepareFileForSharing(kml::GroupIdCollection && categoriesIds, SharingHandler && handler); bool IsCategoryEmpty(kml::MarkGroupId categoryId) const; -- 2.45.3 From 8e3a1ec304c5c845919688df119099646ef401f4 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Wed, 7 Feb 2024 09:02:15 +0200 Subject: [PATCH 6/7] [appstore] Reverted descriptions Signed-off-by: Alexander Borsuk --- iphone/metadata/cs/description.txt | 41 +++++++++++++++++--- iphone/metadata/cs/name.txt | 2 +- iphone/metadata/cs/promotional_text.txt | 2 +- iphone/metadata/cs/subtitle.txt | 2 +- iphone/metadata/de-DE/description.txt | 43 +++++++++++++++++---- iphone/metadata/de-DE/promotional_text.txt | 2 +- iphone/metadata/de-DE/subtitle.txt | 2 +- iphone/metadata/en-US/description.txt | 45 ++++++++++++++++++---- iphone/metadata/en-US/name.txt | 2 +- iphone/metadata/en-US/promotional_text.txt | 2 +- iphone/metadata/en-US/subtitle.txt | 2 +- iphone/metadata/es-ES/description.txt | 43 +++++++++++++++++---- iphone/metadata/es-ES/subtitle.txt | 2 +- iphone/metadata/fr-FR/description.txt | 45 ++++++++++++++++++---- iphone/metadata/id/description.txt | 44 +++++++++++++++++---- iphone/metadata/id/name.txt | 2 +- iphone/metadata/id/promotional_text.txt | 2 +- iphone/metadata/id/subtitle.txt | 2 +- iphone/metadata/pl/description.txt | 44 +++++++++++++++++---- iphone/metadata/pl/promotional_text.txt | 2 +- iphone/metadata/pl/subtitle.txt | 2 +- iphone/metadata/pt-BR/description.txt | 39 ++++++++++++++++--- 22 files changed, 300 insertions(+), 72 deletions(-) diff --git a/iphone/metadata/cs/description.txt b/iphone/metadata/cs/description.txt index 9dae7da8f3..24ec37622a 100644 --- a/iphone/metadata/cs/description.txt +++ b/iphone/metadata/cs/description.txt @@ -1,10 +1,39 @@ -Organic Maps je navigační aplikace s ochranou soukromí pro řidiče, turisty a cyklisty. Aplikace obsahuje navigaci s ochranou soukromí - nemá žádné sledování polohy, neshromažďuje data ani reklamy. Vyhledávání, směrování a navigace fungují bez mobilního signálu, což je ideální pro vzdálené turistické trasy nebo místa se špatným připojením. Aplikace Organic Maps využívá data OpenStreetMap, na jejichž tvorbě se podílejí davy přispěvatelů z celého světa. Projekt je řízen komunitou, kód je open-source a upřednostňuje komunitní rozvoj a spolupráci. +• Podrobné offline mapy s místy, která na jiných mapách nejsou +• Cyklistické trasy, turistické stezky a pěší trasy +• Vrstevnice, výškové profily, vrcholy a svahy +• Pěší, cyklistická a automobilová navigace turn-by-turn s hlasovými pokyny +• Rychlé offline vyhledávání na mapě a záložky +• Uložte si do záložek vše, co potřebujete, importujte a sdílejte KML, KMZ a GPX +• Tmavý režim pro ochranu vašich očí +• … a mnoho dalších funkcí! -• Není nutný mobilní signál - vyhledávání a trasování bez signálu -• Efektivní využití baterie - menší vybíjení baterie -• Rychlé vyhledávání - rychlé vyhledávání míst +Organic Maps jsou čisté a organické, vyrobené s láskou: -V Organic Maps si ceníme soukromí: +• Respektuje vaše soukromí +• Šetří baterii +• Žádné nečekané poplatky za mobilní data + +Organic Maps neobsahují sledovací zařízení a další špatné věci: + +• Žádné reklamy • Žádné sledování • Žádné shromažďování dat -• Žádné reklamy +• Žádné telefonování domů +• Žádná obtěžující registrace +• Žádné povinné výukové programy +• Žádný hlučný e-mailový spam +• Žádná push oznámení +• Žádný crapware +• Žádné pesticidy + +V Organic Maps věříme, že soukromí je základním lidským právem: + +• Organic Maps jsou nezávislý projekt řízený komunitou +• Kód je otevřený +• Mapová data jsou převzata z OpenStreetMap, rovněž komunitně řízeného projektu +• Chráníme vaše soukromí před zvědavýma očima velkých technologických firem +• Zůstaňte v bezpečí, ať jste kdekoli + +Odmítněte dohled, přijměte svou svobodu a podpořte komunitu. + +Vyzkoušejte Organic Maps! diff --git a/iphone/metadata/cs/name.txt b/iphone/metadata/cs/name.txt index 6d6104ca71..9a8daa8d3e 100644 --- a/iphone/metadata/cs/name.txt +++ b/iphone/metadata/cs/name.txt @@ -1 +1 @@ -Organic Maps: pěšky kolo auto +Organic Maps: Mapy Offline diff --git a/iphone/metadata/cs/promotional_text.txt b/iphone/metadata/cs/promotional_text.txt index 9e6978f6d1..0112ecc996 100644 --- a/iphone/metadata/cs/promotional_text.txt +++ b/iphone/metadata/cs/promotional_text.txt @@ -1 +1 @@ -Problémy s mapovými daty jsou řešeny na stránkách OpenStreetMaps.org. Ohledně chyb v aplikaci Organic Maps nás kontaktujte. +Opravte prosím všechny problémy s mapami na OpenStreetMap.org a dejte nám vědět o případných chybách. Vaše zpětná vazba motivuje náš tým nadšenců ke zlepšování aplikace. diff --git a/iphone/metadata/cs/subtitle.txt b/iphone/metadata/cs/subtitle.txt index 8ae445270c..14e60eeadb 100644 --- a/iphone/metadata/cs/subtitle.txt +++ b/iphone/metadata/cs/subtitle.txt @@ -1 +1 @@ -Navigace s ochranou soukromí +GPS, Navigace, Cestování diff --git a/iphone/metadata/de-DE/description.txt b/iphone/metadata/de-DE/description.txt index dd4bc01696..912c1bd61f 100644 --- a/iphone/metadata/de-DE/description.txt +++ b/iphone/metadata/de-DE/description.txt @@ -1,10 +1,39 @@ -Organic Maps ist eine GPS-Navigations-App mit Fokus auf Datenschutz für Autofahrer, Wanderer und Radfahrer. Die App bietet Navigation mit Datenschutz - keine Standortverfolgung, keine Datenerfassung und keine Werbung. Die Suche, Routenplanung und Navigation funktionieren ohne Mobilfunksignal und sind ideal für Reisen auf entlegenen Wanderwegen oder in Regionen mit schlechter Verbindung. Organic Maps verwendet die von der OpenStreetMap-Community bereitgestellten Daten mit Beitragenden aus der ganzen Welt. Das Projekt ist community-getrieben, der Code ist Open Source und legt Wert auf die Entwicklung und Zusammenarbeit in der Gemeinschaft. +• Detaillierte Offline-Karten mit Orten, die es auf anderen Karten nicht gibt +• Rad-, Wander- und Spazierwege +• Höhenlinien, Höhenprofile, Bergspitzen und Steigungen +• Schritt-für-Schritt-Navigation für Fußgänger, Radfahrer und Autos mit Sprachführung +• Schnelle Offlinesuche +• Export und Import von Lesezeichen als KML, KMZ, GPX +• Dunkler Modus zum Schutz deiner Augen +• … und viele weitere Funktionen! -• Kein Mobilfunksignal erforderlich - Suche und Routenplanung ohne Signal -• Effiziente Akkunutzung - Reduzierter Akkuverbrauch -• Schnelle Suche - Finde Standorte schnell +Organic Maps ist rein, organisch und mit Liebe gemacht: + +• Respektiert deine Privatsphäre +• Schont deinen Akku +• Keine unerwarteten Gebühren für mobile Daten + +Frei von Trackern und schlechten Dingen: -Bei Organic Maps wird Datenschutz großgeschrieben: -• Keine Standortverfolgung -• Keine Datenerfassung • Keine Werbung +• Kein Tracking +• Keine Datensammlung +• Kein Telefonieren nach Hause +• Keine lästige Registrierung +• Keine obligatorischen Tutorials +• Kein lästiger E-Mail-Spam +• Keine Push-Benachrichtigungen +• Keine Crapware +• Keine Pestizide + +Wir bei Organic Maps glauben, dass Privatsphäre ein grundlegendes Menschenrecht ist: + +• Organic Maps ist ein von einer unabhängigen Gemeinschaft betriebenes Open-Source-Projekt +• Der Code ist Open Source +• Die Kartendaten stammen von OpenStreetMap, einem ebenfalls von der Community betriebenen Projekt +• Wir schützen deine Privatsphäre vor den neugierigen Augen der großen Technologiekonzerne +• Bleib sicher, egal wo du bist + +Lehne Überwachung ab, lebe deine Freiheit und unterstütze die Community. + +Teste Organic Maps! diff --git a/iphone/metadata/de-DE/promotional_text.txt b/iphone/metadata/de-DE/promotional_text.txt index 5daa8e8991..c497cdfb6b 100644 --- a/iphone/metadata/de-DE/promotional_text.txt +++ b/iphone/metadata/de-DE/promotional_text.txt @@ -1 +1 @@ -Probleme mit Kartendaten werden auf OpenStreetMaps.org bearbeitet. Bei Fehlern in der Organic Maps App, kontaktiere uns. +Bitte behebe Kartenfehler auf OpenStreetMap.org und teile uns alle anderen Fehler mit. Dein Feedback motiviert unser kleines Team von Enthusiasten, die App zu verbessern. diff --git a/iphone/metadata/de-DE/subtitle.txt b/iphone/metadata/de-DE/subtitle.txt index 268b2df613..179cb31614 100644 --- a/iphone/metadata/de-DE/subtitle.txt +++ b/iphone/metadata/de-DE/subtitle.txt @@ -1 +1 @@ -Navigieren mit Privatsphäre +GPS Navigation, Wandern diff --git a/iphone/metadata/en-US/description.txt b/iphone/metadata/en-US/description.txt index d606b4cd88..6d3c81b667 100644 --- a/iphone/metadata/en-US/description.txt +++ b/iphone/metadata/en-US/description.txt @@ -1,10 +1,39 @@ -Organic Maps is a GPS navigation app with privacy, for drivers, hikers, and cyclists. The app features navigation with privacy - no location tracking, no data collection, and no ads. Search, routing and navigation operates without a cell phone signal, ideal for travel on distant hiking trails or locations with poor connections. Organic Maps uses the crowd-sourced OpenStreetMap data with contributors from all over the globe. The project is community-driven, the code is open-source, and prioritizes community development and collaboration. +• Detailed offline maps with places that don't exist on other maps +• Cycling routes, hiking trails, and walking paths +• Contour lines, elevation profiles, peaks, and slopes +• Turn-by-turn walking, cycling, and car navigation with voice guidance +• Fast offline search +• Bookmark everything you need, import and share KML, KMZ, GPX +• Dark mode to protect your eyes +• … and many other features! -• No Cell Signal Required - Search & Route without a signal -• Efficient Battery Usage - Reduced battery drain -• Fast Search - Find locations quickly +Organic Maps is pure and organic, made with love: -At Organic Maps, we value privacy: -• No Location Tracking -• No Data Collection -• No Ads +• Respects your privacy +• Saves your battery +• No unexpected mobile data charges + +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 +• No noisy email spam +• No push notifications +• No crapware +• No pesticides + +At Organic Maps, we believe that privacy is a fundamental human right: + +• Organic Maps is an indie community-driven project +• The code is open-sourced +• The maps data is taken from OpenStreetMap, also community-driven project +• We protect your privacy from Big Tech’s prying eyes +• Stay safe no matter wherever you are + +Reject surveillance, embrace your freedom, and support the community. + +Give Organic Maps a try! diff --git a/iphone/metadata/en-US/name.txt b/iphone/metadata/en-US/name.txt index df673dacf9..0fa869a588 100644 --- a/iphone/metadata/en-US/name.txt +++ b/iphone/metadata/en-US/name.txt @@ -1 +1 @@ -Organic Maps: Hike Bike Drive +Organic Maps Offline Hike Bike diff --git a/iphone/metadata/en-US/promotional_text.txt b/iphone/metadata/en-US/promotional_text.txt index 078816a063..ba256951d1 100644 --- a/iphone/metadata/en-US/promotional_text.txt +++ b/iphone/metadata/en-US/promotional_text.txt @@ -1 +1 @@ -Map data issues are addressed at OpenStreetMaps.org. About bugs in the Organic Maps app, contact us. +Please fix all map issues at OpenStreetMap.org, and let us know about any bugs. Your feedback motivates our small team of enthusiasts to improve the app. diff --git a/iphone/metadata/en-US/subtitle.txt b/iphone/metadata/en-US/subtitle.txt index bc23b8963e..6e286f7efd 100644 --- a/iphone/metadata/en-US/subtitle.txt +++ b/iphone/metadata/en-US/subtitle.txt @@ -1 +1 @@ -Navigate with Privacy +Trails, Travel, GPS Navigation diff --git a/iphone/metadata/es-ES/description.txt b/iphone/metadata/es-ES/description.txt index fdb6fcbf4c..748298a38d 100644 --- a/iphone/metadata/es-ES/description.txt +++ b/iphone/metadata/es-ES/description.txt @@ -1,10 +1,39 @@ -Organic Maps es una aplicación de navegación GPS con privacidad, para conductores, excursionistas y ciclistas. La aplicación ofrece navegación con privacidad: sin seguimiento de ubicación, sin recopilación de datos y sin anuncios. La búsqueda, el enrutamiento y la navegación funcionan sin señal del móvil, lo que resulta ideal para viajar por rutas de senderismo lejanas o lugares con malas conexiones. Organic Maps utiliza los datos de OpenStreetMap, de origen colectivo, con colaboradores de todo el mundo. El proyecto está impulsado por la comunidad, el código es abierto y da prioridad al desarrollo y la colaboración de la comunidad. +• Mapas sin conexión detallados con lugares que no existen en otros mapas +• Rutas ciclistas, rutas de senderismo y senderos para caminar +• Curvas de nivel, perfiles de elevación, picos y pendientes +• Navegación paso a paso a pie, en bicicleta y en automóvil con guía de voz +• Búsqueda rápida sin conexión +• Marca todo lo que necesitas, te importa y comparte con KML, KMZ, GPX +• Modo oscuro para proteger tus ojos +• … ¡y muchas otras funciones! -• No necesita la señal del móvil: busca y rastrea sin señal. -• Uso eficiente de la batería - Reduce el consumo de batería -• Búsqueda rápida - Encuentra las ubicaciones rápidamente +Organic Maps es puro y orgánico, hecho con amor: + +• Respeta tu privacidad +• Ahorra batería +• Sin cargos de datos móviles inesperados + +Organic Maps está libre de rastreadores y otras cosas malas: -En Organic Maps, valoramos la privacidad: -• No rastreamos la ubicación -• Sin recopilación de datos • Sin anuncios +• Sin seguimiento +• Sin recopilación de datos +• Sin telemetria +• Sin registros molestos +• Sin tutoriales obligatorios +• No hay spam molesto en el correo electrónico +• Sin notificaciones automáticas +• Sin basura +• Nada de pesticidas + +En Organic Maps, creemos que la privacidad es un derecho humano fundamental: + +• Organic Maps es un proyecto independiente impulsado por la comunidad +• Es de código abierto +• Los datos de los mapas se toman de OpenStreetMap, también es un proyecto impulsado por la comunidad +• Protegemos tu privacidad de las miradas indiscretas de las grandes empresas +• Mantente seguro sin importar dónde te encuentres + +Rechaza la vigilancia, abraza tu libertad y apoya a la comunidad. + +¡Prueba los Organic Maps! diff --git a/iphone/metadata/es-ES/subtitle.txt b/iphone/metadata/es-ES/subtitle.txt index 40793fd865..c58d7c2157 100644 --- a/iphone/metadata/es-ES/subtitle.txt +++ b/iphone/metadata/es-ES/subtitle.txt @@ -1 +1 @@ -Navega con privacidad +Rutas, Viajes, Navegación GPS diff --git a/iphone/metadata/fr-FR/description.txt b/iphone/metadata/fr-FR/description.txt index ebf88c21a2..a799e4c4f4 100644 --- a/iphone/metadata/fr-FR/description.txt +++ b/iphone/metadata/fr-FR/description.txt @@ -1,10 +1,39 @@ -Organic Maps est une application de navigation GPS respectueuse de la vie privée, destinée aux conducteurs, aux randonneurs et aux cyclistes. L'application permet de naviguer en toute confidentialité - pas de suivi de la localisation, pas de collecte de données et pas de publicité. La recherche, le routage et la navigation fonctionnent même sans signal cellulaire, ce qui est idéal pour les voyages sur des sentiers de randonnée éloignés ou dans des endroits où les connexions sont insuffisantes. Organic Maps utilise les données d'OpenStreetMap, dont les contributeurs viennent du monde entier. Le projet est porté par la communauté, le code est ouvert et la priorité est donnée au développement de la communauté et à la collaboration. +• Des cartes hors ligne détaillées avec des lieux qui n'existent pas sur les autres cartes +• Pistes cyclables, sentiers de randonnée et chemins de promenade +• Courbes de niveau, profils d'élévation, sommets et pentes +• Navigation virage par virage à pied, à vélo et navigation en voiture avec guidage vocal +• Recherche rapide hors ligne +• Créez des signets pour tout ce dont vous avez besoin, importez et partagez des fichiers KML, KMZ, GPX +• Mode sombre pour protéger vos yeux +• ... et bien d'autres fonctionnalités ! -- Aucun signal cellulaire requis - Recherche et itinéraire sans signal -- Utilisation optimale de la batterie - Réduction de la consommation de batterie -- Recherche rapide - Trouver des lieux rapidement +Organic Maps est pur et biologique, fait avec amour : -Chez Organic Maps, nous accordons une grande importance à la confidentialité : -- Pas de géolocalisation -- Pas de collecte de données -- Pas de publicité +• Respecte votre vie privée +• Économise votre batterie +• Pas de frais de données mobiles inattendus + +Organic Maps est exempt de trackers et autres éléments indésirables : + +• Pas de publicités +• Pas de pistage +• Pas de pistage +• Pas d'appel au domicile +• Pas d'inscription fastidieuse +• Pas de tutoriels obligatoires +• Pas de spam excessif +• Pas de notifications push +• Pas de logiciels malveillants +• Pas de pesticides + +Chez Organic Maps, nous pensons que la vie privée est un droit humain fondamental : + +• Organic Maps est un projet indépendant dirigé par la communauté +• Le code est open source +• Les données cartographiques proviennent d'OpenStreetMap, un autre projet communautaire. +• Nous protégeons votre vie privée des regards indiscrets des géants de la tech +• Restez en sécurité, où que vous soyez + +Rejetez la surveillance, embrassez votre liberté et soutenez la communauté. + +Essayez Organic Maps ! diff --git a/iphone/metadata/id/description.txt b/iphone/metadata/id/description.txt index 20026ae3a6..0bc83432f8 100644 --- a/iphone/metadata/id/description.txt +++ b/iphone/metadata/id/description.txt @@ -1,10 +1,38 @@ -Organic Maps adalah aplikasi navigasi GPS dengan privasi, untuk pengemudi, pejalan kaki, dan pengendara sepeda. Aplikasi ini tidak memiliki pelacakan lokasi, tidak ada pengumpulan data, dan tidak ada iklan, sehingga Anda dapat mengendalikan data Anda. Pencarian, perutean, dan navigasi beroperasi tanpa sinyal ponsel, ideal untuk perjalanan di jalur pendakian yang jauh atau lokasi dengan koneksi yang buruk. Organic Maps menggunakan data OpenStreetMap yang bersumber dari kerumunan dengan kontributor dari seluruh dunia. Proyek ini digerakkan oleh komunitas, kodenya bersifat bersumber terbuka, dan memprioritaskan pengembangan dan kolaborasi komunitas. +• Peta luring terperinci dengan tempat-tempat yang tidak ada di peta lain +• Rute bersepeda, jalur pendakian, dan jalur jalan kaki +• Garis kontur, profil elevasi, puncak, dan lereng +• Jalan kaki, bersepeda, dan navigasi mobil belokan demi belokan dengan panduan suara +• Pencarian offline cepat di peta dan markah +• Mode gelap untuk melindungi mata Anda +• …dan banyak fitur lainnya! -- Tidak Memerlukan Sinyal Sel - Pencarian & Rute tanpa sinyal -- Penggunaan Baterai yang Efisien - Mengurangi pengurasan baterai -- Pencarian Cepat - Temukan lokasi dengan cepat +Organic Maps murni dan organik, dibuat dengan cinta: -Di Organic Maps, kami menghargai privasi: -- Tidak Ada Pelacakan Lokasi -- Tidak Ada Pengumpulan Data -- Tanpa Iklan +• Menghormati privasi Anda +• Menghemat baterai Anda +• Tidak ada biaya data seluler yang tidak terduga + +Organic Maps bebas dari pelacak dan hal-hal buruk lainnya: + +• Tanpa iklan +• Tidak ada pelacakan +• Tidak ada pengumpulan data +• Tidak peneleponan rumah +• Tidak ada pendaftaran yang mengganggu +• Tidak ada tutorial wajib +• Tidak ada spam email yang berisik +• Tidak ada pemberitahuan push +• Tidak ada perangkat lunak sampah +• Tidak ada pestisida + +Di Organic Maps, kami percaya bahwa privasi adalah hak asasi manusia yang mendasar: + +• Peta Organik adalah proyek berbasis komunitas sendiri +• Kode ini bersumber terbuka +• Data peta diambil dari OpenStreetMap, juga proyek berbasis komunitas +• Kami melindungi privasi Anda dari mata-mata Teknologi Besar +• Tetap aman di mana pun Anda berada + +Tolak pengawasan, rangkul kebebasan Anda, dan dukung komunitasnya. + +Cobalah Organic Maps! diff --git a/iphone/metadata/id/name.txt b/iphone/metadata/id/name.txt index 677f1f8c51..38ea0a5cda 100644 --- a/iphone/metadata/id/name.txt +++ b/iphone/metadata/id/name.txt @@ -1 +1 @@ -Organic Maps +Organic Maps Luring diff --git a/iphone/metadata/id/promotional_text.txt b/iphone/metadata/id/promotional_text.txt index 0807794e95..c137b8101a 100644 --- a/iphone/metadata/id/promotional_text.txt +++ b/iphone/metadata/id/promotional_text.txt @@ -1 +1 @@ -Masalah data peta dibahas di OpenStreetMap.org. Mengenai bug di aplikasi Organic Maps, hubungi kami. +Tolong perbaiki semua masalah peta di OpenStreetMap dan beri tahu kepada kami jika ada kutu. Umpan balik Anda akan membantu tim kecil kami untuk memperbaiki aplikasi ini. diff --git a/iphone/metadata/id/subtitle.txt b/iphone/metadata/id/subtitle.txt index fbcb590db2..4c2f1f9ac0 100644 --- a/iphone/metadata/id/subtitle.txt +++ b/iphone/metadata/id/subtitle.txt @@ -1 +1 @@ -Navigasi dengan Privasi +Jalur, Perjalanan Navigasi GPS diff --git a/iphone/metadata/pl/description.txt b/iphone/metadata/pl/description.txt index 440cb6949a..5a92ec1600 100644 --- a/iphone/metadata/pl/description.txt +++ b/iphone/metadata/pl/description.txt @@ -1,10 +1,38 @@ -Organic Maps to aplikacja do nawigacji GPS zapewniająca prywatność, przeznaczona dla kierowców, turystów pieszych i rowerzystów. Aplikacja zapewnia nawigację zapewniającą prywatność – bez śledzenia lokalizacji, gromadzenia danych i reklam. Wyszukiwanie, wyznaczanie tras i nawigacja działają bez sygnału telefonu komórkowego, co idealnie sprawdza się w przypadku podróży odległymi szlakami turystycznymi lub lokalizacjami o słabych połączeniach. Organic Maps korzysta z danych OpenStreetMap pochodzących od użytkowników z całego świata. Projekt jest kierowany przez społeczność, kod jest typu open source i priorytetem jest rozwój społeczności i współpraca. +• Szczegółowe mapy offline z miejscami, które nie istnieją na innych mapach +• Trasy rowerowe, szlaki turystyczne, ścieżki spacerowe +• Linie konturowe, profile wysokościowe, szczyty i zbocza +• Nawigacja piesza, rowerowa i samochodowa typu "turn-by-turn" ze wskazówkami głosowymi +• Szybkie wyszukiwanie w trybie offline +• Zapisz wszystko czego potrzebujesz, importuj i udostępniaj KML, KMZ, GPX +• Tryb ciemny, aby chronić Twoje oczy -• Nie jest wymagany sygnał komórkowy — wyszukiwanie i wyznaczanie trasy bez sygnału -• Efektywne wykorzystanie baterii — zmniejszone zużycie baterii -• Szybkie wyszukiwanie — szybko znajduj lokalizacje +Organic Maps jest czyste i organiczne, wykonane z miłością: -W Organic Maps cenimy prywatność: -• Brak śledzenia lokalizacji -• Brak gromadzenia danych -• Bez reklam +• Szanuje Twoją prywatność +• Oszczędza baterię +• Brak niespodziewanych opłat za transmisję danych w sieci komórkowej + +Wolny od elementów śledzących i innych złych rzeczy: + +• Brak reklam +• Brak śledzenia +• Brak zbierania danych +• Brak telemetrii +• Brak irytującej rejestracji +• Brak obowiązkowych samouczków +• Brak hałaśliwego spamu e-mailowego +• Żadnych powiadomień typu push +• Brak oprogramowanie śmieciowe +• Brak pestycydów + +W Organic Maps wierzymy, że prywatność jest podstawowym prawem człowieka: + +• Organic Maps to niezależny projekt prowadzony przez społeczność. +• Kod źródłowy jest otwarty +• Dane map pochodzą z OpenStreetMap, również projektu tworzonego przez społeczność. +• Chronimy prywatność przed wścibskimi oczami Big Tech. +• Bądź bezpieczny bez względu na to, gdzie jesteś + +Odrzuć inwigilację - przyjmij swoją wolność oraz wspomóż społeczność. + +Wypróbuj Organic Maps! diff --git a/iphone/metadata/pl/promotional_text.txt b/iphone/metadata/pl/promotional_text.txt index 3d0cf35eea..1f0b2e1ecb 100644 --- a/iphone/metadata/pl/promotional_text.txt +++ b/iphone/metadata/pl/promotional_text.txt @@ -1 +1 @@ -Problemy z danymi map są rozwiązywane na OpenStreetMaps.org. W sprawie błędów w aplikacji Organic Maps skontaktuj się z nami. +Wszelkie problemy z mapami naprawiaj na OpenStreetMap.org, a nam dawaj znać o błędach. Twoja opinia motywuje nasz mały zespół entuzjastów do ulepszania aplikacji. diff --git a/iphone/metadata/pl/subtitle.txt b/iphone/metadata/pl/subtitle.txt index 6cc63caebf..f3da102e8a 100644 --- a/iphone/metadata/pl/subtitle.txt +++ b/iphone/metadata/pl/subtitle.txt @@ -1 +1 @@ -Nawiguj z prywatnością +Szlaki, podróże, nawigacja GPS diff --git a/iphone/metadata/pt-BR/description.txt b/iphone/metadata/pt-BR/description.txt index 23d967e500..ae66d7e18e 100644 --- a/iphone/metadata/pt-BR/description.txt +++ b/iphone/metadata/pt-BR/description.txt @@ -1,10 +1,37 @@ -Organic Maps é um aplicativo de navegação com privacidade para motoristas, caminhantes e ciclistas. O app oferece navegação com privacidade: não possui rastreamento de localização ou coleta de dados e anúncios. A busca, o roteamento e a navegação funcionam sem sinal de celular, ideal para trilhas ou locais com conexões ruins. Organic Maps usa os dados procedentes dos usuários do OpenStreetMap de todo o mundo. O projeto é conduzido pela comunidade, o código é aberto, priorizando a colaboração e o desenvolvimento da comunidade. +• Mapas offline detalhados com lugares que não existem em outros mapas +• Rotas de ciclismo, trilhas para caminhadas e caminhos para pedestres +• Curvas de nível, perfis de elevação, picos e encostas +• Navegação passo a passo a pé, bicicleta e carro, com orientação por voz +• Busca rápida offline no mapa e marcadores +• Modo escuro para proteger seus olhos -• Não é necessário sinal de celular - Pesquise e navegue sem sinal -• Uso eficiente da bateria - consumo reduzido de energia -• Pesquisa rápida - Encontre locais rapidamente +O Organic Maps é puro e orgânico, feito com amor: -No Organic Maps, valorizamos a privacidade: +• Respeita sua privacidade +• Economiza sua bateria +• Sem cobranças inesperadas de dados móveis + +O Organic Maps está livre de rastreadores e outras coisas ruins: + +• Sem anúncios • Sem rastreamento • Sem coleta de dados -• Sem anúncios +• Sem conexões para servidores externos +• Sem registros desnecessários +• Sem tutoriais obrigatórios +• Sem lixo eletrônico por e-mail +• Sem notificações push +• Sem recursos desnecessários +• Sem pesticidas + +No Organic Maps, acreditamos que a privacidade é um direito humano fundamental: + +• O Organic Maps é um projeto independente voltado para a comunidade +• É código aberto +• Os dados dos mapas são retirados do OpenStreetMap, um projeto também voltado para a comunidade +• Protegemos a sua privacidade dos olhos curiosos das grandes empresas +• Fique protegido, não importa onde você esteja + +Rejeite a vigilância, abrace sua liberdade e apoie a comunidade. + +Experimente Organic Maps! -- 2.45.3 From 0432dd3aa40fe44d98cc10a32c1123dc965ec922 Mon Sep 17 00:00:00 2001 From: Ferenc- Date: Wed, 7 Feb 2024 12:04:55 +0100 Subject: [PATCH 7/7] Update packaging/app.organicmaps.desktop.metainfo.xml Co-authored-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Signed-off-by: Ferenc- --- packaging/app.organicmaps.desktop.metainfo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/app.organicmaps.desktop.metainfo.xml b/packaging/app.organicmaps.desktop.metainfo.xml index 296e266eb0..583c966f71 100644 --- a/packaging/app.organicmaps.desktop.metainfo.xml +++ b/packaging/app.organicmaps.desktop.metainfo.xml @@ -4,7 +4,7 @@ Organic Maps The Organic Maps Community - Free offline maps for travelers + Free offline maps for everyone CC0-1.0 Apache-2.0 -- 2.45.3