Compare commits

...

2 Commits

Author SHA1 Message Date
Andrei Shkrob
ea99e26404 [android] Fix collor selector issue
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-11 14:41:23 +07:00
Andrei Shkrob
f1f5ccd778 [android] Load predefined colors from core
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-11 14:41:23 +07:00
17 changed files with 180 additions and 151 deletions

View File

@@ -35,6 +35,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource; import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.bookmarks.data.KmlFileType; import app.organicmaps.sdk.bookmarks.data.KmlFileType;
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.sdk.bookmarks.data.SortedBlock; import app.organicmaps.sdk.bookmarks.data.SortedBlock;
import app.organicmaps.sdk.bookmarks.data.Track; import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.search.BookmarkSearchListener; import app.organicmaps.sdk.search.BookmarkSearchListener;
@@ -592,7 +593,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
if (mTrack == null) if (mTrack == null)
return; return;
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, Icon.getColorPosition(mTrack.getColor())); args.putInt(BookmarkColorDialogFragment.ICON_TYPE, PredefinedColors.getPredefinedColorIndex(mTrack.getColor()));
final FragmentManager manager = getChildFragmentManager(); final FragmentManager manager = getChildFragmentManager();
String className = BookmarkColorDialogFragment.class.getName(); String className = BookmarkColorDialogFragment.class.getName();
final FragmentFactory factory = manager.getFragmentFactory(); final FragmentFactory factory = manager.getFragmentFactory();
@@ -601,7 +602,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
dialogFragment.setArguments(args); dialogFragment.setArguments(args);
dialogFragment.setOnColorSetListener((colorPos) -> { dialogFragment.setOnColorSetListener((colorPos) -> {
int from = mTrack.getColor(); int from = mTrack.getColor();
int to = BookmarkManager.ICONS.get(colorPos).argb(); int to = PredefinedColors.getColor(colorPos);
if (from == to) if (from == to)
return; return;
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to); BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);

View File

@@ -7,16 +7,18 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.util.Graphics; import app.organicmaps.util.Graphics;
import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.imageview.ShapeableImageView;
import java.util.List; import java.util.List;
import java.util.Objects;
public class IconsAdapter extends ArrayAdapter<Icon> public class ColorsAdapter extends ArrayAdapter<Integer>
{ {
@PredefinedColors.Color
private int mCheckedIconColor; private int mCheckedIconColor;
public IconsAdapter(Context context, List<Icon> list) public ColorsAdapter(Context context, List<Integer> list)
{ {
super(context, 0, 0, list); super(context, 0, 0, list);
} }
@@ -35,19 +37,20 @@ public class IconsAdapter extends ArrayAdapter<Icon>
else else
holder = (SpinnerViewHolder) convertView.getTag(); holder = (SpinnerViewHolder) convertView.getTag();
final Icon icon = getItem(position); @PredefinedColors.Color
final int color = Objects.requireNonNull(getItem(position));
Drawable circle; Drawable circle;
if (icon.getColor() == mCheckedIconColor) if (color == mCheckedIconColor)
{ {
circle = Graphics.drawCircleAndImage(getItem(position).argb(), R.dimen.track_circle_size, circle = Graphics.drawCircleAndImage(PredefinedColors.getColor(mCheckedIconColor), R.dimen.track_circle_size,
app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size, app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size,
getContext()); getContext());
} }
else else
{ {
circle = circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size,
Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources()); getContext().getResources());
} }
holder.icon.setImageDrawable(circle); holder.icon.setImageDrawable(circle);
return convertView; return convertView;

View File

@@ -41,8 +41,6 @@ public enum BookmarkManager {
// These values have to match the values of kml::CompilationType from kml/types.hpp // These values have to match the values of kml::CompilationType from kml/types.hpp
public static final int CATEGORY = 0; public static final int CATEGORY = 0;
public static final List<Icon> ICONS = new ArrayList<>();
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts(); private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
private static final String TAG = BookmarkManager.class.getSimpleName(); private static final String TAG = BookmarkManager.class.getSimpleName();
@@ -70,26 +68,6 @@ public enum BookmarkManager {
@Nullable @Nullable
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener; private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
static
{
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_RED, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PINK, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPPURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIGHTBLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_CYAN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_TEAL, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GREEN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIME, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_YELLOW, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_ORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BROWN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUEGRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
}
public void toggleCategoryVisibility(@NonNull BookmarkCategory category) public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
{ {
boolean isVisible = isVisible(category.getId()); boolean isVisible = isVisible(category.getId());
@@ -342,7 +320,7 @@ public enum BookmarkManager {
nativeShowBookmarkCategoryOnMap(catId); nativeShowBookmarkCategoryOnMap(catId);
} }
@Icon.PredefinedColor @PredefinedColors.Color
public int getLastEditedColor() public int getLastEditedColor()
{ {
return nativeGetLastEditedColor(); return nativeGetLastEditedColor();
@@ -618,7 +596,7 @@ public enum BookmarkManager {
return nativeGetBookmarkXY(bookmarkId); return nativeGetBookmarkXY(bookmarkId);
} }
@Icon.PredefinedColor @PredefinedColors.Color
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId) public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
{ {
return nativeGetBookmarkColor(bookmarkId); return nativeGetBookmarkColor(bookmarkId);
@@ -652,7 +630,7 @@ public enum BookmarkManager {
} }
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name, public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr) @PredefinedColors.Color int color, @NonNull String descr)
{ {
nativeSetBookmarkParams(bookmarkId, name, color, descr); nativeSetBookmarkParams(bookmarkId, name, color, descr);
} }
@@ -808,7 +786,7 @@ public enum BookmarkManager {
@Nullable @Nullable
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon); private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
@Icon.PredefinedColor @PredefinedColors.Color
private native int nativeGetLastEditedColor(); private native int nativeGetLastEditedColor();
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile); private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
@@ -874,7 +852,7 @@ public enum BookmarkManager {
@NonNull @NonNull
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId); private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
@Icon.PredefinedColor @PredefinedColors.Color
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId); private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId); private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
@@ -889,12 +867,13 @@ public enum BookmarkManager {
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName); private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name, private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr); @PredefinedColors.Color int color, @NonNull String descr);
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color); private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
@PredefinedColors.Color int color);
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name, private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr); @PredefinedColors.Color int color, @NonNull String descr);
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId, private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
@IntRange(from = 0) long newCatId, @IntRange(from = 0) long newCatId,

