diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java index 32d2152f8..5567715a5 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java @@ -35,6 +35,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult; import app.organicmaps.sdk.bookmarks.data.CategoryDataSource; import app.organicmaps.sdk.bookmarks.data.Icon; 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.Track; import app.organicmaps.sdk.search.BookmarkSearchListener; @@ -592,7 +593,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment { int from = mTrack.getColor(); - int to = BookmarkManager.ICONS.get(colorPos).argb(); + int to = PredefinedColors.getColor(colorPos); if (from == to) return; BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to); diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/IconsAdapter.java b/android/app/src/main/java/app/organicmaps/bookmarks/ColorsAdapter.java similarity index 70% rename from android/app/src/main/java/app/organicmaps/bookmarks/IconsAdapter.java rename to android/app/src/main/java/app/organicmaps/bookmarks/ColorsAdapter.java index 58c16343a..ffcbd3011 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/IconsAdapter.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/ColorsAdapter.java @@ -7,16 +7,18 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import app.organicmaps.R; -import app.organicmaps.sdk.bookmarks.data.Icon; +import app.organicmaps.sdk.bookmarks.data.PredefinedColors; import app.organicmaps.util.Graphics; import com.google.android.material.imageview.ShapeableImageView; import java.util.List; +import java.util.Objects; -public class IconsAdapter extends ArrayAdapter +public class ColorsAdapter extends ArrayAdapter { + @PredefinedColors.Color private int mCheckedIconColor; - public IconsAdapter(Context context, List list) + public ColorsAdapter(Context context, List list) { super(context, 0, 0, list); } @@ -35,19 +37,20 @@ public class IconsAdapter extends ArrayAdapter else holder = (SpinnerViewHolder) convertView.getTag(); - final Icon icon = getItem(position); + @PredefinedColors.Color + final int color = Objects.requireNonNull(getItem(position)); 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, getContext()); } else { - circle = - Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources()); + circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size, + getContext().getResources()); } holder.icon.setImageDrawable(circle); return convertView; diff --git a/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/BookmarkManager.java b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/BookmarkManager.java index ae0fdc7fa..e683d4a56 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/BookmarkManager.java +++ b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/BookmarkManager.java @@ -41,8 +41,6 @@ public enum BookmarkManager { // These values have to match the values of kml::CompilationType from kml/types.hpp public static final int CATEGORY = 0; - public static final List ICONS = new ArrayList<>(); - private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts(); private static final String TAG = BookmarkManager.class.getSimpleName(); @@ -70,26 +68,6 @@ public enum BookmarkManager { @Nullable 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) { boolean isVisible = isVisible(category.getId()); @@ -342,7 +320,7 @@ public enum BookmarkManager { nativeShowBookmarkCategoryOnMap(catId); } - @Icon.PredefinedColor + @PredefinedColors.Color public int getLastEditedColor() { return nativeGetLastEditedColor(); @@ -618,7 +596,7 @@ public enum BookmarkManager { return nativeGetBookmarkXY(bookmarkId); } - @Icon.PredefinedColor + @PredefinedColors.Color public int getBookmarkColor(@IntRange(from = 0) long bookmarkId) { return nativeGetBookmarkColor(bookmarkId); @@ -652,7 +630,7 @@ public enum BookmarkManager { } 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); } @@ -808,7 +786,7 @@ public enum BookmarkManager { @Nullable private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon); - @Icon.PredefinedColor + @PredefinedColors.Color private native int nativeGetLastEditedColor(); private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile); @@ -874,7 +852,7 @@ public enum BookmarkManager { @NonNull 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 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 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, - @Icon.PredefinedColor int color, @NonNull String descr); + @PredefinedColors.Color int color, @NonNull String descr); private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId, @IntRange(from = 0) long newCatId, diff --git a/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/Icon.java b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/Icon.java index ffc3e9252..1d80f0980 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/Icon.java +++ b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/Icon.java @@ -2,71 +2,13 @@ package app.organicmaps.sdk.bookmarks.data; import android.os.Parcel; import android.os.Parcelable; +import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; -import androidx.annotation.IntDef; import app.organicmaps.sdk.R; import com.google.common.base.Objects; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; 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; /// @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 }; - @PredefinedColor + @PredefinedColors.Color private final int mColor; 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; mType = type; @@ -127,25 +74,16 @@ public class Icon implements Parcelable mType = in.readInt(); } - @PredefinedColor + @PredefinedColors.Color public int getColor() { return mColor; } + @ColorInt public int argb() { - return ARGB_COLORS[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; + return PredefinedColors.getColor(mColor); } @DrawableRes diff --git a/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/PredefinedColors.java b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/PredefinedColors.java new file mode 100644 index 000000000..dd9b3fcb0 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/sdk/bookmarks/data/PredefinedColors.java @@ -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 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(); +} diff --git a/android/app/src/main/java/app/organicmaps/widget/SearchToolbarController.java b/android/app/src/main/java/app/organicmaps/widget/SearchToolbarController.java index 12e17bc92..2060dd4e2 100644 --- a/android/app/src/main/java/app/organicmaps/widget/SearchToolbarController.java +++ b/android/app/src/main/java/app/organicmaps/widget/SearchToolbarController.java @@ -240,7 +240,8 @@ public class SearchToolbarController extends ToolbarController implements View.O } @NonNull - public OnBackPressedCallback getBackPressedCallback() { + public OnBackPressedCallback getBackPressedCallback() + { return mBackPressedCallback; } } diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/BookmarkColorDialogFragment.java b/android/app/src/main/java/app/organicmaps/widget/placepage/BookmarkColorDialogFragment.java index a1a966b63..87310f7c8 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/BookmarkColorDialogFragment.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/BookmarkColorDialogFragment.java @@ -9,9 +9,8 @@ import android.widget.GridView; import androidx.annotation.NonNull; import app.organicmaps.R; import app.organicmaps.base.BaseMwmDialogFragment; -import app.organicmaps.bookmarks.IconsAdapter; -import app.organicmaps.sdk.bookmarks.data.BookmarkManager; -import app.organicmaps.sdk.bookmarks.data.Icon; +import app.organicmaps.bookmarks.ColorsAdapter; +import app.organicmaps.sdk.bookmarks.data.PredefinedColors; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.List; @@ -19,11 +18,12 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment { public static final String ICON_TYPE = "ExtraIconType"; + @PredefinedColors.Color private int mIconColor; public interface OnBookmarkColorChangeListener { - void onBookmarkColorSet(int colorPos); + void onBookmarkColorSet(@PredefinedColors.Color int color); } private OnBookmarkColorChangeListener mColorSetListener; @@ -49,19 +49,20 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment mColorSetListener = listener; } + @NonNull private View buildView() { - final List icons = BookmarkManager.ICONS; - final IconsAdapter adapter = new IconsAdapter(requireActivity(), icons); + final List colors = PredefinedColors.getAllPredefinedColors(); + final ColorsAdapter adapter = new ColorsAdapter(requireActivity(), colors); adapter.chooseItem(mIconColor); @SuppressLint("InflateParams") final GridView gView = (GridView) LayoutInflater.from(requireActivity()).inflate(R.layout.fragment_color_grid, null); gView.setAdapter(adapter); - gView.setOnItemClickListener((arg0, who, pos, id) -> { + gView.setOnItemClickListener((parent, view, predefinedColor, id) -> { if (mColorSetListener != null) - mColorSetListener.onBookmarkColorSet(pos); + mColorSetListener.onBookmarkColorSet(predefinedColor); dismiss(); }); diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java b/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java index 2bcfee1ee..ec586ffaf 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java @@ -24,6 +24,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; import app.organicmaps.sdk.bookmarks.data.BookmarkInfo; import app.organicmaps.sdk.bookmarks.data.BookmarkManager; 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.util.UiUtils; import app.organicmaps.util.Graphics; @@ -304,7 +305,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. final Bundle args = new Bundle(); if (mTrack != null) - args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mTrack.getColor()); + args.putInt(BookmarkColorDialogFragment.ICON_TYPE, PredefinedColors.getPredefinedColorIndex(mColor)); else args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mIcon.getColor()); final FragmentManager manager = getChildFragmentManager(); @@ -317,17 +318,16 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. { case TYPE_BOOKMARK -> dialogFragment.setOnColorSetListener(colorPos -> { - final Icon newIcon = BookmarkManager.ICONS.get(colorPos); - if (mIcon.getColor() == newIcon.getColor()) + if (mIcon != null & mIcon.getColor() == colorPos) return; - mIcon = newIcon; + mIcon = new Icon(colorPos); refreshColorMarker(); }); case TYPE_TRACK -> dialogFragment.setOnColorSetListener(colorPos -> { int from = mTrack.getColor(); - int to = BookmarkManager.ICONS.get(colorPos).argb(); + int to = PredefinedColors.getColor(colorPos); if (from == to) return; mColor = to; @@ -342,9 +342,9 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. { if (mIcon != null) { - Drawable circle = - Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size, app.organicmaps.sdk.R.drawable.ic_bookmark_none, - R.dimen.bookmark_icon_size, requireContext()); + Drawable circle = Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size, + app.organicmaps.sdk.R.drawable.ic_bookmark_none, + R.dimen.bookmark_icon_size, requireContext()); mIvColor.setImageDrawable(circle); } } diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java index 086b6d668..c8de26b72 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java @@ -26,6 +26,7 @@ import app.organicmaps.R; import app.organicmaps.api.Const; import app.organicmaps.intent.Factory; import app.organicmaps.routing.RoutingController; +import app.organicmaps.sdk.ChoosePositionMode; import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.bookmarks.data.BookmarkManager; 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.util.UiUtils; import app.organicmaps.sdk.util.log.Logger; -import app.organicmaps.sdk.ChoosePositionMode; import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetItem; diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageOpeningHoursFragment.java b/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageOpeningHoursFragment.java index 060cdea8a..e227ff2dd 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageOpeningHoursFragment.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageOpeningHoursFragment.java @@ -14,10 +14,10 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import app.organicmaps.R; +import app.organicmaps.editor.data.TimeFormatUtils; import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.Metadata; 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.Timetable; import app.organicmaps.sdk.util.UiUtils; diff --git a/android/sdk/src/main/cpp/CMakeLists.txt b/android/sdk/src/main/cpp/CMakeLists.txt index 770e2682a..4efbd8135 100644 --- a/android/sdk/src/main/cpp/CMakeLists.txt +++ b/android/sdk/src/main/cpp/CMakeLists.txt @@ -43,6 +43,8 @@ set(SRC app/organicmaps/sdk/core/jni_java_methods.cpp app/organicmaps/sdk/core/logging.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/editor/Editor.cpp app/organicmaps/sdk/editor/OpeningHours.cpp diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp index 69c99079b..8048629be 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp @@ -532,16 +532,10 @@ Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetTrack( ASSERT(nTrack, ("Track must not be null with id:)", trackId)); - dp::Color nColor = nTrack->GetColor(0); - - jint androidColor = shift(nColor.GetAlpha(), 24) + - shift(nColor.GetRed(), 16) + - shift(nColor.GetGreen(), 8) + - nColor.GetBlue(); - - return env->NewObject(trackClazz, cId, - trackId, static_cast(nTrack->GetGroupId()), jni::ToJavaString(env, nTrack->GetName()), - ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())), androidColor); + return env->NewObject(trackClazz, cId, trackId, static_cast(nTrack->GetGroupId()), + jni::ToJavaString(env, nTrack->GetName()), + ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())), + nTrack->GetColor(0).GetARGB()); } JNIEXPORT jlong JNICALL diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.cpp new file mode 100644 index 000000000..c038a1330 --- /dev/null +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.cpp @@ -0,0 +1,40 @@ +#include "PredefinedColors.hpp" + +#include "kml/types.hpp" + +#include + +extern "C" +{ +JNIEXPORT jintArray JNICALL +Java_app_organicmaps_sdk_bookmarks_data_PredefinedColors_nativeGetPredefinedColors(JNIEnv * env, jclass) +{ + std::array(kml::PredefinedColor::Count)> colors{}; + for (size_t i = 0; i < static_cast(kml::PredefinedColor::Count); ++i) + colors[i] = static_cast(kml::ColorFromPredefinedColor(static_cast(i)).GetARGB()); + + jintArray jColors = env->NewIntArray(colors.size()); + env->SetIntArrayRegion(jColors, 0, static_cast(colors.size()), colors.data()); + return jColors; +} +} + +namespace +{ +JNINativeMethod const methods[] = { + {"nativeGetPredefinedColors", "()[I", + reinterpret_cast(&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 diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp new file mode 100644 index 000000000..0296558b6 --- /dev/null +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace predefined_colors +{ +jint registerNativeMethods(JNIEnv * env); +} diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.cpp index 9050f7823..05a8700bf 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.cpp @@ -1,11 +1,13 @@ #include "jni_helper.hpp" -#include "logging.hpp" #include "ScopedLocalRef.hpp" +#include "logging.hpp" #include "base/assert.hpp" #include "base/exception.hpp" #include "base/string_utils.hpp" +#include "app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp" + #include static JavaVM * g_jvm = 0; @@ -31,21 +33,21 @@ extern "C" { int __system_property_get(char const * name, char * value); -static bool IsAndroidLowerThan7() +static bool IsAndroidApiLowerThan(int apiLevel) { char value[92] = { 0 }; if (__system_property_get("ro.build.version.sdk", value) < 1) return false; - const int apiLevel = atoi(value); - if (apiLevel > 0 && apiLevel < 24) + int const deviceApiLevel = atoi(value); + if (deviceApiLevel > 0 && deviceApiLevel < apiLevel) return true; 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 -JNI_OnLoad(JavaVM * jvm, void *) +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void *) { g_jvm = jvm; jni::InitSystemLog(); @@ -64,6 +66,12 @@ JNI_OnLoad(JavaVM * jvm, void *) g_networkPolicyClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/NetworkPolicy"); 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; } @@ -84,7 +92,7 @@ JNI_OnUnload(JavaVM *, void *) env->DeleteGlobalRef(g_networkPolicyClazz); env->DeleteGlobalRef(g_elevationInfoClazz); } -} // extern "C" +} // extern "C" namespace jni { diff --git a/drape/color.hpp b/drape/color.hpp index 20967dfe3..b74466334 100644 --- a/drape/color.hpp +++ b/drape/color.hpp @@ -26,6 +26,11 @@ struct Color constexpr uint8_t GetBlue() const { return ExtractByte(m_rgba, 1); } constexpr uint8_t GetAlpha() const { return ExtractByte(m_rgba, 0); } constexpr uint32_t GetRGBA() const { return m_rgba; } + constexpr uint32_t GetARGB() const + { + return (static_cast(GetAlpha()) << 24) | (static_cast(GetRed()) << 16) | + (static_cast(GetGreen()) << 8) | static_cast(GetBlue()); + } constexpr float GetRedF() const { return ChannelToFloat(GetRed()); } constexpr float GetGreenF() const { return ChannelToFloat(GetGreen()); } diff --git a/kml/types.hpp b/kml/types.hpp index b65b73353..c4ad8deb1 100644 --- a/kml/types.hpp +++ b/kml/types.hpp @@ -15,7 +15,6 @@ namespace kml { -/// @note Important! Should be synced with android/app/src/main/java/app/organicmaps/bookmarks/data/Icon.java enum class PredefinedColor : uint8_t { None = 0,