[android] Use separate function to check for MapTooOldToEdit

Signed-off-by: map-per <map-per@gmx.de>
This commit is contained in:
map-per
2025-12-16 14:24:23 +01:00
committed by Konstantin Pastbin
parent 67d88b4fa9
commit 498dcc4240
5 changed files with 58 additions and 13 deletions

View File

@@ -700,22 +700,27 @@ public class PlacePageView extends Fragment
if (shouldEnableEditPlace) if (shouldEnableEditPlace)
{ {
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener(this); mTvEditPlace.setOnClickListener(this);
mTvAddPlace.setOnClickListener(this); mTvAddPlace.setOnClickListener(this);
} }
else else
{ {
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
String countryId = MapManager.nativeGetSelectedCountry(); String countryId = MapManager.nativeGetSelectedCountry();
if (countryId != null) if (countryId != null && MapManager.nativeIsMapTooOldToEdit(countryId))
{ {
// map editing is disabled because the map is too old
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
CountryItem map = CountryItem.fill(countryId); CountryItem map = CountryItem.fill(countryId);
if (map.status == CountryItem.STATUS_UPDATABLE || map.status == CountryItem.STATUS_DONE if (map.status == CountryItem.STATUS_UPDATABLE || map.status == CountryItem.STATUS_DONE
@@ -740,6 +745,12 @@ public class PlacePageView extends Fragment
mapTooOldDescription.setText(R.string.place_page_app_too_old_description); mapTooOldDescription.setText(R.string.place_page_app_too_old_description);
} }
} }
else
{
// map editing is disabled for other reasons
mTvEditPlace.setEnabled(false);
mTvAddPlace.setEnabled(false);
}
} }
final int editButtonColor = final int editButtonColor =

View File

@@ -587,4 +587,11 @@ JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeG
storage::CountryId const & res = g_framework->GetPlacePageInfo().GetCountryId(); storage::CountryId const & res = g_framework->GetPlacePageInfo().GetCountryId();
return (res == storage::kInvalidCountryId ? nullptr : jni::ToJavaString(env, res)); return (res == storage::kInvalidCountryId ? nullptr : jni::ToJavaString(env, res));
} }
// static native boolean nativeIsMapTooOldToEdit(String countryId);
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeIsMapTooOldToEdit(JNIEnv *env, jclass clazz,
jstring country_id)
{
return GetStorage().IsMapTooOldToEdit(jni::ToNativeString(env, country_id));
}
} // extern "C" } // extern "C"

View File

@@ -261,4 +261,9 @@ public final class MapManager
* Returns country ID which the current PP object points to, or {@code null}. * Returns country ID which the current PP object points to, or {@code null}.
*/ */
public static native @Nullable String nativeGetSelectedCountry(); public static native @Nullable String nativeGetSelectedCountry();
/**
* Returns true when the map exists and is too old for map editing.
*/
public static native boolean nativeIsMapTooOldToEdit(String countryId);
} }

View File

@@ -1252,16 +1252,33 @@ bool Storage::IsAllowedToEditVersion(CountryId const & countryId) const
case Status::OnDiskOutOfDate: case Status::OnDiskOutOfDate:
{ {
auto const localFile = GetLatestLocalFile(countryId); auto const localFile = GetLatestLocalFile(countryId);
ASSERT(localFile, ("Local file shouldn't be nullptr.")); return IsAllowedToEditFile(localFile);
auto const currentVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(m_currentVersion));
auto const localVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(localFile->GetVersion()));
return currentVersionTime - localVersionTime < kMaxSecondsTillLastVersionUpdate &&
base::SecondsSinceEpoch() - localVersionTime < kMaxSecondsTillNoEdits;
} }
default: return false; default: return false;
} }
} }
bool Storage::IsMapTooOldToEdit(CountryId const & countryId) const
{
auto const status = CountryStatusEx(countryId);
if (status == Status::OnDiskOutOfDate)
{
LocalFilePtr const localFile = GetLatestLocalFile(countryId);
return !IsAllowedToEditFile(localFile);
}
return false;
}
bool Storage::IsAllowedToEditFile(LocalFilePtr const & localFile) const
{
ASSERT(localFile, ("Local file shouldn't be nullptr."));
auto const currentVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(m_currentVersion));
auto const localVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(localFile->GetVersion()));
return currentVersionTime - localVersionTime < kMaxSecondsTillLastVersionUpdate &&
base::SecondsSinceEpoch() - localVersionTime < kMaxSecondsTillNoEdits;
}
int64_t Storage::GetVersion(CountryId const & countryId) const int64_t Storage::GetVersion(CountryId const & countryId) const
{ {
CHECK_THREAD_CHECKER(m_threadChecker, ()); CHECK_THREAD_CHECKER(m_threadChecker, ());

View File

@@ -383,6 +383,9 @@ public:
/// \brief Returns true if the version of countryId can be used to update maps. /// \brief Returns true if the version of countryId can be used to update maps.
bool IsAllowedToEditVersion(CountryId const & countryId) const; bool IsAllowedToEditVersion(CountryId const & countryId) const;
/// \brief Returns true when the map exists and is too old for map editing.
bool IsMapTooOldToEdit(CountryId const & countryId) const;
/// Returns version of downloaded mwm or zero. /// Returns version of downloaded mwm or zero.
int64_t GetVersion(CountryId const & countryId) const; int64_t GetVersion(CountryId const & countryId) const;
@@ -625,6 +628,8 @@ private:
// Returns a path to a place on disk downloader can use for downloaded files. // Returns a path to a place on disk downloader can use for downloaded files.
std::string GetFileDownloadPath(CountryId const & countryId, MapFileType file) const; std::string GetFileDownloadPath(CountryId const & countryId, MapFileType file) const;
bool IsAllowedToEditFile(LocalFilePtr const & localFile) const;
/// Fast version, doesn't check if country is out of date /// Fast version, doesn't check if country is out of date
Status CountryStatus(CountryId const & countryId) const; Status CountryStatus(CountryId const & countryId) const;