View File

@@ -2,71 +2,13 @@ package app.organicmaps.sdk.bookmarks.data;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import app.organicmaps.sdk.R; import app.organicmaps.sdk.R;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class Icon implements Parcelable public class Icon implements Parcelable
{ {
@Retention(RetentionPolicy.SOURCE)
@IntDef({PREDEFINED_COLOR_NONE, PREDEFINED_COLOR_RED, PREDEFINED_COLOR_BLUE, PREDEFINED_COLOR_PURPLE,
PREDEFINED_COLOR_YELLOW, PREDEFINED_COLOR_PINK, PREDEFINED_COLOR_BROWN, PREDEFINED_COLOR_GREEN,
PREDEFINED_COLOR_ORANGE, PREDEFINED_COLOR_DEEPPURPLE, PREDEFINED_COLOR_LIGHTBLUE, PREDEFINED_COLOR_CYAN,
PREDEFINED_COLOR_TEAL, PREDEFINED_COLOR_LIME, PREDEFINED_COLOR_DEEPORANGE, PREDEFINED_COLOR_GRAY,
PREDEFINED_COLOR_BLUEGRAY})
@interface PredefinedColor
{}
static final int PREDEFINED_COLOR_NONE = 0;
static final int PREDEFINED_COLOR_RED = 1;
static final int PREDEFINED_COLOR_BLUE = 2;
static final int PREDEFINED_COLOR_PURPLE = 3;
static final int PREDEFINED_COLOR_YELLOW = 4;
static final int PREDEFINED_COLOR_PINK = 5;
static final int PREDEFINED_COLOR_BROWN = 6;
static final int PREDEFINED_COLOR_GREEN = 7;
static final int PREDEFINED_COLOR_ORANGE = 8;
static final int PREDEFINED_COLOR_DEEPPURPLE = 9;
static final int PREDEFINED_COLOR_LIGHTBLUE = 10;
static final int PREDEFINED_COLOR_CYAN = 11;
static final int PREDEFINED_COLOR_TEAL = 12;
static final int PREDEFINED_COLOR_LIME = 13;
static final int PREDEFINED_COLOR_DEEPORANGE = 14;
static final int PREDEFINED_COLOR_GRAY = 15;
static final int PREDEFINED_COLOR_BLUEGRAY = 16;
private static int shift(int v, int bitCount)
{
return v << bitCount;
}
private static int toARGB(int r, int g, int b)
{
return shift(255, 24) + shift(r, 16) + shift(g, 8) + b;
}
/// @note Important! Should be synced with kml/types.hpp/PredefinedColor
/// @todo Values can be taken from Core.
private static final int[] ARGB_COLORS = {toARGB(229, 27, 35), // none
toARGB(229, 27, 35), // red
toARGB(0, 110, 199), // blue
toARGB(156, 39, 176), // purple
toARGB(255, 200, 0), // yellow
toARGB(255, 65, 130), // pink
toARGB(121, 85, 72), // brown
toARGB(56, 142, 60), // green
toARGB(255, 160, 0), // orange
toARGB(102, 57, 191), // deeppurple
toARGB(36, 156, 242), // lightblue
toARGB(20, 190, 205), // cyan
toARGB(0, 165, 140), // teal
toARGB(147, 191, 57), // lime
toARGB(240, 100, 50), // deeporange
toARGB(115, 115, 115), // gray
toARGB(89, 115, 128)}; // bluegray
static final int BOOKMARK_ICON_TYPE_NONE = 0; static final int BOOKMARK_ICON_TYPE_NONE = 0;
/// @note Important! Should be synced with kml/types.hpp/BookmarkIcon /// @note Important! Should be synced with kml/types.hpp/BookmarkIcon
@@ -98,11 +40,16 @@ public class Icon implements Parcelable
R.drawable.ic_bookmark_none // FastFood R.drawable.ic_bookmark_none // FastFood
}; };
@PredefinedColor @PredefinedColors.Color
private final int mColor; private final int mColor;
private final int mType; private final int mType;
public Icon(@PredefinedColor int color, int type) public Icon(@PredefinedColors.Color int color)
{
this(color, BOOKMARK_ICON_TYPE_NONE);
}
public Icon(@PredefinedColors.Color int color, int type)
{ {
mColor = color; mColor = color;
mType = type; mType = type;
@@ -127,25 +74,16 @@ public class Icon implements Parcelable
mType = in.readInt(); mType = in.readInt();
} }
@PredefinedColor @PredefinedColors.Color
public int getColor() public int getColor()
{ {
return mColor; return mColor;
} }
@ColorInt
public int argb() public int argb()
{ {
return ARGB_COLORS[mColor]; return PredefinedColors.getColor(mColor);
}
public static int getColorPosition(int color)
{
for (int index = 1; index < ARGB_COLORS.length; index++)
{
if (ARGB_COLORS[index] == color)
return index;
}
return -1;
} }
@DrawableRes @DrawableRes

