diff --git a/android/src/app/organicmaps/widget/placepage/PlacePageView.java b/android/src/app/organicmaps/widget/placepage/PlacePageView.java index 8e302ec97f..35cab13051 100644 --- a/android/src/app/organicmaps/widget/placepage/PlacePageView.java +++ b/android/src/app/organicmaps/widget/placepage/PlacePageView.java @@ -59,7 +59,6 @@ import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.UiUtils; import app.organicmaps.util.Utils; import app.organicmaps.util.concurrency.UiThread; -import app.organicmaps.util.log.Logger; import app.organicmaps.widget.ArrowView; import java.util.ArrayList; @@ -67,7 +66,6 @@ import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.Locale; -import java.util.Objects; import static android.view.View.GONE; import static android.view.View.VISIBLE; @@ -219,6 +217,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private PlacePageViewListener mPlacePageViewListener; private PlacePageViewModel viewModel; + private MapObject mMapObject; @NonNull private static PlacePageButtons.ButtonType toPlacePageButton(@NonNull RoadWarningMarkType type) @@ -273,7 +272,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener, mCoordsFormat = CoordinatesFormat.fromId( MwmApplication.prefs(requireContext()).getInt( PREF_COORDINATES_FORMAT, CoordinatesFormat.LatLonDecimal.getId())); - LocationHelper.INSTANCE.addListener(this); mFrame = view; mFrame.setOnClickListener((v) -> mPlacePageViewListener.onPlacePageRequestToggleState()); @@ -285,6 +283,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener, if (oldHeight != newHeight) mPlacePageViewListener.onPlacePageContentChanged(mPreview.getHeight(), newHeight); }); + mTvTitle = mPreview.findViewById(R.id.tv__title); mTvTitle.setOnLongClickListener(this); mTvTitle.setOnClickListener(this); @@ -396,6 +395,8 @@ public class PlacePageView extends Fragment implements View.OnClickListener, viewModel = new ViewModelProvider(requireActivity()).get(PlacePageViewModel.class); viewModel.getMapObject().observe(requireActivity(), this); + + LocationHelper.INSTANCE.addListener(this); } @Override @@ -463,44 +464,28 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void onBookmarkBtnClicked() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - { - Logger.e(TAG, "Bookmark cannot be managed, mMapObject is null!"); - return; - } - toggleIsBookmark(mapObject); + // No need to call setMapObject here as the native methods will reopen the place page + if (MapObject.isOfType(MapObject.BOOKMARK, mMapObject)) + Framework.nativeDeleteBookmarkFromMapObject(); + else + BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon()); } private void onShareBtnClicked() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - { - Logger.e(TAG, "A map object cannot be shared, it's null!"); - return; - } - SharingUtils.shareMapObject(requireContext(), mapObject); + SharingUtils.shareMapObject(requireContext(), mMapObject); } private void onBackBtnClicked() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - { - Logger.e(TAG, "A mwm request cannot be handled, mMapObject is null!"); - requireActivity().finish(); - return; - } - final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); if (request != null && request.isPickPointMode()) { final Intent result = new Intent(); - result.putExtra(Const.EXTRA_POINT_LAT, mapObject.getLat()) - .putExtra(Const.EXTRA_POINT_LON, mapObject.getLon()) - .putExtra(Const.EXTRA_POINT_NAME, mapObject.getTitle()) - .putExtra(Const.EXTRA_POINT_ID, mapObject.getApiId()) + result.putExtra(Const.EXTRA_POINT_LAT, mMapObject.getLat()) + .putExtra(Const.EXTRA_POINT_LON, mMapObject.getLon()) + .putExtra(Const.EXTRA_POINT_NAME, mMapObject.getTitle()) + .putExtra(Const.EXTRA_POINT_ID, mMapObject.getApiId()) .putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale()); requireActivity().setResult(Activity.RESULT_OK, result); ParsedMwmRequest.setCurrentRequest(null); @@ -510,14 +495,13 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void onRouteFromBtnClicked() { - final MapObject mapObject = getMapObject(); RoutingController controller = RoutingController.get(); if (!controller.isPlanning()) { - controller.prepare(mapObject, null); + controller.prepare(mMapObject, null); mPlacePageViewListener.onPlacePageRequestClose(); } - else if (controller.setStartPoint(mapObject)) + else if (controller.setStartPoint(mMapObject)) { mPlacePageViewListener.onPlacePageRequestClose(); } @@ -525,30 +509,25 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void onRouteToBtnClicked() { - final MapObject mapObject = getMapObject(); if (RoutingController.get().isPlanning()) { - RoutingController.get().setEndPoint(mapObject); + RoutingController.get().setEndPoint(mMapObject); mPlacePageViewListener.onPlacePageRequestClose(); } else { - ((MwmActivity) requireActivity()).startLocationToPoint(mapObject); + ((MwmActivity) requireActivity()).startLocationToPoint(mMapObject); } } private void onRouteAddBtnClicked() { - final MapObject mapObject = getMapObject(); - if (mapObject != null) - RoutingController.get().addStop(mapObject); + RoutingController.get().addStop(mMapObject); } private void onRouteRemoveBtnClicked() { - final MapObject mapObject = getMapObject(); - if (mapObject != null) - RoutingController.get().removeStop(mapObject); + RoutingController.get().removeStop(mMapObject); } private void onAvoidUnpavedBtnClicked() @@ -574,7 +553,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void showDescriptionScreen() { Context context = mPlaceDescriptionContainer.getContext(); - String description = Objects.requireNonNull(getMapObject()).getDescription(); + String description = mMapObject.getDescription(); PlaceDescriptionActivity.start(context, description); } @@ -589,60 +568,51 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void refreshViews() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - { - Logger.e(TAG, "A place page views cannot be refreshed, mMapObject is null"); - return; - } - refreshPreview(mapObject); - refreshDetails(mapObject); - refreshViewsInternal(mapObject); + refreshPreview(); + refreshDetails(); + refreshViewsInternal(); updateBookmarkView(); updatePhoneView(); } - private void refreshViewsInternal(@NonNull MapObject mapObject) + private void refreshViewsInternal() { final Location loc = LocationHelper.INSTANCE.getSavedLocation(); boolean showBackButton = false; boolean showRoutingButton = true; - switch (mapObject.getMapObjectType()) + switch (mMapObject.getMapObjectType()) { case MapObject.BOOKMARK: - refreshDistanceToObject(mapObject, loc); + refreshDistanceToObject(loc); break; case MapObject.POI: case MapObject.SEARCH: - refreshDistanceToObject(mapObject, loc); - setPlaceDescription(mapObject); + refreshDistanceToObject(loc); + setPlaceDescription(); break; case MapObject.API_POINT: - refreshDistanceToObject(mapObject, loc); + refreshDistanceToObject(loc); showBackButton = true; break; case MapObject.MY_POSITION: - refreshMyPosition(mapObject, loc); + refreshMyPosition(loc); showRoutingButton = false; break; } - updateButtons(mapObject, showBackButton, showRoutingButton); + updateButtons(showBackButton, showRoutingButton); } private void updatePhoneView() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - return; final FragmentManager fManager = getChildFragmentManager(); final PlacePagePhoneFragment fragment = (PlacePagePhoneFragment) fManager.findFragmentByTag(PHONE_FRAGMENT_TAG); - if (mapObject.hasPhoneNumber() && fragment == null) + if (mMapObject.hasPhoneNumber() && fragment == null) { fManager.beginTransaction() .add(R.id.place_page_phone_fragment, PlacePagePhoneFragment.class, null, PHONE_FRAGMENT_TAG) .commit(); } - else if (!mapObject.hasPhoneNumber() && fragment != null) + else if (!mMapObject.hasPhoneNumber() && fragment != null) { fManager.beginTransaction() .remove(fragment) @@ -652,18 +622,15 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void updateBookmarkView() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - return; final FragmentManager fManager = getChildFragmentManager(); final PlacePageBookmarkFragment fragment = (PlacePageBookmarkFragment) fManager.findFragmentByTag(BOOKMARK_FRAGMENT_TAG); - if (mapObject.getMapObjectType() == MapObject.BOOKMARK && fragment == null) + if (mMapObject.getMapObjectType() == MapObject.BOOKMARK && fragment == null) { fManager.beginTransaction() - .add(R.id.place_page_bookmark_fragment, PlacePageBookmarkFragment.class, null, BOOKMARK_FRAGMENT_TAG) - .commit(); + .add(R.id.place_page_bookmark_fragment, PlacePageBookmarkFragment.class, null, BOOKMARK_FRAGMENT_TAG) + .commit(); } - else if (mapObject.getMapObjectType() != MapObject.BOOKMARK && fragment != null) + else if (mMapObject.getMapObjectType() != MapObject.BOOKMARK && fragment != null) { fManager.beginTransaction() .remove(fragment) @@ -671,9 +638,9 @@ public class PlacePageView extends Fragment implements View.OnClickListener, } } - private Spanned getShortDescription(@NonNull MapObject mapObject) + private Spanned getShortDescription() { - String htmlDescription = mapObject.getDescription(); + String htmlDescription = mMapObject.getDescription(); final int paragraphStart = htmlDescription.indexOf("
"); final int paragraphEnd = htmlDescription.indexOf("
"); if (paragraphStart == 0 && paragraphEnd != -1) @@ -690,22 +657,22 @@ public class PlacePageView extends Fragment implements View.OnClickListener, return description; } - private void setPlaceDescription(@NonNull MapObject mapObject) + private void setPlaceDescription() { - if (TextUtils.isEmpty(mapObject.getDescription())) + if (TextUtils.isEmpty(mMapObject.getDescription())) { UiUtils.hide(mPlaceDescriptionContainer, mPlaceDescriptionHeaderContainer); } else { UiUtils.show(mPlaceDescriptionContainer, mPlaceDescriptionHeaderContainer); - mPlaceDescriptionView.setText(getShortDescription(mapObject)); + mPlaceDescriptionView.setText(getShortDescription()); } } - private void setTextAndColorizeSubtitle(@NonNull MapObject mapObject) + private void setTextAndColorizeSubtitle() { - String text = mapObject.getSubtitle(); + String text = mMapObject.getSubtitle(); UiUtils.setTextAndHideIfEmpty(mTvSubtitle, text); if (!TextUtils.isEmpty(text)) { @@ -721,40 +688,40 @@ public class PlacePageView extends Fragment implements View.OnClickListener, } } - private void refreshPreview(@NonNull MapObject mapObject) + private void refreshPreview() { - UiUtils.setTextAndHideIfEmpty(mTvTitle, mapObject.getTitle()); - UiUtils.setTextAndHideIfEmpty(mTvSecondaryTitle, mapObject.getSecondaryTitle()); - boolean isPopular = mapObject.getPopularity().getType() == Popularity.Type.POPULAR; + UiUtils.setTextAndHideIfEmpty(mTvTitle, mMapObject.getTitle()); + UiUtils.setTextAndHideIfEmpty(mTvSecondaryTitle, mMapObject.getSecondaryTitle()); + boolean isPopular = mMapObject.getPopularity().getType() == Popularity.Type.POPULAR; if (mPopularityView != null) UiUtils.showIf(isPopular, mPopularityView); if (mToolbar != null) - mToolbar.setTitle(mapObject.getTitle()); - setTextAndColorizeSubtitle(mapObject); - UiUtils.setTextAndHideIfEmpty(mTvAddress, mapObject.getAddress()); + mToolbar.setTitle(mMapObject.getTitle()); + setTextAndColorizeSubtitle(); + UiUtils.setTextAndHideIfEmpty(mTvAddress, mMapObject.getAddress()); } - private void refreshDetails(@NonNull MapObject mapObject) + private void refreshDetails() { - refreshLatLon(mapObject); + refreshLatLon(); - String website = mapObject.getMetadata(Metadata.MetadataType.FMD_WEBSITE); - String url = mapObject.getMetadata(Metadata.MetadataType.FMD_URL); + String website = mMapObject.getMetadata(Metadata.MetadataType.FMD_WEBSITE); + String url = mMapObject.getMetadata(Metadata.MetadataType.FMD_URL); refreshMetadataOrHide(TextUtils.isEmpty(website) ? url : website, mWebsite, mTvWebsite); - String wikimedia_commons = mapObject.getMetadata(Metadata.MetadataType.FMD_WIKIMEDIA_COMMONS); + String wikimedia_commons = mMapObject.getMetadata(Metadata.MetadataType.FMD_WIKIMEDIA_COMMONS); String wikimedia_commons_text = TextUtils.isEmpty(wikimedia_commons) ? "" : getResources().getString(R.string.wikimedia_commons); refreshMetadataOrHide(wikimedia_commons_text, mWikimedia, mTvWikimedia); - refreshMetadataOrHide(mapObject.getMetadata(Metadata.MetadataType.FMD_EMAIL), mEmail, mTvEmail); - refreshMetadataOrHide(mapObject.getMetadata(Metadata.MetadataType.FMD_OPERATOR), mOperator, mTvOperator); + refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_EMAIL), mEmail, mTvEmail); + refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_OPERATOR), mOperator, mTvOperator); /// @todo I don't like it when we take all data from mapObject, but for cuisines, we should /// go into JNI Framework and rely on some "active object". refreshMetadataOrHide(Framework.nativeGetActiveObjectFormattedCuisine(), mCuisine, mTvCuisine); - refreshMetadataOrHide(mapObject.getMetadata(Metadata.MetadataType.FMD_WIKIPEDIA), mWiki, null); - refreshWiFi(mapObject); - refreshMetadataOrHide(mapObject.getMetadata(Metadata.MetadataType.FMD_FLATS), mEntrance, mTvEntrance); - refreshOpeningHours(mapObject); - refreshSocialLinks(mapObject); - refreshMetadataOrHide(mapObject.getMetadata(Metadata.MetadataType.FMD_LEVEL), mLevel, mTvLevel); + refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_WIKIPEDIA), mWiki, null); + refreshWiFi(); + refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_FLATS), mEntrance, mTvEntrance); + refreshOpeningHours(); + refreshSocialLinks(); + refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_LEVEL), mLevel, mTvLevel); // showTaxiOffer(mapObject); @@ -771,15 +738,15 @@ public class PlacePageView extends Fragment implements View.OnClickListener, || UiUtils.isVisible(mAddOrganisation) || UiUtils.isVisible(mAddPlace), mEditTopSpace); } - setPlaceDescription(mapObject); + setPlaceDescription(); } - private void refreshOpeningHours(@NonNull MapObject mapObject) + private void refreshOpeningHours() { - final String ohStr = mapObject.getMetadata(Metadata.MetadataType.FMD_OPEN_HOURS); + final String ohStr = mMapObject.getMetadata(Metadata.MetadataType.FMD_OPEN_HOURS); final Timetable[] timetables = OpeningHours.nativeTimetablesFromString(ohStr); final boolean isEmptyTT = (timetables == null || timetables.length == 0); - final int color = ThemeUtils.getColor(getContext(), android.R.attr.textColorPrimary); + final int color = ThemeUtils.getColor(requireContext(), android.R.attr.textColorPrimary); if (isEmptyTT) { @@ -870,9 +837,9 @@ public class PlacePageView extends Fragment implements View.OnClickListener, UiUtils.setTextAndShow(mTodayNonBusinessTime, TimeFormatUtils.formatNonBusinessTime(closedTimespans, hoursClosedLabel)); } - private void refreshWiFi(@NonNull MapObject mapObject) + private void refreshWiFi() { - final String inet = mapObject.getMetadata(Metadata.MetadataType.FMD_INTERNET); + final String inet = mMapObject.getMetadata(Metadata.MetadataType.FMD_INTERNET); if (!TextUtils.isEmpty(inet)) { mWifi.setVisibility(VISIBLE); @@ -883,17 +850,17 @@ public class PlacePageView extends Fragment implements View.OnClickListener, mWifi.setVisibility(GONE); } - private void refreshSocialLinks(@NonNull MapObject mapObject) + private void refreshSocialLinks() { - final String facebookPageLink = mapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_FACEBOOK); + final String facebookPageLink = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_FACEBOOK); refreshSocialPageLink(mFacebookPage, mTvFacebookPage, facebookPageLink, "facebook.com"); - final String instagramPageLink = mapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_INSTAGRAM); + final String instagramPageLink = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_INSTAGRAM); refreshSocialPageLink(mInstagramPage, mTvInstagramPage, instagramPageLink, "instagram.com"); - final String twitterPageLink = mapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_TWITTER); + final String twitterPageLink = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_TWITTER); refreshSocialPageLink(mTwitterPage, mTvTwitterPage, twitterPageLink, "twitter.com"); - final String vkPageLink = mapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_VK); + final String vkPageLink = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_VK); refreshSocialPageLink(mVkPage, mTvVkPage, vkPageLink, "vk.com"); - final String linePageLink = mapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_LINE); + final String linePageLink = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_LINE); refreshLinePageLink(mLinePage, mTvLinePage, linePageLink); } @@ -951,14 +918,11 @@ public class PlacePageView extends Fragment implements View.OnClickListener, private void updateBookmarkButton() { - final MapObject mapObject = getMapObject(); - if (mapObject == null) - return; final List