Add possibility to select bookmark category after long click on Save button

Signed-off-by: Kiryl Razhdzestvenski <k.rozhdestvenski@tcp-soft.com>
This commit is contained in:
Kiryl Razhdzestvenski 2024-05-13 17:20:20 +03:00
parent 6e93e5b7a5
commit 76b1758d29
5 changed files with 109 additions and 7 deletions

View file

@ -355,9 +355,7 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeDeleteTrack(
frm()->GetBookmarkManager().GetEditSession().DeleteTrack(static_cast<kml::TrackId>(trkId));
}
JNIEXPORT jobject JNICALL
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEditedCategory(
JNIEnv * env, jobject, double lat, double lon)
jobject AddBookmark(JNIEnv * env, double lat, double lon, long categoryId)
{
if (!frm()->HasPlacePageInfo())
return nullptr;
@ -370,13 +368,12 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEdite
bmData.m_name = info.FormatNewBookmarkName();
bmData.m_color.m_predefinedColor = frm()->LastEditedBMColor();
bmData.m_point = mercator::FromLatLon(lat, lon);
auto const lastEditedCategory = frm()->LastEditedBMCategory();
if (info.IsFeature())
SaveFeatureTypes(info.GetTypes(), bmData);
auto const * createdBookmark = bmMng.GetEditSession().CreateBookmark(std::move(bmData),
lastEditedCategory);
categoryId);
auto buildInfo = info.GetBuildInfo();
buildInfo.m_match = place_page::BuildInfo::Match::Everything;
@ -385,6 +382,23 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEdite
return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo());
}
JNIEXPORT jobject JNICALL
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEditedCategory(
JNIEnv * env, jobject, double lat, double lon)
{
if (!frm()->HasPlacePageInfo())
return nullptr;
auto const activeCategory = frm()->LastEditedBMCategory();
return AddBookmark(env, lat, lon, activeCategory);
}
JNIEXPORT jobject JNICALL
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmark(
JNIEnv * env, jobject, double lat, double lon, long categoryId)
{
return AddBookmark(env, lat, lon, categoryId);
}
JNIEXPORT jlong JNICALL
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeGetLastEditedCategory(

View file

@ -139,6 +139,12 @@ public enum BookmarkManager
return nativeAddBookmarkToLastEditedCategory(lat, lon);
}
@Nullable
public Bookmark addNewBookmark(double lat, double lon, long cotegoryId)
{
return nativeAddBookmark(lat, lon, cotegoryId);
}
public void addLoadingListener(@NonNull BookmarksLoadingListener listener)
{
mListeners.add(listener);
@ -816,6 +822,9 @@ public enum BookmarkManager
@Nullable
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
@Nullable
private native Bookmark nativeAddBookmark(double lat, double lon, long catedoryId);
@Icon.PredefinedColor
private native int nativeGetLastEditedColor();

View file

@ -6,6 +6,7 @@ public class MenuBottomSheetItem
public final int iconRes;
public final int badgeCount;
public final OnClickListener onClickListener;
public final OnLongClickListener onLongClickListener;
public MenuBottomSheetItem(int titleRes, int iconRes, OnClickListener onClickListener)
{
@ -13,6 +14,16 @@ public class MenuBottomSheetItem
this.iconRes = iconRes;
this.badgeCount = 0;
this.onClickListener = onClickListener;
this.onLongClickListener = () -> {};
}
public MenuBottomSheetItem(int titleRes, int iconRes, OnClickListener onClickListener, OnLongClickListener onLongClickListener)
{
this.titleRes = titleRes;
this.iconRes = iconRes;
this.badgeCount = 0;
this.onClickListener = onClickListener;
this.onLongClickListener = onLongClickListener;
}
public MenuBottomSheetItem(int titleRes, int iconRes, int badgeCount, OnClickListener onClickListener)
@ -21,10 +32,25 @@ public class MenuBottomSheetItem
this.iconRes = iconRes;
this.badgeCount = badgeCount;
this.onClickListener = onClickListener;
this.onLongClickListener = () -> {};
}
public MenuBottomSheetItem(int titleRes, int iconRes, int badgeCount, OnClickListener onClickListener, OnLongClickListener onLongClickListener)
{
this.titleRes = titleRes;
this.iconRes = iconRes;
this.badgeCount = badgeCount;
this.onClickListener = onClickListener;
this.onLongClickListener = onLongClickListener;
}
public interface OnClickListener
{
void onClick();
}
public interface OnLongClickListener
{
void onLongClick();
}
}

View file

