diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp index 5c0e24a8e9..0b7f2f3beb 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp @@ -304,8 +304,9 @@ void OnUploadFinished(JNIEnv * env, BookmarkCatalog::UploadResult uploadResult, ASSERT(g_bookmarkManagerClass, ()); jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, g_bookmarkManagerInstanceField); + jni::TScopedLocalRef const descriptionStr(env, jni::ToJavaString(env, description)); env->CallVoidMethod(bookmarkManagerInstance, g_onUploadFinishedMethod, - static_cast(uploadResult), jni::ToJavaString(env, description), + static_cast(uploadResult), descriptionStr.get(), static_cast(originCategoryId), static_cast(resultCategoryId)); jni::HandleJavaException(env); } diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index d9bd3fd9ce..ce5ac5f065 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -814,8 +814,8 @@ public enum BookmarkManager * * @param uploadResult is result of the uploading. * @param description is detailed description of the uploading result. - * @param originCategoryId is original identifier of the uploading bookmarks category. - * @param resultCategoryId is identifier of the uploading category after finishing. + * @param originCategoryId is original identifier of the uploaded bookmarks category. + * @param resultCategoryId is identifier of the uploaded category after finishing. * In the case of bookmarks modification during uploading * the identifier can be new. */ diff --git a/map/bookmark_catalog.cpp b/map/bookmark_catalog.cpp index 1b70cc4bb2..711e0f2dac 100644 --- a/map/bookmark_catalog.cpp +++ b/map/bookmark_catalog.cpp @@ -281,11 +281,12 @@ void BookmarkCatalog::RequestTagGroups(std::string const & language, } void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessToken, - kml::FileData const & fileData, std::string const & pathToKmb, + std::shared_ptr fileData, std::string const & pathToKmb, UploadSuccessCallback && uploadSuccessCallback, UploadErrorCallback && uploadErrorCallback) { - CHECK_EQUAL(uploadData.m_serverId, fileData.m_serverId, ()); + CHECK(fileData != nullptr, ()); + CHECK_EQUAL(uploadData.m_serverId, fileData->m_serverId, ()); if (accessToken.empty()) { @@ -294,14 +295,14 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo return; } - if (fileData.m_categoryData.m_accessRules == kml::AccessRules::Paid) + if (fileData->m_categoryData.m_accessRules == kml::AccessRules::Paid) { if (uploadErrorCallback) uploadErrorCallback(UploadResult::InvalidCall, "Could not upload paid bookmarks."); return; } - if (fileData.m_categoryData.m_accessRules == kml::AccessRules::Public && + if (fileData->m_categoryData.m_accessRules == kml::AccessRules::Public && uploadData.m_accessRules != kml::AccessRules::Public) { if (uploadErrorCallback) @@ -332,7 +333,7 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo } GetPlatform().RunTask(Platform::Thread::Network, [uploadData = std::move(uploadData), accessToken, - pathToKmb, fileData = std::move(fileData), originalSha1, + pathToKmb, fileData, originalSha1, uploadSuccessCallback = std::move(uploadSuccessCallback), uploadErrorCallback = std::move(uploadErrorCallback)]() mutable { @@ -358,13 +359,13 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo } // Embed necessary data to KML. - fileData.m_serverId = uploadData.m_serverId; - fileData.m_categoryData.m_accessRules = uploadData.m_accessRules; - fileData.m_categoryData.m_authorName = uploadData.m_userName; - fileData.m_categoryData.m_authorId = uploadData.m_userId; + fileData->m_serverId = uploadData.m_serverId; + fileData->m_categoryData.m_accessRules = uploadData.m_accessRules; + fileData->m_categoryData.m_authorName = uploadData.m_userName; + fileData->m_categoryData.m_authorId = uploadData.m_userId; auto const filePath = base::JoinPath(GetPlatform().TmpDir(), uploadData.m_serverId); - if (!SaveKmlFile(fileData, filePath, KmlFileType::Text)) + if (!SaveKmlFile(*fileData, filePath, KmlFileType::Text)) { if (uploadErrorCallback) uploadErrorCallback(UploadResult::InvalidCall, "Could not save the uploading file."); @@ -380,12 +381,20 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo if (uploadCode.m_httpCode >= 200 && uploadCode.m_httpCode < 300) { // Update KML. - bool const originalFileExists = GetPlatform().IsFileExistsByFullPath(pathToKmb); - bool originalFileUnmodified = false; - if (originalFileExists) - originalFileUnmodified = (originalSha1 == coding::SHA1::CalculateBase64(pathToKmb)); - if (uploadSuccessCallback) - uploadSuccessCallback(UploadResult::Success, fileData, originalFileExists, originalFileUnmodified); + GetPlatform().RunTask(Platform::Thread::File, + [pathToKmb, fileData, originalSha1, + uploadSuccessCallback = std::move(uploadSuccessCallback)]() mutable + { + bool const originalFileExists = GetPlatform().IsFileExistsByFullPath(pathToKmb); + bool originalFileUnmodified = false; + if (originalFileExists) + originalFileUnmodified = (originalSha1 == coding::SHA1::CalculateBase64(pathToKmb)); + if (uploadSuccessCallback) + { + uploadSuccessCallback(UploadResult::Success, fileData, + originalFileExists, originalFileUnmodified); + } + }); } else if (uploadCode.m_httpCode == 400) { diff --git a/map/bookmark_catalog.hpp b/map/bookmark_catalog.hpp index 974b8d20c0..df1be52247 100644 --- a/map/bookmark_catalog.hpp +++ b/map/bookmark_catalog.hpp @@ -61,7 +61,7 @@ public: InvalidCall }; using UploadSuccessCallback = platform::SafeCallback fileData, bool originalFileExists, bool originalFileUnmodified)>; using UploadErrorCallback = platform::SafeCallback fileData, std::string const & pathToKmb, UploadSuccessCallback && uploadSuccessCallback, UploadErrorCallback && uploadErrorCallback); diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 4b2ff2e1fb..0342301a10 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -2258,12 +2258,27 @@ void BookmarkManager::UploadToCatalog(kml::MarkGroupId categoryId, kml::AccessRu } auto onUploadSuccess = [this, categoryId](BookmarkCatalog::UploadResult result, - kml::FileData fileData, bool originalFileExists, - bool originalFileUnmodified) + std::shared_ptr fileData, bool originalFileExists, + bool originalFileUnmodified) mutable { CHECK_THREAD_CHECKER(m_threadChecker, ()); - if (!originalFileExists || originalFileUnmodified) + CHECK(fileData != nullptr, ()); + + auto cat = GetBmCategory(categoryId); + if (!originalFileExists || originalFileUnmodified || + (cat != nullptr && cat->GetServerId() == fileData->m_serverId)) { + // Update bookmarks category. + { + auto session = GetEditSession(); + if (cat != nullptr) + { + cat->SetServerId(fileData->m_serverId); + cat->SetAccessRules(fileData->m_categoryData.m_accessRules); + cat->SetAuthor(fileData->m_categoryData.m_authorName, fileData->m_categoryData.m_authorId); + } + } + if (m_onCatalogUploadFinishedHandler) m_onCatalogUploadFinishedHandler(result, {}, categoryId, categoryId); return; @@ -2271,24 +2286,21 @@ void BookmarkManager::UploadToCatalog(kml::MarkGroupId categoryId, kml::AccessRu // Until we cannot block UI to prevent bookmarks modification during uploading, // we have to create a copy in this case. - for (auto & n : fileData.m_categoryData.m_name) + for (auto & n : fileData->m_categoryData.m_name) n.second += " (uploaded copy)"; CHECK(migration::IsMigrationCompleted(), ()); - auto const name = RemoveInvalidSymbols(GetPreferredBookmarkStr(fileData.m_categoryData.m_name), - kDefaultBookmarksFileName); - auto const fileName = GenerateUniqueFileName(GetBookmarksDirectory(), name, kKmbExtension); - auto fileDataPtr = std::make_unique(); - *fileDataPtr = fileData; + auto const serverId = fileData->m_serverId; + *fileDataPtr = std::move(*fileData); KMLDataCollection collection; - collection.emplace_back(std::make_pair(fileName, std::move(fileDataPtr))); + collection.emplace_back(std::make_pair("", std::move(fileDataPtr))); CreateCategories(std::move(collection), true /* autoSave */); kml::MarkGroupId newCategoryId = categoryId; for (auto const & cat : m_categories) { - if (cat.second->GetServerId() == fileData.m_serverId) + if (cat.second->GetServerId() == serverId) { newCategoryId = cat.first; break; @@ -2309,7 +2321,8 @@ void BookmarkManager::UploadToCatalog(kml::MarkGroupId categoryId, kml::AccessRu }; auto & kmlData = kmlDataCollection->front(); - m_bookmarkCatalog.Upload(uploadData, m_user.GetAccessToken(), *kmlData.second, + std::shared_ptr fileData = std::move(kmlData.second); + m_bookmarkCatalog.Upload(uploadData, m_user.GetAccessToken(), fileData, kmlData.first, std::move(onUploadSuccess), std::move(onUploadError)); }