View File

@@ -0,0 +1,50 @@
package app.organicmaps.sdk.bookmarks.data;
import androidx.annotation.ColorInt;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import dalvik.annotation.optimization.FastNative;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.stream.IntStream;
public class PredefinedColors
{
@Retention(RetentionPolicy.SOURCE)
@IntRange(from = 0)
public @interface Color
{}
/// @note Color format: ARGB
@ColorInt
private static final int[] PREDEFINED_COLORS = nativeGetPredefinedColors();
@ColorInt
public static int getColor(int index)
{
return PREDEFINED_COLORS[index];
}
@PredefinedColors.Color
public static List<Integer> getAllPredefinedColors()
{
// 0 is reserved for "no color" option.
return IntStream.range(1, PREDEFINED_COLORS.length).boxed().toList();
}
public static int getPredefinedColorIndex(@ColorInt int color)
{
// 0 is reserved for "no color" option.
for (int index = 1; index < PREDEFINED_COLORS.length; index++)
{
if (PREDEFINED_COLORS[index] == color)
return index;
}
return -1;
}
@FastNative
@NonNull
private static native int[] nativeGetPredefinedColors();
}

View File

@@ -240,7 +240,8 @@ public class SearchToolbarController extends ToolbarController implements View.O
} }
@NonNull @NonNull
public OnBackPressedCallback getBackPressedCallback() { public OnBackPressedCallback getBackPressedCallback()
{
return mBackPressedCallback; return mBackPressedCallback;
} }
} }