@ -28,6 +28,7 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
private int mMaxButtons;
private PlacePageButtonClickListener mItemListener;
private PlacePageButtonLongClickListener mItemLongClickListener;
private ViewGroup mButtonsContainer;
private PlacePageViewModel mViewModel;
@ -52,6 +53,7 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
Fragment parentFragment = getParentFragment();
mItemListener = (PlacePageButtonClickListener) parentFragment;
mItemLongClickListener = (PlacePageButtonLongClickListener) parentFragment;
createButtons(mViewModel.getCurrentButtons().getValue());
}
@ -121,6 +123,10 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
else
mItemListener.onPlacePageButtonClick(current.getType());
});
parent.setOnLongClickListener((view) -> {
mItemLongClickListener.onPlacePageButtonLongClick(current.getType());
return true;
});
return parent;
}
@ -149,4 +155,9 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
{
void onPlacePageButtonClick(ButtonType item);
}
public interface PlacePageButtonLongClickListener
{
void onPlacePageButtonLongClick(ButtonType item);
}
}

View file

@ -18,6 +18,7 @@ import androidx.core.view.WindowInsetsCompat;
import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.lifecycle.Observer;
@ -26,6 +27,8 @@ import app.organicmaps.Framework;
import app.organicmaps.MwmActivity;
import app.organicmaps.R;
import app.organicmaps.api.Const;
import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment;
import app.organicmaps.bookmarks.data.BookmarkCategory;
import app.organicmaps.bookmarks.data.BookmarkManager;
import app.organicmaps.bookmarks.data.MapObject;
import app.organicmaps.bookmarks.data.RoadWarningMarkType;
@ -45,12 +48,16 @@ import java.util.List;
public class PlacePageController extends Fragment implements
PlacePageView.PlacePageViewListener,
PlacePageButtons.PlacePageButtonClickListener,
PlacePageButtons.PlacePageButtonLongClickListener,
ChooseBookmarkCategoryFragment.Listener,
MenuBottomSheetFragment.MenuBottomSheetInterface,
Observer<MapObject>
{
private static final String TAG = PlacePageController.class.getSimpleName();
private static final String PLACE_PAGE_BUTTONS_FRAGMENT_TAG = "PLACE_PAGE_BUTTONS";
private static final String PLACE_PAGE_FRAGMENT_TAG = "PLACE_PAGE";
private static final String PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET = "PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET";
private static final float PREVIEW_PLUS_RATIO = 0.45f;
private BottomSheetBehavior<View> mPlacePageBehavior;
@ -71,6 +78,8 @@ public class PlacePageController extends Fragment implements
private MapObject mPreviousMapObject;
private WindowInsetsCompat mCurrentWindowInsets;
private ChooseBookmarkCategoryFragment chooseBookmarkCategoryFragment;
private boolean mShouldCollapse;
private int mDistanceToTop;
@ -113,6 +122,20 @@ public class PlacePageController extends Fragment implements
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
final FragmentManager manager = getParentFragmentManager();
final FragmentFactory factory = manager.getFragmentFactory();
String className = ChooseBookmarkCategoryFragment.class.getName();
final Bundle args = new Bundle();
args.putInt(ChooseBookmarkCategoryFragment.CATEGORY_POSITION, 0);
chooseBookmarkCategoryFragment =
(ChooseBookmarkCategoryFragment) factory.instantiate(getContext().getClassLoader(), className);
chooseBookmarkCategoryFragment.onDestroyView();
chooseBookmarkCategoryFragment.setArguments(args);
final FragmentActivity activity = requireActivity();
mPlacePageRouteSettingsListener = (MwmActivity) activity;
@ -193,8 +216,8 @@ public class PlacePageController extends Fragment implements
{
final PlacePageButton bsItem = PlacePageButtonFactory.createButton(currentItems.get(i), requireActivity());
items.add(new MenuBottomSheetItem(
bsItem.getTitle(),
bsItem.getIcon(),
bsItem.getTitle(),
bsItem.getIcon(),
() -> onPlacePageButtonClick(bsItem.getType())
));
}
@ -371,6 +394,15 @@ public class PlacePageController extends Fragment implements
}
}
@Override
public void onPlacePageButtonLongClick(PlacePageButtons.ButtonType item)
{
switch (item)
{
case BOOKMARK_SAVE -> onBookmarkBtnLongClicked();
}
}
private void onBookmarkBtnClicked()
{
// mMapObject is set to null when the place page closes
@ -384,6 +416,11 @@ public class PlacePageController extends Fragment implements
BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon());
}
private void onBookmarkBtnLongClicked()
{
chooseBookmarkCategoryFragment.show(getChildFragmentManager(),PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET);
}
private void onBackBtnClicked()
{
if (mMapObject == null)
@ -619,6 +656,11 @@ public class PlacePageController extends Fragment implements
mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver);
}
@Override
public void onCategoryChanged(@NonNull BookmarkCategory newCategory) {
BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon(), newCategory.getId());
}
public interface PlacePageRouteSettingsListener
{
void onPlacePageRequestToggleRouteSettings(@NonNull RoadType roadType);