diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp index 4a7913b47..3a7917aa8 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp @@ -1505,6 +1505,22 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeGet3dMode(JNIEnv env->SetBooleanField(result, buildingsField, buildings); } +JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetCustomMapDownloadUrl(JNIEnv * env, jclass, + jstring url) +{ + std::string const nativeUrl = jni::ToNativeString(env, url); + GetPlatform().SetCustomMetaServerUrl(nativeUrl); + + if (g_framework) + { + frm()->GetStorage().ResetMapDownloadMetaConfig(); + } + else + { + LOG(LINFO, ("nativeSetCustomMapDownloadUrl: framework not created yet, skipping ResetMapDownloadMetaConfig")); + } +} + JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetAutoZoomEnabled(JNIEnv * env, jclass, jboolean enabled) { diff --git a/libs/platform/platform.cpp b/libs/platform/platform.cpp index 33f3be41b..4018fad67 100644 --- a/libs/platform/platform.cpp +++ b/libs/platform/platform.cpp @@ -49,6 +49,11 @@ bool GetFileTypeChecked(std::string const & path, Platform::EFileType & type) } } // namespace +namespace +{ + std::string g_customMetaServerUrl; +} // namespace + // static Platform::EError Platform::ErrnoToError() { @@ -150,8 +155,16 @@ std::string Platform::ReadPathForFile(std::string const & file, std::string sear "\nr: ", m_resourcesDir, "\ns: ", m_settingsDir)); } +void Platform::SetCustomMetaServerUrl(std::string const & url) +{ + g_customMetaServerUrl = url; +} + std::string Platform::MetaServerUrl() const { + if (!g_customMetaServerUrl.empty()) + return g_customMetaServerUrl; + return METASERVER_URL; } diff --git a/libs/platform/platform.hpp b/libs/platform/platform.hpp index 592311f54..e0001b50a 100644 --- a/libs/platform/platform.hpp +++ b/libs/platform/platform.hpp @@ -268,6 +268,9 @@ public: /// @return integer version in yyMMdd format. int32_t IntVersion() const; + /// Set custom meta server url to allow user-defined download servers + void SetCustomMetaServerUrl(std::string const & url); + /// @return url for clients to download maps std::string MetaServerUrl() const; diff --git a/libs/storage/map_files_downloader.cpp b/libs/storage/map_files_downloader.cpp index 391eb616b..1ca0e68fd 100644 --- a/libs/storage/map_files_downloader.cpp +++ b/libs/storage/map_files_downloader.cpp @@ -190,4 +190,10 @@ void MapFilesDownloader::GetMetaConfig(MetaConfigCallback const & callback) callback(LoadMetaConfig()); } +void MapFilesDownloader::ResetMetaConfig() +{ + m_serversList.clear(); + m_isMetaConfigRequested = false; +} + } // namespace storage diff --git a/libs/storage/map_files_downloader.hpp b/libs/storage/map_files_downloader.hpp index 3a307837d..c253d4564 100644 --- a/libs/storage/map_files_downloader.hpp +++ b/libs/storage/map_files_downloader.hpp @@ -66,6 +66,9 @@ public: void SetDownloadingPolicy(DownloadingPolicy * policy); void SetDataVersion(int64_t version) { m_dataVersion = version; } + /// Reset after changes, e.g. map download URL. + void ResetMetaConfig(); + /// @name Legacy functions for Android resources downloading routine (initial World download). /// @{ void EnsureMetaConfigReady(std::function && callback); diff --git a/libs/storage/storage.hpp b/libs/storage/storage.hpp index 0b4b90781..98117be89 100644 --- a/libs/storage/storage.hpp +++ b/libs/storage/storage.hpp @@ -585,6 +585,12 @@ public: void RestoreDownloadQueue(); + void ResetMapDownloadMetaConfig() + { + if (m_downloader) + m_downloader->ResetMetaConfig(); + } + protected: void OnFinishDownloading();