[android] Add possibility to select bookmark category after long click on Save button #8166
6 changed files with 221 additions and 30 deletions
|
@ -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,32 @@ 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 jstring JNICALL
|
||||
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeGetNewBookmarkName(
|
||||
JNIEnv * env, jobject)
|
||||
{
|
||||
place_page::Info const & info = g_framework->GetPlacePageInfo();
|
||||
std::string newName = GetPreferredBookmarkStr(info.FormatNewBookmarkName());
|
||||
return jni::ToJavaString(env,newName);
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeGetLastEditedCategory(
|
||||
|
|
|
@ -139,6 +139,24 @@ public enum BookmarkManager
|
|||
return nativeAddBookmarkToLastEditedCategory(lat, lon);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Bookmark addNewBookmark(double lat, double lon, long cotegoryId)
|
||||
{
|
||||
return nativeAddBookmark(lat, lon, cotegoryId);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public long getLastEditedCategory()
|
||||
{
|
||||
return nativeGetLastEditedCategory();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getNewBookmarkName()
|
||||
{
|
||||
return nativeGetNewBookmarkName();
|
||||
}
|
||||
|
||||
public void addLoadingListener(@NonNull BookmarksLoadingListener listener)
|
||||
{
|
||||
mListeners.add(listener);
|
||||
|
@ -412,6 +430,10 @@ public enum BookmarkManager
|
|||
@Icon.PredefinedColor
|
||||
public int getLastEditedColor() { return nativeGetLastEditedColor(); }
|
||||
|
||||
public Icon getIconByColor(int colorId) {
|
||||
return ICONS.stream().filter(icon -> icon.getColor()==colorId).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
@MainThread
|
||||
public void loadBookmarksFile(@NonNull String path, boolean isTemporaryFile)
|
||||
{
|
||||
|
@ -816,6 +838,15 @@ public enum BookmarkManager
|
|||
@Nullable
|
||||
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
||||
|
||||
@Nullable
|
||||
private native Bookmark nativeAddBookmark(double lat, double lon, long catedoryId);
|
||||
|
||||
@Nullable
|
||||
private native String nativeGetNewBookmarkName();
|
||||
|
||||
@Nullable
|
||||
private native long nativeGetLastEditedCategory();
|
||||
|
||||
@Icon.PredefinedColor
|
||||
private native int nativeGetLastEditedColor();
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import app.organicmaps.R;
|
|||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment;
|
||||
import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment.Listener;
|
||||
import app.organicmaps.bookmarks.data.Bookmark;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||
import app.organicmaps.bookmarks.data.BookmarkManager;
|
||||
|
@ -41,7 +42,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
{
|
||||
public static final String EXTRA_CATEGORY_ID = "CategoryId";
|
||||
public static final String EXTRA_BOOKMARK_ID = "BookmarkId";
|
||||
|
||||
public static final String EXTRA_BOOKMARK_LAT = "BookmarkLat";
|
||||
public static final String EXTRA_BOOKMARK_LON = "BookmarkLon";
|
||||
private TextInputEditText mEtDescription;
|
||||
private TextInputEditText mEtName;
|
||||
@NonNull
|
||||
|
@ -68,6 +70,23 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
final Bundle args = new Bundle();
|
||||
args.putLong(EXTRA_CATEGORY_ID, categoryId);
|
||||
args.putLong(EXTRA_BOOKMARK_ID, bookmarkId);
|
||||
showView(args, context, manager, listener);
|
||||
}
|
||||
|
||||
public static void createBookmark(double lat, double lon, @NonNull Context context,
|
||||
@NonNull FragmentManager manager,
|
||||
@Nullable EditBookmarkListener listener)
|
||||
{
|
||||
final Bundle args = new Bundle();
|
||||
args.putDouble(EXTRA_BOOKMARK_LAT, lat);
|
||||
args.putDouble(EXTRA_BOOKMARK_LON, lon);
|
||||
showView(args, context, manager, listener);
|
||||
}
|
||||
|
||||
public static void showView(Bundle args, @NonNull Context context,
|
||||
@NonNull FragmentManager manager,
|
||||
@Nullable EditBookmarkListener listener)
|
||||
{
|
||||
String name = EditBookmarkFragment.class.getName();
|
||||
final FragmentFactory factory = manager.getFragmentFactory();
|
||||
final EditBookmarkFragment fragment = (EditBookmarkFragment) factory.instantiate(context.getClassLoader(), name);
|
||||
|
@ -91,16 +110,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
return inflater.inflate(R.layout.fragment_edit_bookmark, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, Bundle savedInstanceState)
|
||||
private void InitViewElements(@NonNull View view)
|
||||
{
|
||||
final Bundle args = getArguments();
|
||||
long categoryId = args.getLong(EXTRA_CATEGORY_ID);
|
||||
mBookmarkCategory = BookmarkManager.INSTANCE.getCategoryById(categoryId);
|
||||
long bookmarkId = args.getLong(EXTRA_BOOKMARK_ID);
|
||||
mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId);
|
||||
if (mBookmark != null)
|
||||
mIcon = mBookmark.getIcon();
|
||||
mEtName = view.findViewById(R.id.et__bookmark_name);
|
||||
clearNameBtn = view.findViewById(R.id.edit_bookmark_name_input);
|
||||
clearNameBtn.setEndIconOnClickListener(v -> clearAndFocus(mEtName));
|
||||
|
@ -123,6 +134,36 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
mTvBookmarkGroup.setOnClickListener(this);
|
||||
mIvColor = view.findViewById(R.id.iv__bookmark_color);
|
||||
mIvColor.setOnClickListener(this);
|
||||
|
||||
if (mBookmark == null) {
|
||||
int lastUsedColor = BookmarkManager.INSTANCE.getLastEditedColor();
|
||||
mIcon = BookmarkManager.INSTANCE.getIconByColor(lastUsedColor);
|
||||
}
|
||||
else {
|
||||
mIcon = mBookmark.getIcon();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, Bundle savedInstanceState)
|
||||
{
|
||||
final Bundle args = getArguments();
|
||||
|
||||
long categoryId = -1;
|
||||
if (args.containsKey(EXTRA_CATEGORY_ID))
|
||||
categoryId = args.getLong(EXTRA_CATEGORY_ID);
|
||||
else
|
||||
categoryId = BookmarkManager.INSTANCE.getLastEditedCategory();
|
||||
|
||||
mBookmarkCategory = BookmarkManager.INSTANCE.getCategoryById(categoryId);
|
||||
|
||||
if (args.containsKey(EXTRA_BOOKMARK_ID))
|
||||
{
|
||||
long bookmarkId = args.getLong(EXTRA_BOOKMARK_ID);
|
||||
mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId);
|
||||
}
|
||||
|
||||
InitViewElements(view);
|
||||
refreshBookmark();
|
||||
initToolbar(view);
|
||||
}
|
||||
|
@ -158,6 +199,14 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
}
|
||||
|
||||
private void saveBookmark()
|
||||
{
|
||||
if (mBookmark == null)
|
||||
createBookmark();
|
||||
else
|
||||
updateBookmark();
|
||||
}
|
||||
|
||||
private void updateBookmark()
|
||||
{
|
||||
if (mBookmark == null)
|
||||
{
|
||||
|
@ -168,13 +217,30 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
if (movedFromCategory)
|
||||
BookmarkManager.INSTANCE.notifyCategoryChanging(mBookmark, mBookmarkCategory.getId());
|
||||
BookmarkManager.INSTANCE.notifyParametersUpdating(mBookmark, mEtName.getText().toString(),
|
||||
mIcon, mEtDescription.getText().toString());
|
||||
mIcon, mEtDescription.getText().toString());
|
||||
|
||||
if (mListener != null)
|
||||
mListener.onBookmarkSaved(mBookmark.getBookmarkId(), movedFromCategory);
|
||||
dismiss();
|
||||
}
|
||||
|
||||
private void createBookmark()
|
||||
{
|
||||
if (mBookmarkCategory == null)
|
||||
return;
|
||||
|
||||
final Bundle args = getArguments();
|
||||
double lat = args.getDouble(EXTRA_BOOKMARK_LAT);
|
||||
double lon = args.getDouble(EXTRA_BOOKMARK_LON);
|
||||
|
||||
Bookmark bookmark = BookmarkManager.INSTANCE.addNewBookmark(lat,lon,mBookmarkCategory.getId());
|
||||
BookmarkManager.INSTANCE.setBookmarkParams(bookmark.getBookmarkId(), mEtName.getText().toString(), mIcon.getColor(), mEtDescription.getText().toString());
|
||||
|
||||
if (mListener != null)
|
||||
mListener.onBookmarkSaved(bookmark.getBookmarkId(), false);
|
||||
dismiss();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
|
@ -187,9 +253,6 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
|
||||
private void selectBookmarkSet()
|
||||
{
|
||||
if (mBookmark == null)
|
||||
return;
|
||||
|
||||
final Bundle args = new Bundle();
|
||||
final List<BookmarkCategory> categories = BookmarkManager.INSTANCE.getCategories();
|
||||
final int index = categories.indexOf(mBookmarkCategory);
|
||||
|
@ -253,16 +316,22 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
private void refreshBookmark()
|
||||
{
|
||||
if (mBookmark == null)
|
||||
return;
|
||||
|
||||
if (TextUtils.isEmpty(mEtName.getText()))
|
||||
mEtName.setText(mBookmark.getName());
|
||||
|
||||
if (TextUtils.isEmpty(mEtDescription.getText()))
|
||||
{
|
||||
mEtDescription.setText(
|
||||
BookmarkManager.INSTANCE.getBookmarkDescription(mBookmark.getBookmarkId()));
|
||||
if (TextUtils.isEmpty(mEtName.getText()))
|
||||
mEtName.setText(BookmarkManager.INSTANCE.getNewBookmarkName());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TextUtils.isEmpty(mEtName.getText()))
|
||||
mEtName.setText(mBookmark.getName());
|
||||
|
||||
if (TextUtils.isEmpty(mEtDescription.getText()))
|
||||
{
|
||||
mEtDescription.setText(
|
||||
BookmarkManager.INSTANCE.getBookmarkDescription(mBookmark.getBookmarkId()));
|
||||
}
|
||||
}
|
||||
|
||||
refreshCategory();
|
||||
refreshColorMarker();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,8 @@ import app.organicmaps.util.UiUtils;
|
|||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageBookmarkFragment;
|
||||
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -45,12 +47,16 @@ import java.util.List;
|
|||
public class PlacePageController extends Fragment implements
|
||||
PlacePageView.PlacePageViewListener,
|
||||
PlacePageButtons.PlacePageButtonClickListener,
|
||||
PlacePageButtons.PlacePageButtonLongClickListener,
|
||||
MenuBottomSheetFragment.MenuBottomSheetInterface,
|
||||
EditBookmarkFragment.EditBookmarkListener,
|
||||
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;
|
||||
|
@ -113,6 +119,7 @@ public class PlacePageController extends Fragment implements
|
|||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
final FragmentActivity activity = requireActivity();
|
||||
mPlacePageRouteSettingsListener = (MwmActivity) activity;
|
||||
|
||||
|
@ -193,9 +200,10 @@ public class PlacePageController extends Fragment implements
|
|||
{
|
||||
final PlacePageButton bsItem = PlacePageButtonFactory.createButton(currentItems.get(i), requireActivity());
|
||||
items.add(new MenuBottomSheetItem(
|
||||
bsItem.getTitle(),
|
||||
bsItem.getIcon(),
|
||||
() -> onPlacePageButtonClick(bsItem.getType())
|
||||
bsItem.getTitle(),
|
||||
bsItem.getIcon(),
|
||||
() -> onPlacePageButtonClick(bsItem.getType()),
|
||||
() -> onPlacePageButtonLongClick(bsItem.getType())
|
||||
));
|
||||
}
|
||||
return items;
|
||||
|
@ -371,6 +379,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 +401,15 @@ public class PlacePageController extends Fragment implements
|
|||
BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon());
|
||||
}
|
||||
|
||||
private void onBookmarkBtnLongClicked()
|
||||
{
|
||||
final FragmentActivity activity = requireActivity();
|
||||
EditBookmarkFragment.createBookmark(mMapObject.getLat(), mMapObject.getLon(),
|
||||
activity,
|
||||
activity.getSupportFragmentManager(),
|
||||
this);
|
||||
}
|
||||
|
||||
private void onBackBtnClicked()
|
||||
{
|
||||
if (mMapObject == null)
|
||||
|
@ -619,6 +645,11 @@ public class PlacePageController extends Fragment implements
|
|||
mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBookmarkSaved(long bookmarkId, boolean movedFromCategory) {
|
||||
|
||||
}
|
||||
|
||||
public interface PlacePageRouteSettingsListener
|
||||
{
|
||||
void onPlacePageRequestToggleRouteSettings(@NonNull RoadType roadType);
|
||||
|
|
Reference in a new issue