View File

@@ -9,9 +9,8 @@ import android.widget.GridView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmDialogFragment; import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.bookmarks.IconsAdapter; import app.organicmaps.bookmarks.ColorsAdapter;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.sdk.bookmarks.data.Icon;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List; import java.util.List;
@@ -19,11 +18,12 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
{ {
public static final String ICON_TYPE = "ExtraIconType"; public static final String ICON_TYPE = "ExtraIconType";
@PredefinedColors.Color
private int mIconColor; private int mIconColor;
public interface OnBookmarkColorChangeListener public interface OnBookmarkColorChangeListener
{ {
void onBookmarkColorSet(int colorPos); void onBookmarkColorSet(@PredefinedColors.Color int color);
} }
private OnBookmarkColorChangeListener mColorSetListener; private OnBookmarkColorChangeListener mColorSetListener;
@@ -49,19 +49,20 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
mColorSetListener = listener; mColorSetListener = listener;
} }
@NonNull
private View buildView() private View buildView()
{ {
final List<Icon> icons = BookmarkManager.ICONS; final List<Integer> colors = PredefinedColors.getAllPredefinedColors();
final IconsAdapter adapter = new IconsAdapter(requireActivity(), icons); final ColorsAdapter adapter = new ColorsAdapter(requireActivity(), colors);
adapter.chooseItem(mIconColor); adapter.chooseItem(mIconColor);
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
final GridView gView = final GridView gView =
(GridView) LayoutInflater.from(requireActivity()).inflate(R.layout.fragment_color_grid, null); (GridView) LayoutInflater.from(requireActivity()).inflate(R.layout.fragment_color_grid, null);
gView.setAdapter(adapter); gView.setAdapter(adapter);
gView.setOnItemClickListener((arg0, who, pos, id) -> { gView.setOnItemClickListener((parent, view, pos, id) -> {
if (mColorSetListener != null) if (mColorSetListener != null)
mColorSetListener.onBookmarkColorSet(pos); mColorSetListener.onBookmarkColorSet(adapter.getItem(pos));
dismiss(); dismiss();
}); });

View File

@@ -24,6 +24,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
import app.organicmaps.sdk.bookmarks.data.BookmarkInfo; import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.sdk.bookmarks.data.Track; import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics; import app.organicmaps.util.Graphics;
@@ -304,7 +305,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
final Bundle args = new Bundle(); final Bundle args = new Bundle();
if (mTrack != null) if (mTrack != null)
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mTrack.getColor()); args.putInt(BookmarkColorDialogFragment.ICON_TYPE, PredefinedColors.getPredefinedColorIndex(mColor));
else else
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mIcon.getColor()); args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mIcon.getColor());
final FragmentManager manager = getChildFragmentManager(); final FragmentManager manager = getChildFragmentManager();
@@ -317,17 +318,16 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
{ {
case TYPE_BOOKMARK -> case TYPE_BOOKMARK ->
dialogFragment.setOnColorSetListener(colorPos -> { dialogFragment.setOnColorSetListener(colorPos -> {
final Icon newIcon = BookmarkManager.ICONS.get(colorPos); if (mIcon != null && mIcon.getColor() == colorPos)
if (mIcon.getColor() == newIcon.getColor())
return; return;
mIcon = newIcon; mIcon = new Icon(colorPos);
refreshColorMarker(); refreshColorMarker();
}); });
case TYPE_TRACK -> case TYPE_TRACK ->
dialogFragment.setOnColorSetListener(colorPos -> { dialogFragment.setOnColorSetListener(colorPos -> {
int from = mTrack.getColor(); int from = mTrack.getColor();
int to = BookmarkManager.ICONS.get(colorPos).argb(); int to = PredefinedColors.getColor(colorPos);
if (from == to) if (from == to)
return; return;
mColor = to; mColor = to;
@@ -342,9 +342,9 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
{ {
if (mIcon != null) if (mIcon != null)
{ {
Drawable circle = Drawable circle = Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size,
Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size, app.organicmaps.sdk.R.drawable.ic_bookmark_none, app.organicmaps.sdk.R.drawable.ic_bookmark_none,
R.dimen.bookmark_icon_size, requireContext()); R.dimen.bookmark_icon_size, requireContext());
mIvColor.setImageDrawable(circle); mIvColor.setImageDrawable(circle);
} }
} }

View File

@@ -26,6 +26,7 @@ import app.organicmaps.R;
import app.organicmaps.api.Const; import app.organicmaps.api.Const;
import app.organicmaps.intent.Factory; import app.organicmaps.intent.Factory;
import app.organicmaps.routing.RoutingController; import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.ChoosePositionMode;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
@@ -33,7 +34,6 @@ import app.organicmaps.sdk.bookmarks.data.RoadWarningMarkType;
import app.organicmaps.sdk.settings.RoadType; import app.organicmaps.sdk.settings.RoadType;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.ChoosePositionMode;
import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem; import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;

View File

@@ -14,10 +14,10 @@ import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timespan; import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -43,6 +43,8 @@ set(SRC
app/organicmaps/sdk/core/jni_java_methods.cpp app/organicmaps/sdk/core/jni_java_methods.cpp
app/organicmaps/sdk/core/logging.cpp app/organicmaps/sdk/core/logging.cpp
app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp
app/organicmaps/sdk/bookmarks/data/PredefinedColors.cpp
app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp
app/organicmaps/sdk/DownloadResourcesLegacyActivity.cpp app/organicmaps/sdk/DownloadResourcesLegacyActivity.cpp
app/organicmaps/sdk/editor/Editor.cpp app/organicmaps/sdk/editor/Editor.cpp
app/organicmaps/sdk/editor/OpeningHours.cpp app/organicmaps/sdk/editor/OpeningHours.cpp

View File

@@ -532,16 +532,10 @@ Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetTrack(
ASSERT(nTrack, ("Track must not be null with id:)", trackId)); ASSERT(nTrack, ("Track must not be null with id:)", trackId));
dp::Color nColor = nTrack->GetColor(0); return env->NewObject(trackClazz, cId, trackId, static_cast<jlong>(nTrack->GetGroupId()),
jni::ToJavaString(env, nTrack->GetName()),
jint androidColor = shift(nColor.GetAlpha(), 24) + ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())),
shift(nColor.GetRed(), 16) + nTrack->GetColor(0).GetARGB());
shift(nColor.GetGreen(), 8) +
nColor.GetBlue();
return env->NewObject(trackClazz, cId,
trackId, static_cast<jlong>(nTrack->GetGroupId()), jni::ToJavaString(env, nTrack->GetName()),
ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())), androidColor);
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL

View File

@@ -0,0 +1,40 @@
#include "PredefinedColors.hpp"
#include "kml/types.hpp"
#include <array>
extern "C"
{
JNIEXPORT jintArray JNICALL
Java_app_organicmaps_sdk_bookmarks_data_PredefinedColors_nativeGetPredefinedColors(JNIEnv * env, jclass)
{
std::array<jint, static_cast<size_t>(kml::PredefinedColor::Count)> colors{};
for (size_t i = 0; i < static_cast<size_t>(kml::PredefinedColor::Count); ++i)
colors[i] = static_cast<jint>(kml::ColorFromPredefinedColor(static_cast<kml::PredefinedColor>(i)).GetARGB());
jintArray jColors = env->NewIntArray(colors.size());
env->SetIntArrayRegion(jColors, 0, static_cast<jsize>(colors.size()), colors.data());
return jColors;
}
}
namespace
{
JNINativeMethod const methods[] = {
{"nativeGetPredefinedColors", "()[I",
reinterpret_cast<void *>(&Java_app_organicmaps_sdk_bookmarks_data_PredefinedColors_nativeGetPredefinedColors)},
};
}
namespace predefined_colors
{
jint registerNativeMethods(JNIEnv * env)
{
jclass clazz = env->FindClass("app/organicmaps/sdk/bookmarks/data/PredefinedColors");
if (clazz == nullptr)
return JNI_ERR;
return env->RegisterNatives(clazz, methods, std::size(methods));
}
} // namespace predefined_colors

View File

@@ -0,0 +1,8 @@
#pragma once
#include <jni.h>
namespace predefined_colors
{
jint registerNativeMethods(JNIEnv * env);
}

View File

@@ -1,11 +1,13 @@
#include "jni_helper.hpp" #include "jni_helper.hpp"
#include "logging.hpp"
#include "ScopedLocalRef.hpp" #include "ScopedLocalRef.hpp"
#include "logging.hpp"
#include "base/assert.hpp" #include "base/assert.hpp"
#include "base/exception.hpp" #include "base/exception.hpp"
#include "base/string_utils.hpp" #include "base/string_utils.hpp"
#include "app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp"
#include <vector> #include <vector>
static JavaVM * g_jvm = 0; static JavaVM * g_jvm = 0;
@@ -31,21 +33,21 @@ extern "C"
{ {
int __system_property_get(char const * name, char * value); int __system_property_get(char const * name, char * value);
static bool IsAndroidLowerThan7() static bool IsAndroidApiLowerThan(int apiLevel)
{ {
char value[92] = { 0 }; char value[92] = { 0 };
if (__system_property_get("ro.build.version.sdk", value) < 1) if (__system_property_get("ro.build.version.sdk", value) < 1)
return false; return false;
const int apiLevel = atoi(value); int const deviceApiLevel = atoi(value);
if (apiLevel > 0 && apiLevel < 24) if (deviceApiLevel > 0 && deviceApiLevel < apiLevel)
return true; return true;
return false; return false;
} }
static bool const g_isAndroidLowerThan7 = IsAndroidLowerThan7(); static bool const g_isAndroidLowerThan12 = IsAndroidApiLowerThan(30);
static bool const g_isAndroidLowerThan7 = g_isAndroidLowerThan12 && IsAndroidApiLowerThan(24);
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void *)
JNI_OnLoad(JavaVM * jvm, void *)
{ {
g_jvm = jvm; g_jvm = jvm;
jni::InitSystemLog(); jni::InitSystemLog();
@@ -64,6 +66,12 @@ JNI_OnLoad(JavaVM * jvm, void *)
g_networkPolicyClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/NetworkPolicy"); g_networkPolicyClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/NetworkPolicy");
g_elevationInfoClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo"); g_elevationInfoClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo");
if (g_isAndroidLowerThan12)
{
if (predefined_colors::registerNativeMethods(env) != JNI_OK)
return JNI_ERR;
}
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }
@@ -84,7 +92,7 @@ JNI_OnUnload(JavaVM *, void *)
env->DeleteGlobalRef(g_networkPolicyClazz); env->DeleteGlobalRef(g_networkPolicyClazz);
env->DeleteGlobalRef(g_elevationInfoClazz); env->DeleteGlobalRef(g_elevationInfoClazz);
} }
} // extern "C" } // extern "C"
namespace jni namespace jni
{ {

View File

@@ -26,6 +26,11 @@ struct Color
constexpr uint8_t GetBlue() const { return ExtractByte(m_rgba, 1); } constexpr uint8_t GetBlue() const { return ExtractByte(m_rgba, 1); }
constexpr uint8_t GetAlpha() const { return ExtractByte(m_rgba, 0); } constexpr uint8_t GetAlpha() const { return ExtractByte(m_rgba, 0); }
constexpr uint32_t GetRGBA() const { return m_rgba; } constexpr uint32_t GetRGBA() const { return m_rgba; }
constexpr uint32_t GetARGB() const
{
return (static_cast<uint32_t>(GetAlpha()) << 24) | (static_cast<uint32_t>(GetRed()) << 16) |
(static_cast<uint32_t>(GetGreen()) << 8) | static_cast<uint32_t>(GetBlue());
}
constexpr float GetRedF() const { return ChannelToFloat(GetRed()); } constexpr float GetRedF() const { return ChannelToFloat(GetRed()); }
constexpr float GetGreenF() const { return ChannelToFloat(GetGreen()); } constexpr float GetGreenF() const { return ChannelToFloat(GetGreen()); }

View File

@@ -15,7 +15,6 @@
namespace kml namespace kml
{ {
/// @note Important! Should be synced with android/app/src/main/java/app/organicmaps/bookmarks/data/Icon.java
enum class PredefinedColor : uint8_t enum class PredefinedColor : uint8_t
{ {
None = 0, None = 0,