Format all C++ and Java code via clang-format

Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
This commit is contained in:
Konstantin Pastbin
2025-08-17 14:32:37 +07:00
parent 9f0290c0ec
commit bfffa1fff4
2169 changed files with 56441 additions and 64188 deletions

View File

@@ -150,14 +150,12 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
switch (item.newStatus) switch (item.newStatus)
{ {
case CountryItem.STATUS_DONE: case CountryItem.STATUS_DONE:
mAreResourcesDownloaded = true; mAreResourcesDownloaded = true;
showMap(); showMap();
return; return;
case CountryItem.STATUS_FAILED: case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
MapManager.showError(DownloadResourcesLegacyActivity.this, item, null);
return;
} }
} }
} }

View File

@@ -163,24 +163,24 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
int pointerIndex = event.getActionIndex(); int pointerIndex = event.getActionIndex();
switch (action) switch (action)
{ {
case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP; case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP;
case MotionEvent.ACTION_UP -> case MotionEvent.ACTION_UP ->
{ {
action = Map.NATIVE_ACTION_UP; action = Map.NATIVE_ACTION_UP;
pointerIndex = 0; pointerIndex = 0;
} }
case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN; case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN;
case MotionEvent.ACTION_DOWN -> case MotionEvent.ACTION_DOWN ->
{ {
action = Map.NATIVE_ACTION_DOWN; action = Map.NATIVE_ACTION_DOWN;
pointerIndex = 0; pointerIndex = 0;
} }
case MotionEvent.ACTION_MOVE -> case MotionEvent.ACTION_MOVE ->
{ {
action = Map.NATIVE_ACTION_MOVE; action = Map.NATIVE_ACTION_MOVE;
pointerIndex = Map.INVALID_POINTER_MASK; pointerIndex = Map.INVALID_POINTER_MASK;
} }
case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL; case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL;
} }
Map.onTouch(action, event, pointerIndex); Map.onTouch(action, event, pointerIndex);
return true; return true;

View File

@@ -683,29 +683,29 @@ public class MwmActivity extends BaseMwmFragmentActivity
mPointChooser.findViewById(R.id.done).setOnClickListener(v -> { mPointChooser.findViewById(R.id.done).setOnClickListener(v -> {
switch (ChoosePositionMode.get()) switch (ChoosePositionMode.get())
{ {
case Api: case Api:
final Intent apiResult = new Intent(); final Intent apiResult = new Intent();
final double[] center = Framework.nativeGetScreenRectCenter(); final double[] center = Framework.nativeGetScreenRectCenter();
apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]); apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]); apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale()); apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
setResult(Activity.RESULT_OK, apiResult); setResult(Activity.RESULT_OK, apiResult);
finish(); finish();
break; break;
case Editor: case Editor:
if (Framework.nativeIsDownloadedMapAtScreenCenter()) if (Framework.nativeIsDownloadedMapAtScreenCenter())
startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class)); startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
else else
{ {
dismissAlertDialog(); dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.message_invalid_feature_position) .setTitle(R.string.message_invalid_feature_position)
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setOnDismissListener(dialog -> mAlertDialog = null) .setOnDismissListener(dialog -> mAlertDialog = null)
.show(); .show();
} }
break; break;
case None: throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()"); case None: throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
} }
closePositionChooser(); closePositionChooser();
}); });
@@ -972,24 +972,24 @@ public class MwmActivity extends BaseMwmFragmentActivity
{ {
switch (button) switch (button)
{ {
case zoomIn -> Map.zoomIn(); case zoomIn -> Map.zoomIn();
case zoomOut -> Map.zoomOut(); case zoomOut -> Map.zoomOut();
case myPosition -> case myPosition ->
{ {
Logger.i(LOCATION_TAG, "The location button pressed"); Logger.i(LOCATION_TAG, "The location button pressed");
// Calls onMyPositionModeChanged(mode + 1). // Calls onMyPositionModeChanged(mode + 1).
LocationState.nativeSwitchToNextMode(); LocationState.nativeSwitchToNextMode();
} }
case toggleMapLayer -> toggleMapLayerBottomSheet(); case toggleMapLayer -> toggleMapLayerBottomSheet();
case bookmarks -> showBookmarks(); case bookmarks -> showBookmarks();
case search -> showSearch(""); case search -> showSearch("");
case menu -> case menu ->
{ {
closeFloatingPanels(); closeFloatingPanels();
showBottomSheet(MAIN_MENU_ID); showBottomSheet(MAIN_MENU_ID);
} }
case help -> showHelp(); case help -> showHelp();
case trackRecordingStatus -> showTrackSaveDialog(); case trackRecordingStatus -> showTrackSaveDialog();
} }
} }
@@ -2429,18 +2429,18 @@ public class MwmActivity extends BaseMwmFragmentActivity
{ {
switch (keyCode) switch (keyCode)
{ {
case KeyEvent.KEYCODE_DPAD_DOWN: Map.zoomOut(); return true; case KeyEvent.KEYCODE_DPAD_DOWN: Map.zoomOut(); return true;
case KeyEvent.KEYCODE_DPAD_UP: Map.zoomIn(); return true; case KeyEvent.KEYCODE_DPAD_UP: Map.zoomIn(); return true;
case KeyEvent.KEYCODE_ESCAPE: case KeyEvent.KEYCODE_ESCAPE:
final Intent currIntent = getIntent(); final Intent currIntent = getIntent();
final String backUrl = Framework.nativeGetParsedBackUrl(); final String backUrl = Framework.nativeGetParsedBackUrl();
if (TextUtils.isEmpty(backUrl) || (currIntent != null && Factory.isStartedForApiResult(currIntent))) if (TextUtils.isEmpty(backUrl) || (currIntent != null && Factory.isStartedForApiResult(currIntent)))
{ {
finish(); finish();
return true; return true;
} }
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
default: return super.onKeyUp(keyCode, event); default: return super.onKeyUp(keyCode, event);
} }
} }

View File

@@ -62,39 +62,39 @@ public class LocalBackupManager implements BookmarkManager.BookmarksSharingListe
ErrorCode errorCode = null; ErrorCode errorCode = null;
switch (result.getCode()) switch (result.getCode())
{ {
case BookmarkSharingResult.SUCCESS -> case BookmarkSharingResult.SUCCESS ->
{ {
if (!saveBackup(result)) if (!saveBackup(result))
{
Logger.e(TAG, "Failed to save backup. See system log above");
errorCode = ErrorCode.FILE_ERROR;
}
else
{
Logger.i(TAG, "Backup was created and saved successfully");
}
}
case BookmarkSharingResult.EMPTY_CATEGORY ->
{
errorCode = ErrorCode.EMPTY_CATEGORY;
Logger.e(TAG, "Failed to create backup. Category is empty");
}
case BookmarkSharingResult.ARCHIVE_ERROR ->
{
errorCode = ErrorCode.ARCHIVE_ERROR;
Logger.e(TAG, "Failed to create archive of bookmarks");
}
case BookmarkSharingResult.FILE_ERROR ->
{ {
Logger.e(TAG, "Failed to save backup. See system log above");
errorCode = ErrorCode.FILE_ERROR; errorCode = ErrorCode.FILE_ERROR;
Logger.e(TAG, "Failed create file for archive");
} }
default -> else
{ {
errorCode = ErrorCode.UNSUPPORTED; Logger.i(TAG, "Backup was created and saved successfully");
Logger.e(TAG, "Failed to create backup. Unknown error");
} }
} }
case BookmarkSharingResult.EMPTY_CATEGORY ->
{
errorCode = ErrorCode.EMPTY_CATEGORY;
Logger.e(TAG, "Failed to create backup. Category is empty");
}
case BookmarkSharingResult.ARCHIVE_ERROR ->
{
errorCode = ErrorCode.ARCHIVE_ERROR;
Logger.e(TAG, "Failed to create archive of bookmarks");
}
case BookmarkSharingResult.FILE_ERROR ->
{
errorCode = ErrorCode.FILE_ERROR;
Logger.e(TAG, "Failed create file for archive");
}
default ->
{
errorCode = ErrorCode.UNSUPPORTED;
Logger.e(TAG, "Failed to create backup. Unknown error");
}
}
ErrorCode finalErrorCode = errorCode; ErrorCode finalErrorCode = errorCode;
UiThread.run(() -> { UiThread.run(() -> {

View File

@@ -66,47 +66,47 @@ public class BookmarkCategoriesAdapter extends BaseBookmarkCategoryAdapter<Recyc
LayoutInflater inflater = LayoutInflater.from(parent.getContext()); LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) switch (viewType)
{ {
case TYPE_ACTION_HEADER -> case TYPE_ACTION_HEADER ->
{ {
View header = inflater.inflate(R.layout.item_bookmark_group_list_header, parent, false); View header = inflater.inflate(R.layout.item_bookmark_group_list_header, parent, false);
return new HeaderViewHolder(header); return new HeaderViewHolder(header);
} }
case TYPE_CATEGORY_ITEM -> case TYPE_CATEGORY_ITEM ->
{ {
View view = inflater.inflate(R.layout.item_bookmark_category, parent, false); View view = inflater.inflate(R.layout.item_bookmark_category, parent, false);
final CategoryViewHolder holder = new CategoryViewHolder(view); final CategoryViewHolder holder = new CategoryViewHolder(view);
view.setOnClickListener(new CategoryItemClickListener(holder)); view.setOnClickListener(new CategoryItemClickListener(holder));
view.setOnLongClickListener(new LongClickListener(holder)); view.setOnLongClickListener(new LongClickListener(holder));
return holder; return holder;
} }
case TYPE_ACTION_ADD -> case TYPE_ACTION_ADD ->
{ {
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false); View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
item.setOnClickListener(v -> { item.setOnClickListener(v -> {
if (mCategoryListCallback != null) if (mCategoryListCallback != null)
mCategoryListCallback.onAddButtonClick(); mCategoryListCallback.onAddButtonClick();
}); });
return new Holders.GeneralViewHolder(item); return new Holders.GeneralViewHolder(item);
} }
case TYPE_ACTION_IMPORT -> case TYPE_ACTION_IMPORT ->
{ {
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false); View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
item.setOnClickListener(v -> { item.setOnClickListener(v -> {
if (mCategoryListCallback != null) if (mCategoryListCallback != null)
mCategoryListCallback.onImportButtonClick(); mCategoryListCallback.onImportButtonClick();
}); });
return new Holders.GeneralViewHolder(item); return new Holders.GeneralViewHolder(item);
} }
case TYPE_ACTION_EXPORT_ALL_AS_KMZ -> case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
{ {
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false); View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
item.setOnClickListener(v -> { item.setOnClickListener(v -> {
if (mCategoryListCallback != null) if (mCategoryListCallback != null)
mCategoryListCallback.onExportButtonClick(); mCategoryListCallback.onExportButtonClick();
}); });
return new Holders.GeneralViewHolder(item); return new Holders.GeneralViewHolder(item);
} }
default -> throw new AssertionError("Invalid item type: " + viewType); default -> throw new AssertionError("Invalid item type: " + viewType);
} }
} }
@@ -116,44 +116,44 @@ public class BookmarkCategoriesAdapter extends BaseBookmarkCategoryAdapter<Recyc
int type = getItemViewType(position); int type = getItemViewType(position);
switch (type) switch (type)
{ {
case TYPE_ACTION_HEADER -> case TYPE_ACTION_HEADER ->
{ {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.setAction(mMassOperationAction, BookmarkManager.INSTANCE.areAllCategoriesInvisible()); headerViewHolder.setAction(mMassOperationAction, BookmarkManager.INSTANCE.areAllCategoriesInvisible());
headerViewHolder.getText().setText(R.string.bookmark_lists); headerViewHolder.getText().setText(R.string.bookmark_lists);
} }
case TYPE_CATEGORY_ITEM -> case TYPE_CATEGORY_ITEM ->
{ {
final BookmarkCategory category = getCategoryByPosition(toCategoryPosition(position)); final BookmarkCategory category = getCategoryByPosition(toCategoryPosition(position));
CategoryViewHolder categoryHolder = (CategoryViewHolder) holder; CategoryViewHolder categoryHolder = (CategoryViewHolder) holder;
categoryHolder.setEntity(category); categoryHolder.setEntity(category);
categoryHolder.setName(category.getName()); categoryHolder.setName(category.getName());
categoryHolder.setSize(); categoryHolder.setSize();
categoryHolder.setVisibilityState(category.isVisible()); categoryHolder.setVisibilityState(category.isVisible());
ToggleVisibilityClickListener visibilityListener = new ToggleVisibilityClickListener(categoryHolder); ToggleVisibilityClickListener visibilityListener = new ToggleVisibilityClickListener(categoryHolder);
categoryHolder.setVisibilityListener(visibilityListener); categoryHolder.setVisibilityListener(visibilityListener);
CategoryItemMoreClickListener moreClickListener = new CategoryItemMoreClickListener(categoryHolder); CategoryItemMoreClickListener moreClickListener = new CategoryItemMoreClickListener(categoryHolder);
categoryHolder.setMoreButtonClickListener(moreClickListener); categoryHolder.setMoreButtonClickListener(moreClickListener);
} }
case TYPE_ACTION_ADD -> case TYPE_ACTION_ADD ->
{ {
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder; Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
generalViewHolder.getImage().setImageResource(R.drawable.ic_add_list); generalViewHolder.getImage().setImageResource(R.drawable.ic_add_list);
generalViewHolder.getText().setText(R.string.bookmarks_create_new_group); generalViewHolder.getText().setText(R.string.bookmarks_create_new_group);
} }
case TYPE_ACTION_IMPORT -> case TYPE_ACTION_IMPORT ->
{ {
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder; Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
generalViewHolder.getImage().setImageResource(R.drawable.ic_import); generalViewHolder.getImage().setImageResource(R.drawable.ic_import);
generalViewHolder.getText().setText(R.string.bookmarks_import); generalViewHolder.getText().setText(R.string.bookmarks_import);
} }
case TYPE_ACTION_EXPORT_ALL_AS_KMZ -> case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
{ {
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder; Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
generalViewHolder.getImage().setImageResource(R.drawable.ic_export); generalViewHolder.getImage().setImageResource(R.drawable.ic_export);
generalViewHolder.getText().setText(R.string.bookmarks_export); generalViewHolder.getText().setText(R.string.bookmarks_export);
} }
default -> throw new AssertionError("Invalid item type: " + type); default -> throw new AssertionError("Invalid item type: " + type);
} }
} }

View File

@@ -442,37 +442,37 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
Holders.BaseBookmarkHolder holder = null; Holders.BaseBookmarkHolder holder = null;
switch (viewType) switch (viewType)
{ {
case TYPE_TRACK: case TYPE_TRACK:
Holders.TrackViewHolder trackHolder = Holders.TrackViewHolder trackHolder =
new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track, parent, false)); new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track, parent, false));
trackHolder.setOnClickListener(mClickListener); trackHolder.setOnClickListener(mClickListener);
trackHolder.setOnLongClickListener(mLongClickListener); trackHolder.setOnLongClickListener(mLongClickListener);
trackHolder.setTrackIconClickListener(mIconClickListener); trackHolder.setTrackIconClickListener(mIconClickListener);
trackHolder.setMoreButtonClickListener(mMoreClickListener); trackHolder.setMoreButtonClickListener(mMoreClickListener);
holder = trackHolder; holder = trackHolder;
break; break;
case TYPE_BOOKMARK: case TYPE_BOOKMARK:
Holders.BookmarkViewHolder bookmarkHolder = Holders.BookmarkViewHolder bookmarkHolder =
new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark, parent, false)); new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark, parent, false));
bookmarkHolder.setOnClickListener(mClickListener); bookmarkHolder.setOnClickListener(mClickListener);
bookmarkHolder.setOnLongClickListener(mLongClickListener); bookmarkHolder.setOnLongClickListener(mLongClickListener);
holder = bookmarkHolder; holder = bookmarkHolder;
break; break;
case TYPE_SECTION: case TYPE_SECTION:
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false); MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
holder = new Holders.SectionViewHolder(tv); holder = new Holders.SectionViewHolder(tv);
break; break;
case TYPE_DESC: case TYPE_DESC:
View desc = inflater.inflate(R.layout.item_category_description, parent, false); View desc = inflater.inflate(R.layout.item_category_description, parent, false);
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn); MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
MaterialTextView text = desc.findViewById(R.id.text); MaterialTextView text = desc.findViewById(R.id.text);
MaterialTextView title = desc.findViewById(R.id.title); MaterialTextView title = desc.findViewById(R.id.title);
setMoreButtonVisibility(text, moreBtn); setMoreButtonVisibility(text, moreBtn);
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory()); holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn)); text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn)); moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn)); title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
break; break;
} }
if (holder == null) if (holder == null)

View File

@@ -552,12 +552,12 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
switch (adapter.getItemViewType(position)) switch (adapter.getItemViewType(position))
{ {
case BookmarkListAdapter.TYPE_SECTION, BookmarkListAdapter.TYPE_DESC -> case BookmarkListAdapter.TYPE_SECTION, BookmarkListAdapter.TYPE_DESC ->
{ {
return; return;
} }
case BookmarkListAdapter.TYPE_BOOKMARK -> onBookmarkClicked(position, intent, adapter); case BookmarkListAdapter.TYPE_BOOKMARK -> onBookmarkClicked(position, intent, adapter);
case BookmarkListAdapter.TYPE_TRACK -> onTrackClicked(position, intent, adapter); case BookmarkListAdapter.TYPE_TRACK -> onTrackClicked(position, intent, adapter);
} }
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
@@ -622,22 +622,22 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
switch (type) switch (type)
{ {
case BookmarkListAdapter.TYPE_SECTION: case BookmarkListAdapter.TYPE_SECTION:
case BookmarkListAdapter.TYPE_DESC: case BookmarkListAdapter.TYPE_DESC:
// Do nothing here? // Do nothing here?
break; break;
case BookmarkListAdapter.TYPE_BOOKMARK: case BookmarkListAdapter.TYPE_BOOKMARK:
final BookmarkInfo bookmark = (BookmarkInfo) adapter.getItem(mSelectedPosition); final BookmarkInfo bookmark = (BookmarkInfo) adapter.getItem(mSelectedPosition);
MenuBottomSheetFragment.newInstance(BOOKMARKS_MENU_ID, bookmark.getName()) MenuBottomSheetFragment.newInstance(BOOKMARKS_MENU_ID, bookmark.getName())
.show(getChildFragmentManager(), BOOKMARKS_MENU_ID); .show(getChildFragmentManager(), BOOKMARKS_MENU_ID);
break; break;
case BookmarkListAdapter.TYPE_TRACK: case BookmarkListAdapter.TYPE_TRACK:
final Track track = (Track) adapter.getItem(mSelectedPosition); final Track track = (Track) adapter.getItem(mSelectedPosition);
MenuBottomSheetFragment.newInstance(TRACK_MENU_ID, track.getName()) MenuBottomSheetFragment.newInstance(TRACK_MENU_ID, track.getName())
.show(getChildFragmentManager(), TRACK_MENU_ID); .show(getChildFragmentManager(), TRACK_MENU_ID);
break; break;
} }
} }
@@ -844,19 +844,19 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
{ {
switch (id) switch (id)
{ {
case BOOKMARKS_MENU_ID -> case BOOKMARKS_MENU_ID ->
{ {
return getBookmarkMenuItems(); return getBookmarkMenuItems();
} }
case TRACK_MENU_ID -> case TRACK_MENU_ID ->
{ {
final Track track = (Track) getBookmarkListAdapter().getItem(mSelectedPosition); final Track track = (Track) getBookmarkListAdapter().getItem(mSelectedPosition);
return getTrackMenuItems(track); return getTrackMenuItems(track);
} }
case OPTIONS_MENU_ID -> case OPTIONS_MENU_ID ->
{ {
return getOptionsMenuItems(); return getOptionsMenuItems();
} }
} }
return null; return null;
} }

View File

@@ -57,27 +57,27 @@ public enum BookmarksSharingHelper
switch (result.getCode()) switch (result.getCode())
{ {
case BookmarkSharingResult.SUCCESS -> case BookmarkSharingResult.SUCCESS ->
SharingUtils.shareBookmarkFile(context, launcher, result.getSharingPath(), result.getMimeType()); SharingUtils.shareBookmarkFile(context, launcher, result.getSharingPath(), result.getMimeType());
case BookmarkSharingResult.EMPTY_CATEGORY -> case BookmarkSharingResult.EMPTY_CATEGORY ->
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog) new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.bookmarks_error_title_share_empty) .setTitle(R.string.bookmarks_error_title_share_empty)
.setMessage(R.string.bookmarks_error_message_share_empty) .setMessage(R.string.bookmarks_error_message_share_empty)
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.show(); .show();
case BookmarkSharingResult.ARCHIVE_ERROR, BookmarkSharingResult.FILE_ERROR -> case BookmarkSharingResult.ARCHIVE_ERROR, BookmarkSharingResult.FILE_ERROR ->
{ {
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog) new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.dialog_routing_system_error) .setTitle(R.string.dialog_routing_system_error)
.setMessage(R.string.bookmarks_error_message_share_general) .setMessage(R.string.bookmarks_error_message_share_general)
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.show(); .show();
List<String> names = new ArrayList<>(); List<String> names = new ArrayList<>();
for (long categoryId : result.getCategoriesIds()) for (long categoryId : result.getCategoriesIds())
names.add(BookmarkManager.INSTANCE.getCategoryById(categoryId).getName()); names.add(BookmarkManager.INSTANCE.getCategoryById(categoryId).getName());
Logger.e(TAG, "Failed to share bookmark categories " + names + ", error code: " + result.getCode()); Logger.e(TAG, "Failed to share bookmark categories " + names + ", error code: " + result.getCode());
} }
default -> throw new AssertionError("Unsupported bookmark sharing code: " + result.getCode()); default -> throw new AssertionError("Unsupported bookmark sharing code: " + result.getCode());
} }
} }

View File

@@ -64,10 +64,10 @@ public class ChooseBookmarksSortingTypeFragment
{ {
switch (sortingType) switch (sortingType)
{ {
case BookmarkManager.SORT_BY_TYPE: return R.id.sort_by_type; case BookmarkManager.SORT_BY_TYPE: return R.id.sort_by_type;
case BookmarkManager.SORT_BY_DISTANCE: return R.id.sort_by_distance; case BookmarkManager.SORT_BY_DISTANCE: return R.id.sort_by_distance;
case BookmarkManager.SORT_BY_TIME: return R.id.sort_by_time; case BookmarkManager.SORT_BY_TIME: return R.id.sort_by_time;
case BookmarkManager.SORT_BY_NAME: return R.id.sort_by_name; case BookmarkManager.SORT_BY_NAME: return R.id.sort_by_name;
} }
} }
return R.id.sort_by_default; return R.id.sort_by_default;

View File

@@ -62,29 +62,29 @@ public final class SearchUiHelpers
CarColor color = Colors.DEFAULT; CarColor color = Colors.DEFAULT;
switch (searchResult.description.openNow) switch (searchResult.description.openNow)
{ {
case SearchResult.OPEN_NOW_YES: case SearchResult.OPEN_NOW_YES:
if (searchResult.description.minutesUntilClosed < 60) // less than 1 hour if (searchResult.description.minutesUntilClosed < 60) // less than 1 hour
{ {
final String time = searchResult.description.minutesUntilClosed + " " + carContext.getString(R.string.minute); final String time = searchResult.description.minutesUntilClosed + " " + carContext.getString(R.string.minute);
text = carContext.getString(R.string.closes_in, time); text = carContext.getString(R.string.closes_in, time);
color = Colors.OPENING_HOURS_CLOSES_SOON; color = Colors.OPENING_HOURS_CLOSES_SOON;
} }
else else
{ {
text = carContext.getString(R.string.editor_time_open); text = carContext.getString(R.string.editor_time_open);
color = Colors.OPENING_HOURS_OPEN; color = Colors.OPENING_HOURS_OPEN;
} }
break; break;
case SearchResult.OPEN_NOW_NO: case SearchResult.OPEN_NOW_NO:
if (searchResult.description.minutesUntilOpen < 60) // less than 1 hour if (searchResult.description.minutesUntilOpen < 60) // less than 1 hour
{ {
final String time = searchResult.description.minutesUntilOpen + " " + carContext.getString(R.string.minute); final String time = searchResult.description.minutesUntilOpen + " " + carContext.getString(R.string.minute);
text = carContext.getString(R.string.opens_in, time); text = carContext.getString(R.string.opens_in, time);
} }
else else
text = carContext.getString(R.string.closed); text = carContext.getString(R.string.closed);
color = Colors.OPENING_HOURS_CLOSED; color = Colors.OPENING_HOURS_CLOSED;
break; break;
} }
result.append(text); result.append(text);

View File

@@ -65,36 +65,36 @@ public final class IntentUtils
final ScreenManager screenManager = carContext.getCarService(ScreenManager.class); final ScreenManager screenManager = carContext.getCarService(ScreenManager.class);
switch (Framework.nativeParseAndSetApiUrl(uri.toString())) switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
{ {
case RequestType.INCORRECT: return; case RequestType.INCORRECT: return;
case RequestType.MAP: case RequestType.MAP:
screenManager.popToRoot(); screenManager.popToRoot();
Map.executeMapApiRequest(); Map.executeMapApiRequest();
return; return;
case RequestType.SEARCH: case RequestType.SEARCH:
screenManager.popToRoot(); screenManager.popToRoot();
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest(); final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
final double[] latlon = Framework.nativeGetParsedCenterLatLon(); final double[] latlon = Framework.nativeGetParsedCenterLatLon();
if (latlon != null) if (latlon != null)
{ {
Framework.nativeStopLocationFollow(); Framework.nativeStopLocationFollow();
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM); Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
// We need to update viewport for search api manually because of drape engine // We need to update viewport for search api manually because of drape engine
// will not notify subscribers when search activity is shown. // will not notify subscribers when search activity is shown.
if (!request.mIsSearchOnMap) if (!request.mIsSearchOnMap)
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM); Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
} }
final SearchScreen.Builder builder = new SearchScreen.Builder(carContext, surfaceRenderer); final SearchScreen.Builder builder = new SearchScreen.Builder(carContext, surfaceRenderer);
builder.setQuery(request.mQuery); builder.setQuery(request.mQuery);
if (request.mLocale != null) if (request.mLocale != null)
builder.setLocale(request.mLocale); builder.setLocale(request.mLocale);
screenManager.popToRoot(); screenManager.popToRoot();
screenManager.push(builder.build()); screenManager.push(builder.build());
return; return;
case RequestType.ROUTE: Logger.e(TAG, "Route API is not supported by Android Auto: " + uri); return; case RequestType.ROUTE: Logger.e(TAG, "Route API is not supported by Android Auto: " + uri); return;
case RequestType.CROSSHAIR: Logger.e(TAG, "Crosshair API is not supported by Android Auto: " + uri); return; case RequestType.CROSSHAIR: Logger.e(TAG, "Crosshair API is not supported by Android Auto: " + uri); return;
case RequestType.MENU: Logger.e(TAG, "Menu API is not supported by Android Auto: " + uri); return; case RequestType.MENU: Logger.e(TAG, "Menu API is not supported by Android Auto: " + uri); return;
case RequestType.SETTINGS: Logger.e(TAG, "Settings API is not supported by Android Auto: " + uri); case RequestType.SETTINGS: Logger.e(TAG, "Settings API is not supported by Android Auto: " + uri);
} }
} }

View File

@@ -171,20 +171,20 @@ public final class UiHelpers
int drawableRes; int drawableRes;
switch (locationMode) switch (locationMode)
{ {
case LocationState.PENDING_POSITION, LocationState.NOT_FOLLOW_NO_POSITION -> case LocationState.PENDING_POSITION, LocationState.NOT_FOLLOW_NO_POSITION ->
drawableRes = R.drawable.ic_location_off; drawableRes = R.drawable.ic_location_off;
case LocationState.NOT_FOLLOW -> drawableRes = R.drawable.ic_not_follow; case LocationState.NOT_FOLLOW -> drawableRes = R.drawable.ic_not_follow;
case LocationState.FOLLOW -> case LocationState.FOLLOW ->
{ {
drawableRes = R.drawable.ic_follow; drawableRes = R.drawable.ic_follow;
tintColor = Colors.LOCATION_TINT; tintColor = Colors.LOCATION_TINT;
} }
case LocationState.FOLLOW_AND_ROTATE -> case LocationState.FOLLOW_AND_ROTATE ->
{ {
drawableRes = R.drawable.ic_follow_and_rotate; drawableRes = R.drawable.ic_follow_and_rotate;
tintColor = Colors.LOCATION_TINT; tintColor = Colors.LOCATION_TINT;
} }
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode); default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
} }
final CarIcon icon = final CarIcon icon =

View File

@@ -115,15 +115,15 @@ class BottomPanel
{ {
switch (status) switch (status)
{ {
case STATUS_UPDATABLE -> case STATUS_UPDATABLE ->
{ {
UpdateInfo info = MapManager.nativeGetUpdateInfo(root); UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
setUpdateAllState(info); setUpdateAllState(info);
} // Special case for "Countries" node when no maps currently downloaded. } // Special case for "Countries" node when no maps currently downloaded.
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false; case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState(); case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
case STATUS_FAILED -> setRetryFailedStates(); case STATUS_FAILED -> setRetryFailedStates();
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status); default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
} }
} }
else else
@@ -133,15 +133,15 @@ class BottomPanel
{ {
switch (status) switch (status)
{ {
case STATUS_UPDATABLE -> case STATUS_UPDATABLE ->
{ {
UpdateInfo info = MapManager.nativeGetUpdateInfo(root); UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
setUpdateAllState(info); setUpdateAllState(info);
} }
case STATUS_DONE -> show = false; case STATUS_DONE -> show = false;
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState(); case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
case STATUS_FAILED -> setRetryFailedStates(); case STATUS_FAILED -> setRetryFailedStates();
default -> setDownloadAllState(); default -> setDownloadAllState();
} }
} }
} }

View File

@@ -70,9 +70,9 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
switch (item.newStatus) switch (item.newStatus)
{ {
case CountryItem.STATUS_FAILED: updateViews(); return; case CountryItem.STATUS_FAILED: updateViews(); return;
case CountryItem.STATUS_DONE: exitFragment(); return; case CountryItem.STATUS_DONE: exitFragment(); return;
} }
break; break;

View File

@@ -287,41 +287,41 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
ArrayList<MenuBottomSheetItem> items = new ArrayList<>(); ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
switch (mSelectedItem.status) switch (mSelectedItem.status)
{ {
case CountryItem.STATUS_DOWNLOADABLE: items.add(getDownloadMenuItem()); break; case CountryItem.STATUS_DOWNLOADABLE: items.add(getDownloadMenuItem()); break;
case CountryItem.STATUS_UPDATABLE: case CountryItem.STATUS_UPDATABLE:
items.add(getUpdateMenuItem()); items.add(getUpdateMenuItem());
// Fallthrough // Fallthrough
case CountryItem.STATUS_DONE: case CountryItem.STATUS_DONE:
if (!mSelectedItem.isExpandable()) if (!mSelectedItem.isExpandable())
items.add(getExploreMenuItem()); items.add(getExploreMenuItem());
appendDeleteMenuItem(items);
break;
case CountryItem.STATUS_FAILED:
items.add(getCancelMenuItem());
if (mSelectedItem.present)
{
appendDeleteMenuItem(items); appendDeleteMenuItem(items);
break; items.add(getExploreMenuItem());
}
break;
case CountryItem.STATUS_FAILED: case CountryItem.STATUS_PROGRESS:
items.add(getCancelMenuItem()); case CountryItem.STATUS_APPLYING:
case CountryItem.STATUS_ENQUEUED:
items.add(getCancelMenuItem());
if (mSelectedItem.present) if (mSelectedItem.present)
{ items.add(getExploreMenuItem());
appendDeleteMenuItem(items); break;
items.add(getExploreMenuItem());
}
break;
case CountryItem.STATUS_PROGRESS: case CountryItem.STATUS_PARTLY:
case CountryItem.STATUS_APPLYING: items.add(getDownloadMenuItem());
case CountryItem.STATUS_ENQUEUED: appendDeleteMenuItem(items);
items.add(getCancelMenuItem()); break;
if (mSelectedItem.present)
items.add(getExploreMenuItem());
break;
case CountryItem.STATUS_PARTLY:
items.add(getDownloadMenuItem());
appendDeleteMenuItem(items);
break;
} }
return items; return items;
} }
@@ -372,20 +372,20 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{ {
switch (mItem.status) switch (mItem.status)
{ {
case CountryItem.STATUS_DONE, CountryItem.STATUS_PROGRESS, CountryItem.STATUS_APPLYING, case CountryItem.STATUS_DONE, CountryItem.STATUS_PROGRESS, CountryItem.STATUS_APPLYING,
CountryItem.STATUS_ENQUEUED -> CountryItem.STATUS_ENQUEUED ->
processLongClick();
case CountryItem.STATUS_DOWNLOADABLE, CountryItem.STATUS_PARTLY ->
{
if (clickOnStatus)
onDownloadActionSelected(mItem, DownloaderAdapter.this);
else
processLongClick(); processLongClick();
case CountryItem.STATUS_DOWNLOADABLE, CountryItem.STATUS_PARTLY -> }
{ case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
if (clickOnStatus) case CountryItem.STATUS_UPDATABLE ->
onDownloadActionSelected(mItem, DownloaderAdapter.this); MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
else default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
processLongClick();
}
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
case CountryItem.STATUS_UPDATABLE ->
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
} }
} }
@@ -535,33 +535,33 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{ {
switch (ci.category) switch (ci.category)
{ {
case CountryItem.CATEGORY_NEAR_ME -> case CountryItem.CATEGORY_NEAR_ME ->
{
if (ci.category != prev)
{ {
if (ci.category != prev) headerId = CountryItem.CATEGORY_NEAR_ME;
{ mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_near_me_subtitle)));
headerId = CountryItem.CATEGORY_NEAR_ME;
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_near_me_subtitle)));
prev = ci.category;
}
}
case CountryItem.CATEGORY_DOWNLOADED ->
{
if (ci.category != prev)
{
headerId = CountryItem.CATEGORY_DOWNLOADED;
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_downloaded_subtitle)));
prev = ci.category;
}
}
default ->
{
int prevHeader = headerId;
headerId = CountryItem.CATEGORY_AVAILABLE + ci.name.charAt(0);
if (headerId != prevHeader)
mItemsAndHeader.add(new GenericItem(StringUtils.toUpperCase(ci.name.substring(0, 1))));
prev = ci.category; prev = ci.category;
} }
} }
case CountryItem.CATEGORY_DOWNLOADED ->
{
if (ci.category != prev)
{
headerId = CountryItem.CATEGORY_DOWNLOADED;
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_downloaded_subtitle)));
prev = ci.category;
}
}
default ->
{
int prevHeader = headerId;
headerId = CountryItem.CATEGORY_AVAILABLE + ci.name.charAt(0);
if (headerId != prevHeader)
mItemsAndHeader.add(new GenericItem(StringUtils.toUpperCase(ci.name.substring(0, 1))));
prev = ci.category;
}
}
ci.headerId = headerId; ci.headerId = headerId;
} }
mItemsAndHeader.add(new GenericItem(ci)); mItemsAndHeader.add(new GenericItem(ci));

View File

@@ -24,8 +24,8 @@ import app.organicmaps.widget.PlaceholderView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapter> public class DownloaderFragment
implements MenuBottomSheetFragment.MenuBottomSheetInterface extends BaseMwmRecyclerFragment<DownloaderAdapter> implements MenuBottomSheetFragment.MenuBottomSheetInterface
{ {
private DownloaderToolbarController mToolbarController; private DownloaderToolbarController mToolbarController;
@@ -153,7 +153,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
mBottomPanel = new BottomPanel(this, view); mBottomPanel = new BottomPanel(this, view);
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this); mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mToolbarController.getBackPressedCallback()); requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
mToolbarController.getBackPressedCallback());
update(); update();
} }
@@ -195,7 +196,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
{ {
if (mAdapter == null) if (mAdapter == null)
mAdapter = new DownloaderAdapter(this); mAdapter = new DownloaderAdapter(this);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mAdapter.getBackPressedCallback()); requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
mAdapter.getBackPressedCallback());
return mAdapter; return mAdapter;
} }

View File

@@ -20,13 +20,13 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment; import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.dialog.EditTextDialogFragment; import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.editor.Editor; import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.LocalizedName; import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.editor.data.LocalizedStreet; import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
@@ -623,11 +623,11 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
switch (Editor.nativeGetMapObjectStatus()) switch (Editor.nativeGetMapObjectStatus())
{ {
case Editor.CREATED -> mReset.setText(R.string.editor_remove_place_button); case Editor.CREATED -> mReset.setText(R.string.editor_remove_place_button);
case Editor.MODIFIED -> mReset.setText(R.string.editor_reset_edits_button); case Editor.MODIFIED -> mReset.setText(R.string.editor_reset_edits_button);
case Editor.UNTOUCHED -> mReset.setText(R.string.editor_place_doesnt_exist); case Editor.UNTOUCHED -> mReset.setText(R.string.editor_place_doesnt_exist);
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature."); case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted."); case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
} }
} }
@@ -641,11 +641,11 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
switch (Editor.nativeGetMapObjectStatus()) switch (Editor.nativeGetMapObjectStatus())
{ {
case Editor.CREATED -> rollback(Editor.CREATED); case Editor.CREATED -> rollback(Editor.CREATED);
case Editor.MODIFIED -> rollback(Editor.MODIFIED); case Editor.MODIFIED -> rollback(Editor.MODIFIED);
case Editor.UNTOUCHED -> placeDoesntExist(); case Editor.UNTOUCHED -> placeDoesntExist();
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature."); case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted."); case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
} }
} }

View File

@@ -173,8 +173,8 @@ public class EditorHostFragment
{ {
switch (mMode) switch (mMode)
{ {
case OPENING_HOURS, STREET, CUISINE, LANGUAGE, PHONE, SELF_SERVICE -> editMapObject(); case OPENING_HOURS, STREET, CUISINE, LANGUAGE, PHONE, SELF_SERVICE -> editMapObject();
default -> Utils.navigateToParent(requireActivity()); default -> Utils.navigateToParent(requireActivity());
} }
return true; return true;
} }
@@ -283,57 +283,57 @@ public class EditorHostFragment
{ {
switch (mMode) switch (mMode)
{ {
case OPENING_HOURS -> case OPENING_HOURS ->
{ {
final String timetables = ((TimetableContainerFragment) getChildFragmentManager().findFragmentByTag( final String timetables = ((TimetableContainerFragment) getChildFragmentManager().findFragmentByTag(
TimetableContainerFragment.class.getName())) TimetableContainerFragment.class.getName()))
.getTimetable(); .getTimetable();
Editor.nativeSetOpeningHours(timetables); Editor.nativeSetOpeningHours(timetables);
editMapObject(); editMapObject();
} }
case STREET -> case STREET ->
setStreet(((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())) setStreet(
.getStreet()); ((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())).getStreet());
case CUISINE -> case CUISINE ->
{ {
String[] cuisines = String[] cuisines =
((CuisineFragment) getChildFragmentManager().findFragmentByTag(CuisineFragment.class.getName())) ((CuisineFragment) getChildFragmentManager().findFragmentByTag(CuisineFragment.class.getName()))
.getCuisines(); .getCuisines();
Editor.nativeSetSelectedCuisines(cuisines); Editor.nativeSetSelectedCuisines(cuisines);
editMapObject(); editMapObject();
} }
case SELF_SERVICE -> case SELF_SERVICE ->
setSelection( setSelection(
Metadata.MetadataType.FMD_SELF_SERVICE, Metadata.MetadataType.FMD_SELF_SERVICE,
((SelfServiceFragment) getChildFragmentManager().findFragmentByTag(SelfServiceFragment.class.getName())) ((SelfServiceFragment) getChildFragmentManager().findFragmentByTag(SelfServiceFragment.class.getName()))
.getSelection()); .getSelection());
case LANGUAGE -> editMapObject(); case LANGUAGE -> editMapObject();
case MAP_OBJECT -> case MAP_OBJECT ->
{ {
if (!setEdits()) if (!setEdits())
return; return;
// Save object edits // Save object edits
if (!MwmApplication.prefs(requireContext()).contains(NOOB_ALERT_SHOWN)) if (!MwmApplication.prefs(requireContext()).contains(NOOB_ALERT_SHOWN))
{
showNoobDialog();
}
else
{
saveNote();
saveMapObjectEdits();
}
}
case PHONE ->
{ {
final String phone = showNoobDialog();
((PhoneFragment) getChildFragmentManager().findFragmentByTag(PhoneFragment.class.getName())).getPhone();
if (Editor.nativeIsPhoneValid(phone))
{
Editor.nativeSetPhone(phone);
editMapObject();
}
} }
else
{
saveNote();
saveMapObjectEdits();
}
}
case PHONE ->
{
final String phone =
((PhoneFragment) getChildFragmentManager().findFragmentByTag(PhoneFragment.class.getName())).getPhone();
if (Editor.nativeIsPhoneValid(phone))
{
Editor.nativeSetPhone(phone);
editMapObject();
}
}
} }
} }
} }

View File

@@ -7,13 +7,11 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textfield.TextInputEditText;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.FeatureCategory; import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView; import com.google.android.material.textview.MaterialTextView;
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@@ -59,17 +57,18 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
{ {
switch (viewType) switch (viewType)
{ {
case TYPE_CATEGORY -> case TYPE_CATEGORY ->
{ {
return new FeatureViewHolder( return new FeatureViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category, parent, false)); LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category, parent, false));
} }
case TYPE_FOOTER -> case TYPE_FOOTER ->
{ {
return new FooterViewHolder( return new FooterViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false), (FooterListener) mFragment); LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false),
} (FooterListener) mFragment);
default -> throw new IllegalArgumentException("Unsupported"); }
default -> throw new IllegalArgumentException("Unsupported");
} }
} }

View File

@@ -1,34 +1,35 @@
package app.organicmaps.editor; package app.organicmaps.editor;
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType; import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.MwmApplication; import app.organicmaps.MwmApplication;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.Language;
import app.organicmaps.sdk.editor.OsmOAuth;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import android.text.TextUtils;
import android.content.Intent;
import android.widget.Toast;
import app.organicmaps.sdk.Framework;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment; import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.dialog.EditTextDialogFragment; import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.Language;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import app.organicmaps.widget.SearchToolbarController; import app.organicmaps.widget.SearchToolbarController;
import app.organicmaps.widget.ToolbarController; import app.organicmaps.widget.ToolbarController;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener public class FeatureCategoryFragment
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
{ {
private FeatureCategory mSelectedCategory; private FeatureCategory mSelectedCategory;
protected ToolbarController mToolbarController; protected ToolbarController mToolbarController;
@@ -58,8 +59,7 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCate
mSelectedCategory = mSelectedCategory =
Utils.getParcelable(args, FeatureCategoryActivity.EXTRA_FEATURE_CATEGORY, FeatureCategory.class); Utils.getParcelable(args, FeatureCategoryActivity.EXTRA_FEATURE_CATEGORY, FeatureCategory.class);
} }
mToolbarController = new SearchToolbarController(view, requireActivity()) mToolbarController = new SearchToolbarController(view, requireActivity()) {
{
@Override @Override
protected void onTextChanged(String query) protected void onTextChanged(String query)
{ {
@@ -158,19 +158,21 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCate
private void showNoteConfirmationDialog(double lat, double lon, String noteText) private void showNoteConfirmationDialog(double lat, double lon, String noteText)
{ {
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog) new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_share_to_all_dialog_title) .setTitle(R.string.editor_share_to_all_dialog_title)
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) .setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
+ " " + getString(R.string.editor_share_to_all_dialog_message_2)) + getString(R.string.editor_share_to_all_dialog_message_2))
.setPositiveButton(android.R.string.ok, (dlg, which) -> { .setPositiveButton(android.R.string.ok,
MwmApplication.prefs(requireContext().getApplicationContext()).edit() (dlg, which) -> {
.putBoolean(NOTE_CONFIRMATION_SHOWN, true) MwmApplication.prefs(requireContext().getApplicationContext())
.apply(); .edit()
Editor.nativeCreateStandaloneNote(lat, lon, noteText); .putBoolean(NOTE_CONFIRMATION_SHOWN, true)
mPendingNoteText = ""; .apply();
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show(); Editor.nativeCreateStandaloneNote(lat, lon, noteText);
requireActivity().finish(); mPendingNoteText = "";
}) Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
.setNegativeButton(R.string.cancel, null) requireActivity().finish();
.show(); })
.setNegativeButton(R.string.cancel, null)
.show();
} }
} }

View File

@@ -13,9 +13,9 @@ import androidx.appcompat.widget.SwitchCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
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.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.HoursMinutes; import app.organicmaps.sdk.editor.data.HoursMinutes;
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

@@ -162,8 +162,8 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
switch (mMode) switch (mMode)
{ {
case SIMPLE -> setMode(Mode.ADVANCED, filledTimetables); case SIMPLE -> setMode(Mode.ADVANCED, filledTimetables);
case ADVANCED -> setMode(Mode.SIMPLE, filledTimetables); case ADVANCED -> setMode(Mode.SIMPLE, filledTimetables);
} }
} }

View File

@@ -42,8 +42,8 @@ public class FaqFragment extends BaseMwmFragment
{ {
switch (which) switch (which)
{ {
case 0 -> sendGeneralFeedback(); case 0 -> sendGeneralFeedback();
case 1 -> reportBug(); case 1 -> reportBug();
} }
} }
}; };

View File

@@ -78,67 +78,67 @@ public class Factory
switch (Framework.nativeParseAndSetApiUrl(uri.toString())) switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
{ {
case RequestType.INCORRECT: return false; case RequestType.INCORRECT: return false;
case RequestType.MAP: case RequestType.MAP:
SearchEngine.INSTANCE.cancelInteractiveSearch(); SearchEngine.INSTANCE.cancelInteractiveSearch();
Map.executeMapApiRequest(); Map.executeMapApiRequest();
return true; return true;
case RequestType.ROUTE: case RequestType.ROUTE:
SearchEngine.INSTANCE.cancelInteractiveSearch(); SearchEngine.INSTANCE.cancelInteractiveSearch();
final ParsedRoutingData data = Framework.nativeGetParsedRoutingData(); final ParsedRoutingData data = Framework.nativeGetParsedRoutingData();
RoutingController.get().setRouterType(data.mRouterType); RoutingController.get().setRouterType(data.mRouterType);
final RoutePoint from = data.mPoints[0]; final RoutePoint from = data.mPoints[0];
final RoutePoint to = data.mPoints[1]; final RoutePoint to = data.mPoints[1];
RoutingController.get().prepare( RoutingController.get().prepare(
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, from.mName, "", from.mLat, from.mLon), MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, from.mName, "", from.mLat, from.mLon),
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, to.mName, "", to.mLat, to.mLon)); MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, to.mName, "", to.mLat, to.mLon));
return true; return true;
case RequestType.SEARCH: case RequestType.SEARCH:
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
if (latlon != null)
{ {
SearchEngine.INSTANCE.cancelInteractiveSearch(); Framework.nativeStopLocationFollow();
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest(); Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
final double[] latlon = Framework.nativeGetParsedCenterLatLon(); // We need to update viewport for search api manually because of drape engine
if (latlon != null) // will not notify subscribers when search activity is shown.
{ if (!request.mIsSearchOnMap)
Framework.nativeStopLocationFollow(); Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
// We need to update viewport for search api manually because of drape engine
// will not notify subscribers when search activity is shown.
if (!request.mIsSearchOnMap)
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
}
SearchActivity.start(target, request.mQuery, request.mLocale, request.mIsSearchOnMap);
return true;
} }
case RequestType.CROSSHAIR: SearchActivity.start(target, request.mQuery, request.mLocale, request.mIsSearchOnMap);
return true;
}
case RequestType.CROSSHAIR:
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
target.showPositionChooserForAPI(Framework.nativeGetParsedAppName());
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
if (latlon != null)
{ {
SearchEngine.INSTANCE.cancelInteractiveSearch(); Framework.nativeStopLocationFollow();
target.showPositionChooserForAPI(Framework.nativeGetParsedAppName()); Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
if (latlon != null)
{
Framework.nativeStopLocationFollow();
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
}
return true;
}
case RequestType.OAUTH2:
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
final String oauth2code = Framework.nativeGetParsedOAuth2Code();
OsmLoginActivity.OAuth2Callback(target, oauth2code);
return true;
} }
// Menu and Settings url types should be implemented to support deeplinking. return true;
case RequestType.MENU: }
case RequestType.SETTINGS: case RequestType.OAUTH2:
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
final String oauth2code = Framework.nativeGetParsedOAuth2Code();
OsmLoginActivity.OAuth2Callback(target, oauth2code);
return true;
}
// Menu and Settings url types should be implemented to support deeplinking.
case RequestType.MENU:
case RequestType.SETTINGS:
} }
return false; return false;

View File

@@ -42,26 +42,26 @@ public class LayerBottomSheetItem
int buttonTextResource = R.string.layers_title; int buttonTextResource = R.string.layers_title;
switch (mode) switch (mode)
{ {
case OUTDOORS: case OUTDOORS:
disabledResource = R.attr.outdoorsMenuDisabled; disabledResource = R.attr.outdoorsMenuDisabled;
enabledResource = R.attr.outdoorsMenuEnabled; enabledResource = R.attr.outdoorsMenuEnabled;
buttonTextResource = R.string.button_layer_outdoor; buttonTextResource = R.string.button_layer_outdoor;
break; break;
case SUBWAY: case SUBWAY:
disabledResource = R.attr.subwayMenuDisabled; disabledResource = R.attr.subwayMenuDisabled;
enabledResource = R.attr.subwayMenuEnabled; enabledResource = R.attr.subwayMenuEnabled;
buttonTextResource = R.string.subway; buttonTextResource = R.string.subway;
break; break;
case ISOLINES: case ISOLINES:
disabledResource = R.attr.isoLinesMenuDisabled; disabledResource = R.attr.isoLinesMenuDisabled;
enabledResource = R.attr.isoLinesMenuEnabled; enabledResource = R.attr.isoLinesMenuEnabled;
buttonTextResource = R.string.button_layer_isolines; buttonTextResource = R.string.button_layer_isolines;
break; break;
case TRAFFIC: case TRAFFIC:
disabledResource = R.attr.trafficMenuDisabled; disabledResource = R.attr.trafficMenuDisabled;
enabledResource = R.attr.trafficMenuEnabled; enabledResource = R.attr.trafficMenuEnabled;
buttonTextResource = R.string.button_layer_traffic; buttonTextResource = R.string.button_layer_traffic;
break; break;
} }
int disabled = ThemeUtils.getResource(mContext, disabledResource); int disabled = ThemeUtils.getResource(mContext, disabledResource);
int enabled = ThemeUtils.getResource(mContext, enabledResource); int enabled = ThemeUtils.getResource(mContext, enabledResource);

View File

@@ -230,21 +230,21 @@ public class MapButtonsController extends Fragment
return; return;
switch (button) switch (button)
{ {
case zoom: UiUtils.showIf(show && Config.showZoomButtons(), buttonView); break; case zoom: UiUtils.showIf(show && Config.showZoomButtons(), buttonView); break;
case toggleMapLayer: case toggleMapLayer:
if (mToggleMapLayerButton != null) if (mToggleMapLayerButton != null)
UiUtils.showIf(show && !isInNavigationMode(), mToggleMapLayerButton); UiUtils.showIf(show && !isInNavigationMode(), mToggleMapLayerButton);
break; break;
case myPosition: case myPosition:
if (mNavMyPosition != null) if (mNavMyPosition != null)
mNavMyPosition.showButton(show); mNavMyPosition.showButton(show);
break; break;
case search: mSearchWheel.show(show); case search: mSearchWheel.show(show);
case bookmarks: case bookmarks:
case menu: UiUtils.showIf(show, buttonView); break; case menu: UiUtils.showIf(show, buttonView); break;
case trackRecordingStatus: case trackRecordingStatus:
UiUtils.showIf(show, buttonView); UiUtils.showIf(show, buttonView);
animateIconBlinking(show, (FloatingActionButton) buttonView); animateIconBlinking(show, (FloatingActionButton) buttonView);
} }
} }

View File

@@ -11,14 +11,14 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RouteMarkData; import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType; import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@@ -63,26 +63,26 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
switch (mRoutePoints.get(position).mPointType) switch (mRoutePoints.get(position).mPointType)
{ {
case Start: // Starting point. case Start: // Starting point.
if (mRoutePoints.get(position).mIsMyPosition) if (mRoutePoints.get(position).mIsMyPosition)
iconId = R.drawable.ic_location_arrow_blue; iconId = R.drawable.ic_location_arrow_blue;
else else
iconId = R.drawable.route_point_start; iconId = R.drawable.route_point_start;
break; break;
case Intermediate: // Intermediate stop. case Intermediate: // Intermediate stop.
TypedArray iconArray = mContext.getResources().obtainTypedArray(R.array.route_stop_icons); TypedArray iconArray = mContext.getResources().obtainTypedArray(R.array.route_stop_icons);
iconId = iconArray.getResourceId(mRoutePoints.get(position).mIntermediateIndex, R.drawable.route_point_20); iconId = iconArray.getResourceId(mRoutePoints.get(position).mIntermediateIndex, R.drawable.route_point_20);
iconArray.recycle(); iconArray.recycle();
break; break;
case Finish: // Destination point. case Finish: // Destination point.
iconId = R.drawable.route_point_finish; iconId = R.drawable.route_point_finish;
break; break;
default: // Unknown route type. default: // Unknown route type.
iconId = R.drawable.warning_icon; iconId = R.drawable.warning_icon;
break; break;
} }
// Set icon widget. // Set icon widget.

View File

@@ -23,76 +23,76 @@ public class ResultCodesHelper
int cancelBtnResId = android.R.string.cancel; int cancelBtnResId = android.R.string.cancel;
switch (errorCode) switch (errorCode)
{ {
case ResultCodes.NO_POSITION: case ResultCodes.NO_POSITION:
if (!MwmApplication.from(context).getLocationHelper().isActive()) if (!MwmApplication.from(context).getLocationHelper().isActive())
{ {
titleRes = R.string.dialog_routing_location_turn_on; titleRes = R.string.dialog_routing_location_turn_on;
messages.add(resources.getString(R.string.dialog_routing_location_unknown_turn_on)); messages.add(resources.getString(R.string.dialog_routing_location_unknown_turn_on));
} }
else else
{ {
titleRes = R.string.dialog_routing_check_gps; titleRes = R.string.dialog_routing_check_gps;
messages.add(resources.getString(R.string.dialog_routing_error_location_not_found)); messages.add(resources.getString(R.string.dialog_routing_error_location_not_found));
messages.add(resources.getString(R.string.dialog_routing_location_turn_wifi)); messages.add(resources.getString(R.string.dialog_routing_location_turn_wifi));
} }
break; break;
case ResultCodes.INCONSISTENT_MWM_ROUTE: case ResultCodes.INCONSISTENT_MWM_ROUTE:
case ResultCodes.ROUTING_FILE_NOT_EXIST: case ResultCodes.ROUTING_FILE_NOT_EXIST:
titleRes = R.string.routing_download_maps_along;
messages.add(resources.getString(R.string.routing_requires_all_map));
break;
case ResultCodes.START_POINT_NOT_FOUND:
titleRes = R.string.dialog_routing_change_start;
messages.add(resources.getString(R.string.dialog_routing_start_not_determined));
messages.add(resources.getString(R.string.dialog_routing_select_closer_start));
break;
case ResultCodes.END_POINT_NOT_FOUND:
titleRes = R.string.dialog_routing_change_end;
messages.add(resources.getString(R.string.dialog_routing_end_not_determined));
messages.add(resources.getString(R.string.dialog_routing_select_closer_end));
break;
case ResultCodes.INTERMEDIATE_POINT_NOT_FOUND:
titleRes = R.string.dialog_routing_change_intermediate;
messages.add(resources.getString(R.string.dialog_routing_intermediate_not_determined));
break;
case ResultCodes.DIFFERENT_MWM:
messages.add(resources.getString(R.string.routing_failed_cross_mwm_building));
break;
case ResultCodes.FILE_TOO_OLD:
titleRes = R.string.downloader_update_maps;
messages.add(resources.getString(R.string.downloader_mwm_migration_dialog));
break;
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_NO_NETWORK:
messages.add(resources.getString(R.string.transit_not_found));
break;
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_TOO_LONG_PEDESTRIAN:
titleRes = R.string.dialog_pedestrian_route_is_long_header;
messages.add(resources.getString(R.string.dialog_pedestrian_route_is_long_message));
cancelBtnResId = R.string.ok;
break;
case ResultCodes.ROUTE_NOT_FOUND:
case ResultCodes.ROUTE_NOT_FOUND_REDRESS_ROUTE_ERROR:
if (missingCount == 0)
{
titleRes = R.string.dialog_routing_unable_locate_route;
messages.add(resources.getString(R.string.dialog_routing_cant_build_route));
messages.add(resources.getString(R.string.dialog_routing_change_start_or_end));
}
else
{
titleRes = R.string.routing_download_maps_along; titleRes = R.string.routing_download_maps_along;
messages.add(resources.getString(R.string.routing_requires_all_map)); messages.add(resources.getString(R.string.routing_requires_all_map));
break; }
case ResultCodes.START_POINT_NOT_FOUND: break;
titleRes = R.string.dialog_routing_change_start; case ResultCodes.INTERNAL_ERROR:
messages.add(resources.getString(R.string.dialog_routing_start_not_determined)); titleRes = R.string.dialog_routing_system_error;
messages.add(resources.getString(R.string.dialog_routing_select_closer_start)); messages.add(resources.getString(R.string.dialog_routing_application_error));
break; messages.add(resources.getString(R.string.dialog_routing_try_again));
case ResultCodes.END_POINT_NOT_FOUND: break;
titleRes = R.string.dialog_routing_change_end; case ResultCodes.NEED_MORE_MAPS:
messages.add(resources.getString(R.string.dialog_routing_end_not_determined)); titleRes = R.string.dialog_routing_download_and_build_cross_route;
messages.add(resources.getString(R.string.dialog_routing_select_closer_end)); messages.add(resources.getString(R.string.dialog_routing_download_cross_route));
break; break;
case ResultCodes.INTERMEDIATE_POINT_NOT_FOUND:
titleRes = R.string.dialog_routing_change_intermediate;
messages.add(resources.getString(R.string.dialog_routing_intermediate_not_determined));
break;
case ResultCodes.DIFFERENT_MWM:
messages.add(resources.getString(R.string.routing_failed_cross_mwm_building));
break;
case ResultCodes.FILE_TOO_OLD:
titleRes = R.string.downloader_update_maps;
messages.add(resources.getString(R.string.downloader_mwm_migration_dialog));
break;
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_NO_NETWORK:
messages.add(resources.getString(R.string.transit_not_found));
break;
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_TOO_LONG_PEDESTRIAN:
titleRes = R.string.dialog_pedestrian_route_is_long_header;
messages.add(resources.getString(R.string.dialog_pedestrian_route_is_long_message));
cancelBtnResId = R.string.ok;
break;
case ResultCodes.ROUTE_NOT_FOUND:
case ResultCodes.ROUTE_NOT_FOUND_REDRESS_ROUTE_ERROR:
if (missingCount == 0)
{
titleRes = R.string.dialog_routing_unable_locate_route;
messages.add(resources.getString(R.string.dialog_routing_cant_build_route));
messages.add(resources.getString(R.string.dialog_routing_change_start_or_end));
}
else
{
titleRes = R.string.routing_download_maps_along;
messages.add(resources.getString(R.string.routing_requires_all_map));
}
break;
case ResultCodes.INTERNAL_ERROR:
titleRes = R.string.dialog_routing_system_error;
messages.add(resources.getString(R.string.dialog_routing_application_error));
messages.add(resources.getString(R.string.dialog_routing_try_again));
break;
case ResultCodes.NEED_MORE_MAPS:
titleRes = R.string.dialog_routing_download_and_build_cross_route;
messages.add(resources.getString(R.string.dialog_routing_download_cross_route));
break;
} }
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@@ -119,10 +119,11 @@ final class RoutingBottomMenuController implements View.OnClickListener
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame, private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
@NonNull View timeElevationLine, @NonNull View transitFrame, @NonNull View timeElevationLine, @NonNull View transitFrame,
@NonNull MaterialTextView error, @NonNull Button start, @NonNull ImageView altitudeChart, @NonNull MaterialTextView error, @NonNull Button start,
@NonNull MaterialTextView time, @NonNull MaterialTextView altitudeDifference, @NonNull ImageView altitudeChart, @NonNull MaterialTextView time,
@NonNull TextView timeVehicle, @Nullable MaterialTextView arrival, @NonNull MaterialTextView altitudeDifference, @NonNull TextView timeVehicle,
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener) @Nullable MaterialTextView arrival, @NonNull View actionFrame,
@Nullable RoutingBottomMenuListener listener)
{ {
mContext = context; mContext = context;
mAltitudeChartFrame = altitudeChartFrame; mAltitudeChartFrame = altitudeChartFrame;

View File

@@ -13,11 +13,11 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentFactory; import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
{ {

View File

@@ -45,16 +45,16 @@ public class SensorHelper implements SensorEventListener
mLastAccuracy = event.accuracy; mLastAccuracy = event.accuracy;
switch (mLastAccuracy) switch (mLastAccuracy)
{ {
case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: break; case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: break;
case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM: case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM:
for (SensorListener listener : mListeners) for (SensorListener listener : mListeners)
listener.onCompassCalibrationRecommended(); listener.onCompassCalibrationRecommended();
break; break;
case SensorManager.SENSOR_STATUS_ACCURACY_LOW: case SensorManager.SENSOR_STATUS_ACCURACY_LOW:
case SensorManager.SENSOR_STATUS_UNRELIABLE: case SensorManager.SENSOR_STATUS_UNRELIABLE:
default: default:
for (SensorListener listener : mListeners) for (SensorListener listener : mListeners)
listener.onCompassCalibrationRequired(); listener.onCompassCalibrationRequired();
} }
} }

View File

@@ -34,10 +34,10 @@ public final class RoutePointInfo implements Parcelable
{ {
switch (markType) switch (markType)
{ {
case 0: mMarkType = RouteMarkType.Start; break; case 0: mMarkType = RouteMarkType.Start; break;
case 1: mMarkType = RouteMarkType.Intermediate; break; case 1: mMarkType = RouteMarkType.Intermediate; break;
case 2: mMarkType = RouteMarkType.Finish; break; case 2: mMarkType = RouteMarkType.Finish; break;
default: throw new IllegalArgumentException("Mark type is not valid = " + markType); default: throw new IllegalArgumentException("Mark type is not valid = " + markType);
} }
mIntermediateIndex = intermediateIndex; mIntermediateIndex = intermediateIndex;

View File

@@ -28,13 +28,13 @@ public class LocationUtils
double correction = 0; double correction = 0;
switch (displayOrientation) switch (displayOrientation)
{ {
case Surface.ROTATION_0 -> case Surface.ROTATION_0 ->
{ {
return angle; return angle;
} }
case Surface.ROTATION_90 -> correction = Math.PI / 2.0; case Surface.ROTATION_90 -> correction = Math.PI / 2.0;
case Surface.ROTATION_180 -> correction = Math.PI; case Surface.ROTATION_180 -> correction = Math.PI;
case Surface.ROTATION_270 -> correction = (3.0 * Math.PI / 2.0); case Surface.ROTATION_270 -> correction = (3.0 * Math.PI / 2.0);
} }
return correctAngle(angle, correction); return correctAngle(angle, correction);

View File

@@ -146,11 +146,11 @@ public final class Logger
{ {
switch (level) switch (level)
{ {
case Log.VERBOSE: return 'V'; case Log.VERBOSE: return 'V';
case Log.DEBUG: return 'D'; case Log.DEBUG: return 'D';
case Log.INFO: return 'I'; case Log.INFO: return 'I';
case Log.WARN: return 'W'; case Log.WARN: return 'W';
case Log.ERROR: return 'E'; case Log.ERROR: return 'E';
} }
assert false : "Unknown log level " + level; assert false : "Unknown log level " + level;
return '_'; return '_';

View File

@@ -149,39 +149,39 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
switch (result.description.openNow) switch (result.description.openNow)
{ {
case SearchResult.OPEN_NOW_YES -> case SearchResult.OPEN_NOW_YES ->
{
if (result.description.minutesUntilClosed < 60) // less than 1 hour
{ {
if (result.description.minutesUntilClosed < 60) // less than 1 hour final String time = result.description.minutesUntilClosed + " " + resources.getString(R.string.minute);
{ final String string = resources.getString(R.string.closes_in, time);
final String time = result.description.minutesUntilClosed + " " + resources.getString(R.string.minute);
final String string = resources.getString(R.string.closes_in, time);
UiUtils.setTextAndShow(mOpen, string); UiUtils.setTextAndShow(mOpen, string);
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_yellow)); mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_yellow));
}
else
{
UiUtils.setTextAndShow(mOpen, resources.getString(R.string.editor_time_open));
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_green));
}
} }
case SearchResult.OPEN_NOW_NO -> else
{ {
if (result.description.minutesUntilOpen < 60) // less than 1 hour UiUtils.setTextAndShow(mOpen, resources.getString(R.string.editor_time_open));
{ mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_green));
final String time = result.description.minutesUntilOpen + " " + resources.getString(R.string.minute);
final String string = resources.getString(R.string.opens_in, time);
UiUtils.setTextAndShow(mOpen, string);
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_red));
}
else
{
UiUtils.setTextAndShow(mOpen, resources.getString(R.string.closed));
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_red));
}
} }
default -> UiUtils.hide(mOpen); }
case SearchResult.OPEN_NOW_NO ->
{
if (result.description.minutesUntilOpen < 60) // less than 1 hour
{
final String time = result.description.minutesUntilOpen + " " + resources.getString(R.string.minute);
final String string = resources.getString(R.string.opens_in, time);
UiUtils.setTextAndShow(mOpen, string);
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_red));
}
else
{
UiUtils.setTextAndShow(mOpen, resources.getString(R.string.closed));
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_red));
}
}
default -> UiUtils.hide(mOpen);
} }
} }

View File

@@ -49,32 +49,32 @@ class SearchHistoryAdapter extends RecyclerView.Adapter<SearchHistoryAdapter.Vie
switch (type) switch (type)
{ {
case TYPE_ITEM: case TYPE_ITEM:
res = new ViewHolder( res = new ViewHolder(
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_recent, viewGroup, false)); LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_recent, viewGroup, false));
res.mText.setOnClickListener(v -> mSearchToolbarController.setQuery(res.mText.getText())); res.mText.setOnClickListener(v -> mSearchToolbarController.setQuery(res.mText.getText()));
break; break;
case TYPE_CLEAR: case TYPE_CLEAR:
res = new ViewHolder( res = new ViewHolder(
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_clear_history, viewGroup, false)); LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_clear_history, viewGroup, false));
res.mText.setOnClickListener(v -> { res.mText.setOnClickListener(v -> {
SearchRecents.clear(); SearchRecents.clear();
notifyDataSetChanged(); notifyDataSetChanged();
}); });
break; break;
case TYPE_MY_POSITION: case TYPE_MY_POSITION:
res = new ViewHolder( res = new ViewHolder(
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_my_position, viewGroup, false)); LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_search_my_position, viewGroup, false));
res.mText.setOnClickListener(v -> { res.mText.setOnClickListener(v -> {
RoutingController.get().onPoiSelected( RoutingController.get().onPoiSelected(
MwmApplication.from(viewGroup.getContext()).getLocationHelper().getMyPosition()); MwmApplication.from(viewGroup.getContext()).getLocationHelper().getMyPosition());
mSearchToolbarController.onUpClick(); mSearchToolbarController.onUpClick();
}); });
break; break;
default: throw new IllegalArgumentException("Unsupported ViewHolder type given"); default: throw new IllegalArgumentException("Unsupported ViewHolder type given");
} }
Graphics.tint(res.mText); Graphics.tint(res.mText);

View File

@@ -326,10 +326,10 @@ public class VoiceInstructionsSettingsFragment extends BaseXmlSettingsFragment
final String ttsLinkText = getString(R.string.prefs_languages_information_off_link); final String ttsLinkText = getString(R.string.prefs_languages_information_off_link);
final Spannable link = new SpannableString(ttsLinkText + ""); final Spannable link = new SpannableString(ttsLinkText + "");
// Set link color. // Set link color.
link.setSpan( link.setSpan(new ForegroundColorSpan(ContextCompat.getColor(
new ForegroundColorSpan(ContextCompat.getColor( requireContext(),
requireContext(), UiUtils.getStyledResourceId(requireContext(), com.google.android.material.R.attr.colorSecondary))), UiUtils.getStyledResourceId(requireContext(), com.google.android.material.R.attr.colorSecondary))),
0, ttsLinkText.length(), 0); 0, ttsLinkText.length(), 0);
ttsLangInfoLink.setSummary(link); ttsLangInfoLink.setSummary(link);
final String ttsInfoUrl = requireActivity().getString(R.string.tts_info_link); final String ttsInfoUrl = requireActivity().getString(R.string.tts_info_link);

View File

@@ -166,9 +166,9 @@ public class NavMenu
public void refreshTts() public void refreshTts()
{ {
mTts.setImageDrawable(TtsPlayer.isEnabled() mTts.setImageDrawable(TtsPlayer.isEnabled() ? Graphics.tint(mActivity, R.drawable.ic_voice_on,
? Graphics.tint(mActivity, R.drawable.ic_voice_on, com.google.android.material.R.attr.colorSecondary) com.google.android.material.R.attr.colorSecondary)
: Graphics.tint(mActivity, R.drawable.ic_voice_off)); : Graphics.tint(mActivity, R.drawable.ic_voice_off));
} }
private void updateTime(int seconds) private void updateTime(int seconds)

View File

@@ -156,23 +156,23 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
switch (mType) switch (mType)
{ {
case TYPE_BOOKMARK -> case TYPE_BOOKMARK ->
{ {
mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(id); mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(id);
if (savedInstanceState != null && savedInstanceState.getParcelable(STATE_ICON) != null) if (savedInstanceState != null && savedInstanceState.getParcelable(STATE_ICON) != null)
mIcon = savedInstanceState.getParcelable(STATE_ICON); mIcon = savedInstanceState.getParcelable(STATE_ICON);
else if (mBookmark != null) else if (mBookmark != null)
mIcon = mBookmark.getIcon(); mIcon = mBookmark.getIcon();
refreshBookmark(); refreshBookmark();
} }
case TYPE_TRACK -> case TYPE_TRACK ->
{ {
mTrack = BookmarkManager.INSTANCE.getTrack(id); mTrack = BookmarkManager.INSTANCE.getTrack(id);
mColor = mTrack.getColor(); mColor = mTrack.getColor();
if (savedInstanceState != null) if (savedInstanceState != null)
mColor = savedInstanceState.getInt(STATE_COLOR, mColor); mColor = savedInstanceState.getInt(STATE_COLOR, mColor);
refreshTrack(); refreshTrack();
} }
} }
initToolbar(view); initToolbar(view);
} }
@@ -210,16 +210,16 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
final ShapeableImageView imageView = toolbar.findViewById(R.id.save); final ShapeableImageView imageView = toolbar.findViewById(R.id.save);
switch (mType) switch (mType)
{ {
case TYPE_BOOKMARK -> case TYPE_BOOKMARK ->
{ {
imageView.setOnClickListener(v -> saveBookmark()); imageView.setOnClickListener(v -> saveBookmark());
toolbar.setTitle(R.string.placepage_edit_bookmark_button); toolbar.setTitle(R.string.placepage_edit_bookmark_button);
} }
case TYPE_TRACK -> case TYPE_TRACK ->
{ {
imageView.setOnClickListener(v -> saveTrack()); imageView.setOnClickListener(v -> saveTrack());
toolbar.setTitle(R.string.edit_track); toolbar.setTitle(R.string.edit_track);
} }
} }
UiUtils.showHomeUpButton(toolbar); UiUtils.showHomeUpButton(toolbar);
toolbar.setNavigationOnClickListener(v -> dismiss()); toolbar.setNavigationOnClickListener(v -> dismiss());
@@ -319,23 +319,23 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
dialogFragment.setArguments(args); dialogFragment.setArguments(args);
switch (mType) switch (mType)
{ {
case TYPE_BOOKMARK -> case TYPE_BOOKMARK ->
dialogFragment.setOnColorSetListener(colorPos -> { dialogFragment.setOnColorSetListener(colorPos -> {
if (mIcon != null && mIcon.getColor() == colorPos) if (mIcon != null && mIcon.getColor() == colorPos)
return; return;
mIcon = new Icon(colorPos, mIcon.getType()); mIcon = new Icon(colorPos, mIcon.getType());
refreshColorMarker(); refreshColorMarker();
}); });
case TYPE_TRACK -> case TYPE_TRACK ->
dialogFragment.setOnColorSetListener(colorPos -> { dialogFragment.setOnColorSetListener(colorPos -> {
int from = mTrack.getColor(); int from = mTrack.getColor();
int to = PredefinedColors.getColor(colorPos); int to = PredefinedColors.getColor(colorPos);
if (from == to) if (from == to)
return; return;
mColor = to; mColor = to;
refreshTrackColor(); refreshTrackColor();
}); });
} }
dialogFragment.show(requireActivity().getSupportFragmentManager(), null); dialogFragment.show(requireActivity().getSupportFragmentManager(), null);

View File

@@ -414,15 +414,15 @@ public class PlacePageController
{ {
switch (item) switch (item)
{ {
case BOOKMARK_SAVE, BOOKMARK_DELETE -> onBookmarkBtnClicked(); case BOOKMARK_SAVE, BOOKMARK_DELETE -> onBookmarkBtnClicked();
case BACK -> onBackBtnClicked(); case BACK -> onBackBtnClicked();
case ROUTE_FROM -> onRouteFromBtnClicked(); case ROUTE_FROM -> onRouteFromBtnClicked();
case ROUTE_TO -> onRouteToBtnClicked(); case ROUTE_TO -> onRouteToBtnClicked();
case ROUTE_ADD -> onRouteAddBtnClicked(); case ROUTE_ADD -> onRouteAddBtnClicked();
case ROUTE_REMOVE -> onRouteRemoveBtnClicked(); case ROUTE_REMOVE -> onRouteRemoveBtnClicked();
case ROUTE_AVOID_TOLL -> onAvoidTollBtnClicked(); case ROUTE_AVOID_TOLL -> onAvoidTollBtnClicked();
case ROUTE_AVOID_UNPAVED -> onAvoidUnpavedBtnClicked(); case ROUTE_AVOID_UNPAVED -> onAvoidUnpavedBtnClicked();
case ROUTE_AVOID_FERRY -> onAvoidFerryBtnClicked(); case ROUTE_AVOID_FERRY -> onAvoidFerryBtnClicked();
} }
} }

View File

@@ -478,8 +478,9 @@ public class PlacePageView extends Fragment
MaterialTextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor); MaterialTextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
final int editPlaceButtonColor = final int editPlaceButtonColor =
Editor.nativeShouldEnableEditPlace() Editor.nativeShouldEnableEditPlace()
? ContextCompat.getColor(getContext(), ? ContextCompat.getColor(
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary)) getContext(),
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary))
: getResources().getColor(R.color.button_accent_text_disabled); : getResources().getColor(R.color.button_accent_text_disabled);
mTvEditPlace.setTextColor(editPlaceButtonColor); mTvEditPlace.setTextColor(editPlaceButtonColor);
mTvAddBusiness.setTextColor(editPlaceButtonColor); mTvAddBusiness.setTextColor(editPlaceButtonColor);

View File

@@ -31,13 +31,13 @@ using namespace std::placeholders;
/// Special error codes to notify GUI about free space /// Special error codes to notify GUI about free space
//@{ //@{
#define ERR_DOWNLOAD_SUCCESS 0 #define ERR_DOWNLOAD_SUCCESS 0
#define ERR_DISK_ERROR -1 #define ERR_DISK_ERROR -1
#define ERR_NOT_ENOUGH_FREE_SPACE -2 #define ERR_NOT_ENOUGH_FREE_SPACE -2
#define ERR_STORAGE_DISCONNECTED -3 #define ERR_STORAGE_DISCONNECTED -3
#define ERR_DOWNLOAD_ERROR -4 #define ERR_DOWNLOAD_ERROR -4
#define ERR_NO_MORE_FILES -5 #define ERR_NO_MORE_FILES -5
#define ERR_FILE_IN_PROGRESS -6 #define ERR_FILE_IN_PROGRESS -6
//@} //@}
namespace namespace
@@ -52,135 +52,129 @@ static std::shared_ptr<HttpRequest> g_currentRequest;
extern "C" extern "C"
{ {
using Callback = HttpRequest::Callback; using Callback = HttpRequest::Callback;
static int HasSpaceForFiles(Platform & pl, std::string const & sdcardPath, size_t fileSize) static int HasSpaceForFiles(Platform & pl, std::string const & sdcardPath, size_t fileSize)
{
switch (pl.GetWritableStorageStatus(fileSize))
{ {
switch (pl.GetWritableStorageStatus(fileSize)) case Platform::STORAGE_DISCONNECTED: return ERR_STORAGE_DISCONNECTED;
{
case Platform::STORAGE_DISCONNECTED:
return ERR_STORAGE_DISCONNECTED;
case Platform::NOT_ENOUGH_SPACE: case Platform::NOT_ENOUGH_SPACE: return ERR_NOT_ENOUGH_FREE_SPACE;
return ERR_NOT_ENOUGH_FREE_SPACE;
default: default: return static_cast<int>(fileSize);
return static_cast<int>(fileSize);
}
}
JNIEXPORT jint JNICALL
Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeGetBytesToDownload(JNIEnv * env, jclass clazz)
{
// clear all
g_filesToDownload.clear();
g_totalBytesToDownload = 0;
g_totalDownloadedBytes = 0;
using namespace storage;
Storage const & storage = g_framework->GetStorage();
auto const status = storage.GetForceDownloadWorlds(g_filesToDownload);
for (auto const & cf : g_filesToDownload)
g_totalBytesToDownload += cf.GetRemoteSize();
int res;
if (status == Storage::WorldStatus::ERROR_CREATE_FOLDER ||
status == Storage::WorldStatus::ERROR_MOVE_FILE)
{
res = ERR_DISK_ERROR;
}
else
{
Platform & pl = GetPlatform();
res = HasSpaceForFiles(pl, pl.WritableDir(), g_totalBytesToDownload);
}
if (res == ERR_STORAGE_DISCONNECTED)
LOG(LWARNING, ("External file system is not available"));
else if (res == ERR_NOT_ENOUGH_FREE_SPACE)
LOG(LWARNING, ("Not enough space to extract files"));
g_currentRequest.reset();
if (status == Storage::WorldStatus::WAS_MOVED)
{
g_framework->ReloadWorldMaps();
res = ERR_DOWNLOAD_SUCCESS; // reset possible storage error if we moved files
}
return res;
}
static void DownloadFileFinished(std::shared_ptr<jobject> obj, HttpRequest const & req)
{
auto const status = req.GetStatus();
ASSERT_NOT_EQUAL(status, DownloadStatus::InProgress, ());
int errorCode = ERR_DOWNLOAD_ERROR;
if (status == DownloadStatus::Completed)
errorCode = ERR_DOWNLOAD_SUCCESS;
g_currentRequest.reset();
if (errorCode == ERR_DOWNLOAD_SUCCESS)
{
auto const & curFile = g_filesToDownload.back();
size_t const sz = curFile.GetRemoteSize();
LOG(LDEBUG, ("finished downloading", curFile.GetName(), "size", sz, "bytes"));
g_totalDownloadedBytes += sz;
LOG(LDEBUG, ("totalDownloadedBytes:", g_totalDownloadedBytes));
g_filesToDownload.pop_back();
}
JNIEnv * env = jni::GetEnv();
jmethodID methodID = jni::GetMethodID(env, *obj, "onFinish", "(I)V");
env->CallVoidMethod(*obj, methodID, errorCode);
}
static void DownloadFileProgress(std::shared_ptr<jobject> listener, HttpRequest const & req)
{
JNIEnv * env = jni::GetEnv();
static jmethodID methodID = jni::GetMethodID(env, *listener, "onProgress", "(I)V");
env->CallVoidMethod(*listener, methodID, static_cast<jint>(g_totalDownloadedBytes + req.GetProgress().m_bytesDownloaded));
}
JNIEXPORT jint JNICALL
Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeStartNextFileDownload(JNIEnv * env, jclass clazz, jobject listener)
{
if (g_filesToDownload.empty())
return ERR_NO_MORE_FILES;
/// @todo One downloader instance with cached servers. All this routine will be refactored some time.
static auto downloader = storage::GetDownloader();
storage::Storage const & storage = g_framework->GetStorage();
downloader->SetDataVersion(storage.GetCurrentDataVersion());
downloader->EnsureMetaConfigReady([&storage, ptr = jni::make_global_ref(listener)]()
{
auto const & curFile = g_filesToDownload.back();
auto const fileName = curFile.GetFileName(MapFileType::Map);
LOG(LINFO, ("Downloading file", fileName));
g_currentRequest.reset(HttpRequest::GetFile(
downloader->MakeUrlListLegacy(fileName),
storage.GetFilePath(curFile.GetName(), MapFileType::Map),
curFile.GetRemoteSize(),
std::bind(&DownloadFileFinished, ptr, _1),
std::bind(&DownloadFileProgress, ptr, _1),
0, false));
});
return ERR_FILE_IN_PROGRESS;
}
JNIEXPORT void JNICALL
Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeCancelCurrentFile(JNIEnv * env, jclass clazz)
{
LOG(LDEBUG, ("cancelCurrentFile, currentRequest=", g_currentRequest));
g_currentRequest.reset();
} }
} }
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeGetBytesToDownload(JNIEnv * env,
jclass clazz)
{
// clear all
g_filesToDownload.clear();
g_totalBytesToDownload = 0;
g_totalDownloadedBytes = 0;
using namespace storage;
Storage const & storage = g_framework->GetStorage();
auto const status = storage.GetForceDownloadWorlds(g_filesToDownload);
for (auto const & cf : g_filesToDownload)
g_totalBytesToDownload += cf.GetRemoteSize();
int res;
if (status == Storage::WorldStatus::ERROR_CREATE_FOLDER || status == Storage::WorldStatus::ERROR_MOVE_FILE)
{
res = ERR_DISK_ERROR;
}
else
{
Platform & pl = GetPlatform();
res = HasSpaceForFiles(pl, pl.WritableDir(), g_totalBytesToDownload);
}
if (res == ERR_STORAGE_DISCONNECTED)
LOG(LWARNING, ("External file system is not available"));
else if (res == ERR_NOT_ENOUGH_FREE_SPACE)
LOG(LWARNING, ("Not enough space to extract files"));
g_currentRequest.reset();
if (status == Storage::WorldStatus::WAS_MOVED)
{
g_framework->ReloadWorldMaps();
res = ERR_DOWNLOAD_SUCCESS; // reset possible storage error if we moved files
}
return res;
}
static void DownloadFileFinished(std::shared_ptr<jobject> obj, HttpRequest const & req)
{
auto const status = req.GetStatus();
ASSERT_NOT_EQUAL(status, DownloadStatus::InProgress, ());
int errorCode = ERR_DOWNLOAD_ERROR;
if (status == DownloadStatus::Completed)
errorCode = ERR_DOWNLOAD_SUCCESS;
g_currentRequest.reset();
if (errorCode == ERR_DOWNLOAD_SUCCESS)
{
auto const & curFile = g_filesToDownload.back();
size_t const sz = curFile.GetRemoteSize();
LOG(LDEBUG, ("finished downloading", curFile.GetName(), "size", sz, "bytes"));
g_totalDownloadedBytes += sz;
LOG(LDEBUG, ("totalDownloadedBytes:", g_totalDownloadedBytes));
g_filesToDownload.pop_back();
}
JNIEnv * env = jni::GetEnv();
jmethodID methodID = jni::GetMethodID(env, *obj, "onFinish", "(I)V");
env->CallVoidMethod(*obj, methodID, errorCode);
}
static void DownloadFileProgress(std::shared_ptr<jobject> listener, HttpRequest const & req)
{
JNIEnv * env = jni::GetEnv();
static jmethodID methodID = jni::GetMethodID(env, *listener, "onProgress", "(I)V");
env->CallVoidMethod(*listener, methodID,
static_cast<jint>(g_totalDownloadedBytes + req.GetProgress().m_bytesDownloaded));
}
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeStartNextFileDownload(
JNIEnv * env, jclass clazz, jobject listener)
{
if (g_filesToDownload.empty())
return ERR_NO_MORE_FILES;
/// @todo One downloader instance with cached servers. All this routine will be refactored some time.
static auto downloader = storage::GetDownloader();
storage::Storage const & storage = g_framework->GetStorage();
downloader->SetDataVersion(storage.GetCurrentDataVersion());
downloader->EnsureMetaConfigReady([&storage, ptr = jni::make_global_ref(listener)]()
{
auto const & curFile = g_filesToDownload.back();
auto const fileName = curFile.GetFileName(MapFileType::Map);
LOG(LINFO, ("Downloading file", fileName));
g_currentRequest.reset(HttpRequest::GetFile(downloader->MakeUrlListLegacy(fileName),
storage.GetFilePath(curFile.GetName(), MapFileType::Map),
curFile.GetRemoteSize(), std::bind(&DownloadFileFinished, ptr, _1),
std::bind(&DownloadFileProgress, ptr, _1), 0, false));
});
return ERR_FILE_IN_PROGRESS;
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeCancelCurrentFile(JNIEnv * env,
jclass clazz)
{
LOG(LDEBUG, ("cancelCurrentFile, currentRequest=", g_currentRequest));
g_currentRequest.reset();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -10,9 +10,8 @@
#include "drape_frontend/gui/skin.hpp" #include "drape_frontend/gui/skin.hpp"
#include "drape/pointers.hpp"
#include "drape/graphics_context_factory.hpp" #include "drape/graphics_context_factory.hpp"
#include "drape/pointers.hpp"
#include "indexer/feature_decl.hpp" #include "indexer/feature_decl.hpp"
#include "indexer/map_style.hpp" #include "indexer/map_style.hpp"
@@ -39,184 +38,176 @@ struct EverywhereSearchParams;
namespace android namespace android
{ {
enum CoordinatesFormat // See Java enum app.organicmaps.widget.placepage.CoordinatesFormat for all possible values. enum CoordinatesFormat // See Java enum app.organicmaps.widget.placepage.CoordinatesFormat for all possible values.
{
LatLonDMS = 0, // Latitude, Longitude in degrees minutes seconds format, comma separated
LatLonDecimal = 1, // Latitude, Longitude in decimal format, comma separated
OLCFull = 2, // Open location code, full format
OSMLink = 3, // Link to the OSM. E.g. https://osm.org/go/xcXjyqQlq-?m=
UTM = 4, // Universal Transverse Mercator
MGRS = 5 // Military Grid Reference System
};
// Keep in sync `public @interface ChoosePositionMode`in Framework.java.
enum class ChoosePositionMode
{
None = 0,
Editor = 1,
Api = 2,
};
class Framework : private power_management::PowerManager::Subscriber
{
private:
drape_ptr<dp::ThreadSafeFactory> m_oglContextFactory;
drape_ptr<dp::GraphicsContextFactory> m_vulkanContextFactory;
::Framework m_work;
math::LowPassVector<float, 3> m_sensors[2];
double m_lastCompass = 0;
std::string m_searchQuery;
std::map<gui::EWidget, gui::Position> m_guiPositions;
void TrafficStateChanged(TrafficManager::TrafficState state);
void TransitSchemeStateChanged(TransitReadManager::TransitSchemeState state);
void IsolinesSchemeStateChanged(IsolinesManager::IsolinesState state);
void MyPositionModeChanged(location::EMyPositionMode mode, bool routingActive);
location::TMyPositionModeChanged m_myPositionModeSignal;
TrafficManager::TrafficStateChangedFn m_onTrafficStateChangedFn;
TransitReadManager::TransitStateChangedFn m_onTransitStateChangedFn;
IsolinesManager::IsolinesStateChangedFn m_onIsolinesStateChangedFn;
ChoosePositionMode m_isChoosePositionMode = ChoosePositionMode::None;
bool m_isSurfaceDestroyed = false;
public:
Framework(std::function<void()> && afterMapsLoaded);
storage::Storage & GetStorage();
DataSource const & GetDataSource();
void ShowNode(storage::CountryId const & countryId, bool zoomToDownloadButton);
void OnLocationError(int /* == location::TLocationStatus*/ newStatus);
void OnLocationUpdated(location::GpsInfo const & info);
void OnCompassUpdated(location::CompassInfo const & info, bool forceRedraw);
bool CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi, bool firstLaunch, bool launchByDeepLink,
uint32_t appVersionCode, bool isCustomROM);
bool IsDrapeEngineCreated() const;
void UpdateDpi(int dpi);
bool DestroySurfaceOnDetach();
void DetachSurface(bool destroySurface);
bool AttachSurface(JNIEnv * env, jobject jSurface);
void PauseSurfaceRendering();
void ResumeSurfaceRendering();
void SetMapStyle(MapStyle mapStyle);
void MarkMapStyle(MapStyle mapStyle);
MapStyle GetMapStyle() const;
void SetupMeasurementSystem();
RoutingManager & GetRoutingManager() { return m_work.GetRoutingManager(); }
void SetRouter(routing::RouterType type) { m_work.GetRoutingManager().SetRouter(type); }
routing::RouterType GetRouter() const { return m_work.GetRoutingManager().GetRouter(); }
routing::RouterType GetLastUsedRouter() const { return m_work.GetRoutingManager().GetLastUsedRouter(); }
void Resize(JNIEnv * env, jobject jSurface, int w, int h);
struct Finger
{ {
LatLonDMS = 0, // Latitude, Longitude in degrees minutes seconds format, comma separated Finger(int64_t id, float x, float y) : m_id(id), m_x(x), m_y(y) {}
LatLonDecimal = 1, // Latitude, Longitude in decimal format, comma separated
OLCFull = 2, // Open location code, full format int64_t m_id;
OSMLink = 3, // Link to the OSM. E.g. https://osm.org/go/xcXjyqQlq-?m= float m_x, m_y;
UTM = 4, // Universal Transverse Mercator
MGRS = 5 // Military Grid Reference System
}; };
// Keep in sync `public @interface ChoosePositionMode`in Framework.java. void Scale(double factor, m2::PointD const & pxPoint, bool isAnim);
enum class ChoosePositionMode
{
None = 0,
Editor = 1,
Api = 2,
};
class Framework : private power_management::PowerManager::Subscriber void Scroll(double distanceX, double distanceY);
{
private:
drape_ptr<dp::ThreadSafeFactory> m_oglContextFactory;
drape_ptr<dp::GraphicsContextFactory> m_vulkanContextFactory;
::Framework m_work;
math::LowPassVector<float, 3> m_sensors[2]; void Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer);
double m_lastCompass = 0;
std::string m_searchQuery; bool Search(search::EverywhereSearchParams const & params);
std::string GetLastSearchQuery() { return m_searchQuery; }
void ClearLastSearchQuery() { m_searchQuery.clear(); }
std::map<gui::EWidget, gui::Position> m_guiPositions; void AddLocalMaps();
void RemoveLocalMaps();
void ReloadWorldMaps();
void TrafficStateChanged(TrafficManager::TrafficState state); m2::PointD GetViewportCenter() const;
void TransitSchemeStateChanged(TransitReadManager::TransitSchemeState state);
void IsolinesSchemeStateChanged(IsolinesManager::IsolinesState state);
void MyPositionModeChanged(location::EMyPositionMode mode, bool routingActive); void AddString(std::string const & name, std::string const & value);
location::TMyPositionModeChanged m_myPositionModeSignal; void Scale(::Framework::EScaleMode mode);
void Scale(m2::PointD const & centerPt, int targetZoom, bool animate);
TrafficManager::TrafficStateChangedFn m_onTrafficStateChangedFn; void ChangeTrackColor(kml::TrackId trackId, dp::Color color);
TransitReadManager::TransitStateChangedFn m_onTransitStateChangedFn; void ReplaceBookmark(kml::MarkId markId, kml::BookmarkData & bm);
IsolinesManager::IsolinesStateChangedFn m_onIsolinesStateChangedFn; void ReplaceTrack(kml::TrackId trackId, kml::TrackData & trackData);
void MoveBookmark(kml::MarkId markId, kml::MarkGroupId curCat, kml::MarkGroupId newCat);
void MoveTrack(kml::TrackId trackId, kml::MarkGroupId curCat, kml::MarkGroupId newCat);
ChoosePositionMode m_isChoosePositionMode = ChoosePositionMode::None; ::Framework * NativeFramework();
bool m_isSurfaceDestroyed = false;
public: bool IsDownloadingActive();
Framework(std::function<void()> && afterMapsLoaded);
storage::Storage & GetStorage(); void ExecuteMapApiRequest();
DataSource const & GetDataSource();
void ShowNode(storage::CountryId const & countryId, bool zoomToDownloadButton); void DeactivatePopup();
void DeactivateMapSelectionCircle(bool restoreViewport);
void OnLocationError(int/* == location::TLocationStatus*/ newStatus); // std::string GetOutdatedCountriesString();
void OnLocationUpdated(location::GpsInfo const & info);
void OnCompassUpdated(location::CompassInfo const & info, bool forceRedraw);
bool CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi, bool firstLaunch, void SetMyPositionModeListener(location::TMyPositionModeChanged const & fn);
bool launchByDeepLink, uint32_t appVersionCode, bool isCustomROM); location::EMyPositionMode GetMyPositionMode() const;
bool IsDrapeEngineCreated() const; void SwitchMyPositionNextMode();
void UpdateDpi(int dpi);
bool DestroySurfaceOnDetach();
void DetachSurface(bool destroySurface);
bool AttachSurface(JNIEnv * env, jobject jSurface);
void PauseSurfaceRendering();
void ResumeSurfaceRendering();
void SetMapStyle(MapStyle mapStyle); void SetTrafficStateListener(TrafficManager::TrafficStateChangedFn const & fn);
void MarkMapStyle(MapStyle mapStyle); void SetTransitSchemeListener(TransitReadManager::TransitStateChangedFn const & fn);
MapStyle GetMapStyle() const; void SetIsolinesListener(IsolinesManager::IsolinesStateChangedFn const & fn);
void SetupMeasurementSystem(); bool IsTrafficEnabled();
void EnableTraffic();
void DisableTraffic();
RoutingManager & GetRoutingManager() { return m_work.GetRoutingManager(); } void Save3dMode(bool allow3d, bool allow3dBuildings);
void SetRouter(routing::RouterType type) { m_work.GetRoutingManager().SetRouter(type); } void Set3dMode(bool allow3d, bool allow3dBuildings);
routing::RouterType GetRouter() const { return m_work.GetRoutingManager().GetRouter(); } void Get3dMode(bool & allow3d, bool & allow3dBuildings);
routing::RouterType GetLastUsedRouter() const
{
return m_work.GetRoutingManager().GetLastUsedRouter();
}
void Resize(JNIEnv * env, jobject jSurface, int w, int h); void SetMapLanguageCode(std::string const & languageCode);
std::string GetMapLanguageCode();
struct Finger void SetChoosePositionMode(ChoosePositionMode mode, bool isBusiness, m2::PointD const * optionalPosition);
{ ChoosePositionMode GetChoosePositionMode();
Finger(int64_t id, float x, float y)
: m_id(id)
, m_x(x)
, m_y(y)
{
}
int64_t m_id; void UpdateMyPositionRoutingOffset(int offsetY);
float m_x, m_y; void SetupWidget(gui::EWidget widget, float x, float y, dp::Anchor anchor);
}; void ApplyWidgets();
void CleanWidgets();
void Scale(double factor, m2::PointD const & pxPoint, bool isAnim); place_page::Info & GetPlacePageInfo();
void Scroll(double distanceX, double distanceY); bool IsAutoRetryDownloadFailed();
bool IsDownloadOn3gEnabled();
void EnableDownloadOn3g();
void Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer); // int ToDoAfterUpdate() const;
bool Search(search::EverywhereSearchParams const & params); // PowerManager::Subscriber overrides:
std::string GetLastSearchQuery() { return m_searchQuery; } void OnPowerFacilityChanged(power_management::Facility const facility, bool enabled) override;
void ClearLastSearchQuery() { m_searchQuery.clear(); } void OnPowerSchemeChanged(power_management::Scheme const actualScheme) override;
void AddLocalMaps(); FeatureID BuildFeatureId(JNIEnv * env, jobject featureId);
void RemoveLocalMaps(); };
void ReloadWorldMaps(); } // namespace android
m2::PointD GetViewportCenter() const;
void AddString(std::string const & name, std::string const & value);
void Scale(::Framework::EScaleMode mode);
void Scale(m2::PointD const & centerPt, int targetZoom, bool animate);
void ChangeTrackColor(kml::TrackId trackId, dp::Color color);
void ReplaceBookmark(kml::MarkId markId, kml::BookmarkData & bm);
void ReplaceTrack(kml::TrackId trackId, kml::TrackData & trackData);
void MoveBookmark(kml::MarkId markId, kml::MarkGroupId curCat, kml::MarkGroupId newCat);
void MoveTrack(kml::TrackId trackId, kml::MarkGroupId curCat, kml::MarkGroupId newCat);
::Framework * NativeFramework();
bool IsDownloadingActive();
void ExecuteMapApiRequest();
void DeactivatePopup();
void DeactivateMapSelectionCircle(bool restoreViewport);
// std::string GetOutdatedCountriesString();
void SetMyPositionModeListener(location::TMyPositionModeChanged const & fn);
location::EMyPositionMode GetMyPositionMode() const;
void SwitchMyPositionNextMode();
void SetTrafficStateListener(TrafficManager::TrafficStateChangedFn const & fn);
void SetTransitSchemeListener(TransitReadManager::TransitStateChangedFn const & fn);
void SetIsolinesListener(IsolinesManager::IsolinesStateChangedFn const & fn);
bool IsTrafficEnabled();
void EnableTraffic();
void DisableTraffic();
void Save3dMode(bool allow3d, bool allow3dBuildings);
void Set3dMode(bool allow3d, bool allow3dBuildings);
void Get3dMode(bool & allow3d, bool & allow3dBuildings);
void SetMapLanguageCode(std::string const & languageCode);
std::string GetMapLanguageCode();
void SetChoosePositionMode(ChoosePositionMode mode, bool isBusiness, m2::PointD const * optionalPosition);
ChoosePositionMode GetChoosePositionMode();
void UpdateMyPositionRoutingOffset(int offsetY);
void SetupWidget(gui::EWidget widget, float x, float y, dp::Anchor anchor);
void ApplyWidgets();
void CleanWidgets();
place_page::Info & GetPlacePageInfo();
bool IsAutoRetryDownloadFailed();
bool IsDownloadOn3gEnabled();
void EnableDownloadOn3g();
// int ToDoAfterUpdate() const;
// PowerManager::Subscriber overrides:
void OnPowerFacilityChanged(power_management::Facility const facility, bool enabled) override;
void OnPowerSchemeChanged(power_management::Scheme const actualScheme) override;
FeatureID BuildFeatureId(JNIEnv * env, jobject featureId);
};
}
extern std::unique_ptr<android::Framework> g_framework; extern std::unique_ptr<android::Framework> g_framework;
::Framework * frm(); ::Framework * frm();

View File

@@ -7,26 +7,23 @@
extern "C" extern "C"
{ {
static void LocationStateModeChanged(location::EMyPositionMode mode, std::shared_ptr<jobject> const & listener)
static void LocationStateModeChanged(location::EMyPositionMode mode,
std::shared_ptr<jobject> const & listener)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener.get(), env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener.get(), "onMyPositionModeChanged", "(I)V"),
"onMyPositionModeChanged", "(I)V"), static_cast<jint>(mode)); static_cast<jint>(mode));
} }
// public static void nativeSwitchToNextMode(); // public static void nativeSwitchToNextMode();
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeSwitchToNextMode(JNIEnv * env,
Java_app_organicmaps_sdk_location_LocationState_nativeSwitchToNextMode(JNIEnv * env, jclass clazz) jclass clazz)
{ {
ASSERT(g_framework, ()); ASSERT(g_framework, ());
g_framework->SwitchMyPositionNextMode(); g_framework->SwitchMyPositionNextMode();
} }
// private static int nativeGetMode(); // private static int nativeGetMode();
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeGetMode(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_location_LocationState_nativeGetMode(JNIEnv * env, jclass clazz)
{ {
// GetMyPositionMode() is initialized only after drape creation. // GetMyPositionMode() is initialized only after drape creation.
// https://github.com/organicmaps/organicmaps/issues/1128#issuecomment-1784435190 // https://github.com/organicmaps/organicmaps/issues/1128#issuecomment-1784435190
@@ -35,34 +32,31 @@ Java_app_organicmaps_sdk_location_LocationState_nativeGetMode(JNIEnv * env, jcla
} }
// public static void nativeSetListener(ModeChangeListener listener); // public static void nativeSetListener(ModeChangeListener listener);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeSetListener(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_location_LocationState_nativeSetListener(JNIEnv * env, jclass clazz, jobject listener)
jobject listener)
{ {
ASSERT(g_framework, ()); ASSERT(g_framework, ());
g_framework->SetMyPositionModeListener(std::bind(&LocationStateModeChanged, std::placeholders::_1, g_framework->SetMyPositionModeListener(
jni::make_global_ref(listener))); std::bind(&LocationStateModeChanged, std::placeholders::_1, jni::make_global_ref(listener)));
} }
// public static void nativeRemoveListener(); // public static void nativeRemoveListener();
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeRemoveListener(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_location_LocationState_nativeRemoveListener(JNIEnv * env, jclass clazz)
{ {
ASSERT(g_framework, ()); ASSERT(g_framework, ());
g_framework->SetMyPositionModeListener(location::TMyPositionModeChanged()); g_framework->SetMyPositionModeListener(location::TMyPositionModeChanged());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeOnLocationError(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_location_LocationState_nativeOnLocationError(JNIEnv * env, jclass clazz, int errorCode) int errorCode)
{ {
ASSERT(g_framework, ()); ASSERT(g_framework, ());
g_framework->OnLocationError(errorCode); g_framework->OnLocationError(errorCode);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_LocationState_nativeLocationUpdated(
Java_app_organicmaps_sdk_location_LocationState_nativeLocationUpdated(JNIEnv * env, jclass clazz, jlong time, JNIEnv * env, jclass clazz, jlong time, jdouble lat, jdouble lon, jfloat accuracy, jdouble altitude, jfloat speed,
jdouble lat, jdouble lon, jfloat accuracy, jfloat bearing)
jdouble altitude, jfloat speed, jfloat bearing)
{ {
ASSERT(g_framework, ()); ASSERT(g_framework, ());
location::GpsInfo info; location::GpsInfo info;
@@ -90,4 +84,4 @@ Java_app_organicmaps_sdk_location_LocationState_nativeLocationUpdated(JNIEnv * e
g_framework->OnLocationUpdated(info); g_framework->OnLocationUpdated(info);
GpsTracker::Instance().OnLocationUpdated(info); GpsTracker::Instance().OnLocationUpdated(info);
} }
} // extern "C" } // extern "C"

View File

@@ -15,51 +15,43 @@ namespace
void OnRenderingInitializationFinished(std::shared_ptr<jobject> const & listener) void OnRenderingInitializationFinished(std::shared_ptr<jobject> const & listener)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener.get(), env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener.get(), "onRenderingInitializationFinished", "()V"));
"onRenderingInitializationFinished", "()V"));
} }
} // namespace } // namespace
extern "C" extern "C"
{ {
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_Map_nativeCreateEngine(JNIEnv * env, jclass, jobject surface,
Java_app_organicmaps_sdk_Map_nativeCreateEngine(JNIEnv * env, jclass, jint density, jboolean firstLaunch,
jobject surface, jint density, jboolean isLaunchByDeepLink,
jboolean firstLaunch, jint appVersionCode, jboolean isCustomROM)
jboolean isLaunchByDeepLink,
jint appVersionCode,
jboolean isCustomROM)
{ {
return g_framework->CreateDrapeEngine(env, surface, density, firstLaunch, isLaunchByDeepLink, return g_framework->CreateDrapeEngine(env, surface, density, firstLaunch, isLaunchByDeepLink,
base::asserted_cast<uint32_t>(appVersionCode), isCustomROM); base::asserted_cast<uint32_t>(appVersionCode), isCustomROM);
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_Map_nativeIsEngineCreated(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeIsEngineCreated(JNIEnv *, jclass)
{ {
return g_framework->IsDrapeEngineCreated(); return g_framework->IsDrapeEngineCreated();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeUpdateEngineDpi(JNIEnv *, jclass, jint dpi)
Java_app_organicmaps_sdk_Map_nativeUpdateEngineDpi(JNIEnv *, jclass, jint dpi)
{ {
return g_framework->UpdateDpi(dpi); return g_framework->UpdateDpi(dpi);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeExecuteMapApiRequest(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_Map_nativeExecuteMapApiRequest(JNIEnv * env, jclass)
{ {
return g_framework->ExecuteMapApiRequest(); return g_framework->ExecuteMapApiRequest();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeSetRenderingInitializationFinishedListener(JNIEnv *, jclass,
Java_app_organicmaps_sdk_Map_nativeSetRenderingInitializationFinishedListener( jobject listener)
JNIEnv *, jclass, jobject listener)
{ {
if (listener) if (listener)
{ {
g_framework->NativeFramework()->SetGraphicsContextInitializationHandler( g_framework->NativeFramework()->SetGraphicsContextInitializationHandler(
std::bind(&OnRenderingInitializationFinished, jni::make_global_ref(listener))); std::bind(&OnRenderingInitializationFinished, jni::make_global_ref(listener)));
} }
else else
{ {
@@ -67,69 +59,61 @@ Java_app_organicmaps_sdk_Map_nativeSetRenderingInitializationFinishedListener(
} }
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_Map_nativeAttachSurface(JNIEnv * env, jclass, jobject surface)
Java_app_organicmaps_sdk_Map_nativeAttachSurface(JNIEnv * env, jclass, jobject surface)
{ {
return g_framework->AttachSurface(env, surface); return g_framework->AttachSurface(env, surface);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeDetachSurface(JNIEnv *, jclass, jboolean destroySurface)
Java_app_organicmaps_sdk_Map_nativeDetachSurface(JNIEnv *, jclass, jboolean destroySurface)
{ {
g_framework->DetachSurface(destroySurface); g_framework->DetachSurface(destroySurface);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeSurfaceChanged(JNIEnv * env, jclass, jobject surface, jint w,
Java_app_organicmaps_sdk_Map_nativeSurfaceChanged(JNIEnv * env, jclass, jobject surface, jint w, jint h) jint h)
{ {
g_framework->Resize(env, surface, w, h); g_framework->Resize(env, surface, w, h);
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_Map_nativeDestroySurfaceOnDetach(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeDestroySurfaceOnDetach(JNIEnv *, jclass)
{ {
return g_framework->DestroySurfaceOnDetach(); return g_framework->DestroySurfaceOnDetach();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativePauseSurfaceRendering(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativePauseSurfaceRendering(JNIEnv *, jclass)
{ {
g_framework->PauseSurfaceRendering(); g_framework->PauseSurfaceRendering();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeResumeSurfaceRendering(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeResumeSurfaceRendering(JNIEnv *, jclass)
{ {
g_framework->ResumeSurfaceRendering(); g_framework->ResumeSurfaceRendering();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeUpdateMyPositionRoutingOffset(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_Map_nativeUpdateMyPositionRoutingOffset(JNIEnv * env, jclass clazz, int offsetY) int offsetY)
{ {
g_framework->UpdateMyPositionRoutingOffset(offsetY); g_framework->UpdateMyPositionRoutingOffset(offsetY);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeApplyWidgets(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeApplyWidgets(JNIEnv *, jclass)
{ {
g_framework->ApplyWidgets(); g_framework->ApplyWidgets();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeCleanWidgets(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeCleanWidgets(JNIEnv *, jclass)
{ {
g_framework->CleanWidgets(); g_framework->CleanWidgets();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeSetupWidget(JNIEnv *, jclass, jint widget, jfloat x, jfloat y,
Java_app_organicmaps_sdk_Map_nativeSetupWidget( jint anchor)
JNIEnv *, jclass, jint widget, jfloat x, jfloat y, jint anchor)
{ {
g_framework->SetupWidget(static_cast<gui::EWidget>(widget), x, y, static_cast<dp::Anchor>(anchor)); g_framework->SetupWidget(static_cast<gui::EWidget>(widget), x, y, static_cast<dp::Anchor>(anchor));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeCompassUpdated(JNIEnv *, jclass, jdouble north,
Java_app_organicmaps_sdk_Map_nativeCompassUpdated(JNIEnv *, jclass, jdouble north, jboolean forceRedraw) jboolean forceRedraw)
{ {
location::CompassInfo info; location::CompassInfo info;
info.m_bearing = north; info.m_bearing = north;
@@ -137,54 +121,45 @@ Java_app_organicmaps_sdk_Map_nativeCompassUpdated(JNIEnv *, jclass, jdouble nort
g_framework->OnCompassUpdated(info, forceRedraw); g_framework->OnCompassUpdated(info, forceRedraw);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeScalePlus(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeScalePlus(JNIEnv *, jclass)
{ {
g_framework->Scale(::Framework::SCALE_MAG); g_framework->Scale(::Framework::SCALE_MAG);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeScaleMinus(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeScaleMinus(JNIEnv *, jclass)
{ {
g_framework->Scale(::Framework::SCALE_MIN); g_framework->Scale(::Framework::SCALE_MIN);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeOnScroll(JNIEnv *, jclass, jdouble distanceX,
Java_app_organicmaps_sdk_Map_nativeOnScroll( jdouble distanceY)
JNIEnv *, jclass, jdouble distanceX, jdouble distanceY)
{ {
g_framework->Scroll(distanceX, distanceY); g_framework->Scroll(distanceX, distanceY);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeOnScale(JNIEnv *, jclass, jdouble factor, jdouble focusX,
Java_app_organicmaps_sdk_Map_nativeOnScale( jdouble focusY, jboolean isAnim)
JNIEnv *, jclass, jdouble factor, jdouble focusX, jdouble focusY, jboolean isAnim)
{ {
g_framework->Scale(factor, {focusX, focusY}, isAnim); g_framework->Scale(factor, {focusX, focusY}, isAnim);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeOnTouch(JNIEnv *, jclass, jint action, jint id1, jfloat x1,
Java_app_organicmaps_sdk_Map_nativeOnTouch(JNIEnv *, jclass, jint action, jfloat y1, jint id2, jfloat x2, jfloat y2,
jint id1, jfloat x1, jfloat y1, jint maskedPointer)
jint id2, jfloat x2, jfloat y2,
jint maskedPointer)
{ {
g_framework->Touch(action, g_framework->Touch(action, android::Framework::Finger(id1, x1, y1), android::Framework::Finger(id2, x2, y2),
android::Framework::Finger(id1, x1, y1), maskedPointer);
android::Framework::Finger(id2, x2, y2), maskedPointer);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeStorageConnected(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeStorageConnected(JNIEnv *, jclass)
{ {
android::Platform::Instance().OnExternalStorageStatusChanged(true); android::Platform::Instance().OnExternalStorageStatusChanged(true);
g_framework->AddLocalMaps(); g_framework->AddLocalMaps();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Map_nativeStorageDisconnected(JNIEnv *, jclass)
Java_app_organicmaps_sdk_Map_nativeStorageDisconnected(JNIEnv *, jclass)
{ {
android::Platform::Instance().OnExternalStorageStatusChanged(false); android::Platform::Instance().OnExternalStorageStatusChanged(false);
g_framework->RemoveLocalMaps(); g_framework->RemoveLocalMaps();
} }
} // extern "C" } // extern "C"

View File

@@ -21,7 +21,6 @@
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
namespace namespace
{ {
// The last 5% are left for applying diffs. // The last 5% are left for applying diffs.
@@ -44,7 +43,10 @@ struct TBatchedData
TBatchedData(storage::CountryId const & countryId, storage::NodeStatus const newStatus, TBatchedData(storage::CountryId const & countryId, storage::NodeStatus const newStatus,
storage::NodeErrorCode const errorCode, bool isLeaf) storage::NodeErrorCode const errorCode, bool isLeaf)
: m_countryId(countryId), m_newStatus(newStatus), m_errorCode(errorCode), m_isLeaf(isLeaf) : m_countryId(countryId)
, m_newStatus(newStatus)
, m_errorCode(errorCode)
, m_isLeaf(isLeaf)
{} {}
}; };
@@ -64,11 +66,11 @@ struct CountryItemBuilder
{ {
jclass m_class; jclass m_class;
jmethodID m_ctor; jmethodID m_ctor;
jfieldID m_Id, m_Name, m_DirectParentId, m_TopmostParentId, m_DirectParentName, m_TopmostParentName, jfieldID m_Id, m_Name, m_DirectParentId, m_TopmostParentId, m_DirectParentName, m_TopmostParentName, m_Description,
m_Description, m_Size, m_EnqueuedSize, m_TotalSize, m_ChildCount, m_TotalChildCount, m_Size, m_EnqueuedSize, m_TotalSize, m_ChildCount, m_TotalChildCount, m_Present, m_Progress, m_DownloadedBytes,
m_Present, m_Progress, m_DownloadedBytes, m_BytesToDownload, m_Category, m_Status, m_ErrorCode; m_BytesToDownload, m_Category, m_Status, m_ErrorCode;
CountryItemBuilder(JNIEnv *env) CountryItemBuilder(JNIEnv * env)
{ {
m_class = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/CountryItem"); m_class = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/CountryItem");
m_ctor = jni::GetConstructorID(env, m_class, "(Ljava/lang/String;)V"); m_ctor = jni::GetConstructorID(env, m_class, "(Ljava/lang/String;)V");
@@ -95,10 +97,7 @@ struct CountryItemBuilder
} }
DECLARE_BUILDER_INSTANCE(CountryItemBuilder); DECLARE_BUILDER_INSTANCE(CountryItemBuilder);
jobject Create(JNIEnv * env, jobject id) const jobject Create(JNIEnv * env, jobject id) const { return env->NewObject(m_class, m_ctor, id); }
{
return env->NewObject(m_class, m_ctor, id);
}
}; };
static storage::CountryId const GetRootId(JNIEnv * env, jstring root) static storage::CountryId const GetRootId(JNIEnv * env, jstring root)
@@ -109,52 +108,54 @@ static storage::CountryId const GetRootId(JNIEnv * env, jstring root)
extern "C" extern "C"
{ {
// static String nativeGetRoot(); // static String nativeGetRoot();
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetRoot(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetRoot(JNIEnv * env, jclass clazz)
{ {
return jni::ToJavaString(env, GetStorage().GetRootId()); return jni::ToJavaString(env, GetStorage().GetRootId());
} }
// static boolean nativeMoveFile(String oldFile, String newFile); // static boolean nativeMoveFile(String oldFile, String newFile);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeMoveFile(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeMoveFile(JNIEnv * env, jclass clazz, jstring oldFile, jstring newFile) jstring oldFile,
jstring newFile)
{ {
return base::MoveFileX(jni::ToNativeString(env, oldFile), jni::ToNativeString(env, newFile)); return base::MoveFileX(jni::ToNativeString(env, oldFile), jni::ToNativeString(env, newFile));
} }
// static boolean nativeHasSpaceToDownloadAmount(long bytes); // static boolean nativeHasSpaceToDownloadAmount(long bytes);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToDownloadAmount(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToDownloadAmount(JNIEnv * env, jclass clazz, jlong bytes) jclass clazz,
jlong bytes)
{ {
return storage::IsEnoughSpaceForDownload(bytes); return storage::IsEnoughSpaceForDownload(bytes);
} }
// static boolean nativeHasSpaceToDownloadCountry(String root); // static boolean nativeHasSpaceToDownloadCountry(String root);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToDownloadCountry(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToDownloadCountry(JNIEnv * env, jclass clazz, jstring root) jclass clazz,
jstring root)
{ {
return storage::IsEnoughSpaceForDownload(jni::ToNativeString(env, root), GetStorage()); return storage::IsEnoughSpaceForDownload(jni::ToNativeString(env, root), GetStorage());
} }
// static boolean nativeHasSpaceToUpdate(String root); // static boolean nativeHasSpaceToUpdate(String root);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToUpdate(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeHasSpaceToUpdate(JNIEnv * env, jclass clazz, jstring root) jclass clazz,
jstring root)
{ {
return IsEnoughSpaceForUpdate(jni::ToNativeString(env, root), GetStorage()); return IsEnoughSpaceForUpdate(jni::ToNativeString(env, root), GetStorage());
} }
// static int nativeGetDownloadedCount(); // static int nativeGetDownloadedCount();
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetDownloadedCount(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetDownloadedCount(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return static_cast<jint>(GetStorage().GetDownloadedFilesCount()); return static_cast<jint>(GetStorage().GetDownloadedFilesCount());
} }
// static @Nullable UpdateInfo nativeGetUpdateInfo(@Nullable String root); // static @Nullable UpdateInfo nativeGetUpdateInfo(@Nullable String root);
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetUpdateInfo(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetUpdateInfo(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
storage::Storage::UpdateInfo info; storage::Storage::UpdateInfo info;
if (!GetStorage().GetUpdateInfo(GetRootId(env, root), info)) if (!GetStorage().GetUpdateInfo(GetRootId(env, root), info))
@@ -168,7 +169,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetUpdateInfo(JNIEnv * env,
return env->NewObject(infoClass, ctor, info.m_numberOfMwmFilesToUpdate, info.m_totalDownloadSizeInBytes); return env->NewObject(infoClass, ctor, info.m_numberOfMwmFilesToUpdate, info.m_totalDownloadSizeInBytes);
} }
static void UpdateItemShort(JNIEnv * env, jobject item, storage::NodeStatus const status, storage::NodeErrorCode const error) static void UpdateItemShort(JNIEnv * env, jobject item, storage::NodeStatus const status,
storage::NodeErrorCode const error)
{ {
auto const & ciBuilder = CountryItemBuilder::Instance(env); auto const & ciBuilder = CountryItemBuilder::Instance(env);
@@ -211,7 +213,8 @@ static void UpdateItem(JNIEnv * env, jobject item, storage::NodeAttrs const & at
} }
// Description // Description
env->SetObjectField(item, ciBuilder.m_Description, SLR(env, jni::ToJavaString(env, attrs.m_nodeLocalDescription)).get()); env->SetObjectField(item, ciBuilder.m_Description,
SLR(env, jni::ToJavaString(env, attrs.m_nodeLocalDescription)).get());
// Sizes // Sizes
env->SetLongField(item, ciBuilder.m_Size, attrs.m_localMwmSize); env->SetLongField(item, ciBuilder.m_Size, attrs.m_localMwmSize);
@@ -267,18 +270,21 @@ static void PutItemsToList(
} }
} }
// static void nativeListItems(@Nullable String root, double lat, double lon, boolean hasLocation, boolean myMapsMode, List<CountryItem> result); // static void nativeListItems(@Nullable String root, double lat, double lon, boolean hasLocation, boolean myMapsMode,
JNIEXPORT void JNICALL // List<CountryItem> result);
Java_app_organicmaps_sdk_downloader_MapManager_nativeListItems(JNIEnv * env, jclass clazz, jstring parent, jdouble lat, jdouble lon, jboolean hasLocation, jboolean myMapsMode, jobject result) JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeListItems(JNIEnv * env, jclass clazz,
jstring parent, jdouble lat,
jdouble lon, jboolean hasLocation,
jboolean myMapsMode,
jobject result)
{ {
if (hasLocation && !myMapsMode) if (hasLocation && !myMapsMode)
{ {
storage::CountriesVec near; storage::CountriesVec near;
g_framework->NativeFramework()->GetCountryInfoGetter().GetRegionsCountryId(mercator::FromLatLon(lat, lon), near); g_framework->NativeFramework()->GetCountryInfoGetter().GetRegionsCountryId(mercator::FromLatLon(lat, lon), near);
PutItemsToList(env, result, near, ItemCategory::NEAR_ME, PutItemsToList(env, result, near, ItemCategory::NEAR_ME,
[](storage::CountryId const & countryId, storage::NodeAttrs const & attrs) -> bool { [](storage::CountryId const & countryId, storage::NodeAttrs const & attrs) -> bool
return !attrs.m_present; { return !attrs.m_present; });
});
} }
storage::CountriesVec downloaded, available; storage::CountriesVec downloaded, available;
@@ -291,8 +297,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeListItems(JNIEnv * env, jcl
} }
// static void nativeUpdateItem(CountryItem item); // static void nativeUpdateItem(CountryItem item);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetAttributes(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetAttributes(JNIEnv * env, jclass, jobject item) jobject item)
{ {
auto const & ciBuilder = CountryItemBuilder::Instance(env); auto const & ciBuilder = CountryItemBuilder::Instance(env);
jstring id = static_cast<jstring>(env->GetObjectField(item, ciBuilder.m_Id)); jstring id = static_cast<jstring>(env->GetObjectField(item, ciBuilder.m_Id));
@@ -304,8 +310,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetAttributes(JNIEnv * env,
} }
// static void nativeGetStatus(String root); // static void nativeGetStatus(String root);
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetStatus(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetStatus(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
storage::NodeStatuses ns; storage::NodeStatuses ns;
GetStorage().GetNodeStatuses(jni::ToNativeString(env, root), ns); GetStorage().GetNodeStatuses(jni::ToNativeString(env, root), ns);
@@ -313,8 +319,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetStatus(JNIEnv * env, jcl
} }
// static void nativeGetError(String root); // static void nativeGetError(String root);
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetError(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetError(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
storage::NodeStatuses ns; storage::NodeStatuses ns;
GetStorage().GetNodeStatuses(jni::ToNativeString(env, root), ns); GetStorage().GetNodeStatuses(jni::ToNativeString(env, root), ns);
@@ -322,22 +328,23 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetError(JNIEnv * env, jcla
} }
// static String nativeGetName(String root); // static String nativeGetName(String root);
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetName(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetName(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
return jni::ToJavaString(env, GetStorage().GetNodeLocalName(jni::ToNativeString(env, root))); return jni::ToJavaString(env, GetStorage().GetNodeLocalName(jni::ToNativeString(env, root)));
} }
// static @Nullable String nativeFindCountry(double lat, double lon); // static @Nullable String nativeFindCountry(double lat, double lon);
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeFindCountry(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeFindCountry(JNIEnv * env, jclass clazz, jdouble lat, jdouble lon) jdouble lat, jdouble lon)
{ {
return jni::ToJavaString(env, g_framework->NativeFramework()->GetCountryInfoGetter().GetRegionCountryId(mercator::FromLatLon(lat, lon))); return jni::ToJavaString(
env, g_framework->NativeFramework()->GetCountryInfoGetter().GetRegionCountryId(mercator::FromLatLon(lat, lon)));
} }
// static boolean nativeIsDownloading(); // static boolean nativeIsDownloading();
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeIsDownloading(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeIsDownloading(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return static_cast<jboolean>(GetStorage().IsDownloadInProgress()); return static_cast<jboolean>(GetStorage().IsDownloadInProgress());
} }
@@ -365,14 +372,14 @@ static void EndBatchingCallbacks(JNIEnv * env)
for (TBatchedData const & dataItem : key.second) for (TBatchedData const & dataItem : key.second)
{ {
// Create StorageCallbackData instance… // Create StorageCallbackData instance…
static jclass batchDataClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/MapManager$StorageCallbackData"); static jclass batchDataClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/MapManager$StorageCallbackData");
static jmethodID batchDataCtor = jni::GetConstructorID(env, batchDataClass, "(Ljava/lang/String;IIZ)V"); static jmethodID batchDataCtor = jni::GetConstructorID(env, batchDataClass, "(Ljava/lang/String;IIZ)V");
jni::TScopedLocalRef const id(env, jni::ToJavaString(env, dataItem.m_countryId)); jni::TScopedLocalRef const id(env, jni::ToJavaString(env, dataItem.m_countryId));
jni::TScopedLocalRef const item(env, env->NewObject(batchDataClass, batchDataCtor, id.get(), jni::TScopedLocalRef const item(
static_cast<jint>(dataItem.m_newStatus), env, env->NewObject(batchDataClass, batchDataCtor, id.get(), static_cast<jint>(dataItem.m_newStatus),
static_cast<jint>(dataItem.m_errorCode), static_cast<jint>(dataItem.m_errorCode), dataItem.m_isLeaf));
dataItem.m_isLeaf));
// …and put it into the resulting list // …and put it into the resulting list
env->CallBooleanMethod(list.get(), listBuilder.m_add, item.get()); env->CallBooleanMethod(list.get(), listBuilder.m_add, item.get());
} }
@@ -387,8 +394,8 @@ static void EndBatchingCallbacks(JNIEnv * env)
} }
// static void nativeDownload(String root); // static void nativeDownload(String root);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeDownload(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeDownload(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
StartBatchingCallbacks(); StartBatchingCallbacks();
GetStorage().DownloadNode(jni::ToNativeString(env, root)); GetStorage().DownloadNode(jni::ToNativeString(env, root));
@@ -396,8 +403,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeDownload(JNIEnv * env, jcla
} }
// static boolean nativeRetry(String root); // static boolean nativeRetry(String root);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeRetry(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeRetry(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
StartBatchingCallbacks(); StartBatchingCallbacks();
GetStorage().RetryDownloadNode(jni::ToNativeString(env, root)); GetStorage().RetryDownloadNode(jni::ToNativeString(env, root));
@@ -405,8 +412,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeRetry(JNIEnv * env, jclass
} }
// static void nativeUpdate(String root); // static void nativeUpdate(String root);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeUpdate(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeUpdate(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
StartBatchingCallbacks(); StartBatchingCallbacks();
GetStorage().UpdateNode(GetRootId(env, root)); GetStorage().UpdateNode(GetRootId(env, root));
@@ -414,8 +421,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeUpdate(JNIEnv * env, jclass
} }
// static void nativeCancel(String root); // static void nativeCancel(String root);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeCancel(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeCancel(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
StartBatchingCallbacks(); StartBatchingCallbacks();
GetStorage().CancelDownloadNode(GetRootId(env, root)); GetStorage().CancelDownloadNode(GetRootId(env, root));
@@ -423,8 +430,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeCancel(JNIEnv * env, jclass
} }
// static void nativeDelete(String root); // static void nativeDelete(String root);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeDelete(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeDelete(JNIEnv * env, jclass clazz, jstring root) jstring root)
{ {
StartBatchingCallbacks(); StartBatchingCallbacks();
auto const countryId = jni::ToNativeString(env, root); auto const countryId = jni::ToNativeString(env, root);
@@ -432,8 +439,7 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeDelete(JNIEnv * env, jclass
EndBatchingCallbacks(env); EndBatchingCallbacks(env);
} }
static void StatusChangedCallback(std::shared_ptr<jobject> const & listenerRef, static void StatusChangedCallback(std::shared_ptr<jobject> const & listenerRef, storage::CountryId const & countryId)
storage::CountryId const & countryId)
{ {
storage::NodeStatuses ns; storage::NodeStatuses ns;
GetStorage().GetNodeStatuses(countryId, ns); GetStorage().GetNodeStatuses(countryId, ns);
@@ -445,42 +451,48 @@ static void StatusChangedCallback(std::shared_ptr<jobject> const & listenerRef,
EndBatchingCallbacks(jni::GetEnv()); EndBatchingCallbacks(jni::GetEnv());
} }
static void ProgressChangedCallback(std::shared_ptr<jobject> const & listenerRef, static void ProgressChangedCallback(std::shared_ptr<jobject> const & listenerRef, storage::CountryId const & countryId,
storage::CountryId const & countryId, downloader::Progress const & progress) downloader::Progress const & progress)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
jmethodID const methodID = jni::GetMethodID(env, *listenerRef, "onProgress", "(Ljava/lang/String;JJ)V"); jmethodID const methodID = jni::GetMethodID(env, *listenerRef, "onProgress", "(Ljava/lang/String;JJ)V");
env->CallVoidMethod(*listenerRef, methodID, jni::ToJavaString(env, countryId), env->CallVoidMethod(*listenerRef, methodID, jni::ToJavaString(env, countryId), progress.m_bytesDownloaded,
progress.m_bytesDownloaded, progress.m_bytesTotal); progress.m_bytesTotal);
} }
// static int nativeSubscribe(StorageCallback listener); // static int nativeSubscribe(StorageCallback listener);
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeSubscribe(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeSubscribe(JNIEnv * env, jclass clazz, jobject listener) jobject listener)
{ {
return GetStorage().Subscribe(std::bind(&StatusChangedCallback, jni::make_global_ref(listener), std::placeholders::_1), return GetStorage().Subscribe(
std::bind(&ProgressChangedCallback, jni::make_global_ref(listener), std::placeholders::_1, std::placeholders::_2)); std::bind(&StatusChangedCallback, jni::make_global_ref(listener), std::placeholders::_1),
std::bind(&ProgressChangedCallback, jni::make_global_ref(listener), std::placeholders::_1,
std::placeholders::_2));
} }
// static void nativeUnsubscribe(int slot); // static void nativeUnsubscribe(int slot);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeUnsubscribe(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeUnsubscribe(JNIEnv * env, jclass clazz, jint slot) jint slot)
{ {
GetStorage().Unsubscribe(slot); GetStorage().Unsubscribe(slot);
} }
// static void nativeSubscribeOnCountryChanged(CurrentCountryChangedListener listener); // static void nativeSubscribeOnCountryChanged(CurrentCountryChangedListener listener);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeSubscribeOnCountryChanged(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeSubscribeOnCountryChanged(JNIEnv * env, jclass clazz, jobject listener) jclass clazz,
jobject listener)
{ {
ASSERT(!g_countryChangedListener, ()); ASSERT(!g_countryChangedListener, ());
g_countryChangedListener = env->NewGlobalRef(listener); g_countryChangedListener = env->NewGlobalRef(listener);
auto const callback = [](storage::CountryId const & countryId) { auto const callback = [](storage::CountryId const & countryId)
{
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
jmethodID methodID = jni::GetMethodID(env, g_countryChangedListener, "onCurrentCountryChanged", "(Ljava/lang/String;)V"); jmethodID methodID =
env->CallVoidMethod(g_countryChangedListener, methodID, jni::TScopedLocalRef(env, jni::ToJavaString(env, countryId)).get()); jni::GetMethodID(env, g_countryChangedListener, "onCurrentCountryChanged", "(Ljava/lang/String;)V");
env->CallVoidMethod(g_countryChangedListener, methodID,
jni::TScopedLocalRef(env, jni::ToJavaString(env, countryId)).get());
}; };
storage::CountryId const & prev = g_framework->NativeFramework()->GetLastReportedCountry(); storage::CountryId const & prev = g_framework->NativeFramework()->GetLastReportedCountry();
@@ -491,8 +503,8 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeSubscribeOnCountryChanged(J
} }
// static void nativeUnsubscribeOnCountryChanged(); // static void nativeUnsubscribeOnCountryChanged();
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeUnsubscribeOnCountryChanged(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeUnsubscribeOnCountryChanged(JNIEnv * env, jclass clazz) jclass clazz)
{ {
g_framework->NativeFramework()->SetCurrentCountryChangedListener(nullptr); g_framework->NativeFramework()->SetCurrentCountryChangedListener(nullptr);
@@ -501,15 +513,16 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeUnsubscribeOnCountryChanged
} }
// static boolean nativeHasUnsavedEditorChanges(String root); // static boolean nativeHasUnsavedEditorChanges(String root);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeHasUnsavedEditorChanges(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeHasUnsavedEditorChanges(JNIEnv * env, jclass clazz, jstring root) jclass clazz,
jstring root)
{ {
return g_framework->NativeFramework()->HasUnsavedEdits(jni::ToNativeString(env, root)); return g_framework->NativeFramework()->HasUnsavedEdits(jni::ToNativeString(env, root));
} }
// static void nativeGetPathTo(String root, List<String> result); // static void nativeGetPathTo(String root, List<String> result);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetPathTo(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetPathTo(JNIEnv * env, jclass clazz, jstring root, jobject result) jstring root, jobject result)
{ {
auto const listAddMethod = jni::ListBuilder::Instance(env).m_add; auto const listAddMethod = jni::ListBuilder::Instance(env).m_add;
@@ -520,8 +533,9 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetPathTo(JNIEnv * env, jcl
} }
// static int nativeGetOverallProgress(String[] countries); // static int nativeGetOverallProgress(String[] countries);
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetOverallProgress(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetOverallProgress(JNIEnv * env, jclass clazz, jobjectArray jcountries) jclass clazz,
jobjectArray jcountries)
{ {
int const size = env->GetArrayLength(jcountries); int const size = env->GetArrayLength(jcountries);
storage::CountriesVec countries; storage::CountriesVec countries;
@@ -543,29 +557,29 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetOverallProgress(JNIEnv *
} }
// static boolean nativeIsAutoretryFailed(); // static boolean nativeIsAutoretryFailed();
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeIsAutoretryFailed(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeIsAutoretryFailed(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return g_framework->IsAutoRetryDownloadFailed(); return g_framework->IsAutoRetryDownloadFailed();
} }
// static boolean nativeIsDownloadOn3gEnabled(); // static boolean nativeIsDownloadOn3gEnabled();
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeIsDownloadOn3gEnabled(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeIsDownloadOn3gEnabled(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return g_framework->IsDownloadOn3gEnabled(); return g_framework->IsDownloadOn3gEnabled();
} }
// static void nativeEnableDownloadOn3g(); // static void nativeEnableDownloadOn3g();
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeEnableDownloadOn3g(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeEnableDownloadOn3g(JNIEnv * env, jclass clazz) jclass clazz)
{ {
g_framework->EnableDownloadOn3g(); g_framework->EnableDownloadOn3g();
} }
// static @Nullable String nativeGetSelectedCountry(); // static @Nullable String nativeGetSelectedCountry();
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeGetSelectedCountry(JNIEnv * env,
Java_app_organicmaps_sdk_downloader_MapManager_nativeGetSelectedCountry(JNIEnv * env, jclass clazz) jclass clazz)
{ {
if (!g_framework->NativeFramework()->HasPlacePageInfo()) if (!g_framework->NativeFramework()->HasPlacePageInfo())
return nullptr; return nullptr;
@@ -573,4 +587,4 @@ Java_app_organicmaps_sdk_downloader_MapManager_nativeGetSelectedCountry(JNIEnv *
storage::CountryId const & res = g_framework->GetPlacePageInfo().GetCountryId(); storage::CountryId const & res = g_framework->GetPlacePageInfo().GetCountryId();
return (res == storage::kInvalidCountryId ? nullptr : jni::ToJavaString(env, res)); return (res == storage::kInvalidCountryId ? nullptr : jni::ToJavaString(env, res));
} }
} // extern "C" } // extern "C"

View File

@@ -16,8 +16,8 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeSetSettingsDir
// static void nativeInitPlatform(Context context, String apkPath, String storagePath, String privatePath, String // static void nativeInitPlatform(Context context, String apkPath, String storagePath, String privatePath, String
// tmpPath, String flavorName, String buildType, boolean isTablet); // tmpPath, String flavorName, String buildType, boolean isTablet);
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitPlatform( JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitPlatform(
JNIEnv * env, jclass clazz, jobject context, jstring apkPath, jstring writablePath, jstring privatePath, JNIEnv * env, jclass clazz, jobject context, jstring apkPath, jstring writablePath, jstring privatePath,
jstring tmpPath, jstring flavorName, jstring buildType, jboolean isTablet) jstring tmpPath, jstring flavorName, jstring buildType, jboolean isTablet)
{ {
android::Platform::Instance().Initialize(env, context, apkPath, writablePath, privatePath, tmpPath, flavorName, android::Platform::Instance().Initialize(env, context, apkPath, writablePath, privatePath, tmpPath, flavorName,
buildType, isTablet); buildType, isTablet);
@@ -29,13 +29,12 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitFramework(
{ {
if (!g_framework) if (!g_framework)
{ {
g_framework = std::make_unique<android::Framework>( g_framework = std::make_unique<android::Framework>([onComplete = jni::make_global_ref(onComplete)]()
[onComplete = jni::make_global_ref(onComplete)]() {
{ JNIEnv * env = jni::GetEnv();
JNIEnv * env = jni::GetEnv(); jmethodID const methodId = jni::GetMethodID(env, *onComplete, "run", "()V");
jmethodID const methodId = jni::GetMethodID(env, *onComplete, "run", "()V"); env->CallVoidMethod(*onComplete, methodId);
env->CallVoidMethod(*onComplete, methodId); });
});
} }
} }

View File

@@ -8,52 +8,52 @@
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeSetEnabled(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_location_TrackRecorder_nativeSetEnabled(JNIEnv * env, jclass clazz, jboolean enable) jboolean enable)
{ {
GpsTracker::Instance().SetEnabled(enable); GpsTracker::Instance().SetEnabled(enable);
Framework * const f = frm(); Framework * const f = frm();
if (f == nullptr) if (f == nullptr)
return; return;
if (enable) if (enable)
f->ConnectToGpsTracker(); f->ConnectToGpsTracker();
else else
f->DisconnectFromGpsTracker(); f->DisconnectFromGpsTracker();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsEnabled(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsEnabled(JNIEnv * env, jclass clazz) {
{ return GpsTracker::Instance().IsEnabled();
return GpsTracker::Instance().IsEnabled(); }
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeStartTrackRecording(JNIEnv * env,
JNIEXPORT void JNICALL jclass clazz)
Java_app_organicmaps_sdk_location_TrackRecorder_nativeStartTrackRecording(JNIEnv * env, jclass clazz) {
{ frm()->StartTrackRecording();
frm()->StartTrackRecording(); }
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeStopTrackRecording(JNIEnv * env,
JNIEXPORT void JNICALL jclass clazz)
Java_app_organicmaps_sdk_location_TrackRecorder_nativeStopTrackRecording(JNIEnv * env, jclass clazz) {
{ frm()->StopTrackRecording();
frm()->StopTrackRecording(); }
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeSaveTrackRecordingWithName(JNIEnv * env,
JNIEXPORT void JNICALL jclass clazz,
Java_app_organicmaps_sdk_location_TrackRecorder_nativeSaveTrackRecordingWithName(JNIEnv * env, jclass clazz, jstring name) jstring name)
{ {
frm()->SaveTrackRecordingWithName(jni::ToNativeString(env, name)); frm()->SaveTrackRecordingWithName(jni::ToNativeString(env, name));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsTrackRecordingEmpty(JNIEnv * env,
Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsTrackRecordingEmpty(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return frm()->IsTrackRecordingEmpty(); return frm()->IsTrackRecordingEmpty();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsTrackRecordingEnabled(JNIEnv * env,
Java_app_organicmaps_sdk_location_TrackRecorder_nativeIsTrackRecordingEnabled(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return frm()->IsTrackRecordingEnabled(); return frm()->IsTrackRecordingEnabled();
} }
} }

View File

@@ -9,41 +9,42 @@ extern "C"
static void TrafficStateChanged(TrafficManager::TrafficState state, std::shared_ptr<jobject> const & listener) static void TrafficStateChanged(TrafficManager::TrafficState state, std::shared_ptr<jobject> const & listener)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener, "onTrafficStateChanged", "(I)V"), static_cast<jint>(state)); env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener, "onTrafficStateChanged", "(I)V"),
static_cast<jint>(state));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeSetListener(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeSetListener(JNIEnv * env, jclass clazz, jobject listener) jclass clazz,
jobject listener)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetTrafficStateListener(std::bind(&TrafficStateChanged, std::placeholders::_1, jni::make_global_ref(listener))); g_framework->SetTrafficStateListener(
std::bind(&TrafficStateChanged, std::placeholders::_1, jni::make_global_ref(listener)));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeRemoveListener(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeRemoveListener(JNIEnv * env, jclass clazz) jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetTrafficStateListener(TrafficManager::TrafficStateChangedFn()); g_framework->SetTrafficStateListener(TrafficManager::TrafficStateChangedFn());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeEnable(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeEnable(JNIEnv * env, jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->EnableTraffic(); g_framework->EnableTraffic();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeIsEnabled(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeIsEnabled(JNIEnv * env, jclass clazz) jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
return static_cast<jboolean>(g_framework->IsTrafficEnabled()); return static_cast<jboolean>(g_framework->IsTrafficEnabled());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeDisable(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_maplayer_traffic_TrafficState_nativeDisable(JNIEnv * env, jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->DisableTraffic(); g_framework->DisableTraffic();
} }
} // extern "C" } // extern "C"

View File

@@ -27,107 +27,98 @@ void InjectMetadata(JNIEnv * env, jclass const clazz, jobject const mapObject, o
}); });
} }
//jobject CreatePopularity(JNIEnv * env, place_page::Info const & info) // jobject CreatePopularity(JNIEnv * env, place_page::Info const & info)
//{ //{
// static jclass const popularityClass = // static jclass const popularityClass =
// jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity"); // jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity");
// static jmethodID const popularityConstructor = // static jmethodID const popularityConstructor =
// jni::GetConstructorID(env, popularityClass, "(I)V"); // jni::GetConstructorID(env, popularityClass, "(I)V");
// auto const popularityValue = info.GetPopularity(); // auto const popularityValue = info.GetPopularity();
// return env->NewObject(popularityClass, popularityConstructor, static_cast<jint>(popularityValue)); // return env->NewObject(popularityClass, popularityConstructor, static_cast<jint>(popularityValue));
//} // }
jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObjectType, jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObjectType, double lat, double lon,
double lat, double lon, bool parseMeta, bool parseApi, bool parseMeta, bool parseApi, jobject const & routingPointInfo, jobject const & popularity,
jobject const & routingPointInfo, jobject const & popularity, jobjectArray jrawTypes) jobjectArray jrawTypes)
{ {
// public MapObject(@NonNull FeatureId featureId, @MapObjectType int mapObjectType, String title, // public MapObject(@NonNull FeatureId featureId, @MapObjectType int mapObjectType, String title,
// @Nullable String secondaryTitle, String subtitle, String address, // @Nullable String secondaryTitle, String subtitle, String address,
// double lat, double lon, String apiId, @Nullable RoutePointInfo routePointInfo, // double lat, double lon, String apiId, @Nullable RoutePointInfo routePointInfo,
// @OpeningMode int openingMode, @NonNull Popularity popularity, @NonNull String description, // @OpeningMode int openingMode, @NonNull Popularity popularity, @NonNull String description,
// int roadWarningType, @Nullable String[] rawTypes) // int roadWarningType, @Nullable String[] rawTypes)
static jmethodID const ctorId = jni::GetConstructorID( static jmethodID const ctorId =
env, g_mapObjectClazz, jni::GetConstructorID(env, g_mapObjectClazz,
"(" "("
"Lapp/organicmaps/sdk/bookmarks/data/FeatureId;" // featureId "Lapp/organicmaps/sdk/bookmarks/data/FeatureId;" // featureId
"I" // mapObjectType "I" // mapObjectType
"Ljava/lang/String;" // title "Ljava/lang/String;" // title
"Ljava/lang/String;" // secondaryTitle "Ljava/lang/String;" // secondaryTitle
"Ljava/lang/String;" // subtitle "Ljava/lang/String;" // subtitle
"Ljava/lang/String;" // address "Ljava/lang/String;" // address
"DD" // lat, lon "DD" // lat, lon
"Ljava/lang/String;" // appId "Ljava/lang/String;" // appId
"Lapp/organicmaps/sdk/routing/RoutePointInfo;" // routePointInfo "Lapp/organicmaps/sdk/routing/RoutePointInfo;" // routePointInfo
"I" // openingMode "I" // openingMode
"Lapp/organicmaps/sdk/search/Popularity;" // popularity "Lapp/organicmaps/sdk/search/Popularity;" // popularity
"Ljava/lang/String;" // description "Ljava/lang/String;" // description
"I" // roadWarnType "I" // roadWarnType
"[Ljava/lang/String;" // rawTypes "[Ljava/lang/String;" // rawTypes
")V"); ")V");
//public FeatureId(@NonNull String mwmName, long mwmVersion, int featureIndex) // public FeatureId(@NonNull String mwmName, long mwmVersion, int featureIndex)
static jmethodID const featureCtorId = static jmethodID const featureCtorId = jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
auto const fID = info.GetID(); auto const fID = info.GetID();
jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, fID.GetMwmName())); jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, fID.GetMwmName()));
jni::TScopedLocalRef jFeatureId( jni::TScopedLocalRef jFeatureId(env, env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(),
env, env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(), (jlong)fID.GetMwmVersion(), (jlong)fID.GetMwmVersion(), (jint)fID.m_index));
(jint)fID.m_index));
jni::TScopedLocalRef jTitle(env, jni::ToJavaString(env, info.GetTitle())); jni::TScopedLocalRef jTitle(env, jni::ToJavaString(env, info.GetTitle()));
jni::TScopedLocalRef jSecondaryTitle(env, jni::ToJavaString(env, info.GetSecondaryTitle())); jni::TScopedLocalRef jSecondaryTitle(env, jni::ToJavaString(env, info.GetSecondaryTitle()));
jni::TScopedLocalRef jSubtitle(env, jni::ToJavaStringWithSupplementalCharsFix(env, info.GetSubtitle())); jni::TScopedLocalRef jSubtitle(env, jni::ToJavaStringWithSupplementalCharsFix(env, info.GetSubtitle()));
jni::TScopedLocalRef jAddress(env, jni::ToJavaString(env, info.GetSecondarySubtitle())); jni::TScopedLocalRef jAddress(env, jni::ToJavaString(env, info.GetSecondarySubtitle()));
jni::TScopedLocalRef jApiId(env, jni::ToJavaString(env, parseApi ? info.GetApiUrl() : "")); jni::TScopedLocalRef jApiId(env, jni::ToJavaString(env, parseApi ? info.GetApiUrl() : ""));
jni::TScopedLocalRef jWikiDescription(env, jni::ToJavaString(env, info.GetWikiDescription())); jni::TScopedLocalRef jWikiDescription(env, jni::ToJavaString(env, info.GetWikiDescription()));
jobject mapObject = jobject mapObject = env->NewObject(g_mapObjectClazz, ctorId, jFeatureId.get(), mapObjectType, jTitle.get(),
env->NewObject(g_mapObjectClazz, ctorId, jFeatureId.get(), mapObjectType, jTitle.get(), jSecondaryTitle.get(), jSubtitle.get(), jAddress.get(), lat, lon, jApiId.get(),
jSecondaryTitle.get(), jSubtitle.get(), jAddress.get(), lat, lon, jApiId.get(), routingPointInfo, static_cast<jint>(info.GetOpeningMode()), popularity,
routingPointInfo, jWikiDescription.get(), static_cast<jint>(info.GetRoadType()), jrawTypes);
static_cast<jint>(info.GetOpeningMode()), popularity, jWikiDescription.get(),
static_cast<jint>(info.GetRoadType()), jrawTypes);
if (parseMeta) if (parseMeta)
InjectMetadata(env, g_mapObjectClazz, mapObject, info); InjectMetadata(env, g_mapObjectClazz, mapObject, info);
return mapObject; return mapObject;
} }
jobject CreateBookmark(JNIEnv *env, const place_page::Info &info, jobject CreateBookmark(JNIEnv * env, place_page::Info const & info, jni::TScopedLocalObjectArrayRef const & jrawTypes,
const jni::TScopedLocalObjectArrayRef &jrawTypes, jni::TScopedLocalRef const & routingPointInfo, jobject const & popularity)
const jni::TScopedLocalRef &routingPointInfo,
jobject const & popularity)
{ {
//public Bookmark(@NonNull FeatureId featureId, @IntRange(from = 0) long categoryId, // public Bookmark(@NonNull FeatureId featureId, @IntRange(from = 0) long categoryId,
// @IntRange(from = 0) long bookmarkId, String title, @Nullable String secondaryTitle, // @IntRange(from = 0) long bookmarkId, String title, @Nullable String secondaryTitle,
// @Nullable String subtitle, @Nullable String address, @Nullable RoutePointInfo routePointInfo, // @Nullable String subtitle, @Nullable String address, @Nullable RoutePointInfo routePointInfo,
// @OpeningMode int openingMode, @NonNull Popularity popularity, @NonNull String description, // @OpeningMode int openingMode, @NonNull Popularity popularity, @NonNull String description,
// @Nullable String[] rawTypes) // @Nullable String[] rawTypes)
static jmethodID const ctorId = static jmethodID const ctorId =
jni::GetConstructorID(env, g_bookmarkClazz, jni::GetConstructorID(env, g_bookmarkClazz,
"(Lapp/organicmaps/sdk/bookmarks/data/FeatureId;JJLjava/lang/String;" "(Lapp/organicmaps/sdk/bookmarks/data/FeatureId;JJLjava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;" "Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
"Lapp/organicmaps/sdk/routing/RoutePointInfo;" "Lapp/organicmaps/sdk/routing/RoutePointInfo;"
"ILapp/organicmaps/sdk/search/Popularity;Ljava/lang/String;" "ILapp/organicmaps/sdk/search/Popularity;Ljava/lang/String;"
"[Ljava/lang/String;)V"); "[Ljava/lang/String;)V");
static jmethodID const featureCtorId = static jmethodID const featureCtorId = jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
auto const bookmarkId = info.GetBookmarkId(); auto const bookmarkId = info.GetBookmarkId();
auto const categoryId = info.GetBookmarkCategoryId(); auto const categoryId = info.GetBookmarkCategoryId();
jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, info.GetID().GetMwmName())); jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, info.GetID().GetMwmName()));
jni::TScopedLocalRef jFeatureId( jni::TScopedLocalRef jFeatureId(env, env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(),
env, env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(), (jlong)info.GetID().GetMwmVersion(), (jint)info.GetID().m_index));
(jlong)info.GetID().GetMwmVersion(), (jint)info.GetID().m_index));
jni::TScopedLocalRef jTitle(env, jni::ToJavaString(env, info.GetTitle())); jni::TScopedLocalRef jTitle(env, jni::ToJavaString(env, info.GetTitle()));
jni::TScopedLocalRef jSecondaryTitle(env, jni::ToJavaString(env, info.GetSecondaryTitle())); jni::TScopedLocalRef jSecondaryTitle(env, jni::ToJavaString(env, info.GetSecondaryTitle()));
jni::TScopedLocalRef jSubtitle(env, jni::ToJavaStringWithSupplementalCharsFix(env, info.GetSubtitle())); jni::TScopedLocalRef jSubtitle(env, jni::ToJavaStringWithSupplementalCharsFix(env, info.GetSubtitle()));
jni::TScopedLocalRef jAddress(env, jni::ToJavaString(env, info.GetSecondarySubtitle())); jni::TScopedLocalRef jAddress(env, jni::ToJavaString(env, info.GetSecondarySubtitle()));
jni::TScopedLocalRef jWikiDescription(env, jni::ToJavaString(env, info.GetWikiDescription())); jni::TScopedLocalRef jWikiDescription(env, jni::ToJavaString(env, info.GetWikiDescription()));
jobject mapObject = env->NewObject( jobject mapObject = env->NewObject(g_bookmarkClazz, ctorId, jFeatureId.get(), static_cast<jlong>(categoryId),
g_bookmarkClazz, ctorId, jFeatureId.get(), static_cast<jlong>(categoryId), static_cast<jlong>(bookmarkId), jTitle.get(), jSecondaryTitle.get(),
static_cast<jlong>(bookmarkId), jTitle.get(), jSecondaryTitle.get(), jSubtitle.get(), jSubtitle.get(), jAddress.get(), routingPointInfo.get(), info.GetOpeningMode(),
jAddress.get(), routingPointInfo.get(), info.GetOpeningMode(), popularity, popularity, jWikiDescription.get(), jrawTypes.get());
jWikiDescription.get(), jrawTypes.get());
if (info.HasMetadata()) if (info.HasMetadata())
InjectMetadata(env, g_mapObjectClazz, mapObject, info); InjectMetadata(env, g_mapObjectClazz, mapObject, info);
@@ -139,9 +130,8 @@ jobject CreateElevationPoint(JNIEnv * env, ElevationInfo::Point const & point)
static jclass const pointClass = static jclass const pointClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point"); jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point");
// public Point(double distance, int altitude) // public Point(double distance, int altitude)
static jmethodID const pointCtorId = static jmethodID const pointCtorId = jni::GetConstructorID(env, pointClass, "(DI)V");
jni::GetConstructorID(env, pointClass, "(DI)V"); return env->NewObject(pointClass, pointCtorId, static_cast<jdouble>(point.m_distance),
return env->NewObject(pointClass, pointCtorId, static_cast<jdouble >(point.m_distance),
static_cast<jint>(point.m_point.GetAltitude())); static_cast<jint>(point.m_point.GetAltitude()));
} }
@@ -150,11 +140,8 @@ jobjectArray ToElevationPointArray(JNIEnv * env, ElevationInfo::Points const & p
CHECK(!points.empty(), ("Elevation points must be non empty!")); CHECK(!points.empty(), ("Elevation points must be non empty!"));
static jclass const pointClass = static jclass const pointClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point"); jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point");
return jni::ToJavaArray(env, pointClass, points, return jni::ToJavaArray(env, pointClass, points, [](JNIEnv * env, ElevationInfo::Point const & item)
[](JNIEnv * env, ElevationInfo::Point const & item) { return CreateElevationPoint(env, item); });
{
return CreateElevationPoint(env, item);
});
} }
jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info) jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info)
@@ -162,18 +149,18 @@ jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info)
// public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points, // public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points,
// int ascent, int descent, int minAltitude, int maxAltitude, int difficulty, // int ascent, int descent, int minAltitude, int maxAltitude, int difficulty,
// long m_duration) // long m_duration)
static jmethodID const ctorId = static jmethodID const ctorId = jni::GetConstructorID(env, g_elevationInfoClazz,
jni::GetConstructorID(env, g_elevationInfoClazz, "(JLjava/lang/String;Ljava/lang/String;" "(JLjava/lang/String;Ljava/lang/String;"
"[Lapp/organicmaps/sdk/bookmarks/data/ElevationInfo$Point;" "[Lapp/organicmaps/sdk/bookmarks/data/ElevationInfo$Point;"
"IIIIIJ)V"); "IIIIIJ)V");
jni::TScopedLocalObjectArrayRef jPoints(env, ToElevationPointArray(env, info.GetPoints())); jni::TScopedLocalObjectArrayRef jPoints(env, ToElevationPointArray(env, info.GetPoints()));
// TODO (KK): elevation info should have only the elevation data - see the https://github.com/organicmaps/organicmaps/pull/10063 // TODO (KK): elevation info should have only the elevation data - see the
return env->NewObject(g_elevationInfoClazz, ctorId, // https://github.com/organicmaps/organicmaps/pull/10063
jPoints.get(), return env->NewObject(g_elevationInfoClazz, ctorId, jPoints.get(),
// static_cast<jint>(info.GetAscent()), // static_cast<jint>(info.GetAscent()),
// static_cast<jint>(info.GetDescent()), // static_cast<jint>(info.GetDescent()),
// static_cast<jint>(info.GetMinAltitude()), // static_cast<jint>(info.GetMinAltitude()),
// static_cast<jint>(info.GetMaxAltitude()), // static_cast<jint>(info.GetMaxAltitude()),
static_cast<jint>(info.GetDifficulty())); static_cast<jint>(info.GetDifficulty()));
} }
@@ -185,46 +172,39 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
if (info.IsRoutePoint()) if (info.IsRoutePoint())
routingPointInfo.reset(CreateRoutePointInfo(env, info)); routingPointInfo.reset(CreateRoutePointInfo(env, info));
//jni::TScopedLocalRef popularity(env, CreatePopularity(env, info)); // jni::TScopedLocalRef popularity(env, CreatePopularity(env, info));
jobject popularity = nullptr; jobject popularity = nullptr;
if (info.IsBookmark()) if (info.IsBookmark())
{
return CreateBookmark(env, info, jrawTypes, routingPointInfo, popularity); return CreateBookmark(env, info, jrawTypes, routingPointInfo, popularity);
}
ms::LatLon const ll = info.GetLatLon(); ms::LatLon const ll = info.GetLatLon();
// TODO(yunikkk): object can be POI + API + search result + bookmark simultaneously. // TODO(yunikkk): object can be POI + API + search result + bookmark simultaneously.
// TODO(yunikkk): Should we pass localized strings here and in other methods as byte arrays? // TODO(yunikkk): Should we pass localized strings here and in other methods as byte arrays?
if (info.IsMyPosition()) if (info.IsMyPosition())
{ {
return CreateMapObject(env, info, kMyPosition, ll.m_lat, ll.m_lon, return CreateMapObject(env, info, kMyPosition, ll.m_lat, ll.m_lon, false /* parseMeta */, false /* parseApi */,
false /* parseMeta */, false /* parseApi */,
routingPointInfo.get(), popularity, jrawTypes.get()); routingPointInfo.get(), popularity, jrawTypes.get());
} }
if (info.HasApiUrl()) if (info.HasApiUrl())
{ {
return CreateMapObject(env, info, kApiPoint, ll.m_lat, ll.m_lon, return CreateMapObject(env, info, kApiPoint, ll.m_lat, ll.m_lon, true /* parseMeta */, true /* parseApi */,
true /* parseMeta */, true /* parseApi */,
routingPointInfo.get(), popularity, jrawTypes.get()); routingPointInfo.get(), popularity, jrawTypes.get());
} }
return CreateMapObject(env, info, kPoi, ll.m_lat, ll.m_lon, return CreateMapObject(env, info, kPoi, ll.m_lat, ll.m_lon, true /* parseMeta */, false /* parseApi */,
true /* parseMeta */, false /* parseApi */,
routingPointInfo.get(), popularity, jrawTypes.get()); routingPointInfo.get(), popularity, jrawTypes.get());
} }
jobject CreateFeatureId(JNIEnv * env, FeatureID const & fid) jobject CreateFeatureId(JNIEnv * env, FeatureID const & fid)
{ {
static jmethodID const featureCtorId = static jmethodID const featureCtorId = jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
auto const & info = fid.m_mwmId.GetInfo(); auto const & info = fid.m_mwmId.GetInfo();
jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, info ? info->GetCountryName() : "")); jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, info ? info->GetCountryName() : ""));
return env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(), return env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(),
info ? static_cast<jlong>(info->GetVersion()) : 0, info ? static_cast<jlong>(info->GetVersion()) : 0, static_cast<jint>(fid.m_index));
static_cast<jint>(fid.m_index));
} }
jobjectArray ToFeatureIdArray(JNIEnv * env, std::vector<FeatureID> const & ids) jobjectArray ToFeatureIdArray(JNIEnv * env, std::vector<FeatureID> const & ids)
@@ -233,8 +213,6 @@ jobjectArray ToFeatureIdArray(JNIEnv * env, std::vector<FeatureID> const & ids)
return nullptr; return nullptr;
return jni::ToJavaArray(env, g_featureIdClazz, ids, return jni::ToJavaArray(env, g_featureIdClazz, ids,
[](JNIEnv * env, FeatureID const & fid) { [](JNIEnv * env, FeatureID const & fid) { return CreateFeatureId(env, fid); });
return CreateFeatureId(env, fid);
});
} }
} // namespace usermark_helper } // namespace usermark_helper

View File

@@ -2,8 +2,8 @@
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/Framework.hpp" #include "app/organicmaps/sdk/Framework.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include <vector> #include <vector>

View File

@@ -6,7 +6,8 @@ namespace jni
{ {
// A smart pointer that deletes a JNI local reference when it goes out of scope. // A smart pointer that deletes a JNI local reference when it goes out of scope.
template <typename T> template <typename T>
class ScopedLocalRef { class ScopedLocalRef
{
public: public:
ScopedLocalRef(JNIEnv * env, T localRef) : m_env(env), m_localRef(localRef) {} ScopedLocalRef(JNIEnv * env, T localRef) : m_env(env), m_localRef(localRef) {}

View File

@@ -6,8 +6,8 @@
#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 "app/organicmaps/sdk/bookmarks/data/Icon.hpp" #include "app/organicmaps/sdk/bookmarks/data/Icon.hpp"
#include "app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp"
#include <vector> #include <vector>
@@ -36,7 +36,7 @@ int __system_property_get(char const * name, char * value);
static bool IsAndroidApiLowerThan(int apiLevel) 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;
int const deviceApiLevel = atoi(value); int const deviceApiLevel = atoi(value);
@@ -78,8 +78,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void *)
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *, void *)
JNI_OnUnload(JavaVM *, void *)
{ {
g_jvm = 0; g_jvm = 0;
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
@@ -187,11 +186,11 @@ jstring ToJavaStringWithSupplementalCharsFix(JNIEnv * env, std::string const & s
if (g_isAndroidLowerThan7) if (g_isAndroidLowerThan7)
{ {
// Detect 4-byte sequence start marker to avoid unnecessary allocation + copy. // Detect 4-byte sequence start marker to avoid unnecessary allocation + copy.
for (const auto c : s) for (auto const c : s)
{ {
if (0b11110000 == (c & 0b11111000)) if (0b11110000 == (c & 0b11111000))
{ {
const auto utf16 = strings::ToUtf16(s); auto const utf16 = strings::ToUtf16(s);
return env->NewString(reinterpret_cast<jchar const *>(utf16.data()), utf16.size()); return env->NewString(reinterpret_cast<jchar const *>(utf16.data()), utf16.size());
} }
} }
@@ -219,39 +218,36 @@ std::shared_ptr<jobject> make_global_ref(jobject obj)
}); });
} }
std::string ToNativeString(JNIEnv * env, const jthrowable & e) std::string ToNativeString(JNIEnv * env, jthrowable const & e)
{ {
jni::TScopedLocalClassRef logClassRef(env, env->FindClass("android/util/Log")); jni::TScopedLocalClassRef logClassRef(env, env->FindClass("android/util/Log"));
ASSERT(logClassRef.get(), ()); ASSERT(logClassRef.get(), ());
static jmethodID const getStacktraceMethod = static jmethodID const getStacktraceMethod = jni::GetStaticMethodID(env, logClassRef.get(), "getStackTraceString",
jni::GetStaticMethodID(env, logClassRef.get(), "getStackTraceString", "(Ljava/lang/Throwable;)Ljava/lang/String;");
"(Ljava/lang/Throwable;)Ljava/lang/String;");
ASSERT(getStacktraceMethod, ()); ASSERT(getStacktraceMethod, ());
TScopedLocalRef resultRef(env, env->CallStaticObjectMethod(logClassRef.get(), getStacktraceMethod, e)); TScopedLocalRef resultRef(env, env->CallStaticObjectMethod(logClassRef.get(), getStacktraceMethod, e));
return ToNativeString(env, (jstring) resultRef.get()); return ToNativeString(env, (jstring)resultRef.get());
} }
bool HandleJavaException(JNIEnv * env) bool HandleJavaException(JNIEnv * env)
{ {
if (env->ExceptionCheck()) if (env->ExceptionCheck())
{ {
jni::ScopedLocalRef<jthrowable> const e(env, env->ExceptionOccurred()); jni::ScopedLocalRef<jthrowable> const e(env, env->ExceptionOccurred());
env->ExceptionDescribe(); env->ExceptionDescribe();
env->ExceptionClear(); env->ExceptionClear();
base::LogLevel level = GetLogLevelForException(env, e.get()); base::LogLevel level = GetLogLevelForException(env, e.get());
LOG(level, (ToNativeString(env, e.get()))); LOG(level, (ToNativeString(env, e.get())));
return true; return true;
} }
return false; return false;
} }
base::LogLevel GetLogLevelForException(JNIEnv * env, const jthrowable & e) base::LogLevel GetLogLevelForException(JNIEnv * env, jthrowable const & e)
{ {
static jclass const errorClass = jni::GetGlobalClassRef(env, "java/lang/Error"); static jclass const errorClass = jni::GetGlobalClassRef(env, "java/lang/Error");
ASSERT(errorClass, (jni::DescribeException())); ASSERT(errorClass, (jni::DescribeException()));
static jclass const runtimeExceptionClass = static jclass const runtimeExceptionClass = jni::GetGlobalClassRef(env, "java/lang/RuntimeException");
jni::GetGlobalClassRef(env, "java/lang/RuntimeException");
ASSERT(runtimeExceptionClass, (jni::DescribeException())); ASSERT(runtimeExceptionClass, (jni::DescribeException()));
// If Unchecked Exception or Error is occurred during Java call the app should fail immediately. // If Unchecked Exception or Error is occurred during Java call the app should fail immediately.
// In other cases, just a warning message about exception (Checked Exception) // In other cases, just a warning message about exception (Checked Exception)
@@ -281,12 +277,10 @@ std::string DescribeException()
jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point) jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point)
{ {
jclass klass = env->FindClass("app/organicmaps/sdk/bookmarks/data/ParcelablePointD"); jclass klass = env->FindClass("app/organicmaps/sdk/bookmarks/data/ParcelablePointD");
ASSERT ( klass, () ); ASSERT(klass, ());
jmethodID methodID = GetConstructorID(env, klass, "(DD)V"); jmethodID methodID = GetConstructorID(env, klass, "(DD)V");
return env->NewObject(klass, methodID, return env->NewObject(klass, methodID, static_cast<jdouble>(point.x), static_cast<jdouble>(point.y));
static_cast<jdouble>(point.x),
static_cast<jdouble>(point.y));
} }
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point) jobject GetNewPoint(JNIEnv * env, m2::PointD const & point)
@@ -297,12 +291,10 @@ jobject GetNewPoint(JNIEnv * env, m2::PointD const & point)
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point) jobject GetNewPoint(JNIEnv * env, m2::PointI const & point)
{ {
jclass klass = env->FindClass("android/graphics/Point"); jclass klass = env->FindClass("android/graphics/Point");
ASSERT ( klass, () ); ASSERT(klass, ());
jmethodID methodID = GetConstructorID(env, klass, "(II)V"); jmethodID methodID = GetConstructorID(env, klass, "(II)V");
return env->NewObject(klass, methodID, return env->NewObject(klass, methodID, static_cast<jint>(point.x), static_cast<jint>(point.y));
static_cast<jint>(point.x),
static_cast<jint>(point.y));
} }
// This util method dumps content of local and global reference jni tables to logcat for debug and testing purposes // This util method dumps content of local and global reference jni tables to logcat for debug and testing purposes
@@ -317,8 +309,8 @@ void DumpDalvikReferenceTables()
jobject ToKeyValue(JNIEnv * env, std::pair<std::string, std::string> src) jobject ToKeyValue(JNIEnv * env, std::pair<std::string, std::string> src)
{ {
static jmethodID const keyValueInit = jni::GetConstructorID( static jmethodID const keyValueInit =
env, g_keyValueClazz, "(Ljava/lang/String;Ljava/lang/String;)V"); jni::GetConstructorID(env, g_keyValueClazz, "(Ljava/lang/String;Ljava/lang/String;)V");
jni::TScopedLocalRef key(env, jni::ToJavaString(env, src.first)); jni::TScopedLocalRef key(env, jni::ToJavaString(env, src.first));
jni::TScopedLocalRef value(env, jni::ToJavaString(env, src.second)); jni::TScopedLocalRef value(env, jni::ToJavaString(env, src.second));
@@ -328,16 +320,12 @@ jobject ToKeyValue(JNIEnv * env, std::pair<std::string, std::string> src)
std::pair<std::string, std::string> ToNativeKeyValue(JNIEnv * env, jobject pairOfStrings) std::pair<std::string, std::string> ToNativeKeyValue(JNIEnv * env, jobject pairOfStrings)
{ {
static jfieldID const keyId = env->GetFieldID(g_keyValueClazz, "mKey", static jfieldID const keyId = env->GetFieldID(g_keyValueClazz, "mKey", "Ljava/lang/String;");
"Ljava/lang/String;"); static jfieldID const valueId = env->GetFieldID(g_keyValueClazz, "mValue", "Ljava/lang/String;");
static jfieldID const valueId = env->GetFieldID(g_keyValueClazz, "mValue",
"Ljava/lang/String;");
jni::ScopedLocalRef<jstring> const key( jni::ScopedLocalRef<jstring> const key(env, static_cast<jstring>(env->GetObjectField(pairOfStrings, keyId)));
env, static_cast<jstring>(env->GetObjectField(pairOfStrings, keyId))); jni::ScopedLocalRef<jstring> const value(env, static_cast<jstring>(env->GetObjectField(pairOfStrings, valueId)));
jni::ScopedLocalRef<jstring> const value(
env, static_cast<jstring>(env->GetObjectField(pairOfStrings, valueId)));
return { jni::ToNativeString(env, key.get()), jni::ToNativeString(env, value.get()) }; return {jni::ToNativeString(env, key.get()), jni::ToNativeString(env, value.get())};
} }
} // namespace jni } // namespace jni

View File

@@ -41,8 +41,8 @@ jfieldID GetStaticFieldID(JNIEnv * env, jclass clazz, char const * name, char co
jclass GetGlobalClassRef(JNIEnv * env, char const * s); jclass GetGlobalClassRef(JNIEnv * env, char const * s);
std::string ToNativeString(JNIEnv * env, jstring str); std::string ToNativeString(JNIEnv * env, jstring str);
// Converts UTF-8 array to native UTF-8 string. Result differs from simple GetStringUTFChars call for characters greater than U+10000, // Converts UTF-8 array to native UTF-8 string. Result differs from simple GetStringUTFChars call for characters greater
// since jni uses modified UTF (MUTF-8) for strings. // than U+10000, since jni uses modified UTF (MUTF-8) for strings.
std::string ToNativeString(JNIEnv * env, jbyteArray const & utfBytes); std::string ToNativeString(JNIEnv * env, jbyteArray const & utfBytes);
jstring ToJavaString(JNIEnv * env, char const * s); jstring ToJavaString(JNIEnv * env, char const * s);
inline jstring ToJavaString(JNIEnv * env, std::string const & s) inline jstring ToJavaString(JNIEnv * env, std::string const & s)
@@ -63,7 +63,7 @@ char const * GetStringClassName();
std::string DescribeException(); std::string DescribeException();
bool HandleJavaException(JNIEnv * env); bool HandleJavaException(JNIEnv * env);
base::LogLevel GetLogLevelForException(JNIEnv * env, const jthrowable & e); base::LogLevel GetLogLevelForException(JNIEnv * env, jthrowable const & e);
std::shared_ptr<jobject> make_global_ref(jobject obj); std::shared_ptr<jobject> make_global_ref(jobject obj);
using TScopedLocalRef = ScopedLocalRef<jobject>; using TScopedLocalRef = ScopedLocalRef<jobject>;
@@ -77,10 +77,10 @@ jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point);
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point); jobject GetNewPoint(JNIEnv * env, m2::PointD const & point);
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point); jobject GetNewPoint(JNIEnv * env, m2::PointI const & point);
template<typename TIt, typename TToJavaFn> template <typename TIt, typename TToJavaFn>
jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, TIt begin, TIt end, size_t const size, TToJavaFn && toJavaFn) jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, TIt begin, TIt end, size_t const size, TToJavaFn && toJavaFn)
{ {
jobjectArray jArray = env->NewObjectArray((jint) size, clazz, 0); jobjectArray jArray = env->NewObjectArray((jint)size, clazz, 0);
jint i = 0; jint i = 0;
for (auto it = begin; it != end; ++it) for (auto it = begin; it != end; ++it)
{ {
@@ -92,21 +92,17 @@ jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, TIt begin, TIt end, size_t
return jArray; return jArray;
} }
template<typename TContainer, typename TToJavaFn> template <typename TContainer, typename TToJavaFn>
jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, TContainer const & src, TToJavaFn && toJavaFn) jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, TContainer const & src, TToJavaFn && toJavaFn)
{ {
return ToJavaArray(env, clazz, std::begin(src), std::end(src), src.size(), return ToJavaArray(env, clazz, std::begin(src), std::end(src), src.size(), std::forward<TToJavaFn>(toJavaFn));
std::forward<TToJavaFn>(toJavaFn));
} }
template <typename Cont> template <typename Cont>
jobjectArray ToJavaStringArray(JNIEnv * env, Cont const & src) jobjectArray ToJavaStringArray(JNIEnv * env, Cont const & src)
{ {
return ToJavaArray(env, GetStringClass(env), src, return ToJavaArray(env, GetStringClass(env), src,
[](JNIEnv * env, std::string const & item) [](JNIEnv * env, std::string const & item) { return ToJavaString(env, item.c_str()); });
{
return ToJavaString(env, item.c_str());
});
} }
void DumpDalvikReferenceTables(); void DumpDalvikReferenceTables();

View File

@@ -29,4 +29,4 @@ jobject ListBuilder::CreateArray(JNIEnv * env, size_t sz) const
{ {
return env->NewObject(m_arrayClass, m_arrayCtor, sz); return env->NewObject(m_arrayClass, m_arrayCtor, sz);
} }
} // namespace jni } // namespace jni

View File

@@ -2,8 +2,12 @@
#include <jni.h> #include <jni.h>
#define DECLARE_BUILDER_INSTANCE(BuilderType) static BuilderType const & Instance(JNIEnv * env) { \ #define DECLARE_BUILDER_INSTANCE(BuilderType) \
static BuilderType const inst(env); return inst; } static BuilderType const & Instance(JNIEnv * env) \
{ \
static BuilderType const inst(env); \
return inst; \
}
namespace jni namespace jni
{ {
@@ -34,4 +38,4 @@ public:
jobject CreateArray(JNIEnv * env, size_t sz) const; jobject CreateArray(JNIEnv * env, size_t sz) const;
}; };
} // namespace jni } // namespace jni

View File

@@ -3,9 +3,9 @@
#include "base/exception.hpp" #include "base/exception.hpp"
#include "base/logging.hpp" #include "base/logging.hpp"
#include "app/organicmaps/sdk/core/ScopedEnv.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp" #include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/core/logging.hpp" #include "app/organicmaps/sdk/core/logging.hpp"
#include "app/organicmaps/sdk/core/ScopedEnv.hpp"
#include <android/log.h> #include <android/log.h>
#include <cassert> #include <cassert>
@@ -22,17 +22,17 @@ void AndroidMessage(LogLevel level, SrcPoint const & src, std::string const & s)
switch (level) switch (level)
{ {
case LINFO: pr = ANDROID_LOG_INFO; break; case LINFO: pr = ANDROID_LOG_INFO; break;
case LDEBUG: pr = ANDROID_LOG_DEBUG; break; case LDEBUG: pr = ANDROID_LOG_DEBUG; break;
case LWARNING: pr = ANDROID_LOG_WARN; break; case LWARNING: pr = ANDROID_LOG_WARN; break;
case LERROR: pr = ANDROID_LOG_ERROR; break; case LERROR: pr = ANDROID_LOG_ERROR; break;
case LCRITICAL: pr = ANDROID_LOG_ERROR; break; case LCRITICAL: pr = ANDROID_LOG_ERROR; break;
case NUM_LOG_LEVELS: break; case NUM_LOG_LEVELS: break;
} }
ScopedEnv env(jni::GetJVM()); ScopedEnv env(jni::GetJVM());
static jmethodID const logMethod = jni::GetStaticMethodID(env.get(), g_loggerClazz, static jmethodID const logMethod = jni::GetStaticMethodID(
"log", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"); env.get(), g_loggerClazz, "log", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V");
std::string const out = DebugPrint(src) + s; std::string const out = DebugPrint(src) + s;
jni::TScopedLocalRef msg(env.get(), jni::ToJavaString(env.get(), out)); jni::TScopedLocalRef msg(env.get(), jni::ToJavaString(env.get(), out));
@@ -68,4 +68,4 @@ void ToggleDebugLogs(bool enabled)
else else
g_LogLevel = LINFO; g_LogLevel = LINFO;
} }
} } // namespace jni

View File

@@ -2,7 +2,7 @@
namespace jni namespace jni
{ {
void InitSystemLog(); void InitSystemLog();
void InitAssertLog(); void InitAssertLog();
void ToggleDebugLogs(bool enabled); void ToggleDebugLogs(bool enabled);
} } // namespace jni

View File

@@ -2,16 +2,12 @@
namespace android namespace android
{ {
void RenderContext::makeCurrent() void RenderContext::makeCurrent() {}
{
}
graphics::RenderContext * RenderContext::createShared() graphics::RenderContext * RenderContext::createShared()
{ {
RenderContext * rc = new RenderContext(); RenderContext * rc = new RenderContext();
rc->setResourceManager(resourceManager()); rc->setResourceManager(resourceManager());
return rc; return rc;
}
} }
} // namespace android

View File

@@ -6,12 +6,11 @@
namespace android namespace android
{ {
class RenderContext : public graphics::gl::RenderContext class RenderContext : public graphics::gl::RenderContext
{ {
public: public:
void makeCurrent();
void makeCurrent(); graphics::RenderContext * createShared();
};
graphics::RenderContext * createShared(); } // namespace android
};
}

View File

@@ -1,7 +1,7 @@
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/Framework.hpp" #include "app/organicmaps/sdk/Framework.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "editor/osm_editor.hpp" #include "editor/osm_editor.hpp"
@@ -43,8 +43,7 @@ jobject ToJavaName(JNIEnv * env, osm::LocalizedName const & name)
jni::TScopedLocalRef jName(env, jni::ToJavaString(env, name.m_name)); jni::TScopedLocalRef jName(env, jni::ToJavaString(env, name.m_name));
jni::TScopedLocalRef jLang(env, jni::ToJavaString(env, name.m_lang)); jni::TScopedLocalRef jLang(env, jni::ToJavaString(env, name.m_lang));
jni::TScopedLocalRef jLangName(env, jni::ToJavaString(env, name.m_langName)); jni::TScopedLocalRef jLangName(env, jni::ToJavaString(env, name.m_langName));
return env->NewObject(g_localNameClazz, g_localNameCtor, name.m_code, return env->NewObject(g_localNameClazz, g_localNameCtor, name.m_code, jName.get(), jLang.get(), jLangName.get());
jName.get(), jLang.get(), jLangName.get());
} }
jobject ToJavaStreet(JNIEnv * env, osm::LocalizedStreet const & street) jobject ToJavaStreet(JNIEnv * env, osm::LocalizedStreet const & street)
@@ -65,12 +64,12 @@ extern "C"
{ {
using osm::Editor; using osm::Editor;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeInit(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeInit(JNIEnv * env, jclass)
{ {
g_localNameClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/LocalizedName"); g_localNameClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/LocalizedName");
// LocalizedName(int code, @NonNull String name, @NonNull String lang, @NonNull String langName) // LocalizedName(int code, @NonNull String name, @NonNull String lang, @NonNull String langName)
g_localNameCtor = jni::GetConstructorID(env, g_localNameClazz, "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); g_localNameCtor =
jni::GetConstructorID(env, g_localNameClazz, "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
g_localNameFieldCode = env->GetFieldID(g_localNameClazz, "code", "I"); g_localNameFieldCode = env->GetFieldID(g_localNameClazz, "code", "I");
g_localNameFieldName = env->GetFieldID(g_localNameClazz, "name", "Ljava/lang/String;"); g_localNameFieldName = env->GetFieldID(g_localNameClazz, "name", "Ljava/lang/String;");
@@ -81,30 +80,28 @@ Java_app_organicmaps_sdk_editor_Editor_nativeInit(JNIEnv * env, jclass)
g_localStreetFieldLoc = env->GetFieldID(g_localStreetClazz, "localizedName", "Ljava/lang/String;"); g_localStreetFieldLoc = env->GetFieldID(g_localStreetClazz, "localizedName", "Ljava/lang/String;");
g_namesDataSourceClassID = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/NamesDataSource"); g_namesDataSourceClassID = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/NamesDataSource");
g_namesDataSourceConstructorID = jni::GetConstructorID(env, g_namesDataSourceClassID, "([Lapp/organicmaps/sdk/editor/data/LocalizedName;I)V"); g_namesDataSourceConstructorID =
jni::GetConstructorID(env, g_namesDataSourceClassID, "([Lapp/organicmaps/sdk/editor/data/LocalizedName;I)V");
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetOpeningHours(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetOpeningHours(JNIEnv * env, jclass)
{ {
return jni::ToJavaString(env, g_editableMapObject.GetOpeningHours()); return jni::ToJavaString(env, g_editableMapObject.GetOpeningHours());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetOpeningHours(JNIEnv * env, jclass, jstring value)
Java_app_organicmaps_sdk_editor_Editor_nativeSetOpeningHours(JNIEnv * env, jclass, jstring value)
{ {
g_editableMapObject.SetOpeningHours(jni::ToNativeString(env, value)); g_editableMapObject.SetOpeningHours(jni::ToNativeString(env, value));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMetadata(JNIEnv * env, jclass, jint id)
Java_app_organicmaps_sdk_editor_Editor_nativeGetMetadata(JNIEnv * env, jclass, jint id)
{ {
auto const metaID = static_cast<osm::MapObject::MetadataID>(id); auto const metaID = static_cast<osm::MapObject::MetadataID>(id);
ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ()); ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ());
if (osm::isSocialContactTag(metaID)) if (osm::isSocialContactTag(metaID))
{ {
auto const value = g_editableMapObject.GetMetadata(metaID); auto const value = g_editableMapObject.GetMetadata(metaID);
if (value.find('/') == std::string::npos) // `value` contains pagename. if (value.find('/') == std::string::npos) // `value` contains pagename.
return jni::ToJavaString(env, value); return jni::ToJavaString(env, value);
// `value` contains URL. // `value` contains URL.
return jni::ToJavaString(env, osm::socialContactToURL(metaID, value)); return jni::ToJavaString(env, osm::socialContactToURL(metaID, value));
@@ -112,64 +109,56 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetMetadata(JNIEnv * env, jclass, j
return jni::ToJavaString(env, g_editableMapObject.GetMetadata(metaID)); return jni::ToJavaString(env, g_editableMapObject.GetMetadata(metaID));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsMetadataValid(JNIEnv * env, jclass, jint id,
Java_app_organicmaps_sdk_editor_Editor_nativeIsMetadataValid(JNIEnv * env, jclass, jint id, jstring value) jstring value)
{ {
auto const metaID = static_cast<osm::MapObject::MetadataID>(id); auto const metaID = static_cast<osm::MapObject::MetadataID>(id);
ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ()); ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ());
return osm::EditableMapObject::IsValidMetadata(metaID, jni::ToNativeString(env, value)); return osm::EditableMapObject::IsValidMetadata(metaID, jni::ToNativeString(env, value));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetMetadata(JNIEnv * env, jclass, jint id,
Java_app_organicmaps_sdk_editor_Editor_nativeSetMetadata(JNIEnv * env, jclass, jint id, jstring value) jstring value)
{ {
auto const metaID = static_cast<osm::MapObject::MetadataID>(id); auto const metaID = static_cast<osm::MapObject::MetadataID>(id);
ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ()); ASSERT_LESS(metaID, osm::MapObject::MetadataID::FMD_COUNT, ());
g_editableMapObject.SetMetadata(metaID, jni::ToNativeString(env, value)); g_editableMapObject.SetMetadata(metaID, jni::ToNativeString(env, value));
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetStars(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetStars(JNIEnv * env, jclass)
{ {
return g_editableMapObject.GetStars(); return g_editableMapObject.GetStars();
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMaxEditableBuildingLevels(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetMaxEditableBuildingLevels(JNIEnv *, jclass)
{ {
return osm::EditableMapObject::kMaximumLevelsEditableByUsers; return osm::EditableMapObject::kMaximumLevelsEditableByUsers;
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeHasWifi(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeHasWifi(JNIEnv *, jclass)
{ {
return g_editableMapObject.GetInternet() == feature::Internet::Wlan; return g_editableMapObject.GetInternet() == feature::Internet::Wlan;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetHasWifi(JNIEnv *, jclass, jboolean hasWifi)
Java_app_organicmaps_sdk_editor_Editor_nativeSetHasWifi(JNIEnv *, jclass, jboolean hasWifi)
{ {
if (hasWifi != (g_editableMapObject.GetInternet() == feature::Internet::Wlan)) if (hasWifi != (g_editableMapObject.GetInternet() == feature::Internet::Wlan))
g_editableMapObject.SetInternet(hasWifi ? feature::Internet::Wlan : feature::Internet::Unknown); g_editableMapObject.SetInternet(hasWifi ? feature::Internet::Wlan : feature::Internet::Unknown);
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSaveEditedFeature(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeSaveEditedFeature(JNIEnv *, jclass)
{ {
switch (g_framework->NativeFramework()->SaveEditedMapObject(g_editableMapObject)) switch (g_framework->NativeFramework()->SaveEditedMapObject(g_editableMapObject))
{ {
case osm::Editor::SaveResult::NothingWasChanged: case osm::Editor::SaveResult::NothingWasChanged:
case osm::Editor::SaveResult::SavedSuccessfully: case osm::Editor::SaveResult::SavedSuccessfully: return true;
return true;
case osm::Editor::SaveResult::NoFreeSpaceError: case osm::Editor::SaveResult::NoFreeSpaceError:
case osm::Editor::SaveResult::NoUnderlyingMapError: case osm::Editor::SaveResult::NoUnderlyingMapError:
case osm::Editor::SaveResult::SavingError: case osm::Editor::SaveResult::SavingError: return false;
return false;
} }
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowEditPlace(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowEditPlace(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -178,8 +167,7 @@ Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowEditPlace(JNIEnv *, jclas
return g_framework->GetPlacePageInfo().ShouldShowEditPlace(); return g_framework->GetPlacePageInfo().ShouldShowEditPlace();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddBusiness(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddBusiness(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -188,8 +176,7 @@ Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddBusiness(JNIEnv *, jcl
return g_framework->GetPlacePageInfo().ShouldShowAddBusiness(); return g_framework->GetPlacePageInfo().ShouldShowAddBusiness();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddPlace(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddPlace(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -198,8 +185,7 @@ Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddPlace(JNIEnv *, jclass
return g_framework->GetPlacePageInfo().ShouldShowAddPlace(); return g_framework->GetPlacePageInfo().ShouldShowAddPlace();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableEditPlace(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableEditPlace(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -208,8 +194,7 @@ Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableEditPlace(JNIEnv *, jcl
return g_framework->GetPlacePageInfo().ShouldEnableEditPlace(); return g_framework->GetPlacePageInfo().ShouldEnableEditPlace();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableAddPlace(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableAddPlace(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -218,8 +203,8 @@ Java_app_organicmaps_sdk_editor_Editor_nativeShouldEnableAddPlace(JNIEnv *, jcla
return g_framework->GetPlacePageInfo().ShouldEnableAddPlace(); return g_framework->GetPlacePageInfo().ShouldEnableAddPlace();
} }
JNIEXPORT jintArray JNICALL JNIEXPORT jintArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetEditableProperties(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeGetEditableProperties(JNIEnv * env, jclass clazz) jclass clazz)
{ {
auto const & editable = g_editableMapObject.GetEditableProperties(); auto const & editable = g_editableMapObject.GetEditableProperties();
size_t const size = editable.size(); size_t const size = editable.size();
@@ -232,32 +217,27 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetEditableProperties(JNIEnv * env,
return jEditableFields; return jEditableFields;
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsAddressEditable(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeIsAddressEditable(JNIEnv * env, jclass clazz)
{ {
return g_editableMapObject.IsAddressEditable(); return g_editableMapObject.IsAddressEditable();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsNameEditable(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeIsNameEditable(JNIEnv * env, jclass clazz)
{ {
return g_editableMapObject.IsNameEditable(); return g_editableMapObject.IsNameEditable();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsPointType(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeIsPointType(JNIEnv * env, jclass clazz)
{ {
return g_editableMapObject.IsPointType(); return g_editableMapObject.IsPointType();
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsBuilding(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeIsBuilding(JNIEnv * env, jclass clazz)
{ {
return g_editableMapObject.IsBuilding(); return g_editableMapObject.IsBuilding();
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetNamesDataSource(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetNamesDataSource(JNIEnv * env, jclass)
{ {
auto const namesDataSource = g_editableMapObject.GetNamesDataSource(); auto const namesDataSource = g_editableMapObject.GetNamesDataSource();
@@ -267,82 +247,79 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetNamesDataSource(JNIEnv * env, jc
return env->NewObject(g_namesDataSourceClassID, g_namesDataSourceConstructorID, names, mandatoryNamesCount); return env->NewObject(g_namesDataSourceClassID, g_namesDataSourceConstructorID, names, mandatoryNamesCount);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetNames(JNIEnv * env, jclass, jobjectArray names)
Java_app_organicmaps_sdk_editor_Editor_nativeSetNames(JNIEnv * env, jclass, jobjectArray names)
{ {
int const length = env->GetArrayLength(names); int const length = env->GetArrayLength(names);
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
auto jName = env->GetObjectArrayElement(names, i); auto jName = env->GetObjectArrayElement(names, i);
g_editableMapObject.SetName(jni::ToNativeString(env, static_cast<jstring>(env->GetObjectField(jName, g_localNameFieldName))), g_editableMapObject.SetName(
env->GetIntField(jName, g_localNameFieldCode)); jni::ToNativeString(env, static_cast<jstring>(env->GetObjectField(jName, g_localNameFieldName))),
env->GetIntField(jName, g_localNameFieldCode));
} }
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetStreet(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetStreet(JNIEnv * env, jclass)
{ {
return ToJavaStreet(env, g_editableMapObject.GetStreet()); return ToJavaStreet(env, g_editableMapObject.GetStreet());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetStreet(JNIEnv * env, jclass, jobject street)
Java_app_organicmaps_sdk_editor_Editor_nativeSetStreet(JNIEnv * env, jclass, jobject street)
{ {
g_editableMapObject.SetStreet({jni::ToNativeString(env, (jstring) env->GetObjectField(street, g_localStreetFieldDef)), g_editableMapObject.SetStreet(
jni::ToNativeString(env, (jstring) env->GetObjectField(street, g_localStreetFieldLoc))}); {jni::ToNativeString(env, (jstring)env->GetObjectField(street, g_localStreetFieldDef)),
jni::ToNativeString(env, (jstring)env->GetObjectField(street, g_localStreetFieldLoc))});
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetNearbyStreets(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetNearbyStreets(JNIEnv * env, jclass clazz)
{ {
return jni::ToJavaArray(env, g_localStreetClazz, g_editableMapObject.GetNearbyStreets(), ToJavaStreet); return jni::ToJavaArray(env, g_localStreetClazz, g_editableMapObject.GetNearbyStreets(), ToJavaStreet);
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetSupportedLanguages(
Java_app_organicmaps_sdk_editor_Editor_nativeGetSupportedLanguages(JNIEnv * env, jclass clazz, jboolean includeServiceLangs) JNIEnv * env, jclass clazz, jboolean includeServiceLangs)
{ {
using TLang = StringUtf8Multilang::Lang; using TLang = StringUtf8Multilang::Lang;
//public Language(@NonNull String code, @NonNull String name) // public Language(@NonNull String code, @NonNull String name)
static jclass const langClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Language"); static jclass const langClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Language");
static jmethodID const langCtor = jni::GetConstructorID(env, langClass, "(Ljava/lang/String;Ljava/lang/String;)V"); static jmethodID const langCtor = jni::GetConstructorID(env, langClass, "(Ljava/lang/String;Ljava/lang/String;)V");
return jni::ToJavaArray(env, langClass, StringUtf8Multilang::GetSupportedLanguages(includeServiceLangs), return jni::ToJavaArray(env, langClass, StringUtf8Multilang::GetSupportedLanguages(includeServiceLangs),
[](JNIEnv * env, TLang const & lang) [](JNIEnv * env, TLang const & lang)
{ {
jni::TScopedLocalRef const code(env, jni::ToJavaString(env, lang.m_code)); jni::TScopedLocalRef const code(env, jni::ToJavaString(env, lang.m_code));
jni::TScopedLocalRef const name(env, jni::ToJavaString(env, lang.m_name)); jni::TScopedLocalRef const name(env, jni::ToJavaString(env, lang.m_name));
return env->NewObject(langClass, langCtor, code.get(), name.get()); return env->NewObject(langClass, langCtor, code.get(), name.get());
}); });
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetHouseNumber(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeGetHouseNumber(JNIEnv * env, jclass)
{ {
return jni::ToJavaString(env, g_editableMapObject.GetHouseNumber()); return jni::ToJavaString(env, g_editableMapObject.GetHouseNumber());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetHouseNumber(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_Editor_nativeSetHouseNumber(JNIEnv * env, jclass, jstring houseNumber) jstring houseNumber)
{ {
g_editableMapObject.SetHouseNumber(jni::ToNativeString(env, houseNumber)); g_editableMapObject.SetHouseNumber(jni::ToNativeString(env, houseNumber));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeHasSomethingToUpload(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeHasSomethingToUpload(JNIEnv * env, jclass clazz)
{ {
return Editor::Instance().HaveMapEditsOrNotesToUpload(); return Editor::Instance().HaveMapEditsOrNotesToUpload();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeUploadChanges(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativeUploadChanges(JNIEnv * env, jclass clazz, jstring token, jstring appVersion, jstring appId) jstring token, jstring appVersion,
jstring appId)
{ {
// TODO: Handle upload status in callback // TODO: Handle upload status in callback
Editor::Instance().UploadChanges(jni::ToNativeString(env, token), Editor::Instance().UploadChanges(jni::ToNativeString(env, token),
{{"created_by", "CoMaps " OMIM_OS_NAME " " + jni::ToNativeString(env, appVersion)}, {{"created_by", "CoMaps " OMIM_OS_NAME " " + jni::ToNativeString(env, appVersion)},
{"bundle_id", jni::ToNativeString(env, appId)}}, nullptr); {"bundle_id", jni::ToNativeString(env, appId)}},
nullptr);
} }
JNIEXPORT jlongArray JNICALL JNIEXPORT jlongArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetStats(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetStats(JNIEnv * env, jclass clazz)
{ {
auto const stats = Editor::Instance().GetStats(); auto const stats = Editor::Instance().GetStats();
jlongArray result = env->NewLongArray(3); jlongArray result = env->NewLongArray(3);
@@ -352,14 +329,12 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetStats(JNIEnv * env, jclass clazz
return result; return result;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeClearLocalEdits(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeClearLocalEdits(JNIEnv * env, jclass clazz)
{ {
Editor::Instance().ClearAllLocalEdits(); Editor::Instance().ClearAllLocalEdits();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeStartEdit(JNIEnv *, jclass)
Java_app_organicmaps_sdk_editor_Editor_nativeStartEdit(JNIEnv *, jclass)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
if (!frm->HasPlacePageInfo()) if (!frm->HasPlacePageInfo())
@@ -373,9 +348,8 @@ Java_app_organicmaps_sdk_editor_Editor_nativeStartEdit(JNIEnv *, jclass)
CHECK(frm->GetEditableMapObject(info.GetID(), g_editableMapObject), ("Invalid feature in the place page.")); CHECK(frm->GetEditableMapObject(info.GetID(), g_editableMapObject), ("Invalid feature in the place page."));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeCreateMapObject(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_Editor_nativeCreateMapObject(JNIEnv * env, jclass, jstring featureType)
jstring featureType)
{ {
::Framework * frm = g_framework->NativeFramework(); ::Framework * frm = g_framework->NativeFramework();
auto const type = classif().GetTypeByReadableObjectName(jni::ToNativeString(env, featureType)); auto const type = classif().GetTypeByReadableObjectName(jni::ToNativeString(env, featureType));
@@ -384,11 +358,10 @@ Java_app_organicmaps_sdk_editor_Editor_nativeCreateMapObject(JNIEnv * env, jclas
} }
// static void nativeCreateNote(String text); // static void nativeCreateNote(String text);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeCreateNote(JNIEnv * env, jclass clazz, jstring text)
Java_app_organicmaps_sdk_editor_Editor_nativeCreateNote(JNIEnv * env, jclass clazz, jstring text)
{ {
g_framework->NativeFramework()->CreateNote( g_framework->NativeFramework()->CreateNote(g_editableMapObject, osm::Editor::NoteProblemType::General,
g_editableMapObject, osm::Editor::NoteProblemType::General, jni::ToNativeString(env, text)); jni::ToNativeString(env, text));
} }
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeCreateStandaloneNote(JNIEnv * env, jclass clazz, JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeCreateStandaloneNote(JNIEnv * env, jclass clazz,
@@ -399,23 +372,21 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeCreateStanda
} }
// static void nativePlaceDoesNotExist(String comment); // static void nativePlaceDoesNotExist(String comment);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativePlaceDoesNotExist(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativePlaceDoesNotExist(JNIEnv * env, jclass clazz, jstring comment) jstring comment)
{ {
g_framework->NativeFramework()->CreateNote(g_editableMapObject, g_framework->NativeFramework()->CreateNote(g_editableMapObject, osm::Editor::NoteProblemType::PlaceDoesNotExist,
osm::Editor::NoteProblemType::PlaceDoesNotExist,
jni::ToNativeString(env, comment)); jni::ToNativeString(env, comment));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeRollbackMapObject(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeRollbackMapObject(JNIEnv * env, jclass clazz)
{ {
g_framework->NativeFramework()->RollBackChanges(g_editableMapObject.GetID()); g_framework->NativeFramework()->RollBackChanges(g_editableMapObject.GetID());
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetAllCreatableFeatureTypes(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeGetAllCreatableFeatureTypes(JNIEnv * env, jclass clazz, jclass clazz,
jstring jLang) jstring jLang)
{ {
std::string const & lang = jni::ToNativeString(env, jLang); std::string const & lang = jni::ToNativeString(env, jLang);
auto & categories = GetFeatureCategories(); auto & categories = GetFeatureCategories();
@@ -424,10 +395,10 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetAllCreatableFeatureTypes(JNIEnv
return jni::ToJavaStringArray(env, categories.GetAllCreatableTypeNames()); return jni::ToJavaStringArray(env, categories.GetAllCreatableTypeNames());
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSearchCreatableFeatureTypes(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeSearchCreatableFeatureTypes(JNIEnv * env, jclass clazz, jclass clazz,
jstring query, jstring query,
jstring jLang) jstring jLang)
{ {
std::string const & lang = jni::ToNativeString(env, jLang); std::string const & lang = jni::ToNativeString(env, jLang);
auto & categories = GetFeatureCategories(); auto & categories = GetFeatureCategories();
@@ -436,8 +407,7 @@ Java_app_organicmaps_sdk_editor_Editor_nativeSearchCreatableFeatureTypes(JNIEnv
return jni::ToJavaStringArray(env, categories.Search(jni::ToNativeString(env, query))); return jni::ToJavaStringArray(env, categories.Search(jni::ToNativeString(env, query)));
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetCuisines(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetCuisines(JNIEnv * env, jclass clazz)
{ {
osm::AllCuisines const & cuisines = osm::Cuisines::Instance().AllSupportedCuisines(); osm::AllCuisines const & cuisines = osm::Cuisines::Instance().AllSupportedCuisines();
std::vector<std::string> keys; std::vector<std::string> keys;
@@ -447,14 +417,15 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetCuisines(JNIEnv * env, jclass cl
return jni::ToJavaStringArray(env, keys); return jni::ToJavaStringArray(env, keys);
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetSelectedCuisines(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeGetSelectedCuisines(JNIEnv * env, jclass clazz) jclass clazz)
{ {
return jni::ToJavaStringArray(env, g_editableMapObject.GetCuisines()); return jni::ToJavaStringArray(env, g_editableMapObject.GetCuisines());
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeFilterCuisinesKeys(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeFilterCuisinesKeys(JNIEnv * env, jclass thiz, jstring jSubstr) jclass thiz,
jstring jSubstr)
{ {
std::string const substr = jni::ToNativeString(env, jSubstr); std::string const substr = jni::ToNativeString(env, jSubstr);
bool const noFilter = substr.length() == 0; bool const noFilter = substr.length() == 0;
@@ -473,8 +444,9 @@ Java_app_organicmaps_sdk_editor_Editor_nativeFilterCuisinesKeys(JNIEnv * env, jc
return jni::ToJavaStringArray(env, keys); return jni::ToJavaStringArray(env, keys);
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeTranslateCuisines(JNIEnv * env,
Java_app_organicmaps_sdk_editor_Editor_nativeTranslateCuisines(JNIEnv * env, jclass clazz, jobjectArray jKeys) jclass clazz,
jobjectArray jKeys)
{ {
int const length = env->GetArrayLength(jKeys); int const length = env->GetArrayLength(jKeys);
auto const & cuisines = osm::Cuisines::Instance(); auto const & cuisines = osm::Cuisines::Instance();
@@ -488,8 +460,8 @@ Java_app_organicmaps_sdk_editor_Editor_nativeTranslateCuisines(JNIEnv * env, jcl
return jni::ToJavaStringArray(env, translations); return jni::ToJavaStringArray(env, translations);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetSelectedCuisines(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativeSetSelectedCuisines(JNIEnv * env, jclass clazz, jobjectArray jKeys) jobjectArray jKeys)
{ {
int const length = env->GetArrayLength(jKeys); int const length = env->GetArrayLength(jKeys);
std::vector<std::string> cuisines; std::vector<std::string> cuisines;
@@ -499,39 +471,35 @@ Java_app_organicmaps_sdk_editor_Editor_nativeSetSelectedCuisines(JNIEnv * env, j
g_editableMapObject.SetCuisines(cuisines); g_editableMapObject.SetCuisines(cuisines);
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetFormattedCuisine(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetFormattedCuisine(JNIEnv * env, jclass clazz)
{ {
return jni::ToJavaString(env, g_editableMapObject.FormatCuisines()); return jni::ToJavaString(env, g_editableMapObject.FormatCuisines());
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMwmName(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetMwmName(JNIEnv * env, jclass clazz)
{ {
return jni::ToJavaString(env, g_editableMapObject.GetID().GetMwmName()); return jni::ToJavaString(env, g_editableMapObject.GetID().GetMwmName());
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMwmVersion(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetMwmVersion(JNIEnv * env, jclass clazz)
{ {
return g_editableMapObject.GetID().GetMwmVersion(); return g_editableMapObject.GetID().GetMwmVersion();
} }
// static boolean nativeIsHouseValid(String houseNumber); // static boolean nativeIsHouseValid(String houseNumber);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsHouseValid(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativeIsHouseValid(JNIEnv * env, jclass clazz, jstring houseNumber) jstring houseNumber)
{ {
return osm::EditableMapObject::ValidateHouseNumber(jni::ToNativeString(env, houseNumber)); return osm::EditableMapObject::ValidateHouseNumber(jni::ToNativeString(env, houseNumber));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsNameValid(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativeIsNameValid(JNIEnv * env, jclass clazz, jstring name) jstring name)
{ {
return osm::EditableMapObject::ValidateName(jni::ToNativeString(env, name)); return osm::EditableMapObject::ValidateName(jni::ToNativeString(env, name));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetCategory(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetCategory(JNIEnv * env, jclass clazz)
{ {
auto types = g_editableMapObject.GetTypes(); auto types = g_editableMapObject.GetTypes();
types.SortBySpec(); types.SortBySpec();
@@ -540,23 +508,22 @@ Java_app_organicmaps_sdk_editor_Editor_nativeGetCategory(JNIEnv * env, jclass cl
// @FeatureStatus // @FeatureStatus
// static native int nativeGetMapObjectStatus(); // static native int nativeGetMapObjectStatus();
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMapObjectStatus(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeGetMapObjectStatus(JNIEnv * env, jclass clazz)
{ {
return static_cast<jint>(osm::Editor::Instance().GetFeatureStatus(g_editableMapObject.GetID())); return static_cast<jint>(osm::Editor::Instance().GetFeatureStatus(g_editableMapObject.GetID()));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsMapObjectUploaded(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_Editor_nativeIsMapObjectUploaded(JNIEnv * env, jclass clazz)
{ {
return osm::Editor::Instance().IsFeatureUploaded(g_editableMapObject.GetID().m_mwmId, g_editableMapObject.GetID().m_index); return osm::Editor::Instance().IsFeatureUploaded(g_editableMapObject.GetID().m_mwmId,
g_editableMapObject.GetID().m_index);
} }
// static nativeMakeLocalizedName(String langCode, String name); // static nativeMakeLocalizedName(String langCode, String name);
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeMakeLocalizedName(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_Editor_nativeMakeLocalizedName(JNIEnv * env, jclass clazz, jstring code, jstring name) jstring code, jstring name)
{ {
osm::LocalizedName localizedName(jni::ToNativeString(env, code), jni::ToNativeString(env, name)); osm::LocalizedName localizedName(jni::ToNativeString(env, code), jni::ToNativeString(env, name));
return ToJavaName(env, localizedName); return ToJavaName(env, localizedName);
} }
} // extern "C" } // extern "C"

View File

@@ -14,7 +14,6 @@
#include <set> #include <set>
#include <vector> #include <vector>
namespace namespace
{ {
using namespace editor; using namespace editor;
@@ -43,22 +42,12 @@ jfieldID g_fidWeekdays;
jobject JavaHoursMinutes(JNIEnv * env, jlong hours, jlong minutes) jobject JavaHoursMinutes(JNIEnv * env, jlong hours, jlong minutes)
{ {
static const jclass dateUtilsClass = jni::GetGlobalClassRef(env, static jclass const dateUtilsClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/DateUtils");
"app/organicmaps/sdk/util/DateUtils");
static jmethodID const is24HourFormatMethod = static jmethodID const is24HourFormatMethod =
jni::GetStaticMethodID(env, jni::GetStaticMethodID(env, dateUtilsClass, "is24HourFormat", "(Landroid/content/Context;)Z");
dateUtilsClass,
"is24HourFormat",
"(Landroid/content/Context;)Z");
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
jboolean const is24HourFormat = env->CallStaticBooleanMethod(dateUtilsClass, jboolean const is24HourFormat = env->CallStaticBooleanMethod(dateUtilsClass, is24HourFormatMethod, context);
is24HourFormatMethod, jobject const hoursMinutes = env->NewObject(g_clazzHoursMinutes, g_ctorHoursMinutes, hours, minutes, is24HourFormat);
context);
jobject const hoursMinutes = env->NewObject(g_clazzHoursMinutes,
g_ctorHoursMinutes,
hours,
minutes,
is24HourFormat);
ASSERT(hoursMinutes, (jni::DescribeException())); ASSERT(hoursMinutes, (jni::DescribeException()));
return hoursMinutes; return hoursMinutes;
} }
@@ -74,8 +63,7 @@ jobject JavaTimespan(JNIEnv * env, osmoh::Timespan const & timespan)
{ {
auto const start = timespan.GetStart(); auto const start = timespan.GetStart();
auto const end = timespan.GetEnd(); auto const end = timespan.GetEnd();
return JavaTimespan(env, return JavaTimespan(env, JavaHoursMinutes(env, start.GetHoursCount(), start.GetMinutesCount()),
JavaHoursMinutes(env, start.GetHoursCount(), start.GetMinutesCount()),
JavaHoursMinutes(env, end.GetHoursCount(), end.GetMinutesCount())); JavaHoursMinutes(env, end.GetHoursCount(), end.GetMinutesCount()));
} }
@@ -92,22 +80,16 @@ jobject JavaTimetable(JNIEnv * env, TimeTable const & tt)
std::set<Weekday> weekdays = tt.GetOpeningDays(); std::set<Weekday> weekdays = tt.GetOpeningDays();
std::vector<int> weekdaysVector; std::vector<int> weekdaysVector;
weekdaysVector.reserve(weekdays.size()); weekdaysVector.reserve(weekdays.size());
std::transform(weekdays.begin(), weekdays.end(), std::back_inserter(weekdaysVector), [](Weekday weekday) std::transform(weekdays.begin(), weekdays.end(), std::back_inserter(weekdaysVector),
{ [](Weekday weekday) { return static_cast<int>(weekday); });
return static_cast<int>(weekday);
});
jintArray jWeekdays = env->NewIntArray(static_cast<jsize>(weekdays.size())); jintArray jWeekdays = env->NewIntArray(static_cast<jsize>(weekdays.size()));
env->SetIntArrayRegion(jWeekdays, 0, static_cast<jsize>(weekdaysVector.size()), env->SetIntArrayRegion(jWeekdays, 0, static_cast<jsize>(weekdaysVector.size()), &weekdaysVector[0]);
&weekdaysVector[0]);
return JavaTimetable(env, return JavaTimetable(
JavaTimespan(env, tt.GetOpeningTime()), env, JavaTimespan(env, tt.GetOpeningTime()),
jni::ToJavaArray(env, g_clazzTimespan, tt.GetExcludeTime(), [](JNIEnv * env, osmoh::Timespan const & timespan) jni::ToJavaArray(env, g_clazzTimespan, tt.GetExcludeTime(),
{ [](JNIEnv * env, osmoh::Timespan const & timespan) { return JavaTimespan(env, timespan); }),
return JavaTimespan(env, timespan); tt.IsTwentyFourHours(), jWeekdays);
}),
tt.IsTwentyFourHours(),
jWeekdays);
} }
jobjectArray JavaTimetables(JNIEnv * env, TimeTableSet & tts) jobjectArray JavaTimetables(JNIEnv * env, TimeTableSet & tts)
@@ -142,7 +124,7 @@ TimeTable NativeTimetable(JNIEnv * env, jobject jTimetable)
{ {
TimeTable tt = TimeTable::GetPredefinedTimeTable(); TimeTable tt = TimeTable::GetPredefinedTimeTable();
jintArray const jWeekdays = static_cast<jintArray>(env->GetObjectField(jTimetable, g_fidWeekdays)); jintArray const jWeekdays = static_cast<jintArray>(env->GetObjectField(jTimetable, g_fidWeekdays));
int * weekdaysArr = static_cast<int*>(env->GetIntArrayElements(jWeekdays, nullptr)); int * weekdaysArr = static_cast<int *>(env->GetIntArrayElements(jWeekdays, nullptr));
jint size = env->GetArrayLength(jWeekdays); jint size = env->GetArrayLength(jWeekdays);
std::set<Weekday> weekdays; std::set<Weekday> weekdays;
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
@@ -181,8 +163,7 @@ TimeTableSet NativeTimetableSet(JNIEnv * env, jobjectArray jTimetables)
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeInit(JNIEnv * env, jclass clazz)
Java_app_organicmaps_sdk_editor_OpeningHours_nativeInit(JNIEnv * env, jclass clazz)
{ {
g_clazzHoursMinutes = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/HoursMinutes"); g_clazzHoursMinutes = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/HoursMinutes");
// Java signature : HoursMinutes(@IntRange(from = 0, to = 24) long hours, @IntRange(from = 0, to = 60) long minutes) // Java signature : HoursMinutes(@IntRange(from = 0, to = 24) long hours, @IntRange(from = 0, to = 60) long minutes)
@@ -195,8 +176,9 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeInit(JNIEnv * env, jclass cla
g_clazzTimespan = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Timespan"); g_clazzTimespan = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Timespan");
// Java signature : Timespan(HoursMinutes start, HoursMinutes end) // Java signature : Timespan(HoursMinutes start, HoursMinutes end)
g_ctorTimespan = g_ctorTimespan = env->GetMethodID(
env->GetMethodID(g_clazzTimespan, "<init>","(Lapp/organicmaps/sdk/editor/data/HoursMinutes;Lapp/organicmaps/sdk/editor/data/HoursMinutes;)V"); g_clazzTimespan, "<init>",
"(Lapp/organicmaps/sdk/editor/data/HoursMinutes;Lapp/organicmaps/sdk/editor/data/HoursMinutes;)V");
ASSERT(g_ctorTimespan, (jni::DescribeException())); ASSERT(g_ctorTimespan, (jni::DescribeException()));
g_fidStart = env->GetFieldID(g_clazzTimespan, "start", "Lapp/organicmaps/sdk/editor/data/HoursMinutes;"); g_fidStart = env->GetFieldID(g_clazzTimespan, "start", "Lapp/organicmaps/sdk/editor/data/HoursMinutes;");
ASSERT(g_fidStart, (jni::DescribeException())); ASSERT(g_fidStart, (jni::DescribeException()));
@@ -206,11 +188,14 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeInit(JNIEnv * env, jclass cla
g_clazzTimetable = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Timetable"); g_clazzTimetable = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/data/Timetable");
// Java signature : Timetable(Timespan workingTime, Timespan[] closedHours, boolean isFullday, int weekdays[]) // Java signature : Timetable(Timespan workingTime, Timespan[] closedHours, boolean isFullday, int weekdays[])
g_ctorTimetable = g_ctorTimetable =
env->GetMethodID(g_clazzTimetable, "<init>","(Lapp/organicmaps/sdk/editor/data/Timespan;[Lapp/organicmaps/sdk/editor/data/Timespan;Z[I)V"); env->GetMethodID(g_clazzTimetable, "<init>",
"(Lapp/organicmaps/sdk/editor/data/Timespan;[Lapp/organicmaps/sdk/editor/data/Timespan;Z[I)V");
ASSERT(g_ctorTimetable, (jni::DescribeException())); ASSERT(g_ctorTimetable, (jni::DescribeException()));
g_fidWorkingTimespan = env->GetFieldID(g_clazzTimetable, "workingTimespan", "Lapp/organicmaps/sdk/editor/data/Timespan;"); g_fidWorkingTimespan =
env->GetFieldID(g_clazzTimetable, "workingTimespan", "Lapp/organicmaps/sdk/editor/data/Timespan;");
ASSERT(g_fidWorkingTimespan, (jni::DescribeException())); ASSERT(g_fidWorkingTimespan, (jni::DescribeException()));
g_fidClosedTimespans = env->GetFieldID(g_clazzTimetable, "closedTimespans", "[Lapp/organicmaps/sdk/editor/data/Timespan;"); g_fidClosedTimespans =
env->GetFieldID(g_clazzTimetable, "closedTimespans", "[Lapp/organicmaps/sdk/editor/data/Timespan;");
ASSERT(g_fidClosedTimespans, (jni::DescribeException())); ASSERT(g_fidClosedTimespans, (jni::DescribeException()));
g_fidIsFullday = env->GetFieldID(g_clazzTimetable, "isFullday", "Z"); g_fidIsFullday = env->GetFieldID(g_clazzTimetable, "isFullday", "Z");
ASSERT(g_fidIsFullday, (jni::DescribeException())); ASSERT(g_fidIsFullday, (jni::DescribeException()));
@@ -218,23 +203,22 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeInit(JNIEnv * env, jclass cla
ASSERT(g_fidWeekdays, (jni::DescribeException())); ASSERT(g_fidWeekdays, (jni::DescribeException()));
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeGetDefaultTimetables(JNIEnv * env,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeGetDefaultTimetables(JNIEnv * env, jclass clazz) jclass clazz)
{ {
TimeTableSet tts; TimeTableSet tts;
return JavaTimetables(env, tts); return JavaTimetables(env, tts);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeGetComplementTimetable(
Java_app_organicmaps_sdk_editor_OpeningHours_nativeGetComplementTimetable(JNIEnv * env, jclass clazz, jobjectArray timetables) JNIEnv * env, jclass clazz, jobjectArray timetables)
{ {
TimeTableSet const tts = NativeTimetableSet(env, timetables); TimeTableSet const tts = NativeTimetableSet(env, timetables);
return JavaTimetable(env, tts.GetComplementTimeTable()); return JavaTimetable(env, tts.GetComplementTimeTable());
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeRemoveWorkingDay(
Java_app_organicmaps_sdk_editor_OpeningHours_nativeRemoveWorkingDay(JNIEnv * env, jclass clazz, JNIEnv * env, jclass clazz, jobjectArray timetables, jint ttIndex, jint dayIndex)
jobjectArray timetables, jint ttIndex, jint dayIndex)
{ {
TimeTableSet tts = NativeTimetableSet(env, timetables); TimeTableSet tts = NativeTimetableSet(env, timetables);
auto tt = tts.Get(ttIndex); auto tt = tts.Get(ttIndex);
@@ -243,9 +227,8 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeRemoveWorkingDay(JNIEnv * env
return JavaTimetables(env, tts); return JavaTimetables(env, tts);
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeAddWorkingDay(
Java_app_organicmaps_sdk_editor_OpeningHours_nativeAddWorkingDay(JNIEnv * env, jclass clazz, JNIEnv * env, jclass clazz, jobjectArray timetables, jint ttIndex, jint dayIndex)
jobjectArray timetables, jint ttIndex, jint dayIndex)
{ {
TimeTableSet tts = NativeTimetableSet(env, timetables); TimeTableSet tts = NativeTimetableSet(env, timetables);
auto tt = tts.Get(ttIndex); auto tt = tts.Get(ttIndex);
@@ -254,9 +237,9 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeAddWorkingDay(JNIEnv * env, j
return JavaTimetables(env, tts); return JavaTimetables(env, tts);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeSetIsFullday(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeSetIsFullday(JNIEnv * env, jclass clazz, jobject jTimetable,
jobject jTimetable, jboolean jIsFullday) jboolean jIsFullday)
{ {
TimeTable tt = NativeTimetable(env, jTimetable); TimeTable tt = NativeTimetable(env, jTimetable);
if (jIsFullday) if (jIsFullday)
@@ -269,46 +252,49 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeSetIsFullday(JNIEnv * env, jc
return JavaTimetable(env, tt); return JavaTimetable(env, tt);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeSetOpeningTime(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeSetOpeningTime(JNIEnv * env, jclass clazz, jobject jTimetable,
jobject jTimetable, jobject jOpeningTime) jobject jOpeningTime)
{ {
TimeTable tt = NativeTimetable(env, jTimetable); TimeTable tt = NativeTimetable(env, jTimetable);
tt.SetOpeningTime(NativeTimespan(env, jOpeningTime)); tt.SetOpeningTime(NativeTimespan(env, jOpeningTime));
return JavaTimetable(env, tt); return JavaTimetable(env, tt);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeAddClosedSpan(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeAddClosedSpan(JNIEnv * env, jclass clazz, jobject jTimetable,
jobject jTimetable, jobject jClosedSpan) jobject jClosedSpan)
{ {
TimeTable tt = NativeTimetable(env, jTimetable); TimeTable tt = NativeTimetable(env, jTimetable);
tt.AddExcludeTime(NativeTimespan(env, jClosedSpan)); tt.AddExcludeTime(NativeTimespan(env, jClosedSpan));
return JavaTimetable(env, tt); return JavaTimetable(env, tt);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeRemoveClosedSpan(JNIEnv * env,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeRemoveClosedSpan(JNIEnv * env, jclass clazz, jclass clazz,
jobject jTimetable, jint jClosedSpanIndex) jobject jTimetable,
jint jClosedSpanIndex)
{ {
TimeTable tt = NativeTimetable(env, jTimetable); TimeTable tt = NativeTimetable(env, jTimetable);
tt.RemoveExcludeTime(static_cast<size_t>(jClosedSpanIndex)); tt.RemoveExcludeTime(static_cast<size_t>(jClosedSpanIndex));
return JavaTimetable(env, tt); return JavaTimetable(env, tt);
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeTimetablesFromString(JNIEnv * env,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeTimetablesFromString(JNIEnv * env, jclass clazz, jstring jSource) jclass clazz,
jstring jSource)
{ {
TimeTableSet tts; TimeTableSet tts;
std::string const source = jni::ToNativeString(env, jSource); std::string const source = jni::ToNativeString(env, jSource);
if (!source.empty() && MakeTimeTableSet(OpeningHours(source), tts)) if (!source.empty() && MakeTimeTableSet(OpeningHours(source), tts))
return JavaTimetables(env, tts); return JavaTimetables(env, tts);
return nullptr; return nullptr;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeTimetablesToString(JNIEnv * env,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeTimetablesToString(JNIEnv * env, jclass clazz, jobjectArray jTts) jclass clazz,
jobjectArray jTts)
{ {
TimeTableSet tts = NativeTimetableSet(env, jTts); TimeTableSet tts = NativeTimetableSet(env, jTts);
std::stringstream sstr; std::stringstream sstr;
@@ -316,15 +302,15 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeTimetablesToString(JNIEnv * e
return jni::ToJavaString(env, sstr.str()); return jni::ToJavaString(env, sstr.str());
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * env,
Java_app_organicmaps_sdk_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * env, jclass clazz, jstring jSource) jclass clazz,
jstring jSource)
{ {
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid(); return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
} }
JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jclass clazz,
JNIEXPORT jobject JNICALL jobjectArray jTts)
Java_app_organicmaps_sdk_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jclass clazz, jobjectArray jTts)
{ {
TimeTableSet tts = NativeTimetableSet(env, jTts); TimeTableSet tts = NativeTimetableSet(env, jTts);
time_t const now = time(nullptr); time_t const now = time(nullptr);
@@ -334,17 +320,16 @@ Java_app_organicmaps_sdk_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jc
jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState"); jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState");
jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState$State"); jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState$State");
static const std::unordered_map<RuleState, const char*> ruleState = { static std::unordered_map<RuleState, char const *> const ruleState = {
{RuleState::Open, "Open"}, {RuleState::Open, "Open"}, {RuleState::Closed, "Closed"}, {RuleState::Unknown, "Unknown"}};
{RuleState::Closed, "Closed"},
{RuleState::Unknown, "Unknown"}
};
jfieldID stateField = env->GetStaticFieldID(ruleStateClass, ruleState.at(ohInfo.state), "Lapp/organicmaps/editor/OhState$State;"); jfieldID stateField =
env->GetStaticFieldID(ruleStateClass, ruleState.at(ohInfo.state), "Lapp/organicmaps/editor/OhState$State;");
jobject stateObj = env->GetStaticObjectField(ruleStateClass, stateField); jobject stateObj = env->GetStaticObjectField(ruleStateClass, stateField);
jmethodID constructor = env->GetMethodID(ohStateClass, "<init>", "(Lapp/organicmaps/editor/OhState$State;JJ)V"); jmethodID constructor = env->GetMethodID(ohStateClass, "<init>", "(Lapp/organicmaps/editor/OhState$State;JJ)V");
jobject javaOhState = env->NewObject(ohStateClass, constructor, stateObj, (jlong) ohInfo.nextTimeOpen, (jlong) ohInfo.nextTimeClosed); jobject javaOhState =
env->NewObject(ohStateClass, constructor, stateObj, (jlong)ohInfo.nextTimeOpen, (jlong)ohInfo.nextTimeClosed);
return javaOhState; return javaOhState;
} }
} // extern "C" } // extern "C"

View File

@@ -1,7 +1,7 @@
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/Framework.hpp" #include "app/organicmaps/sdk/Framework.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "base/logging.hpp" #include "base/logging.hpp"
#include "base/string_utils.hpp" #include "base/string_utils.hpp"
@@ -25,17 +25,15 @@ bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & ou
extern "C" extern "C"
{ {
JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOAuth2Url(JNIEnv * env, jclass)
JNIEXPORT jstring JNICALL
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOAuth2Url(JNIEnv * env, jclass)
{ {
auto const auth = OsmOAuth::ServerAuth(); auto const auth = OsmOAuth::ServerAuth();
return ToJavaString(env, auth.BuildOAuth2Url()); return ToJavaString(env, auth.BuildOAuth2Url());
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithPassword(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithPassword(JNIEnv * env, jclass clazz, jstring login,
jstring login, jstring password) jstring password)
{ {
OsmOAuth auth = OsmOAuth::ServerAuth(); OsmOAuth auth = OsmOAuth::ServerAuth();
try try
@@ -51,8 +49,8 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithPassword(JNIEnv * env, jc
return nullptr; return nullptr;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithOAuth2Code(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithOAuth2Code(JNIEnv * env, jclass, jstring oauth2code) jstring oauth2code)
{ {
OsmOAuth auth = OsmOAuth::ServerAuth(); OsmOAuth auth = OsmOAuth::ServerAuth();
try try
@@ -60,8 +58,8 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithOAuth2Code(JNIEnv * env,
auto token = auth.FinishAuthorization(ToNativeString(env, oauth2code)); auto token = auth.FinishAuthorization(ToNativeString(env, oauth2code));
if (!token.empty()) if (!token.empty())
{ {
auth.SetAuthToken(token); auth.SetAuthToken(token);
return ToJavaString(env, token); return ToJavaString(env, token);
} }
LOG(LWARNING, ("nativeAuthWithOAuth2Code: invalid OAuth2 code", oauth2code)); LOG(LWARNING, ("nativeAuthWithOAuth2Code: invalid OAuth2 code", oauth2code));
} }
@@ -72,8 +70,8 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeAuthWithOAuth2Code(JNIEnv * env,
return nullptr; return nullptr;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmUsername(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmUsername(JNIEnv * env, jclass, jstring oauthToken) jstring oauthToken)
{ {
UserPreferences prefs; UserPreferences prefs;
if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs)) if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs))
@@ -81,8 +79,8 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmUsername(JNIEnv * env, jcla
return nullptr; return nullptr;
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmChangesetsCount(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmChangesetsCount(JNIEnv * env, jclass, jstring oauthToken) jstring oauthToken)
{ {
UserPreferences prefs; UserPreferences prefs;
if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs)) if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs))
@@ -90,8 +88,8 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmChangesetsCount(JNIEnv * en
return -1; return -1;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmProfilePictureUrl(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmProfilePictureUrl(JNIEnv * env, jclass, jstring oauthToken) jstring oauthToken)
{ {
UserPreferences prefs; UserPreferences prefs;
if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs)) if (LoadOsmUserPreferences(jni::ToNativeString(env, oauthToken), prefs))
@@ -99,15 +97,14 @@ Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetOsmProfilePictureUrl(JNIEnv *
return nullptr; return nullptr;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetHistoryUrl(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetHistoryUrl(JNIEnv * env, jclass, jstring user) jstring user)
{ {
return jni::ToJavaString(env, OsmOAuth::ServerAuth().GetHistoryURL(jni::ToNativeString(env, user))); return jni::ToJavaString(env, OsmOAuth::ServerAuth().GetHistoryURL(jni::ToNativeString(env, user)));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetNotesUrl(JNIEnv * env, jclass, jstring user)
Java_app_organicmaps_sdk_editor_OsmOAuth_nativeGetNotesUrl(JNIEnv * env, jclass, jstring user)
{ {
return jni::ToJavaString(env, OsmOAuth::ServerAuth().GetNotesURL(jni::ToNativeString(env, user))); return jni::ToJavaString(env, OsmOAuth::ServerAuth().GetNotesURL(jni::ToNativeString(env, user)));
} }
} // extern "C" } // extern "C"

View File

@@ -7,39 +7,34 @@ using namespace std::placeholders;
extern "C" extern "C"
{ {
static void IsolinesStateChanged(IsolinesManager::IsolinesState state, static void IsolinesStateChanged(IsolinesManager::IsolinesState state, std::shared_ptr<jobject> const & listener)
std::shared_ptr<jobject> const & listener)
{ {
LOG(LINFO, (static_cast<int>(state))); LOG(LINFO, (static_cast<int>(state)));
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(*listener, env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener, "onStateChanged", "(I)V"), static_cast<jint>(state));
jni::GetMethodID(env, *listener, "onStateChanged", "(I)V"),
static_cast<jint>(state));
} }
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeAddListener(JNIEnv * env,
JNIEXPORT void JNICALL jclass clazz,
Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeAddListener(JNIEnv *env, jclass clazz, jobject listener) jobject listener)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetIsolinesListener(std::bind(&IsolinesStateChanged, g_framework->SetIsolinesListener(
std::placeholders::_1, std::bind(&IsolinesStateChanged, std::placeholders::_1, jni::make_global_ref(listener)));
jni::make_global_ref(listener)));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeRemoveListener(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeRemoveListener(JNIEnv * env, jclass clazz) jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetIsolinesListener(nullptr); g_framework->SetIsolinesListener(nullptr);
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeShouldShowNotification(JNIEnv *env, Java_app_organicmaps_sdk_maplayer_isolines_IsolinesManager_nativeShouldShowNotification(JNIEnv * env, jclass clazz)
jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
auto const &manager = g_framework->NativeFramework()->GetIsolinesManager(); auto const & manager = g_framework->NativeFramework()->GetIsolinesManager();
auto const visible = manager.IsVisible(); auto const visible = manager.IsVisible();
auto const enabled = manager.GetState() == IsolinesManager::IsolinesState::Enabled; auto const enabled = manager.GetState() == IsolinesManager::IsolinesState::Enabled;
return static_cast<jboolean>(!visible && enabled); return static_cast<jboolean>(!visible && enabled);

View File

@@ -7,10 +7,7 @@
namespace android namespace android
{ {
ConfigComparator::ConfigComparator(EGLDisplay display) ConfigComparator::ConfigComparator(EGLDisplay display) : m_display(display) {}
: m_display(display)
{
}
bool ConfigComparator::operator()(EGLConfig const & l, EGLConfig const & r) const bool ConfigComparator::operator()(EGLConfig const & l, EGLConfig const & r) const
{ {
@@ -28,14 +25,10 @@ int ConfigComparator::configWeight(EGLConfig const & config) const
switch (val) switch (val)
{ {
case EGL_NONE: case EGL_NONE: return 0;
return 0; case EGL_SLOW_CONFIG: return 1;
case EGL_SLOW_CONFIG: case EGL_NON_CONFORMANT_CONFIG: return 2;
return 1; default: return 0;
case EGL_NON_CONFORMANT_CONFIG:
return 2;
default:
return 0;
} }
} }
@@ -53,21 +46,21 @@ std::string GetEglError(EGLint error)
{ {
switch (error) switch (error)
{ {
case EGL_NOT_INITIALIZED : return "EGL_NOT_INITIALIZED"; case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED";
case EGL_BAD_ACCESS : return "EGL_BAD_ACCESS"; case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS";
case EGL_BAD_ALLOC : return "EGL_BAD_ALLOC"; case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC";
case EGL_BAD_ATTRIBUTE : return "EGL_BAD_ATTRIBUTE"; case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE";
case EGL_BAD_CONFIG : return "EGL_BAD_CONFIG"; case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG";
case EGL_BAD_CONTEXT : return "EGL_BAD_CONTEXT"; case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT";
case EGL_BAD_CURRENT_SURFACE : return "EGL_BAD_CURRENT_SURFACE"; case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
case EGL_BAD_DISPLAY : return "EGL_BAD_DISPLAY"; case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY";
case EGL_BAD_MATCH : return "EGL_BAD_MATCH"; case EGL_BAD_MATCH: return "EGL_BAD_MATCH";
case EGL_BAD_NATIVE_PIXMAP : return "EGL_BAD_NATIVE_PIXMAP"; case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
case EGL_BAD_NATIVE_WINDOW : return "EGL_BAD_NATIVE_WINDOW"; case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
case EGL_BAD_PARAMETER : return "EGL_BAD_PARAMETER"; case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER";
case EGL_BAD_SURFACE : return "EGL_BAD_SURFACE"; case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE";
case EGL_CONTEXT_LOST : return "EGL_CONTEXT_LOST"; case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST";
default: return strings::to_string(error); default: return strings::to_string(error);
} }
} }

View File

@@ -25,5 +25,16 @@ private:
void CheckEGL(base::SrcPoint const & src); void CheckEGL(base::SrcPoint const & src);
} // namespace android } // namespace android
#define CHECK_EGL(x) do { (x); android::CheckEGL(SRC());} while(false); #define CHECK_EGL(x) \
#define CHECK_EGL_CALL() do { android::CheckEGL(SRC());} while (false); do \
{ \
(x); \
android::CheckEGL(SRC()); \
} \
while (false);
#define CHECK_EGL_CALL() \
do \
{ \
android::CheckEGL(SRC()); \
} \
while (false);

View File

@@ -10,15 +10,12 @@ namespace android
static EGLint * getContextAttributesList() static EGLint * getContextAttributesList()
{ {
static EGLint contextAttrList[] = { static EGLint contextAttrList[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
EGL_CONTEXT_CLIENT_VERSION, 3,
EGL_NONE
};
return contextAttrList; return contextAttrList;
} }
AndroidOGLContext::AndroidOGLContext(EGLDisplay display, EGLSurface surface, AndroidOGLContext::AndroidOGLContext(EGLDisplay display, EGLSurface surface, EGLConfig config,
EGLConfig config, AndroidOGLContext * contextToShareWith) AndroidOGLContext * contextToShareWith)
: m_nativeContext(EGL_NO_CONTEXT) : m_nativeContext(EGL_NO_CONTEXT)
, m_surface(surface) , m_surface(surface)
, m_display(display) , m_display(display)
@@ -82,8 +79,7 @@ bool AndroidOGLContext::Validate()
{ {
if (!m_presentAvailable) if (!m_presentAvailable)
return false; return false;
return eglGetCurrentDisplay() != EGL_NO_DISPLAY && return eglGetCurrentDisplay() != EGL_NO_DISPLAY && eglGetCurrentSurface(EGL_DRAW) != EGL_NO_SURFACE &&
eglGetCurrentSurface(EGL_DRAW) != EGL_NO_SURFACE &&
eglGetCurrentContext() != EGL_NO_CONTEXT; eglGetCurrentContext() != EGL_NO_CONTEXT;
} }

View File

@@ -10,8 +10,7 @@ namespace android
class AndroidOGLContext : public dp::OGLContext class AndroidOGLContext : public dp::OGLContext
{ {
public: public:
AndroidOGLContext(EGLDisplay display, EGLSurface surface, AndroidOGLContext(EGLDisplay display, EGLSurface surface, EGLConfig config, AndroidOGLContext * contextToShareWith);
EGLConfig config, AndroidOGLContext * contextToShareWith);
~AndroidOGLContext(); ~AndroidOGLContext();
void MakeCurrent() override; void MakeCurrent() override;

View File

@@ -22,17 +22,23 @@ namespace
{ {
static EGLint * getConfigAttributesListRGB8() static EGLint * getConfigAttributesListRGB8()
{ {
static EGLint attr_list[] = { static EGLint attr_list[] = {EGL_RED_SIZE,
EGL_RED_SIZE, 8, 8,
EGL_GREEN_SIZE, 8, EGL_GREEN_SIZE,
EGL_BLUE_SIZE, 8, 8,
EGL_ALPHA_SIZE, 0, EGL_BLUE_SIZE,
EGL_STENCIL_SIZE, 0, 8,
EGL_DEPTH_SIZE, 16, EGL_ALPHA_SIZE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT, 0,
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT, EGL_STENCIL_SIZE,
EGL_NONE 0,
}; EGL_DEPTH_SIZE,
16,
EGL_RENDERABLE_TYPE,
EGL_OPENGL_ES3_BIT,
EGL_SURFACE_TYPE,
EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
EGL_NONE};
return attr_list; return attr_list;
} }
@@ -42,8 +48,8 @@ bool IsSupportedRGB8(EGLDisplay display)
{ {
EGLConfig configs[kMaxConfigCount]; EGLConfig configs[kMaxConfigCount];
int count = 0; int count = 0;
return eglChooseConfig(display, getConfigAttributesListRGB8(), configs, return eglChooseConfig(display, getConfigAttributesListRGB8(), configs, kMaxConfigCount, &count) == EGL_TRUE &&
kMaxConfigCount, &count) == EGL_TRUE && count != 0; count != 0;
} }
size_t constexpr kGLThreadsCount = 2; size_t constexpr kGLThreadsCount = 2;
@@ -189,8 +195,7 @@ int AndroidOGLContextFactory::GetHeight() const
void AndroidOGLContextFactory::UpdateSurfaceSize(int w, int h) void AndroidOGLContextFactory::UpdateSurfaceSize(int w, int h)
{ {
ASSERT(IsValid(), ()); ASSERT(IsValid(), ());
if ((m_surfaceWidth != w && m_surfaceWidth != h) || if ((m_surfaceWidth != w && m_surfaceWidth != h) || (m_surfaceHeight != w && m_surfaceHeight != h))
(m_surfaceHeight != w && m_surfaceHeight != h))
{ {
LOG(LINFO, ("Surface size changed and must be re-queried.")); LOG(LINFO, ("Surface size changed and must be re-queried."));
if (!QuerySurfaceSize()) if (!QuerySurfaceSize())
@@ -231,10 +236,7 @@ dp::GraphicsContext * AndroidOGLContextFactory::GetDrawContext()
ASSERT(IsValid(), ()); ASSERT(IsValid(), ());
ASSERT(m_windowSurface != EGL_NO_SURFACE, ()); ASSERT(m_windowSurface != EGL_NO_SURFACE, ());
if (m_drawContext == nullptr) if (m_drawContext == nullptr)
{ m_drawContext = new AndroidOGLContext(m_display, m_windowSurface, m_config, m_uploadContext);
m_drawContext = new AndroidOGLContext(m_display, m_windowSurface,
m_config, m_uploadContext);
}
return m_drawContext; return m_drawContext;
} }
@@ -243,10 +245,7 @@ dp::GraphicsContext * AndroidOGLContextFactory::GetResourcesUploadContext()
ASSERT(IsValid(), ()); ASSERT(IsValid(), ());
ASSERT(m_pixelbufferSurface != EGL_NO_SURFACE, ()); ASSERT(m_pixelbufferSurface != EGL_NO_SURFACE, ());
if (m_uploadContext == nullptr) if (m_uploadContext == nullptr)
{ m_uploadContext = new AndroidOGLContext(m_display, m_pixelbufferSurface, m_config, m_drawContext);
m_uploadContext = new AndroidOGLContext(m_display, m_pixelbufferSurface,
m_config, m_drawContext);
}
return m_uploadContext; return m_uploadContext;
} }
@@ -288,8 +287,7 @@ bool AndroidOGLContextFactory::CreateWindowSurface()
{ {
EGLConfig configs[kMaxConfigCount]; EGLConfig configs[kMaxConfigCount];
int count = 0; int count = 0;
if (eglChooseConfig(m_display, getConfigAttributesListRGB8(), configs, if (eglChooseConfig(m_display, getConfigAttributesListRGB8(), configs, kMaxConfigCount, &count) == EGL_TRUE)
kMaxConfigCount, &count) == EGL_TRUE)
{ {
CHECK(IsSupportedRGB8(m_display), ("RGB8 is not suported on this device")); CHECK(IsSupportedRGB8(m_display), ("RGB8 is not suported on this device"));
LOG(LDEBUG, ("Backbuffer format: RGB8")); LOG(LDEBUG, ("Backbuffer format: RGB8"));
@@ -309,7 +307,7 @@ bool AndroidOGLContextFactory::CreateWindowSurface()
eglGetConfigAttrib(m_display, currentConfig, EGL_NATIVE_VISUAL_ID, &format); eglGetConfigAttrib(m_display, currentConfig, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(m_nativeWindow, 0, 0, format); ANativeWindow_setBuffersGeometry(m_nativeWindow, 0, 0, format);
EGLint surfaceAttributes[] = { EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE }; EGLint surfaceAttributes[] = {EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE};
m_windowSurface = eglCreateWindowSurface(m_display, currentConfig, m_nativeWindow, surfaceAttributes); m_windowSurface = eglCreateWindowSurface(m_display, currentConfig, m_nativeWindow, surfaceAttributes);
if (m_windowSurface == EGL_NO_SURFACE) if (m_windowSurface == EGL_NO_SURFACE)
continue; continue;
@@ -330,14 +328,10 @@ bool AndroidOGLContextFactory::CreateWindowSurface()
bool AndroidOGLContextFactory::CreatePixelbufferSurface() bool AndroidOGLContextFactory::CreatePixelbufferSurface()
{ {
//ASSERT(m_config != NULL, ()); // ASSERT(m_config != NULL, ());
const GLuint size = 1; // yes, 1 is the correct size, we dont really draw on it GLuint const size = 1; // yes, 1 is the correct size, we dont really draw on it
static EGLint surfaceConfig[] = { static EGLint surfaceConfig[] = {EGL_WIDTH, size, EGL_HEIGHT, size, EGL_NONE};
EGL_WIDTH, size,
EGL_HEIGHT, size,
EGL_NONE
};
m_pixelbufferSurface = eglCreatePbufferSurface(m_display, m_config, surfaceConfig); m_pixelbufferSurface = eglCreatePbufferSurface(m_display, m_config, surfaceConfig);

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "androidoglcontext.hpp" #include "androidoglcontext.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "drape/graphics_context_factory.hpp" #include "drape/graphics_context_factory.hpp"
#include "base/src_point.hpp" #include "base/src_point.hpp"
@@ -45,7 +45,7 @@ private:
EGLSurface m_windowSurface; EGLSurface m_windowSurface;
EGLSurface m_pixelbufferSurface; EGLSurface m_pixelbufferSurface;
EGLConfig m_config; EGLConfig m_config;
ANativeWindow * m_nativeWindow; ANativeWindow * m_nativeWindow;
EGLDisplay m_display; EGLDisplay m_display;

View File

@@ -16,327 +16,289 @@
#include "gl3stub.h" #include "gl3stub.h"
GLboolean gl3stubInit() { GLboolean gl3stubInit()
#define FIND_PROC(s) s = reinterpret_cast<decltype(s)>(eglGetProcAddress(#s)) {
FIND_PROC(glReadBuffer); #define FIND_PROC(s) s = reinterpret_cast<decltype(s)>(eglGetProcAddress(#s))
FIND_PROC(glDrawRangeElements); FIND_PROC(glReadBuffer);
FIND_PROC(glTexImage3D); FIND_PROC(glDrawRangeElements);
FIND_PROC(glTexSubImage3D); FIND_PROC(glTexImage3D);
FIND_PROC(glCopyTexSubImage3D); FIND_PROC(glTexSubImage3D);
FIND_PROC(glCompressedTexImage3D); FIND_PROC(glCopyTexSubImage3D);
FIND_PROC(glCompressedTexSubImage3D); FIND_PROC(glCompressedTexImage3D);
FIND_PROC(glGenQueries); FIND_PROC(glCompressedTexSubImage3D);
FIND_PROC(glDeleteQueries); FIND_PROC(glGenQueries);
FIND_PROC(glIsQuery); FIND_PROC(glDeleteQueries);
FIND_PROC(glBeginQuery); FIND_PROC(glIsQuery);
FIND_PROC(glEndQuery); FIND_PROC(glBeginQuery);
FIND_PROC(glGetQueryiv); FIND_PROC(glEndQuery);
FIND_PROC(glGetQueryObjectuiv); FIND_PROC(glGetQueryiv);
FIND_PROC(glUnmapBuffer); FIND_PROC(glGetQueryObjectuiv);
FIND_PROC(glGetBufferPointerv); FIND_PROC(glUnmapBuffer);
FIND_PROC(glDrawBuffers); FIND_PROC(glGetBufferPointerv);
FIND_PROC(glUniformMatrix2x3fv); FIND_PROC(glDrawBuffers);
FIND_PROC(glUniformMatrix3x2fv); FIND_PROC(glUniformMatrix2x3fv);
FIND_PROC(glUniformMatrix2x4fv); FIND_PROC(glUniformMatrix3x2fv);
FIND_PROC(glUniformMatrix4x2fv); FIND_PROC(glUniformMatrix2x4fv);
FIND_PROC(glUniformMatrix3x4fv); FIND_PROC(glUniformMatrix4x2fv);
FIND_PROC(glUniformMatrix4x3fv); FIND_PROC(glUniformMatrix3x4fv);
FIND_PROC(glBlitFramebuffer); FIND_PROC(glUniformMatrix4x3fv);
FIND_PROC(glRenderbufferStorageMultisample); FIND_PROC(glBlitFramebuffer);
FIND_PROC(glFramebufferTextureLayer); FIND_PROC(glRenderbufferStorageMultisample);
FIND_PROC(glMapBufferRange); FIND_PROC(glFramebufferTextureLayer);
FIND_PROC(glFlushMappedBufferRange); FIND_PROC(glMapBufferRange);
FIND_PROC(glBindVertexArray); FIND_PROC(glFlushMappedBufferRange);
FIND_PROC(glDeleteVertexArrays); FIND_PROC(glBindVertexArray);
FIND_PROC(glGenVertexArrays); FIND_PROC(glDeleteVertexArrays);
FIND_PROC(glIsVertexArray); FIND_PROC(glGenVertexArrays);
FIND_PROC(glGetIntegeri_v); FIND_PROC(glIsVertexArray);
FIND_PROC(glBeginTransformFeedback); FIND_PROC(glGetIntegeri_v);
FIND_PROC(glEndTransformFeedback); FIND_PROC(glBeginTransformFeedback);
FIND_PROC(glBindBufferRange); FIND_PROC(glEndTransformFeedback);
FIND_PROC(glBindBufferBase); FIND_PROC(glBindBufferRange);
FIND_PROC(glTransformFeedbackVaryings); FIND_PROC(glBindBufferBase);
FIND_PROC(glGetTransformFeedbackVarying); FIND_PROC(glTransformFeedbackVaryings);
FIND_PROC(glVertexAttribIPointer); FIND_PROC(glGetTransformFeedbackVarying);
FIND_PROC(glGetVertexAttribIiv); FIND_PROC(glVertexAttribIPointer);
FIND_PROC(glGetVertexAttribIuiv); FIND_PROC(glGetVertexAttribIiv);
FIND_PROC(glVertexAttribI4i); FIND_PROC(glGetVertexAttribIuiv);
FIND_PROC(glVertexAttribI4ui); FIND_PROC(glVertexAttribI4i);
FIND_PROC(glVertexAttribI4iv); FIND_PROC(glVertexAttribI4ui);
FIND_PROC(glVertexAttribI4uiv); FIND_PROC(glVertexAttribI4iv);
FIND_PROC(glGetUniformuiv); FIND_PROC(glVertexAttribI4uiv);
FIND_PROC(glGetFragDataLocation); FIND_PROC(glGetUniformuiv);
FIND_PROC(glUniform1ui); FIND_PROC(glGetFragDataLocation);
FIND_PROC(glUniform2ui); FIND_PROC(glUniform1ui);
FIND_PROC(glUniform3ui); FIND_PROC(glUniform2ui);
FIND_PROC(glUniform4ui); FIND_PROC(glUniform3ui);
FIND_PROC(glUniform1uiv); FIND_PROC(glUniform4ui);
FIND_PROC(glUniform2uiv); FIND_PROC(glUniform1uiv);
FIND_PROC(glUniform3uiv); FIND_PROC(glUniform2uiv);
FIND_PROC(glUniform4uiv); FIND_PROC(glUniform3uiv);
FIND_PROC(glClearBufferiv); FIND_PROC(glUniform4uiv);
FIND_PROC(glClearBufferuiv); FIND_PROC(glClearBufferiv);
FIND_PROC(glClearBufferfv); FIND_PROC(glClearBufferuiv);
FIND_PROC(glClearBufferfi); FIND_PROC(glClearBufferfv);
FIND_PROC(glGetStringi); FIND_PROC(glClearBufferfi);
FIND_PROC(glCopyBufferSubData); FIND_PROC(glGetStringi);
FIND_PROC(glGetUniformIndices); FIND_PROC(glCopyBufferSubData);
FIND_PROC(glGetActiveUniformsiv); FIND_PROC(glGetUniformIndices);
FIND_PROC(glGetUniformBlockIndex); FIND_PROC(glGetActiveUniformsiv);
FIND_PROC(glGetActiveUniformBlockiv); FIND_PROC(glGetUniformBlockIndex);
FIND_PROC(glGetActiveUniformBlockName); FIND_PROC(glGetActiveUniformBlockiv);
FIND_PROC(glUniformBlockBinding); FIND_PROC(glGetActiveUniformBlockName);
FIND_PROC(glDrawArraysInstanced); FIND_PROC(glUniformBlockBinding);
FIND_PROC(glDrawElementsInstanced); FIND_PROC(glDrawArraysInstanced);
FIND_PROC(glFenceSync); FIND_PROC(glDrawElementsInstanced);
FIND_PROC(glIsSync); FIND_PROC(glFenceSync);
FIND_PROC(glDeleteSync); FIND_PROC(glIsSync);
FIND_PROC(glClientWaitSync); FIND_PROC(glDeleteSync);
FIND_PROC(glWaitSync); FIND_PROC(glClientWaitSync);
FIND_PROC(glGetInteger64v); FIND_PROC(glWaitSync);
FIND_PROC(glGetSynciv); FIND_PROC(glGetInteger64v);
FIND_PROC(glGetInteger64i_v); FIND_PROC(glGetSynciv);
FIND_PROC(glGetBufferParameteri64v); FIND_PROC(glGetInteger64i_v);
FIND_PROC(glGenSamplers); FIND_PROC(glGetBufferParameteri64v);
FIND_PROC(glDeleteSamplers); FIND_PROC(glGenSamplers);
FIND_PROC(glIsSampler); FIND_PROC(glDeleteSamplers);
FIND_PROC(glBindSampler); FIND_PROC(glIsSampler);
FIND_PROC(glSamplerParameteri); FIND_PROC(glBindSampler);
FIND_PROC(glSamplerParameteriv); FIND_PROC(glSamplerParameteri);
FIND_PROC(glSamplerParameterf); FIND_PROC(glSamplerParameteriv);
FIND_PROC(glSamplerParameterfv); FIND_PROC(glSamplerParameterf);
FIND_PROC(glGetSamplerParameteriv); FIND_PROC(glSamplerParameterfv);
FIND_PROC(glGetSamplerParameterfv); FIND_PROC(glGetSamplerParameteriv);
FIND_PROC(glVertexAttribDivisor); FIND_PROC(glGetSamplerParameterfv);
FIND_PROC(glBindTransformFeedback); FIND_PROC(glVertexAttribDivisor);
FIND_PROC(glDeleteTransformFeedbacks); FIND_PROC(glBindTransformFeedback);
FIND_PROC(glGenTransformFeedbacks); FIND_PROC(glDeleteTransformFeedbacks);
FIND_PROC(glIsTransformFeedback); FIND_PROC(glGenTransformFeedbacks);
FIND_PROC(glPauseTransformFeedback); FIND_PROC(glIsTransformFeedback);
FIND_PROC(glResumeTransformFeedback); FIND_PROC(glPauseTransformFeedback);
FIND_PROC(glGetProgramBinary); FIND_PROC(glResumeTransformFeedback);
FIND_PROC(glProgramBinary); FIND_PROC(glGetProgramBinary);
FIND_PROC(glProgramParameteri); FIND_PROC(glProgramBinary);
FIND_PROC(glInvalidateFramebuffer); FIND_PROC(glProgramParameteri);
FIND_PROC(glInvalidateSubFramebuffer); FIND_PROC(glInvalidateFramebuffer);
FIND_PROC(glTexStorage2D); FIND_PROC(glInvalidateSubFramebuffer);
FIND_PROC(glTexStorage3D); FIND_PROC(glTexStorage2D);
FIND_PROC(glGetInternalformativ); FIND_PROC(glTexStorage3D);
#undef FIND_PROC FIND_PROC(glGetInternalformativ);
#undef FIND_PROC
if (!glReadBuffer || if (!glReadBuffer || !glDrawRangeElements || !glTexImage3D || !glTexSubImage3D || !glCopyTexSubImage3D ||
!glDrawRangeElements || !glCompressedTexImage3D || !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries || !glIsQuery ||
!glTexImage3D || !glBeginQuery || !glEndQuery || !glGetQueryiv || !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv ||
!glTexSubImage3D || !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv || !glUniformMatrix2x4fv ||
!glCopyTexSubImage3D || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv || !glUniformMatrix4x3fv || !glBlitFramebuffer ||
!glCompressedTexImage3D || !glRenderbufferStorageMultisample || !glFramebufferTextureLayer || !glMapBufferRange ||
!glCompressedTexSubImage3D || !glFlushMappedBufferRange || !glBindVertexArray || !glDeleteVertexArrays || !glGenVertexArrays ||
!glGenQueries || !glIsVertexArray || !glGetIntegeri_v || !glBeginTransformFeedback || !glEndTransformFeedback ||
!glDeleteQueries || !glBindBufferRange || !glBindBufferBase || !glTransformFeedbackVaryings || !glGetTransformFeedbackVarying ||
!glIsQuery || !glVertexAttribIPointer || !glGetVertexAttribIiv || !glGetVertexAttribIuiv || !glVertexAttribI4i ||
!glBeginQuery || !glVertexAttribI4ui || !glVertexAttribI4iv || !glVertexAttribI4uiv || !glGetUniformuiv ||
!glEndQuery || !glGetFragDataLocation || !glUniform1ui || !glUniform2ui || !glUniform3ui || !glUniform4ui || !glUniform1uiv ||
!glGetQueryiv || !glUniform2uiv || !glUniform3uiv || !glUniform4uiv || !glClearBufferiv || !glClearBufferuiv || !glClearBufferfv ||
!glGetQueryObjectuiv || !glClearBufferfi || !glGetStringi || !glCopyBufferSubData || !glGetUniformIndices || !glGetActiveUniformsiv ||
!glUnmapBuffer || !glGetUniformBlockIndex || !glGetActiveUniformBlockiv || !glGetActiveUniformBlockName || !glUniformBlockBinding ||
!glGetBufferPointerv || !glDrawArraysInstanced || !glDrawElementsInstanced || !glFenceSync || !glIsSync || !glDeleteSync ||
!glDrawBuffers || !glClientWaitSync || !glWaitSync || !glGetInteger64v || !glGetSynciv || !glGetInteger64i_v ||
!glUniformMatrix2x3fv || !glGetBufferParameteri64v || !glGenSamplers || !glDeleteSamplers || !glIsSampler || !glBindSampler ||
!glUniformMatrix3x2fv || !glSamplerParameteri || !glSamplerParameteriv || !glSamplerParameterf || !glSamplerParameterfv ||
!glUniformMatrix2x4fv || !glGetSamplerParameteriv || !glGetSamplerParameterfv || !glVertexAttribDivisor || !glBindTransformFeedback ||
!glUniformMatrix4x2fv || !glDeleteTransformFeedbacks || !glGenTransformFeedbacks || !glIsTransformFeedback || !glPauseTransformFeedback ||
!glUniformMatrix3x4fv || !glResumeTransformFeedback || !glGetProgramBinary || !glProgramBinary || !glProgramParameteri ||
!glUniformMatrix4x3fv || !glInvalidateFramebuffer || !glInvalidateSubFramebuffer || !glTexStorage2D || !glTexStorage3D ||
!glBlitFramebuffer || !glGetInternalformativ)
!glRenderbufferStorageMultisample || {
!glFramebufferTextureLayer || return GL_FALSE;
!glMapBufferRange || }
!glFlushMappedBufferRange ||
!glBindVertexArray ||
!glDeleteVertexArrays ||
!glGenVertexArrays ||
!glIsVertexArray ||
!glGetIntegeri_v ||
!glBeginTransformFeedback ||
!glEndTransformFeedback ||
!glBindBufferRange ||
!glBindBufferBase ||
!glTransformFeedbackVaryings ||
!glGetTransformFeedbackVarying ||
!glVertexAttribIPointer ||
!glGetVertexAttribIiv ||
!glGetVertexAttribIuiv ||
!glVertexAttribI4i ||
!glVertexAttribI4ui ||
!glVertexAttribI4iv ||
!glVertexAttribI4uiv ||
!glGetUniformuiv ||
!glGetFragDataLocation ||
!glUniform1ui ||
!glUniform2ui ||
!glUniform3ui ||
!glUniform4ui ||
!glUniform1uiv ||
!glUniform2uiv ||
!glUniform3uiv ||
!glUniform4uiv ||
!glClearBufferiv ||
!glClearBufferuiv ||
!glClearBufferfv ||
!glClearBufferfi ||
!glGetStringi ||
!glCopyBufferSubData ||
!glGetUniformIndices ||
!glGetActiveUniformsiv ||
!glGetUniformBlockIndex ||
!glGetActiveUniformBlockiv ||
!glGetActiveUniformBlockName ||
!glUniformBlockBinding ||
!glDrawArraysInstanced ||
!glDrawElementsInstanced ||
!glFenceSync ||
!glIsSync ||
!glDeleteSync ||
!glClientWaitSync ||
!glWaitSync ||
!glGetInteger64v ||
!glGetSynciv ||
!glGetInteger64i_v ||
!glGetBufferParameteri64v ||
!glGenSamplers ||
!glDeleteSamplers ||
!glIsSampler ||
!glBindSampler ||
!glSamplerParameteri ||
!glSamplerParameteriv ||
!glSamplerParameterf ||
!glSamplerParameterfv ||
!glGetSamplerParameteriv ||
!glGetSamplerParameterfv ||
!glVertexAttribDivisor ||
!glBindTransformFeedback ||
!glDeleteTransformFeedbacks ||
!glGenTransformFeedbacks ||
!glIsTransformFeedback ||
!glPauseTransformFeedback ||
!glResumeTransformFeedback ||
!glGetProgramBinary ||
!glProgramBinary ||
!glProgramParameteri ||
!glInvalidateFramebuffer ||
!glInvalidateSubFramebuffer ||
!glTexStorage2D ||
!glTexStorage3D ||
!glGetInternalformativ)
{
return GL_FALSE;
}
return GL_TRUE; return GL_TRUE;
} }
/* Function pointer definitions */ /* Function pointer definitions */
GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode); GL_APICALL void (*GL_APIENTRY glReadBuffer)(GLenum mode);
GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices); GL_APICALL void (*GL_APIENTRY glDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type,
GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); GLvoid const * indices);
GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); GL_APICALL void (*GL_APIENTRY glTexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width,
GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type,
GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); GLvoid const * pixels);
GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); GL_APICALL void (*GL_APIENTRY glTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids); GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids); GLvoid const * pixels);
GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id); GL_APICALL void (*GL_APIENTRY glCopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id); GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target); GL_APICALL void (*GL_APIENTRY glCompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params); GLsizei height, GLsizei depth, GLint border, GLsizei imageSize,
GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params); GLvoid const * data);
GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target); GL_APICALL void (*GL_APIENTRY glCompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params); GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs); GLenum format, GLsizei imageSize, GLvoid const * data);
GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glGenQueries)(GLsizei n, GLuint * ids);
GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glDeleteQueries)(GLsizei n, GLuint const * ids);
GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL GLboolean (*GL_APIENTRY glIsQuery)(GLuint id);
GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glBeginQuery)(GLenum target, GLuint id);
GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glEndQuery)(GLenum target);
GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glGetQueryiv)(GLenum target, GLenum pname, GLint * params);
GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); GL_APICALL void (*GL_APIENTRY glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint * params);
GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GL_APICALL GLboolean (*GL_APIENTRY glUnmapBuffer)(GLenum target);
GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); GL_APICALL void (*GL_APIENTRY glGetBufferPointerv)(GLenum target, GLenum pname, GLvoid ** params);
GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); GL_APICALL void (*GL_APIENTRY glDrawBuffers)(GLsizei n, GLenum const * bufs);
GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length); GL_APICALL void (*GL_APIENTRY glUniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array); GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays); GL_APICALL void (*GL_APIENTRY glUniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays); GLfloat const * value);
GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array); GL_APICALL void (*GL_APIENTRY glUniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data); GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode); GL_APICALL void (*GL_APIENTRY glUniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void); GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); GL_APICALL void (*GL_APIENTRY glUniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer); GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode); GL_APICALL void (*GL_APIENTRY glUniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose,
GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name); GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); GL_APICALL void (*GL_APIENTRY glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,
GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params); GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params); GL_APICALL void (*GL_APIENTRY glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat,
GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w); GLsizei width, GLsizei height);
GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GL_APICALL void (*GL_APIENTRY glFramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level,
GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v); GLint layer);
GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v); GL_APICALL GLvoid * (*GL_APIENTRY glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length,
GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params); GLbitfield access);
GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name); GL_APICALL void (*GL_APIENTRY glFlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length);
GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0); GL_APICALL void (*GL_APIENTRY glBindVertexArray)(GLuint array);
GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1); GL_APICALL void (*GL_APIENTRY glDeleteVertexArrays)(GLsizei n, GLuint const * arrays);
GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2); GL_APICALL void (*GL_APIENTRY glGenVertexArrays)(GLsizei n, GLuint * arrays);
GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GL_APICALL GLboolean (*GL_APIENTRY glIsVertexArray)(GLuint array);
GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value); GL_APICALL void (*GL_APIENTRY glGetIntegeri_v)(GLenum target, GLuint index, GLint * data);
GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value); GL_APICALL void (*GL_APIENTRY glBeginTransformFeedback)(GLenum primitiveMode);
GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value); GL_APICALL void (*GL_APIENTRY glEndTransformFeedback)(void);
GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value); GL_APICALL void (*GL_APIENTRY glBindBufferRange)(GLenum target, GLuint index, GLuint buffer, GLintptr offset,
GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value); GLsizeiptr size);
GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value); GL_APICALL void (*GL_APIENTRY glBindBufferBase)(GLenum target, GLuint index, GLuint buffer);
GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value); GL_APICALL void (*GL_APIENTRY glTransformFeedbackVaryings)(GLuint program, GLsizei count,
GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); GLchar const * const * varyings, GLenum bufferMode);
GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index); GL_APICALL void (*GL_APIENTRY glGetTransformFeedbackVarying)(GLuint program, GLuint index, GLsizei bufSize,
GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); GLsizei * length, GLsizei * size, GLenum * type,
GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices); GLchar * name);
GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); GL_APICALL void (*GL_APIENTRY glVertexAttribIPointer)(GLuint index, GLint size, GLenum type, GLsizei stride,
GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName); GLvoid const * pointer);
GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); GL_APICALL void (*GL_APIENTRY glGetVertexAttribIiv)(GLuint index, GLenum pname, GLint * params);
GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); GL_APICALL void (*GL_APIENTRY glGetVertexAttribIuiv)(GLuint index, GLenum pname, GLuint * params);
GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); GL_APICALL void (*GL_APIENTRY glVertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w);
GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount); GL_APICALL void (*GL_APIENTRY glVertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount); GL_APICALL void (*GL_APIENTRY glVertexAttribI4iv)(GLuint index, GLint const * v);
GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags); GL_APICALL void (*GL_APIENTRY glVertexAttribI4uiv)(GLuint index, GLuint const * v);
GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync); GL_APICALL void (*GL_APIENTRY glGetUniformuiv)(GLuint program, GLint location, GLuint * params);
GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync); GL_APICALL GLint (*GL_APIENTRY glGetFragDataLocation)(GLuint program, GLchar const * name);
GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout); GL_APICALL void (*GL_APIENTRY glUniform1ui)(GLint location, GLuint v0);
GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout); GL_APICALL void (*GL_APIENTRY glUniform2ui)(GLint location, GLuint v0, GLuint v1);
GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params); GL_APICALL void (*GL_APIENTRY glUniform3ui)(GLint location, GLuint v0, GLuint v1, GLuint v2);
GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values); GL_APICALL void (*GL_APIENTRY glUniform4ui)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data); GL_APICALL void (*GL_APIENTRY glUniform1uiv)(GLint location, GLsizei count, GLuint const * value);
GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params); GL_APICALL void (*GL_APIENTRY glUniform2uiv)(GLint location, GLsizei count, GLuint const * value);
GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers); GL_APICALL void (*GL_APIENTRY glUniform3uiv)(GLint location, GLsizei count, GLuint const * value);
GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers); GL_APICALL void (*GL_APIENTRY glUniform4uiv)(GLint location, GLsizei count, GLuint const * value);
GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler); GL_APICALL void (*GL_APIENTRY glClearBufferiv)(GLenum buffer, GLint drawbuffer, GLint const * value);
GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler); GL_APICALL void (*GL_APIENTRY glClearBufferuiv)(GLenum buffer, GLint drawbuffer, GLuint const * value);
GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param); GL_APICALL void (*GL_APIENTRY glClearBufferfv)(GLenum buffer, GLint drawbuffer, GLfloat const * value);
GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param); GL_APICALL void (*GL_APIENTRY glClearBufferfi)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param); GL_APICALL const GLubyte * (*GL_APIENTRY glGetStringi)(GLenum name, GLuint index);
GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param); GL_APICALL void (*GL_APIENTRY glCopyBufferSubData)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset,
GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params); GLintptr writeOffset, GLsizeiptr size);
GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params); GL_APICALL void (*GL_APIENTRY glGetUniformIndices)(GLuint program, GLsizei uniformCount,
GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor); GLchar const * const * uniformNames, GLuint * uniformIndices);
GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id); GL_APICALL void (*GL_APIENTRY glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount,
GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids); GLuint const * uniformIndices, GLenum pname, GLint * params);
GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids); GL_APICALL GLuint (*GL_APIENTRY glGetUniformBlockIndex)(GLuint program, GLchar const * uniformBlockName);
GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id); GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname,
GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void); GLint * params);
GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void); GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize,
GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary); GLsizei * length, GLchar * uniformBlockName);
GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length); GL_APICALL void (*GL_APIENTRY glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex,
GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value); GLuint uniformBlockBinding);
GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments); GL_APICALL void (*GL_APIENTRY glDrawArraysInstanced)(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); GL_APICALL void (*GL_APIENTRY glDrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, GLvoid const * indices,
GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); GLsizei instanceCount);
GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); GL_APICALL GLsync (*GL_APIENTRY glFenceSync)(GLenum condition, GLbitfield flags);
GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); GL_APICALL GLboolean (*GL_APIENTRY glIsSync)(GLsync sync);
GL_APICALL void (*GL_APIENTRY glDeleteSync)(GLsync sync);
GL_APICALL GLenum (*GL_APIENTRY glClientWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout);
GL_APICALL void (*GL_APIENTRY glWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout);
GL_APICALL void (*GL_APIENTRY glGetInteger64v)(GLenum pname, GLint64 * params);
GL_APICALL void (*GL_APIENTRY glGetSynciv)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length,
GLint * values);
GL_APICALL void (*GL_APIENTRY glGetInteger64i_v)(GLenum target, GLuint index, GLint64 * data);
GL_APICALL void (*GL_APIENTRY glGetBufferParameteri64v)(GLenum target, GLenum pname, GLint64 * params);
GL_APICALL void (*GL_APIENTRY glGenSamplers)(GLsizei count, GLuint * samplers);
GL_APICALL void (*GL_APIENTRY glDeleteSamplers)(GLsizei count, GLuint const * samplers);
GL_APICALL GLboolean (*GL_APIENTRY glIsSampler)(GLuint sampler);
GL_APICALL void (*GL_APIENTRY glBindSampler)(GLuint unit, GLuint sampler);
GL_APICALL void (*GL_APIENTRY glSamplerParameteri)(GLuint sampler, GLenum pname, GLint param);
GL_APICALL void (*GL_APIENTRY glSamplerParameteriv)(GLuint sampler, GLenum pname, GLint const * param);
GL_APICALL void (*GL_APIENTRY glSamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param);
GL_APICALL void (*GL_APIENTRY glSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat const * param);
GL_APICALL void (*GL_APIENTRY glGetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint * params);
GL_APICALL void (*GL_APIENTRY glGetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat * params);
GL_APICALL void (*GL_APIENTRY glVertexAttribDivisor)(GLuint index, GLuint divisor);
GL_APICALL void (*GL_APIENTRY glBindTransformFeedback)(GLenum target, GLuint id);
GL_APICALL void (*GL_APIENTRY glDeleteTransformFeedbacks)(GLsizei n, GLuint const * ids);
GL_APICALL void (*GL_APIENTRY glGenTransformFeedbacks)(GLsizei n, GLuint * ids);
GL_APICALL GLboolean (*GL_APIENTRY glIsTransformFeedback)(GLuint id);
GL_APICALL void (*GL_APIENTRY glPauseTransformFeedback)(void);
GL_APICALL void (*GL_APIENTRY glResumeTransformFeedback)(void);
GL_APICALL void (*GL_APIENTRY glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei * length,
GLenum * binaryFormat, GLvoid * binary);
GL_APICALL void (*GL_APIENTRY glProgramBinary)(GLuint program, GLenum binaryFormat, GLvoid const * binary,
GLsizei length);
GL_APICALL void (*GL_APIENTRY glProgramParameteri)(GLuint program, GLenum pname, GLint value);
GL_APICALL void (*GL_APIENTRY glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments,
GLenum const * attachments);
GL_APICALL void (*GL_APIENTRY glInvalidateSubFramebuffer)(GLenum target, GLsizei numAttachments,
GLenum const * attachments, GLint x, GLint y, GLsizei width,
GLsizei height);
GL_APICALL void (*GL_APIENTRY glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
GLsizei height);
GL_APICALL void (*GL_APIENTRY glTexStorage3D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth);
GL_APICALL void (*GL_APIENTRY glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname,
GLsizei bufSize, GLint * params);

View File

@@ -22,17 +22,15 @@ std::string Platform::GetMemoryInfo() const
if (env == nullptr) if (env == nullptr)
return std::string(); return std::string();
static std::shared_ptr<jobject> classLogsManager = jni::make_global_ref(env->FindClass("app/organicmaps/sdk/util/log/LogsManager")); static std::shared_ptr<jobject> classLogsManager =
jni::make_global_ref(env->FindClass("app/organicmaps/sdk/util/log/LogsManager"));
ASSERT(classLogsManager, ()); ASSERT(classLogsManager, ());
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
static jmethodID const getMemoryInfoId static jmethodID const getMemoryInfoId = jni::GetStaticMethodID(
= jni::GetStaticMethodID(env, env, static_cast<jclass>(*classLogsManager), "getMemoryInfo", "(Landroid/content/Context;)Ljava/lang/String;");
static_cast<jclass>(*classLogsManager), jstring const memInfoString = static_cast<jstring>(
"getMemoryInfo", env->CallStaticObjectMethod(static_cast<jclass>(*classLogsManager), getMemoryInfoId, context));
"(Landroid/content/Context;)Ljava/lang/String;");
jstring const memInfoString = static_cast<jstring>(env->CallStaticObjectMethod(
static_cast<jclass>(*classLogsManager), getMemoryInfoId, context));
ASSERT(memInfoString, ()); ASSERT(memInfoString, ());
return jni::ToNativeString(env, memInfoString); return jni::ToNativeString(env, memInfoString);
@@ -41,20 +39,18 @@ std::string Platform::GetMemoryInfo() const
std::string Platform::DeviceName() const std::string Platform::DeviceName() const
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static jmethodID const getDeviceNameId = jni::GetStaticMethodID(env, g_utilsClazz, "getDeviceName", static jmethodID const getDeviceNameId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getDeviceName", "()Ljava/lang/String;");
auto const deviceName = static_cast<jstring>(env->CallStaticObjectMethod(g_utilsClazz, auto const deviceName = static_cast<jstring>(env->CallStaticObjectMethod(g_utilsClazz, getDeviceNameId));
getDeviceNameId));
return jni::ToNativeString(env, deviceName); return jni::ToNativeString(env, deviceName);
} }
std::string Platform::DeviceModel() const std::string Platform::DeviceModel() const
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static jmethodID const getDeviceModelId = jni::GetStaticMethodID(env, g_utilsClazz, "getDeviceModel", static jmethodID const getDeviceModelId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getDeviceModel", "()Ljava/lang/String;");
auto const deviceModel = static_cast<jstring>(env->CallStaticObjectMethod(g_utilsClazz, auto const deviceModel = static_cast<jstring>(env->CallStaticObjectMethod(g_utilsClazz, getDeviceModelId));
getDeviceModelId));
return jni::ToNativeString(env, deviceModel); return jni::ToNativeString(env, deviceModel);
} }
@@ -79,11 +75,14 @@ Platform::EConnectionType Platform::ConnectionStatus()
if (env == nullptr) if (env == nullptr)
return EConnectionType::CONNECTION_NONE; return EConnectionType::CONNECTION_NONE;
static std::shared_ptr<jobject> clazzConnectionState = jni::make_global_ref(env->FindClass("app/organicmaps/sdk/util/ConnectionState")); static std::shared_ptr<jobject> clazzConnectionState =
jni::make_global_ref(env->FindClass("app/organicmaps/sdk/util/ConnectionState"));
ASSERT(clazzConnectionState, ()); ASSERT(clazzConnectionState, ());
static jmethodID const getConnectionMethodId = jni::GetStaticMethodID(env, static_cast<jclass>(*clazzConnectionState), "getConnectionState", "()B"); static jmethodID const getConnectionMethodId =
return static_cast<Platform::EConnectionType>(env->CallStaticByteMethod(static_cast<jclass>(*clazzConnectionState), getConnectionMethodId)); jni::GetStaticMethodID(env, static_cast<jclass>(*clazzConnectionState), "getConnectionState", "()B");
return static_cast<Platform::EConnectionType>(
env->CallStaticByteMethod(static_cast<jclass>(*clazzConnectionState), getConnectionMethodId));
} }
Platform::ChargingStatus Platform::GetChargingStatus() Platform::ChargingStatus Platform::GetChargingStatus()
@@ -92,8 +91,7 @@ Platform::ChargingStatus Platform::GetChargingStatus()
if (env == nullptr) if (env == nullptr)
return Platform::ChargingStatus::Unknown; return Platform::ChargingStatus::Unknown;
static jclass const clazzBatteryState = static jclass const clazzBatteryState = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/BatteryState");
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/BatteryState");
ASSERT(clazzBatteryState, ()); ASSERT(clazzBatteryState, ());
static jmethodID const getChargingMethodId = static jmethodID const getChargingMethodId =
@@ -109,8 +107,7 @@ uint8_t Platform::GetBatteryLevel()
if (env == nullptr) if (env == nullptr)
return 100; return 100;
static auto const clazzBatteryState = static auto const clazzBatteryState = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/BatteryState");
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/BatteryState");
ASSERT(clazzBatteryState, ()); ASSERT(clazzBatteryState, ());
static auto const getLevelMethodId = static auto const getLevelMethodId =
@@ -123,22 +120,21 @@ namespace platform
{ {
platform::NetworkPolicy GetCurrentNetworkPolicy() platform::NetworkPolicy GetCurrentNetworkPolicy()
{ {
JNIEnv *env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
return platform::NetworkPolicy(network_policy::GetCurrentNetworkUsageStatus(env)); return platform::NetworkPolicy(network_policy::GetCurrentNetworkUsageStatus(env));
} }
} } // namespace platform
namespace android namespace android
{ {
Platform::~Platform() Platform::~Platform()
{ {
JNIEnv *env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->DeleteGlobalRef(m_context); env->DeleteGlobalRef(m_context);
} }
void Platform::Initialize(JNIEnv * env, jobject context, jstring apkPath, void Platform::Initialize(JNIEnv * env, jobject context, jstring apkPath, jstring writablePath, jstring privatePath,
jstring writablePath, jstring privatePath, jstring tmpPath, jstring tmpPath, jstring flavorName, jstring buildType, bool isTablet)
jstring flavorName, jstring buildType, bool isTablet)
{ {
m_context = env->NewGlobalRef(context); m_context = env->NewGlobalRef(context);
m_guiThread = std::make_unique<GuiThread>(); m_guiThread = std::make_unique<GuiThread>();
@@ -156,12 +152,10 @@ void Platform::Initialize(JNIEnv * env, jobject context, jstring apkPath,
LOG(LINFO, ("Temporary path = ", m_tmpDir)); LOG(LINFO, ("Temporary path = ", m_tmpDir));
// IMPORTANT: This method SHOULD be called from UI thread to cache static jni ID-s inside. // IMPORTANT: This method SHOULD be called from UI thread to cache static jni ID-s inside.
(void) ConnectionStatus(); (void)ConnectionStatus();
} }
void Platform::OnExternalStorageStatusChanged(bool isAvailable) void Platform::OnExternalStorageStatusChanged(bool isAvailable) {}
{
}
void Platform::SetWritableDir(std::string const & dir) void Platform::SetWritableDir(std::string const & dir)
{ {
@@ -173,7 +167,7 @@ void Platform::SetSettingsDir(std::string const & dir)
{ {
m_settingsDir = dir; m_settingsDir = dir;
// Logger is not fully initialized here. // Logger is not fully initialized here.
//LOG(LINFO, ("Settings path = ", m_settingsDir)); // LOG(LINFO, ("Settings path = ", m_settingsDir));
} }
bool Platform::HasAvailableSpaceForWriting(uint64_t size) const bool Platform::HasAvailableSpaceForWriting(uint64_t size) const
@@ -209,13 +203,11 @@ void Platform::AndroidSecureStorage::Save(std::string const & key, std::string c
Init(env); Init(env);
static jmethodID const saveMethodId = static jmethodID const saveMethodId = jni::GetStaticMethodID(env, m_secureStorageClass, "save",
jni::GetStaticMethodID(env, m_secureStorageClass, "save", "(Landroid/content/Context;Ljava/lang/String;"
"(Landroid/content/Context;Ljava/lang/String;" "Ljava/lang/String;)V");
"Ljava/lang/String;)V");
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
env->CallStaticVoidMethod(m_secureStorageClass, saveMethodId, env->CallStaticVoidMethod(m_secureStorageClass, saveMethodId, context,
context,
jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get(), jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get(),
jni::TScopedLocalRef(env, jni::ToJavaString(env, value)).get()); jni::TScopedLocalRef(env, jni::ToJavaString(env, value)).get());
} }
@@ -228,14 +220,12 @@ bool Platform::AndroidSecureStorage::Load(std::string const & key, std::string &
Init(env); Init(env);
static jmethodID const loadMethodId = static jmethodID const loadMethodId = jni::GetStaticMethodID(env, m_secureStorageClass, "load",
jni::GetStaticMethodID(env, m_secureStorageClass, "load", "(Landroid/content/Context;Ljava/lang/String;)"
"(Landroid/content/Context;Ljava/lang/String;)" "Ljava/lang/String;");
"Ljava/lang/String;");
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
auto const resultString = static_cast<jstring>(env->CallStaticObjectMethod(m_secureStorageClass, auto const resultString = static_cast<jstring>(env->CallStaticObjectMethod(
loadMethodId, context, m_secureStorageClass, loadMethodId, context, jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get()));
jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get()));
if (resultString == nullptr) if (resultString == nullptr)
return false; return false;
@@ -252,8 +242,7 @@ void Platform::AndroidSecureStorage::Remove(std::string const & key)
Init(env); Init(env);
static jmethodID const removeMethodId = static jmethodID const removeMethodId =
jni::GetStaticMethodID(env, m_secureStorageClass, "remove", jni::GetStaticMethodID(env, m_secureStorageClass, "remove", "(Landroid/content/Context;Ljava/lang/String;)V");
"(Landroid/content/Context;Ljava/lang/String;)V");
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
env->CallStaticVoidMethod(m_secureStorageClass, removeMethodId, context, env->CallStaticVoidMethod(m_secureStorageClass, removeMethodId, context,
jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get()); jni::TScopedLocalRef(env, jni::ToJavaString(env, key)).get());

View File

@@ -20,8 +20,7 @@ public:
~Platform() override; ~Platform() override;
void Initialize(JNIEnv * env, jobject functorProcessObject, jstring apkPath, jstring writablePath, void Initialize(JNIEnv * env, jobject functorProcessObject, jstring apkPath, jstring writablePath,
jstring privatePath, jstring tmpPath, jstring flavorName, jstring privatePath, jstring tmpPath, jstring flavorName, jstring buildType, bool isTablet);
jstring buildType, bool isTablet);
void OnExternalStorageStatusChanged(bool isAvailable); void OnExternalStorageStatusChanged(bool isAvailable);
@@ -53,4 +52,4 @@ private:
AndroidSecureStorage m_secureStorage; AndroidSecureStorage m_secureStorage;
jobject m_context; jobject m_context;
}; };
} // namespace android } // namespace android

View File

@@ -11,12 +11,8 @@ private:
jclass m_klass; jclass m_klass;
public: public:
HttpThread(std::string const & url, HttpThread(std::string const & url, downloader::IHttpThreadCallback & cb, int64_t beg, int64_t end,
downloader::IHttpThreadCallback & cb, int64_t expectedFileSize, std::string const & pb)
int64_t beg,
int64_t end,
int64_t expectedFileSize,
std::string const & pb)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/ChunkTask"); static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/downloader/ChunkTask");
@@ -35,14 +31,9 @@ public:
} }
jni::TScopedLocalRef jUrl(env, jni::ToJavaString(env, url.c_str())); jni::TScopedLocalRef jUrl(env, jni::ToJavaString(env, url.c_str()));
jni::TScopedLocalRef localSelf(env, env->NewObject(klass, jni::TScopedLocalRef localSelf(
initMethodId, env, env->NewObject(klass, initMethodId, reinterpret_cast<jlong>(&cb), jUrl.get(), static_cast<jlong>(beg),
reinterpret_cast<jlong>(&cb), static_cast<jlong>(end), static_cast<jlong>(expectedFileSize), postBody.get()));
jUrl.get(),
static_cast<jlong>(beg),
static_cast<jlong>(end),
static_cast<jlong>(expectedFileSize),
postBody.get()));
m_self = env->NewGlobalRef(localSelf.get()); m_self = env->NewGlobalRef(localSelf.get());
ASSERT(m_self, ()); ASSERT(m_self, ());
@@ -60,29 +51,26 @@ public:
namespace downloader namespace downloader
{ {
HttpThread * CreateNativeHttpThread(std::string const & url, HttpThread * CreateNativeHttpThread(std::string const & url, downloader::IHttpThreadCallback & cb, int64_t beg,
downloader::IHttpThreadCallback & cb, int64_t end, int64_t size, std::string const & pb)
int64_t beg, {
int64_t end, return new HttpThread(url, cb, beg, end, size, pb);
int64_t size, }
std::string const & pb)
{
return new HttpThread(url, cb, beg, end, size, pb);
}
void DeleteNativeHttpThread(HttpThread * request) void DeleteNativeHttpThread(HttpThread * request)
{ {
delete request; delete request;
} }
} // namespace downloader } // namespace downloader
extern "C" extern "C"
{ {
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong beg, jbyteArray data, jlong size) jlong httpCallbackID, jlong beg,
jbyteArray data, jlong size)
{ {
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID); downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback *>(httpCallbackID);
jbyte * buf = env->GetByteArrayElements(data, 0); jbyte * buf = env->GetByteArrayElements(data, 0);
ASSERT(buf, ()); ASSERT(buf, ());
@@ -100,10 +88,12 @@ Java_app_organicmaps_sdk_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass
return ret; return ret;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong httpCode, jlong beg, jlong end) jlong httpCallbackID,
jlong httpCode, jlong beg,
jlong end)
{ {
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID); downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback *>(httpCallbackID);
cb->OnFinish(static_cast<long>(httpCode), beg, end); cb->OnFinish(static_cast<long>(httpCode), beg, end);
} }
} // extern "C" } // extern "C"

View File

@@ -1,5 +1,5 @@
#include "android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.hpp"
#include "android/sdk/src/main/cpp/app/organicmaps/sdk/core/ScopedLocalRef.hpp" #include "android/sdk/src/main/cpp/app/organicmaps/sdk/core/ScopedLocalRef.hpp"
#include "android/sdk/src/main/cpp/app/organicmaps/sdk/core/jni_helper.hpp"
#include "platform/locale.hpp" #include "platform/locale.hpp"
@@ -22,11 +22,12 @@ std::string GetAndroidSystemLanguage()
} }
static jclass const languageClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/Language"); static jclass const languageClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/Language");
static jmethodID const getDefaultLocaleId = jni::GetStaticMethodID(env, languageClass, "getDefaultLocale", "()Ljava/lang/String;"); static jmethodID const getDefaultLocaleId =
jni::GetStaticMethodID(env, languageClass, "getDefaultLocale", "()Ljava/lang/String;");
jni::TScopedLocalRef localeRef(env, env->CallStaticObjectMethod(languageClass, getDefaultLocaleId)); jni::TScopedLocalRef localeRef(env, env->CallStaticObjectMethod(languageClass, getDefaultLocaleId));
std::string res = jni::ToNativeString(env, (jstring) localeRef.get()); std::string res = jni::ToNativeString(env, (jstring)localeRef.get());
if (res.empty()) if (res.empty())
res = DEFAULT_LANG; res = DEFAULT_LANG;
@@ -38,24 +39,24 @@ namespace platform
Locale GetCurrentLocale() Locale GetCurrentLocale()
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static jmethodID const getLanguageCodeId = jni::GetStaticMethodID(env, g_utilsClazz, "getLanguageCode", static jmethodID const getLanguageCodeId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getLanguageCode", "()Ljava/lang/String;");
jni::ScopedLocalRef languageCode(env, env->CallStaticObjectMethod(g_utilsClazz, getLanguageCodeId)); jni::ScopedLocalRef languageCode(env, env->CallStaticObjectMethod(g_utilsClazz, getLanguageCodeId));
static jmethodID const getCountryCodeId = jni::GetStaticMethodID(env, g_utilsClazz, "getCountryCode", static jmethodID const getCountryCodeId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getCountryCode", "()Ljava/lang/String;");
jni::ScopedLocalRef countryCode(env, env->CallStaticObjectMethod(g_utilsClazz, getCountryCodeId)); jni::ScopedLocalRef countryCode(env, env->CallStaticObjectMethod(g_utilsClazz, getCountryCodeId));
static jmethodID const getCurrencyCodeId = jni::GetStaticMethodID(env, g_utilsClazz, "getCurrencyCode", static jmethodID const getCurrencyCodeId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getCurrencyCode", "()Ljava/lang/String;");
jni::ScopedLocalRef currencyCode(env, env->CallStaticObjectMethod(g_utilsClazz, getCurrencyCodeId)); jni::ScopedLocalRef currencyCode(env, env->CallStaticObjectMethod(g_utilsClazz, getCurrencyCodeId));
static jmethodID const getDecimalSeparatorId = jni::GetStaticMethodID(env, g_utilsClazz, "getDecimalSeparator", static jmethodID const getDecimalSeparatorId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getDecimalSeparator", "()Ljava/lang/String;");
jni::ScopedLocalRef decimalSeparatorChar(env, env->CallStaticObjectMethod(g_utilsClazz, getDecimalSeparatorId)); jni::ScopedLocalRef decimalSeparatorChar(env, env->CallStaticObjectMethod(g_utilsClazz, getDecimalSeparatorId));
static jmethodID const getGroupingSeparatorId = jni::GetStaticMethodID(env, g_utilsClazz, "getGroupingSeparator", static jmethodID const getGroupingSeparatorId =
"()Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getGroupingSeparator", "()Ljava/lang/String;");
jni::ScopedLocalRef groupingSeparatorChar(env, env->CallStaticObjectMethod(g_utilsClazz, getGroupingSeparatorId)); jni::ScopedLocalRef groupingSeparatorChar(env, env->CallStaticObjectMethod(g_utilsClazz, getGroupingSeparatorId));
return {jni::ToNativeString(env, static_cast<jstring>(languageCode.get())), return {jni::ToNativeString(env, static_cast<jstring>(languageCode.get())),

View File

@@ -1,7 +1,7 @@
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/core/ScopedLocalRef.hpp" #include "app/organicmaps/sdk/core/ScopedLocalRef.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/platform/AndroidPlatform.hpp" #include "app/organicmaps/sdk/platform/AndroidPlatform.hpp"
#include "platform/localization.hpp" #include "platform/localization.hpp"
@@ -23,8 +23,7 @@ std::string GetLocalizedStringByUtil(jmethodID const & methodId, std::string con
jni::TScopedLocalRef strRef(env, jni::ToJavaString(env, str)); jni::TScopedLocalRef strRef(env, jni::ToJavaString(env, str));
jobject context = android::Platform::Instance().GetContext(); jobject context = android::Platform::Instance().GetContext();
jni::TScopedLocalRef localizedStrRef(env, env->CallStaticObjectMethod(g_utilsClazz, methodId, jni::TScopedLocalRef localizedStrRef(env, env->CallStaticObjectMethod(g_utilsClazz, methodId, context, strRef.get()));
context, strRef.get()));
return jni::ToNativeString(env, static_cast<jstring>(localizedStrRef.get())); return jni::ToNativeString(env, static_cast<jstring>(localizedStrRef.get()));
} }
} // namespace } // namespace
@@ -52,12 +51,11 @@ std::string GetLocalizedString(std::string const & key)
std::string GetCurrencySymbol(std::string const & currencyCode) std::string GetCurrencySymbol(std::string const & currencyCode)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static auto const methodId = jni::GetStaticMethodID(env, g_utilsClazz, "getCurrencySymbol", static auto const methodId =
"(Ljava/lang/String;)Ljava/lang/String;"); jni::GetStaticMethodID(env, g_utilsClazz, "getCurrencySymbol", "(Ljava/lang/String;)Ljava/lang/String;");
jni::TScopedLocalRef currencyCodeRef(env, jni::ToJavaString(env, currencyCode)); jni::TScopedLocalRef currencyCodeRef(env, jni::ToJavaString(env, currencyCode));
jni::TScopedLocalRef localizedStrRef( jni::TScopedLocalRef localizedStrRef(env, env->CallStaticObjectMethod(g_utilsClazz, methodId, currencyCodeRef.get()));
env, env->CallStaticObjectMethod(g_utilsClazz, methodId, currencyCodeRef.get()));
return jni::ToNativeString(env, static_cast<jstring>(localizedStrRef.get())); return jni::ToNativeString(env, static_cast<jstring>(localizedStrRef.get()));
} }

View File

@@ -30,8 +30,7 @@ public:
bool Open(std::string const & host, uint16_t port) bool Open(std::string const & host, uint16_t port)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
static jmethodID const openMethod = static jmethodID const openMethod = jni::GetMethodID(env, m_self, "open", "(Ljava/lang/String;I)Z");
jni::GetMethodID(env, m_self, "open", "(Ljava/lang/String;I)Z");
jni::TScopedLocalRef hostRef(env, jni::ToJavaString(env, host)); jni::TScopedLocalRef hostRef(env, jni::ToJavaString(env, host));
jboolean result = env->CallBooleanMethod(m_self, openMethod, hostRef.get(), static_cast<jint>(port)); jboolean result = env->CallBooleanMethod(m_self, openMethod, hostRef.get(), static_cast<jint>(port));
if (jni::HandleJavaException(env)) if (jni::HandleJavaException(env))
@@ -55,7 +54,7 @@ public:
jboolean result = env->CallBooleanMethod(m_self, readMethod, array, static_cast<jint>(count)); jboolean result = env->CallBooleanMethod(m_self, readMethod, array, static_cast<jint>(count));
if (jni::HandleJavaException(env)) if (jni::HandleJavaException(env))
return false; return false;
//this call copies java byte array to native buffer // this call copies java byte array to native buffer
env->GetByteArrayRegion(array, 0, count, reinterpret_cast<jbyte *>(data)); env->GetByteArrayRegion(array, 0, count, reinterpret_cast<jbyte *>(data));
if (jni::HandleJavaException(env)) if (jni::HandleJavaException(env))
return false; return false;
@@ -66,8 +65,8 @@ public:
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
jni::TScopedLocalByteArrayRef arrayRef(env, env->NewByteArray(count)); jni::TScopedLocalByteArrayRef arrayRef(env, env->NewByteArray(count));
//this call copies native buffer to java byte array // this call copies native buffer to java byte array
env->SetByteArrayRegion(arrayRef.get(), 0, count, reinterpret_cast<const jbyte *>(data)); env->SetByteArrayRegion(arrayRef.get(), 0, count, reinterpret_cast<jbyte const *>(data));
static jmethodID const writeMethod = jni::GetMethodID(env, m_self, "write", "([BI)Z"); static jmethodID const writeMethod = jni::GetMethodID(env, m_self, "write", "([BI)Z");
jboolean result = env->CallBooleanMethod(m_self, writeMethod, arrayRef.get(), static_cast<jint>(count)); jboolean result = env->CallBooleanMethod(m_self, writeMethod, arrayRef.get(), static_cast<jint>(count));
if (jni::HandleJavaException(env)) if (jni::HandleJavaException(env))
@@ -81,11 +80,14 @@ public:
static jmethodID const setTimeoutMethod = jni::GetMethodID(env, m_self, "setTimeout", "(I)V"); static jmethodID const setTimeoutMethod = jni::GetMethodID(env, m_self, "setTimeout", "(I)V");
env->CallVoidMethod(m_self, setTimeoutMethod, static_cast<jint>(milliseconds)); env->CallVoidMethod(m_self, setTimeoutMethod, static_cast<jint>(milliseconds));
jni::HandleJavaException(env); jni::HandleJavaException(env);
}; }
private: private:
jobject m_self; jobject m_self;
}; };
std::unique_ptr<Socket> CreateSocket() { return std::make_unique<SocketImpl>(); } std::unique_ptr<Socket> CreateSocket()
{
return std::make_unique<SocketImpl>();
} }
} // namespace platform

View File

@@ -14,9 +14,8 @@ jobjectArray CreateJunctionInfoArray(JNIEnv * env, std::vector<geometry::PointWi
return jni::ToJavaArray(env, junctionClazz, junctionPoints, return jni::ToJavaArray(env, junctionClazz, junctionPoints,
[](JNIEnv * env, geometry::PointWithAltitude const & pointWithAltitude) [](JNIEnv * env, geometry::PointWithAltitude const & pointWithAltitude)
{ {
auto & point = pointWithAltitude.GetPoint(); auto & point = pointWithAltitude.GetPoint();
return env->NewObject(junctionClazz, junctionConstructor, mercator::YToLat(point.y), return env->NewObject(junctionClazz, junctionConstructor, mercator::YToLat(point.y), mercator::XToLon(point.x));
mercator::XToLon(point.x)); });
});
} }

View File

@@ -13,17 +13,15 @@ jobjectArray CreateRouteMarkDataArray(JNIEnv * env, std::vector<RouteMarkData> c
// int intermediateIndex, boolean isVisible, boolean isMyPosition, // int intermediateIndex, boolean isVisible, boolean isMyPosition,
// boolean isPassed, double lat, double lon) // boolean isPassed, double lat, double lon)
static jmethodID const pointConstructor = static jmethodID const pointConstructor =
jni::GetConstructorID(env, pointClazz, "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V"); jni::GetConstructorID(env, pointClazz, "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V");
return jni::ToJavaArray(env, pointClazz, points, return jni::ToJavaArray(env, pointClazz, points, [&](JNIEnv * jEnv, RouteMarkData const & data)
[&](JNIEnv * jEnv, RouteMarkData const & data) {
{ jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title));
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title)); jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle));
jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle)); return env->NewObject(pointClazz, pointConstructor, title.get(), subtitle.get(),
return env->NewObject( static_cast<jint>(data.m_pointType), static_cast<jint>(data.m_intermediateIndex),
pointClazz, pointConstructor, title.get(), subtitle.get(), static_cast<jboolean>(data.m_isVisible), static_cast<jboolean>(data.m_isMyPosition),
static_cast<jint>(data.m_pointType), static_cast<jint>(data.m_intermediateIndex), static_cast<jboolean>(data.m_isPassed), mercator::YToLat(data.m_position.y),
static_cast<jboolean>(data.m_isVisible), static_cast<jboolean>(data.m_isMyPosition), mercator::XToLon(data.m_position.x));
static_cast<jboolean>(data.m_isPassed), mercator::YToLat(data.m_position.y), });
mercator::XToLon(data.m_position.x));
});
} }

View File

@@ -15,21 +15,21 @@ jobject CreateRoutingInfo(JNIEnv * env, routing::FollowingInfo const & info, Rou
// vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum, // vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum,
// int totalTime, SingleLaneInfo[] lanes) // int totalTime, SingleLaneInfo[] lanes)
static jmethodID const ctorRouteInfoID = static jmethodID const ctorRouteInfoID =
jni::GetConstructorID(env, klass, jni::GetConstructorID(env, klass,
"(Lapp/organicmaps/sdk/util/Distance;Lapp/organicmaps/sdk/util/Distance;" "(Lapp/organicmaps/sdk/util/Distance;Lapp/organicmaps/sdk/util/Distance;"
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DIIIII" "Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DIIIII"
"[Lapp/organicmaps/sdk/routing/SingleLaneInfo;DZZ)V"); "[Lapp/organicmaps/sdk/routing/SingleLaneInfo;DZZ)V");
jobjectArray jLanes = CreateLanesInfo(env, info.m_lanes); jobjectArray jLanes = CreateLanesInfo(env, info.m_lanes);
auto const isSpeedCamLimitExceeded = rm.IsSpeedCamLimitExceeded(); auto const isSpeedCamLimitExceeded = rm.IsSpeedCamLimitExceeded();
auto const shouldPlaySignal = rm.GetSpeedCamManager().ShouldPlayBeepSignal(); auto const shouldPlaySignal = rm.GetSpeedCamManager().ShouldPlayBeepSignal();
jobject const result = env->NewObject( jobject const result = env->NewObject(
klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget), ToJavaDistance(env, info.m_distToTurn), klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget), ToJavaDistance(env, info.m_distToTurn),
jni::ToJavaString(env, info.m_currentStreetName), jni::ToJavaString(env, info.m_nextStreetName), jni::ToJavaString(env, info.m_currentStreetName), jni::ToJavaString(env, info.m_nextStreetName),
jni::ToJavaString(env, info.m_nextNextStreetName), info.m_completionPercent, info.m_turn, info.m_nextTurn, jni::ToJavaString(env, info.m_nextNextStreetName), info.m_completionPercent, info.m_turn, info.m_nextTurn,
info.m_pedestrianTurn, info.m_exitNum, info.m_time, jLanes, info.m_speedLimitMps, info.m_pedestrianTurn, info.m_exitNum, info.m_time, jLanes, info.m_speedLimitMps,
static_cast<jboolean>(isSpeedCamLimitExceeded), static_cast<jboolean>(shouldPlaySignal)); static_cast<jboolean>(isSpeedCamLimitExceeded), static_cast<jboolean>(shouldPlaySignal));
ASSERT(result, (jni::DescribeException())); ASSERT(result, (jni::DescribeException()));
return result; return result;
} }

View File

@@ -25,7 +25,7 @@ jobjectArray CreateLanesInfo(JNIEnv * env, std::vector<routing::FollowingInfo::S
env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data()); env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data());
jni::TScopedLocalRef singleLaneInfo( jni::TScopedLocalRef singleLaneInfo(
env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(), lanes[j].m_isRecommended)); env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(), lanes[j].m_isRecommended));
ASSERT(singleLaneInfo.get(), (jni::DescribeException())); ASSERT(singleLaneInfo.get(), (jni::DescribeException()));
env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get()); env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get());
} }

View File

@@ -11,16 +11,16 @@ jobject CreateTransitRouteInfo(JNIEnv * env, TransitRouteInfo const & routeInfo)
jobjectArray steps = CreateTransitStepInfoArray(env, routeInfo.m_steps); jobjectArray steps = CreateTransitStepInfoArray(env, routeInfo.m_steps);
static jclass const transitRouteInfoClass = static jclass const transitRouteInfoClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/TransitRouteInfo"); jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/TransitRouteInfo");
// Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits, // Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits,
// int totalTimeInSec, @NonNull String totalPedestrianDistance, @NonNull String // int totalTimeInSec, @NonNull String totalPedestrianDistance, @NonNull String
// totalPedestrianDistanceUnits, int totalPedestrianTimeInSec, @NonNull // totalPedestrianDistanceUnits, int totalPedestrianTimeInSec, @NonNull
// TransitStepInfo[] steps) // TransitStepInfo[] steps)
static jmethodID const transitRouteInfoConstructor = static jmethodID const transitRouteInfoConstructor =
jni::GetConstructorID(env, transitRouteInfoClass, jni::GetConstructorID(env, transitRouteInfoClass,
"(Ljava/lang/String;Ljava/lang/String;I" "(Ljava/lang/String;Ljava/lang/String;I"
"Ljava/lang/String;Ljava/lang/String;I" "Ljava/lang/String;Ljava/lang/String;I"
"[Lapp/organicmaps/sdk/routing/TransitStepInfo;)V"); "[Lapp/organicmaps/sdk/routing/TransitStepInfo;)V");
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr)); jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr));
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix)); jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix));
jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr)); jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr));

View File

@@ -12,17 +12,15 @@ jobjectArray CreateTransitStepInfoArray(JNIEnv * env, std::vector<TransitStepInf
// Java signature : TransitStepInfo(int type, @Nullable String distance, @Nullable String distanceUnits, // Java signature : TransitStepInfo(int type, @Nullable String distance, @Nullable String distanceUnits,
// int timeInSec, @Nullable String number, int color, int intermediateIndex) // int timeInSec, @Nullable String number, int color, int intermediateIndex)
static jmethodID const transitStepConstructor = static jmethodID const transitStepConstructor =
jni::GetConstructorID(env, transitStepClass, "(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V"); jni::GetConstructorID(env, transitStepClass, "(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V");
return jni::ToJavaArray( return jni::ToJavaArray(env, transitStepClass, steps, [&](JNIEnv * jEnv, TransitStepInfo const & stepInfo)
env, transitStepClass, steps, {
[&](JNIEnv * jEnv, TransitStepInfo const & stepInfo) jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr));
{ jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix));
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr)); jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number));
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix)); return env->NewObject(transitStepClass, transitStepConstructor, static_cast<jint>(stepInfo.m_type), distance.get(),
jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number)); distanceUnits.get(), static_cast<jint>(stepInfo.m_timeInSec), number.get(),
return env->NewObject(transitStepClass, transitStepConstructor, static_cast<jint>(stepInfo.m_type), static_cast<jint>(stepInfo.m_colorARGB), static_cast<jint>(stepInfo.m_intermediateIndex));
distance.get(), distanceUnits.get(), static_cast<jint>(stepInfo.m_timeInSec), number.get(), });
static_cast<jint>(stepInfo.m_colorARGB), static_cast<jint>(stepInfo.m_intermediateIndex));
});
} }

View File

@@ -13,8 +13,9 @@ JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_search_DisplayedCategori
return jni::ToJavaStringArray(env, categories.GetKeys()); return jni::ToJavaStringArray(env, categories.GetKeys());
} }
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_DisplayedCategories_nativeIsLangSupported( JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_DisplayedCategories_nativeIsLangSupported(JNIEnv * env,
JNIEnv * env, jclass, jstring langCode) jclass,
jstring langCode)
{ {
return search::DisplayedCategories::IsLanguageSupported(jni::ToNativeString(env, langCode)); return search::DisplayedCategories::IsLanguageSupported(jni::ToNativeString(env, langCode));
} }

View File

@@ -65,13 +65,12 @@ bool PopularityHasHigherPriority(bool hasPosition, double distanceInMeters)
return !hasPosition || distanceInMeters > search::Result::kPopularityHighPriorityMinDistance; return !hasPosition || distanceInMeters > search::Result::kPopularityHighPriorityMinDistance;
} }
jobject ToJavaResult(Result const & result, search::ProductInfo const & productInfo, jobject ToJavaResult(Result const & result, search::ProductInfo const & productInfo, bool hasPosition, double lat,
bool hasPosition, double lat, double lon) double lon)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
jni::TScopedLocalIntArrayRef ranges( jni::TScopedLocalIntArrayRef ranges(env, env->NewIntArray(static_cast<jsize>(result.GetHighlightRangesCount() * 2)));
env, env->NewIntArray(static_cast<jsize>(result.GetHighlightRangesCount() * 2)));
jint * rawArr = env->GetIntArrayElements(ranges, nullptr); jint * rawArr = env->GetIntArrayElements(ranges, nullptr);
for (size_t i = 0; i < result.GetHighlightRangesCount(); i++) for (size_t i = 0; i < result.GetHighlightRangesCount(); i++)
{ {
@@ -81,8 +80,8 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
} }
env->ReleaseIntArrayElements(ranges.get(), rawArr, 0); env->ReleaseIntArrayElements(ranges.get(), rawArr, 0);
jni::TScopedLocalIntArrayRef descRanges(env, env->NewIntArray( jni::TScopedLocalIntArrayRef descRanges(
static_cast<jsize>(result.GetDescHighlightRangesCount() * 2))); env, env->NewIntArray(static_cast<jsize>(result.GetDescHighlightRangesCount() * 2)));
jint * rawArr2 = env->GetIntArrayElements(descRanges, nullptr); jint * rawArr2 = env->GetIntArrayElements(descRanges, nullptr);
for (size_t i = 0; i < result.GetDescHighlightRangesCount(); i++) for (size_t i = 0; i < result.GetDescHighlightRangesCount(); i++)
{ {
@@ -100,7 +99,8 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
{ {
jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString())); jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString()));
jni::TScopedLocalRef suggest(env, jni::ToJavaString(env, result.GetSuggestionString())); jni::TScopedLocalRef suggest(env, jni::ToJavaString(env, result.GetSuggestionString()));
return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon, ranges.get(),descRanges.get()); return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon,
ranges.get(), descRanges.get());
} }
platform::Distance distance; platform::Distance distance;
@@ -113,34 +113,31 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
bool const popularityHasHigherPriority = PopularityHasHigherPriority(hasPosition, distanceInMeters); bool const popularityHasHigherPriority = PopularityHasHigherPriority(hasPosition, distanceInMeters);
bool const isFeature = result.GetResultType() == Result::Type::Feature; bool const isFeature = result.GetResultType() == Result::Type::Feature;
jni::TScopedLocalRef featureId(env, usermark_helper::CreateFeatureId(env, isFeature ? jni::TScopedLocalRef featureId(
result.GetFeatureID() : env, usermark_helper::CreateFeatureId(env, isFeature ? result.GetFeatureID() : kEmptyFeatureId));
kEmptyFeatureId));
jni::TScopedLocalRef featureType(env, jni::ToJavaString(env, result.GetLocalizedFeatureType())); jni::TScopedLocalRef featureType(env, jni::ToJavaString(env, result.GetLocalizedFeatureType()));
jni::TScopedLocalRef address(env, jni::ToJavaString(env, result.GetAddress())); jni::TScopedLocalRef address(env, jni::ToJavaString(env, result.GetAddress()));
jni::TScopedLocalRef dist(env, ToJavaDistance(env, distance)); jni::TScopedLocalRef dist(env, ToJavaDistance(env, distance));
jni::TScopedLocalRef description(env, jni::ToJavaString(env, result.GetFeatureDescription())); jni::TScopedLocalRef description(env, jni::ToJavaString(env, result.GetFeatureDescription()));
jni::TScopedLocalRef desc(env, env->NewObject(g_descriptionClass, g_descriptionConstructor, jni::TScopedLocalRef desc(
featureId.get(), featureType.get(), address.get(), env,
dist.get(), description.get(), env->NewObject(g_descriptionClass, g_descriptionConstructor, featureId.get(), featureType.get(), address.get(),
static_cast<jint>(result.IsOpenNow()), dist.get(), description.get(), static_cast<jint>(result.IsOpenNow()), result.GetMinutesUntilOpen(),
result.GetMinutesUntilOpen(),result.GetMinutesUntilClosed(), result.GetMinutesUntilClosed(), static_cast<jboolean>(popularityHasHigherPriority)));
static_cast<jboolean>(popularityHasHigherPriority)));
jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString())); jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString()));
jni::TScopedLocalRef popularity(env, env->NewObject(g_popularityClass, jni::TScopedLocalRef popularity(env, env->NewObject(g_popularityClass, g_popularityConstructor,
g_popularityConstructor,
/// @todo Restore when popularity will be available /// @todo Restore when popularity will be available
0/*static_cast<jint>(result.GetRankingInfo().m_popularity)*/)); 0 /*static_cast<jint>(result.GetRankingInfo().m_popularity)*/));
return env->NewObject(g_resultClass, g_resultConstructor, name.get(), desc.get(), ll.m_lat, ll.m_lon, return env->NewObject(g_resultClass, g_resultConstructor, name.get(), desc.get(), ll.m_lat, ll.m_lon, ranges.get(),
ranges.get(), descRanges.get(), popularity.get()); descRanges.get(), popularity.get());
} }
jobjectArray BuildSearchResults(vector<search::ProductInfo> const & productInfo, jobjectArray BuildSearchResults(vector<search::ProductInfo> const & productInfo, bool hasPosition, double lat,
bool hasPosition, double lat, double lon) double lon)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
@@ -154,8 +151,8 @@ jobjectArray BuildSearchResults(vector<search::ProductInfo> const & productInfo,
return jResults; return jResults;
} }
void OnResults(Results results, vector<search::ProductInfo> const & productInfo, void OnResults(Results results, vector<search::ProductInfo> const & productInfo, jlong timestamp, bool isMapAndTable,
jlong timestamp, bool isMapAndTable, bool hasPosition, double lat, double lon) bool hasPosition, double lat, double lon)
{ {
// Ignore results from obsolete searches. // Ignore results from obsolete searches.
if (g_queryTimestamp > timestamp) if (g_queryTimestamp > timestamp)
@@ -203,8 +200,8 @@ void OnMapSearchResults(storage::DownloaderSearchResults const & results, long l
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
jni::TScopedLocalObjectArrayRef jResults(env, BuildJavaMapResults(results.m_results)); jni::TScopedLocalObjectArrayRef jResults(env, BuildJavaMapResults(results.m_results));
env->CallVoidMethod(g_javaListener, g_mapResultsMethod, jResults.get(), env->CallVoidMethod(g_javaListener, g_mapResultsMethod, jResults.get(), static_cast<jlong>(timestamp),
static_cast<jlong>(timestamp), results.m_endMarker); results.m_endMarker);
} }
void OnBookmarksSearchResults(search::BookmarksSearchParams::Results results, void OnBookmarksSearchResults(search::BookmarksSearchParams::Results results,
@@ -221,8 +218,8 @@ void OnBookmarksSearchResults(search::BookmarksSearchParams::Results results,
vector<jlong> const tmp(results.cbegin(), results.cend()); vector<jlong> const tmp(results.cbegin(), results.cend());
env->SetLongArrayRegion(jResults.get(), 0, static_cast<jsize>(tmp.size()), tmp.data()); env->SetLongArrayRegion(jResults.get(), 0, static_cast<jsize>(tmp.size()), tmp.data());
auto const method = (status == search::BookmarksSearchParams::Status::InProgress) ? auto const method = (status == search::BookmarksSearchParams::Status::InProgress) ? g_updateBookmarksResultsId
g_updateBookmarksResultsId : g_endBookmarksResultsId; : g_endBookmarksResultsId;
env->CallVoidMethod(g_javaListener, method, jResults.get(), static_cast<jlong>(timestamp)); env->CallVoidMethod(g_javaListener, method, jResults.get(), static_cast<jlong>(timestamp));
} }
@@ -231,151 +228,139 @@ void OnBookmarksSearchResults(search::BookmarksSearchParams::Results results,
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeInit(JNIEnv * env, jobject thiz)
Java_app_organicmaps_sdk_search_SearchEngine_nativeInit(JNIEnv * env, jobject thiz) {
g_javaListener = env->NewGlobalRef(thiz);
// public void onResultsUpdate(@NonNull SearchResult[] results, long timestamp)
g_updateResultsId =
jni::GetMethodID(env, g_javaListener, "onResultsUpdate", "([Lapp/organicmaps/sdk/search/SearchResult;J)V");
// public void onResultsEnd(long timestamp)
g_endResultsId = jni::GetMethodID(env, g_javaListener, "onResultsEnd", "(J)V");
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult");
g_resultConstructor =
jni::GetConstructorID(env, g_resultClass,
"(Ljava/lang/String;Lapp/organicmaps/sdk/search/SearchResult$Description;DD[I[I"
"Lapp/organicmaps/sdk/search/Popularity;)V");
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I[I)V");
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult$Description");
/*
Description(FeatureId featureId, String featureType, String region, Distance distance,
String description, int openNow, int minutesUntilOpen, int minutesUntilClosed,
boolean hasPopularityHigherPriority)
*/
g_descriptionConstructor =
jni::GetConstructorID(env, g_descriptionClass,
"(Lapp/organicmaps/sdk/bookmarks/data/FeatureId;"
"Ljava/lang/String;Ljava/lang/String;Lapp/organicmaps/sdk/util/Distance;"
"Ljava/lang/String;IIIZ)V");
g_popularityClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity");
g_popularityConstructor = jni::GetConstructorID(env, g_popularityClass, "(I)V");
g_mapResultsMethod = jni::GetMethodID(env, g_javaListener, "onMapSearchResults",
"([Lapp/organicmaps/sdk/search/MapSearchListener$Result;JZ)V");
g_mapResultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/MapSearchListener$Result");
g_mapResultCtor = jni::GetConstructorID(env, g_mapResultClass, "(Ljava/lang/String;Ljava/lang/String;)V");
g_updateBookmarksResultsId = jni::GetMethodID(env, g_javaListener, "onBookmarkSearchResultsUpdate", "([JJ)V");
g_endBookmarksResultsId = jni::GetMethodID(env, g_javaListener, "onBookmarkSearchResultsEnd", "([JJ)V");
}
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearch(
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory, jstring lang, jlong timestamp,
jboolean hasPosition, jdouble lat, jdouble lon)
{
search::EverywhereSearchParams params{jni::ToNativeString(env, bytes),
jni::ToNativeString(env, lang),
{}, // default timeout
static_cast<bool>(isCategory),
bind(&OnResults, _1, _2, timestamp, false, hasPosition, lat, lon)};
bool const searchStarted = g_framework->NativeFramework()->GetSearchAPI().SearchEverywhere(std::move(params));
if (searchStarted)
g_queryTimestamp = timestamp;
return searchStarted;
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunInteractiveSearch(
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory, jstring lang, jlong timestamp,
jboolean isMapAndTable, jboolean hasPosition, jdouble lat, jdouble lon)
{
search::ViewportSearchParams vparams{
jni::ToNativeString(env, bytes),
jni::ToNativeString(env, lang),
{}, // Default timeout
static_cast<bool>(isCategory),
{}, // Empty m_onStarted callback
{}, // Empty m_onCompleted callback
};
// TODO (@alexzatsepin): set up vparams.m_onCompleted here and use
// HotelsClassifier for hotel queries detection.
// Don't move vparams here, because it's used below.
g_framework->NativeFramework()->GetSearchAPI().SearchInViewport(vparams);
if (isMapAndTable)
{ {
g_javaListener = env->NewGlobalRef(thiz); search::EverywhereSearchParams eparams{std::move(vparams.m_query),
// public void onResultsUpdate(@NonNull SearchResult[] results, long timestamp) std::move(vparams.m_inputLocale),
g_updateResultsId = jni::GetMethodID(env, g_javaListener, "onResultsUpdate", {}, // default timeout
"([Lapp/organicmaps/sdk/search/SearchResult;J)V"); static_cast<bool>(isCategory),
// public void onResultsEnd(long timestamp) bind(&OnResults, _1, _2, timestamp, isMapAndTable, hasPosition, lat, lon)};
g_endResultsId = jni::GetMethodID(env, g_javaListener, "onResultsEnd", "(J)V");
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult");
g_resultConstructor = jni::GetConstructorID(
env, g_resultClass,
"(Ljava/lang/String;Lapp/organicmaps/sdk/search/SearchResult$Description;DD[I[I"
"Lapp/organicmaps/sdk/search/Popularity;)V");
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I[I)V");
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult$Description");
/*
Description(FeatureId featureId, String featureType, String region, Distance distance,
String description, int openNow, int minutesUntilOpen, int minutesUntilClosed,
boolean hasPopularityHigherPriority)
*/
g_descriptionConstructor = jni::GetConstructorID(env, g_descriptionClass,
"(Lapp/organicmaps/sdk/bookmarks/data/FeatureId;"
"Ljava/lang/String;Ljava/lang/String;Lapp/organicmaps/sdk/util/Distance;"
"Ljava/lang/String;IIIZ)V");
g_popularityClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity"); if (g_framework->NativeFramework()->GetSearchAPI().SearchEverywhere(std::move(eparams)))
g_popularityConstructor = jni::GetConstructorID(env, g_popularityClass, "(I)V");
g_mapResultsMethod = jni::GetMethodID(env, g_javaListener, "onMapSearchResults",
"([Lapp/organicmaps/sdk/search/MapSearchListener$Result;JZ)V");
g_mapResultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/MapSearchListener$Result");
g_mapResultCtor = jni::GetConstructorID(env, g_mapResultClass, "(Ljava/lang/String;Ljava/lang/String;)V");
g_updateBookmarksResultsId =
jni::GetMethodID(env, g_javaListener, "onBookmarkSearchResultsUpdate", "([JJ)V");
g_endBookmarksResultsId =
jni::GetMethodID(env, g_javaListener, "onBookmarkSearchResultsEnd", "([JJ)V");
}
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearch(
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory,
jstring lang, jlong timestamp, jboolean hasPosition, jdouble lat, jdouble lon)
{
search::EverywhereSearchParams params{
jni::ToNativeString(env, bytes),
jni::ToNativeString(env, lang),
{}, // default timeout
static_cast<bool>(isCategory),
bind(&OnResults, _1, _2, timestamp, false, hasPosition, lat, lon)
};
bool const searchStarted = g_framework->NativeFramework()->GetSearchAPI().SearchEverywhere(std::move(params));
if (searchStarted)
g_queryTimestamp = timestamp;
return searchStarted;
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunInteractiveSearch(
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory,
jstring lang, jlong timestamp, jboolean isMapAndTable, jboolean hasPosition, jdouble lat, jdouble lon)
{
search::ViewportSearchParams vparams{
jni::ToNativeString(env, bytes),
jni::ToNativeString(env, lang),
{}, // Default timeout
static_cast<bool>(isCategory),
{}, // Empty m_onStarted callback
{}, // Empty m_onCompleted callback
};
// TODO (@alexzatsepin): set up vparams.m_onCompleted here and use
// HotelsClassifier for hotel queries detection.
// Don't move vparams here, because it's used below.
g_framework->NativeFramework()->GetSearchAPI().SearchInViewport(vparams);
if (isMapAndTable)
{
search::EverywhereSearchParams eparams{
std::move(vparams.m_query),
std::move(vparams.m_inputLocale),
{}, // default timeout
static_cast<bool>(isCategory),
bind(&OnResults, _1, _2, timestamp, isMapAndTable, hasPosition, lat, lon)
};
if (g_framework->NativeFramework()->GetSearchAPI().SearchEverywhere(std::move(eparams)))
g_queryTimestamp = timestamp;
}
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchMaps(
JNIEnv * env, jclass clazz, jbyteArray bytes, jstring lang, jlong timestamp)
{
storage::DownloaderSearchParams params{
jni::ToNativeString(env, bytes),
jni::ToNativeString(env, lang),
bind(&OnMapSearchResults, _1, timestamp)
};
if (g_framework->NativeFramework()->GetSearchAPI().SearchInDownloader(std::move(params)))
g_queryTimestamp = timestamp; g_queryTimestamp = timestamp;
} }
}
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchInBookmarks( JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchMaps(JNIEnv * env, jclass clazz,
JNIEnv * env, jclass clazz, jbyteArray query, jlong catId, jlong timestamp) jbyteArray bytes, jstring lang,
{ jlong timestamp)
search::BookmarksSearchParams params{ {
jni::ToNativeString(env, query), storage::DownloaderSearchParams params{jni::ToNativeString(env, bytes), jni::ToNativeString(env, lang),
static_cast<kml::MarkGroupId>(catId), bind(&OnMapSearchResults, _1, timestamp)};
bind(&OnBookmarksSearchResults, _1, _2, timestamp)
};
bool const searchStarted = g_framework->NativeFramework()->GetSearchAPI().SearchInBookmarks(std::move(params)); if (g_framework->NativeFramework()->GetSearchAPI().SearchInDownloader(std::move(params)))
if (searchStarted) g_queryTimestamp = timestamp;
g_queryTimestamp = timestamp; }
return searchStarted;
}
JNIEXPORT void JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchInBookmarks(
Java_app_organicmaps_sdk_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index) JNIEnv * env, jclass clazz, jbyteArray query, jlong catId, jlong timestamp)
{ {
g_framework->NativeFramework()->ShowSearchResult(g_results[index]); search::BookmarksSearchParams params{jni::ToNativeString(env, query), static_cast<kml::MarkGroupId>(catId),
} bind(&OnBookmarksSearchResults, _1, _2, timestamp)};
JNIEXPORT void JNICALL bool const searchStarted = g_framework->NativeFramework()->GetSearchAPI().SearchInBookmarks(std::move(params));
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env, jclass clazz) if (searchStarted)
{ g_queryTimestamp = timestamp;
g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Viewport); return searchStarted;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz,
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelEverywhereSearch(JNIEnv * env, jclass clazz) jint index)
{ {
g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Everywhere); g_framework->NativeFramework()->ShowSearchResult(g_results[index]);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env,
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelAllSearches(JNIEnv * env, jclass clazz) jclass clazz)
{ {
g_framework->NativeFramework()->GetSearchAPI().CancelAllSearches(); g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Viewport);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelEverywhereSearch(JNIEnv * env,
Java_app_organicmaps_sdk_search_SearchEngine_nativeUpdateViewportWithLastResults(JNIEnv * env, jclass clazz) jclass clazz)
{ {
g_framework->NativeFramework()->UpdateViewport(g_results); g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Everywhere);
} }
} // extern "C"
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelAllSearches(JNIEnv * env, jclass clazz)
{
g_framework->NativeFramework()->GetSearchAPI().CancelAllSearches();
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeUpdateViewportWithLastResults(JNIEnv * env,
jclass clazz)
{
g_framework->NativeFramework()->UpdateViewport(g_results);
}
} // extern "C"

View File

@@ -6,14 +6,13 @@
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_settings_MapLanguageCode_setMapLanguageCode(JNIEnv * env, jobject,
Java_app_organicmaps_sdk_settings_MapLanguageCode_setMapLanguageCode(JNIEnv * env, jobject, jstring languageCode) jstring languageCode)
{ {
g_framework->SetMapLanguageCode(jni::ToNativeString(env, languageCode)); g_framework->SetMapLanguageCode(jni::ToNativeString(env, languageCode));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_settings_MapLanguageCode_getMapLanguageCode(JNIEnv * env, jobject)
Java_app_organicmaps_sdk_settings_MapLanguageCode_getMapLanguageCode(JNIEnv * env, jobject)
{ {
return jni::ToJavaString(env, g_framework->GetMapLanguageCode()); return jni::ToJavaString(env, g_framework->GetMapLanguageCode());
} }

View File

@@ -5,19 +5,17 @@
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_settings_UnitLocale_setCurrentUnits(JNIEnv * env, jobject thiz,
Java_app_organicmaps_sdk_settings_UnitLocale_setCurrentUnits(JNIEnv * env, jobject thiz, jint units) jint units)
{ {
measurement_utils::Units const u = static_cast<measurement_utils::Units>(units); measurement_utils::Units const u = static_cast<measurement_utils::Units>(units);
settings::Set(settings::kMeasurementUnits, u); settings::Set(settings::kMeasurementUnits, u);
g_framework->SetupMeasurementSystem(); g_framework->SetupMeasurementSystem();
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_settings_UnitLocale_getCurrentUnits(JNIEnv * env, jobject thiz)
Java_app_organicmaps_sdk_settings_UnitLocale_getCurrentUnits(JNIEnv * env, jobject thiz) {
{ measurement_utils::Units u;
measurement_utils::Units u; return static_cast<jint>(settings::Get(settings::kMeasurementUnits, u) ? u : measurement_utils::Units::Metric);
return static_cast<jint>( }
settings::Get(settings::kMeasurementUnits, u) ? u : measurement_utils::Units::Metric);
}
} }

View File

@@ -7,32 +7,30 @@
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_sound_TtsPlayer_nativeEnableTurnNotifications(JNIEnv *, jclass,
Java_app_organicmaps_sdk_sound_TtsPlayer_nativeEnableTurnNotifications(JNIEnv *, jclass, jboolean enable) jboolean enable)
{ {
return frm()->GetRoutingManager().EnableTurnNotifications(static_cast<bool>(enable)); return frm()->GetRoutingManager().EnableTurnNotifications(static_cast<bool>(enable));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_sound_TtsPlayer_nativeAreTurnNotificationsEnabled(JNIEnv *, jclass)
Java_app_organicmaps_sdk_sound_TtsPlayer_nativeAreTurnNotificationsEnabled(JNIEnv *, jclass)
{ {
return static_cast<jboolean>(frm()->GetRoutingManager().AreTurnNotificationsEnabled()); return static_cast<jboolean>(frm()->GetRoutingManager().AreTurnNotificationsEnabled());
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_sound_TtsPlayer_nativeSetTurnNotificationsLocale(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_sound_TtsPlayer_nativeSetTurnNotificationsLocale(JNIEnv * env, jclass, jstring jLocale) jstring jLocale)
{ {
frm()->GetRoutingManager().SetTurnNotificationsLocale(jni::ToNativeString(env, jLocale)); frm()->GetRoutingManager().SetTurnNotificationsLocale(jni::ToNativeString(env, jLocale));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_sound_TtsPlayer_nativeGetTurnNotificationsLocale(JNIEnv * env,
Java_app_organicmaps_sdk_sound_TtsPlayer_nativeGetTurnNotificationsLocale(JNIEnv * env, jclass) jclass)
{ {
return jni::ToJavaString(env, frm()->GetRoutingManager().GetTurnNotificationsLocale()); return jni::ToJavaString(env, frm()->GetRoutingManager().GetTurnNotificationsLocale());
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_sound_TtsPlayer_nativeGetSupportedLanguages(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_sound_TtsPlayer_nativeGetSupportedLanguages(JNIEnv * env, jclass)
{ {
auto const & supportedLanguages = routing::turns::sound::kLanguageList; auto const & supportedLanguages = routing::turns::sound::kLanguageList;

View File

@@ -9,22 +9,21 @@ static void TransitSchemeStateChanged(TransitReadManager::TransitSchemeState sta
std::shared_ptr<jobject> const & listener) std::shared_ptr<jobject> const & listener)
{ {
JNIEnv * env = jni::GetEnv(); JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(*listener, env->CallVoidMethod(*listener, jni::GetMethodID(env, *listener, "onTransitStateChanged", "(I)V"),
jni::GetMethodID(env, *listener, "onTransitStateChanged", "(I)V"),
static_cast<jint>(state)); static_cast<jint>(state));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_subway_SubwayManager_nativeAddListener(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_subway_SubwayManager_nativeAddListener(JNIEnv *env, jclass clazz, jobject listener) jclass clazz,
jobject listener)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetTransitSchemeListener(std::bind(&TransitSchemeStateChanged, g_framework->SetTransitSchemeListener(
std::placeholders::_1, std::bind(&TransitSchemeStateChanged, std::placeholders::_1, jni::make_global_ref(listener)));
jni::make_global_ref(listener)));
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_maplayer_subway_SubwayManager_nativeRemoveListener(JNIEnv * env,
Java_app_organicmaps_sdk_maplayer_subway_SubwayManager_nativeRemoveListener(JNIEnv * env, jclass clazz) jclass clazz)
{ {
CHECK(g_framework, ("Framework isn't created yet!")); CHECK(g_framework, ("Framework isn't created yet!"));
g_framework->SetTransitSchemeListener(TransitReadManager::TransitStateChangedFn()); g_framework->SetTransitSchemeListener(TransitReadManager::TransitStateChangedFn());

View File

@@ -1,126 +1,122 @@
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/Framework.hpp" #include "app/organicmaps/sdk/Framework.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "platform/settings.hpp" #include "platform/settings.hpp"
extern "C" extern "C"
{ {
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_Config_nativeHasConfigValue(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_Config_nativeHasConfigValue(JNIEnv * env, jclass thiz, jstring name) jstring name)
{ {
std::string value; std::string value;
return settings::Get(jni::ToNativeString(env, name), value); return settings::Get(jni::ToNativeString(env, name), value);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeDeleteConfigValue(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_Config_nativeDeleteConfigValue(JNIEnv * env, jclass thiz, jstring name) jstring name)
{ {
settings::Delete(jni::ToNativeString(env, name)); settings::Delete(jni::ToNativeString(env, name));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetBoolean(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_Config_nativeGetBoolean(JNIEnv * env, jclass thiz, jstring name, jboolean defaultVal) jstring name, jboolean defaultVal)
{ {
bool val; bool val;
if (settings::Get(jni::ToNativeString(env, name), val)) if (settings::Get(jni::ToNativeString(env, name), val))
return static_cast<jboolean>(val); return static_cast<jboolean>(val);
return defaultVal; return defaultVal;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetBoolean(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeSetBoolean(JNIEnv * env, jclass thiz, jstring name, jboolean val) jboolean val)
{ {
(void)settings::Set(jni::ToNativeString(env, name), static_cast<bool>(val)); (void)settings::Set(jni::ToNativeString(env, name), static_cast<bool>(val));
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetInt(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeGetInt(JNIEnv * env, jclass thiz, jstring name, jint defaultValue) jint defaultValue)
{ {
int32_t value; int32_t value;
if (settings::Get(jni::ToNativeString(env, name), value)) if (settings::Get(jni::ToNativeString(env, name), value))
return static_cast<jint>(value); return static_cast<jint>(value);
return defaultValue; return defaultValue;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetInt(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeSetInt(JNIEnv * env, jclass thiz, jstring name, jint value) jint value)
{ {
(void)settings::Set(jni::ToNativeString(env, name), static_cast<int32_t>(value)); (void)settings::Set(jni::ToNativeString(env, name), static_cast<int32_t>(value));
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetLong(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeGetLong(JNIEnv * env, jclass thiz, jstring name, jlong defaultValue) jlong defaultValue)
{ {
int64_t value; int64_t value;
if (settings::Get(jni::ToNativeString(env, name), value)) if (settings::Get(jni::ToNativeString(env, name), value))
return static_cast<jlong>(value); return static_cast<jlong>(value);
return defaultValue; return defaultValue;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetLong(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeSetLong(JNIEnv * env, jclass thiz, jstring name, jlong value) jlong value)
{ {
(void)settings::Set(jni::ToNativeString(env, name), static_cast<int64_t>(value)); (void)settings::Set(jni::ToNativeString(env, name), static_cast<int64_t>(value));
} }
JNIEXPORT jdouble JNICALL JNIEXPORT jdouble JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetDouble(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeGetDouble(JNIEnv * env, jclass thiz, jstring name, jdouble defaultValue) jdouble defaultValue)
{ {
double value; double value;
if (settings::Get(jni::ToNativeString(env, name), value)) if (settings::Get(jni::ToNativeString(env, name), value))
return static_cast<jdouble>(value); return static_cast<jdouble>(value);
return defaultValue; return defaultValue;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetDouble(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeSetDouble(JNIEnv * env, jclass thiz, jstring name, jdouble value) jdouble value)
{ {
(void)settings::Set(jni::ToNativeString(env, name), static_cast<double>(value)); (void)settings::Set(jni::ToNativeString(env, name), static_cast<double>(value));
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetString(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeGetString(JNIEnv * env, jclass thiz, jstring name, jstring defaultValue) jstring defaultValue)
{ {
std::string value; std::string value;
if (settings::Get(jni::ToNativeString(env, name), value)) if (settings::Get(jni::ToNativeString(env, name), value))
return jni::ToJavaString(env, value); return jni::ToJavaString(env, value);
return defaultValue; return defaultValue;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetString(JNIEnv * env, jclass thiz, jstring name,
Java_app_organicmaps_sdk_util_Config_nativeSetString(JNIEnv * env, jclass thiz, jstring name, jstring value) jstring value)
{ {
(void)settings::Set(jni::ToNativeString(env, name), jni::ToNativeString(env, value)); (void)settings::Set(jni::ToNativeString(env, name), jni::ToNativeString(env, value));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetLargeFontsSize(JNIEnv * env, jclass thiz)
Java_app_organicmaps_sdk_util_Config_nativeGetLargeFontsSize(JNIEnv * env, jclass thiz) {
{ return frm()->LoadLargeFontsSize();
return frm()->LoadLargeFontsSize(); }
}
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetLargeFontsSize(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_Config_nativeSetLargeFontsSize(JNIEnv * env, jclass thiz, jboolean value)
jboolean value) {
{ frm()->SetLargeFontsSize(value);
frm()->SetLargeFontsSize(value); }
}
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_Config_nativeGetTransliteration(JNIEnv * env, jclass thiz)
Java_app_organicmaps_sdk_util_Config_nativeGetTransliteration(JNIEnv * env, jclass thiz) {
{ return frm()->LoadTransliteration();
return frm()->LoadTransliteration(); }
}
JNIEXPORT void JNICALL JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetTransliteration(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_Config_nativeSetTransliteration(JNIEnv * env, jclass thiz, jboolean value)
jboolean value) {
{ frm()->SaveTransliteration(value);
frm()->SaveTransliteration(value); frm()->AllowTransliteration(value);
frm()->AllowTransliteration(value); }
} } // extern "C"
} // extern "C"

View File

@@ -10,9 +10,9 @@ inline jobject ToJavaDistance(JNIEnv * env, platform::Distance const & distance)
static jmethodID const distanceConstructor = jni::GetConstructorID(env, distanceClass, "(DLjava/lang/String;B)V"); static jmethodID const distanceConstructor = jni::GetConstructorID(env, distanceClass, "(DLjava/lang/String;B)V");
jobject distanceObject = env->NewObject( jobject distanceObject =
distanceClass, distanceConstructor, env->NewObject(distanceClass, distanceConstructor, distance.GetDistance(),
distance.GetDistance(), jni::ToJavaString(env, distance.GetDistanceString()), static_cast<uint8_t>(distance.GetUnits())); jni::ToJavaString(env, distance.GetDistanceString()), static_cast<uint8_t>(distance.GetUnits()));
return distanceObject; return distanceObject;
} }

View File

@@ -4,9 +4,8 @@
extern "C" extern "C"
{ {
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_GeoUtils_nativeToLatLon(JNIEnv * env, jobject thiz,
Java_app_organicmaps_sdk_util_GeoUtils_nativeToLatLon( jdouble mercX, jdouble mercY)
JNIEnv * env, jobject thiz, jdouble mercX, jdouble mercY)
{ {
auto const mercPoint = m2::PointD(static_cast<double>(mercX), static_cast<double>(mercY)); auto const mercPoint = m2::PointD(static_cast<double>(mercX), static_cast<double>(mercY));
auto const latLon = mercator::ToLatLon(mercPoint); auto const latLon = mercator::ToLatLon(mercPoint);

View File

@@ -23,9 +23,9 @@ SOFTWARE.
*******************************************************************************/ *******************************************************************************/
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "app/organicmaps/sdk/core/ScopedEnv.hpp" #include "app/organicmaps/sdk/core/ScopedEnv.hpp"
#include "app/organicmaps/sdk/core/ScopedLocalRef.hpp" #include "app/organicmaps/sdk/core/ScopedLocalRef.hpp"
#include "app/organicmaps/sdk/core/jni_helper.hpp"
#include "platform/http_client.hpp" #include "platform/http_client.hpp"
@@ -33,8 +33,8 @@ SOFTWARE.
#include "base/exception.hpp" #include "base/exception.hpp"
#include "base/logging.hpp" #include "base/logging.hpp"
#include <string>
#include <iterator> #include <iterator>
#include <string>
#include <unordered_map> #include <unordered_map>
DECLARE_EXCEPTION(JniException, RootException); DECLARE_EXCEPTION(JniException, RootException);
@@ -51,8 +51,7 @@ void RethrowOnJniException(ScopedEnv & env)
MYTHROW(JniException, ()); MYTHROW(JniException, ());
} }
jfieldID GetHttpParamsFieldId(ScopedEnv & env, const char * name, jfieldID GetHttpParamsFieldId(ScopedEnv & env, char const * name, char const * signature = "Ljava/lang/String;")
const char * signature = "Ljava/lang/String;")
{ {
return env->GetFieldID(g_httpParamsClazz, name, signature); return env->GetFieldID(g_httpParamsClazz, name, signature);
} }
@@ -85,8 +84,8 @@ void SetInt(ScopedEnv & env, jobject params, jfieldID const fieldId, int const v
// Get string value from HttpClient.Params object, throws JniException. // Get string value from HttpClient.Params object, throws JniException.
void GetString(ScopedEnv & env, jobject const params, jfieldID const fieldId, std::string & result) void GetString(ScopedEnv & env, jobject const params, jfieldID const fieldId, std::string & result)
{ {
jni::ScopedLocalRef<jstring> const wrappedValue( jni::ScopedLocalRef<jstring> const wrappedValue(env.get(),
env.get(), static_cast<jstring>(env->GetObjectField(params, fieldId))); static_cast<jstring>(env->GetObjectField(params, fieldId)));
RethrowOnJniException(env); RethrowOnJniException(env);
if (wrappedValue) if (wrappedValue)
result = jni::ToNativeString(env.get(), wrappedValue.get()); result = jni::ToNativeString(env.get(), wrappedValue.get());
@@ -103,8 +102,8 @@ void SetHeaders(ScopedEnv & env, jobject const params, platform::HttpClient::Hea
if (headers.empty()) if (headers.empty())
return; return;
static jmethodID const setHeaders = env->GetMethodID( static jmethodID const setHeaders =
g_httpParamsClazz, "setHeaders", "([Lapp/organicmaps/sdk/util/KeyValue;)V"); env->GetMethodID(g_httpParamsClazz, "setHeaders", "([Lapp/organicmaps/sdk/util/KeyValue;)V");
RethrowOnJniException(env); RethrowOnJniException(env);
@@ -115,8 +114,7 @@ void SetHeaders(ScopedEnv & env, jobject const params, platform::HttpClient::Hea
void LoadHeaders(ScopedEnv & env, jobject const params, platform::HttpClient::Headers & headers) void LoadHeaders(ScopedEnv & env, jobject const params, platform::HttpClient::Headers & headers)
{ {
static jmethodID const getHeaders = static jmethodID const getHeaders = env->GetMethodID(g_httpParamsClazz, "getHeaders", "()[Ljava/lang/Object;");
env->GetMethodID(g_httpParamsClazz, "getHeaders", "()[Ljava/lang/Object;");
jni::ScopedLocalRef<jobjectArray> const headersArray( jni::ScopedLocalRef<jobjectArray> const headersArray(
env.get(), static_cast<jobjectArray>(env->CallObjectMethod(params, getHeaders))); env.get(), static_cast<jobjectArray>(env->CallObjectMethod(params, getHeaders)));
@@ -134,16 +132,15 @@ class Ids
public: public:
explicit Ids(ScopedEnv & env) explicit Ids(ScopedEnv & env)
{ {
m_fieldIds = m_fieldIds = {{"httpMethod", GetHttpParamsFieldId(env, "httpMethod")},
{{"httpMethod", GetHttpParamsFieldId(env, "httpMethod")}, {"inputFilePath", GetHttpParamsFieldId(env, "inputFilePath")},
{"inputFilePath", GetHttpParamsFieldId(env, "inputFilePath")}, {"outputFilePath", GetHttpParamsFieldId(env, "outputFilePath")},
{"outputFilePath", GetHttpParamsFieldId(env, "outputFilePath")}, {"cookies", GetHttpParamsFieldId(env, "cookies")},
{"cookies", GetHttpParamsFieldId(env, "cookies")}, {"receivedUrl", GetHttpParamsFieldId(env, "receivedUrl")},
{"receivedUrl", GetHttpParamsFieldId(env, "receivedUrl")}, {"followRedirects", GetHttpParamsFieldId(env, "followRedirects", "Z")},
{"followRedirects", GetHttpParamsFieldId(env, "followRedirects", "Z")}, {"loadHeaders", GetHttpParamsFieldId(env, "loadHeaders", "Z")},
{"loadHeaders", GetHttpParamsFieldId(env, "loadHeaders", "Z")}, {"httpResponseCode", GetHttpParamsFieldId(env, "httpResponseCode", "I")},
{"httpResponseCode", GetHttpParamsFieldId(env, "httpResponseCode", "I")}, {"timeoutMillisec", GetHttpParamsFieldId(env, "timeoutMillisec", "I")}};
{"timeoutMillisec", GetHttpParamsFieldId(env, "timeoutMillisec", "I")}};
} }
jfieldID GetId(std::string const & fieldName) const jfieldID GetId(std::string const & fieldName) const
@@ -173,8 +170,7 @@ bool HttpClient::RunHttpRequest()
static Ids ids(env); static Ids ids(env);
// Create and fill request params. // Create and fill request params.
jni::ScopedLocalRef<jstring> const jniUrl(env.get(), jni::ScopedLocalRef<jstring> const jniUrl(env.get(), jni::ToJavaString(env.get(), m_urlRequested));
jni::ToJavaString(env.get(), m_urlRequested));
if (jni::HandleJavaException(env.get())) if (jni::HandleJavaException(env.get()))
return false; return false;
@@ -190,14 +186,14 @@ bool HttpClient::RunHttpRequest()
static jfieldID const dataField = env->GetFieldID(g_httpParamsClazz, "data", "[B"); static jfieldID const dataField = env->GetFieldID(g_httpParamsClazz, "data", "[B");
if (!m_bodyData.empty()) if (!m_bodyData.empty())
{ {
jni::ScopedLocalRef<jbyteArray> const jniPostData( jni::ScopedLocalRef<jbyteArray> const jniPostData(env.get(),
env.get(), env->NewByteArray(static_cast<jsize>(m_bodyData.size()))); env->NewByteArray(static_cast<jsize>(m_bodyData.size())));
if (jni::HandleJavaException(env.get())) if (jni::HandleJavaException(env.get()))
return false; return false;
env->SetByteArrayRegion(jniPostData.get(), 0, static_cast<jsize>(m_bodyData.size()), env->SetByteArrayRegion(jniPostData.get(), 0, static_cast<jsize>(m_bodyData.size()),
reinterpret_cast<const jbyte *>(m_bodyData.data())); reinterpret_cast<jbyte const *>(m_bodyData.data()));
if (jni::HandleJavaException(env.get())) if (jni::HandleJavaException(env.get()))
return false; return false;
@@ -216,8 +212,7 @@ bool HttpClient::RunHttpRequest()
SetString(env, httpParamsObject.get(), ids.GetId("cookies"), m_cookies); SetString(env, httpParamsObject.get(), ids.GetId("cookies"), m_cookies);
SetBoolean(env, httpParamsObject.get(), ids.GetId("followRedirects"), m_followRedirects); SetBoolean(env, httpParamsObject.get(), ids.GetId("followRedirects"), m_followRedirects);
SetBoolean(env, httpParamsObject.get(), ids.GetId("loadHeaders"), m_loadHeaders); SetBoolean(env, httpParamsObject.get(), ids.GetId("loadHeaders"), m_loadHeaders);
SetInt(env, httpParamsObject.get(), ids.GetId("timeoutMillisec"), SetInt(env, httpParamsObject.get(), ids.GetId("timeoutMillisec"), static_cast<int>(m_timeoutSec * 1000));
static_cast<int>(m_timeoutSec * 1000));
SetHeaders(env, httpParamsObject.get(), m_headers); SetHeaders(env, httpParamsObject.get(), m_headers);
} }
@@ -226,12 +221,12 @@ bool HttpClient::RunHttpRequest()
return false; return false;
} }
static jmethodID const httpClientClassRun = static jmethodID const httpClientClassRun = env->GetStaticMethodID(
env->GetStaticMethodID(g_httpClientClazz, "run", g_httpClientClazz, "run",
"(Lapp/organicmaps/sdk/util/HttpClient$Params;)Lapp/organicmaps/sdk/util/HttpClient$Params;"); "(Lapp/organicmaps/sdk/util/HttpClient$Params;)Lapp/organicmaps/sdk/util/HttpClient$Params;");
jni::ScopedLocalRef<jobject> const response(env.get(), env->CallStaticObjectMethod(g_httpClientClazz, jni::ScopedLocalRef<jobject> const response(
httpClientClassRun, httpParamsObject.get())); env.get(), env->CallStaticObjectMethod(g_httpClientClazz, httpClientClassRun, httpParamsObject.get()));
if (jni::HandleJavaException(env.get())) if (jni::HandleJavaException(env.get()))
return false; return false;
@@ -247,8 +242,8 @@ bool HttpClient::RunHttpRequest()
} }
// dataField is already cached above. // dataField is already cached above.
jni::ScopedLocalRef<jbyteArray> const jniData( jni::ScopedLocalRef<jbyteArray> const jniData(env.get(),
env.get(), static_cast<jbyteArray>(env->GetObjectField(response, dataField))); static_cast<jbyteArray>(env->GetObjectField(response, dataField)));
if (jni::HandleJavaException(env.get())) if (jni::HandleJavaException(env.get()))
return false; return false;
if (jniData) if (jniData)
@@ -256,7 +251,7 @@ bool HttpClient::RunHttpRequest()
jbyte * buffer = env->GetByteArrayElements(jniData.get(), nullptr); jbyte * buffer = env->GetByteArrayElements(jniData.get(), nullptr);
if (buffer) if (buffer)
{ {
m_serverResponse.assign(reinterpret_cast<const char *>(buffer), env->GetArrayLength(jniData.get())); m_serverResponse.assign(reinterpret_cast<char const *>(buffer), env->GetArrayLength(jniData.get()));
env->ReleaseByteArrayElements(jniData.get(), buffer, JNI_ABORT); env->ReleaseByteArrayElements(jniData.get(), buffer, JNI_ABORT);
} }
} }

View File

@@ -3,8 +3,8 @@
extern "C" extern "C"
{ {
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_util_Language_nativeNormalize(JNIEnv * env, jclass type,
Java_app_organicmaps_sdk_util_Language_nativeNormalize(JNIEnv *env, jclass type, jstring lang) jstring lang)
{ {
std::string locale = languages::Normalize(jni::ToNativeString(env, lang)); std::string locale = languages::Normalize(jni::ToNativeString(env, lang));
return jni::ToJavaString(env, locale); return jni::ToJavaString(env, locale);

View File

@@ -1,10 +1,11 @@
#include <jni.h> #include <jni.h>
#include "app/organicmaps/sdk/core/logging.hpp" #include "app/organicmaps/sdk/core/logging.hpp"
extern "C" { extern "C"
JNIEXPORT void JNICALL {
Java_app_organicmaps_sdk_util_log_LogsManager_nativeToggleCoreDebugLogs( JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_log_LogsManager_nativeToggleCoreDebugLogs(JNIEnv * /*env*/,
JNIEnv * /*env*/, jclass /*clazz*/, jboolean enabled) jclass /*clazz*/,
jboolean enabled)
{ {
jni::ToggleDebugLogs(enabled); jni::ToggleDebugLogs(enabled);
} }

View File

@@ -4,15 +4,14 @@ namespace network_policy
{ {
bool GetNetworkPolicyStatus(JNIEnv * env, jobject obj) bool GetNetworkPolicyStatus(JNIEnv * env, jobject obj)
{ {
static jmethodID const networkPolicyCanUseMethod = static jmethodID const networkPolicyCanUseMethod = jni::GetMethodID(env, obj, "canUseNetwork", "()Z");
jni::GetMethodID(env, obj, "canUseNetwork", "()Z");
return env->CallBooleanMethod(obj, networkPolicyCanUseMethod); return env->CallBooleanMethod(obj, networkPolicyCanUseMethod);
} }
bool GetCurrentNetworkUsageStatus(JNIEnv * env) bool GetCurrentNetworkUsageStatus(JNIEnv * env)
{ {
static jmethodID const method = static jmethodID const method =
jni::GetStaticMethodID(env, g_networkPolicyClazz, "getCurrentNetworkUsageStatus", "()Z"); jni::GetStaticMethodID(env, g_networkPolicyClazz, "getCurrentNetworkUsageStatus", "()Z");
return env->CallStaticBooleanMethod(g_networkPolicyClazz, method); return env->CallStaticBooleanMethod(g_networkPolicyClazz, method);
} }
} // namespace network_policy } // namespace network_policy

View File

@@ -4,4 +4,4 @@ namespace network_policy
{ {
bool GetNetworkPolicyStatus(JNIEnv * env, jobject obj); bool GetNetworkPolicyStatus(JNIEnv * env, jobject obj);
bool GetCurrentNetworkUsageStatus(JNIEnv * env); bool GetCurrentNetworkUsageStatus(JNIEnv * env);
} } // namespace network_policy

View File

@@ -20,20 +20,21 @@ jobject MakeJavaPair(JNIEnv * env, std::string const & first, std::string const
extern "C" extern "C"
{ {
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeIsHtml(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_StringUtils_nativeIsHtml(JNIEnv * env, jclass thiz, jstring text) jstring text)
{ {
return strings::IsHTML(jni::ToNativeString(env, text)); return strings::IsHTML(jni::ToNativeString(env, text));
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeContainsNormalized(JNIEnv * env, jclass thiz,
Java_app_organicmaps_sdk_util_StringUtils_nativeContainsNormalized(JNIEnv * env, jclass thiz, jstring str, jstring substr) jstring str,
jstring substr)
{ {
return search::ContainsNormalized(jni::ToNativeString(env, str), jni::ToNativeString(env, substr)); return search::ContainsNormalized(jni::ToNativeString(env, str), jni::ToNativeString(env, substr));
} }
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFilterContainsNormalized(
Java_app_organicmaps_sdk_util_StringUtils_nativeFilterContainsNormalized(JNIEnv * env, jclass thiz, jobjectArray src, jstring jSubstr) JNIEnv * env, jclass thiz, jobjectArray src, jstring jSubstr)
{ {
std::string const substr = jni::ToNativeString(env, jSubstr); std::string const substr = jni::ToNativeString(env, jSubstr);
int const length = env->GetArrayLength(src); int const length = env->GetArrayLength(src);
@@ -49,43 +50,42 @@ Java_app_organicmaps_sdk_util_StringUtils_nativeFilterContainsNormalized(JNIEnv
return jni::ToJavaStringArray(env, filtered); return jni::ToJavaStringArray(env, filtered);
} }
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFormatSpeed( JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFormatSpeed(JNIEnv * env, jclass thiz,
JNIEnv * env, jclass thiz, jdouble metersPerSecond) jdouble metersPerSecond)
{ {
return measurement_utils::FormatSpeed(metersPerSecond, measurement_utils::GetMeasurementUnits()); return measurement_utils::FormatSpeed(metersPerSecond, measurement_utils::GetMeasurementUnits());
} }
JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFormatSpeedAndUnits( JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFormatSpeedAndUnits(JNIEnv * env, jclass thiz,
JNIEnv * env, jclass thiz, jdouble metersPerSecond) jdouble metersPerSecond)
{ {
auto const units = measurement_utils::GetMeasurementUnits(); auto const units = measurement_utils::GetMeasurementUnits();
return MakeJavaPair(env, measurement_utils::FormatSpeedNumeric(metersPerSecond, units), return MakeJavaPair(env, measurement_utils::FormatSpeedNumeric(metersPerSecond, units),
platform::GetLocalizedSpeedUnits(units)); platform::GetLocalizedSpeedUnits(units));
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeFormatDistance(JNIEnv * env, jclass,
Java_app_organicmaps_sdk_util_StringUtils_nativeFormatDistance(JNIEnv * env, jclass, jdouble distanceInMeters) jdouble distanceInMeters)
{ {
return ToJavaDistance(env, platform::Distance::CreateFormatted(distanceInMeters)); return ToJavaDistance(env, platform::Distance::CreateFormatted(distanceInMeters));
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedDistanceUnits(JNIEnv * env,
Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedDistanceUnits(JNIEnv * env, jclass) jclass)
{ {
auto const localizedUnits = platform::GetLocalizedDistanceUnits(); auto const localizedUnits = platform::GetLocalizedDistanceUnits();
return MakeJavaPair(env, localizedUnits.m_high, localizedUnits.m_low); return MakeJavaPair(env, localizedUnits.m_high, localizedUnits.m_low);
} }
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedAltitudeUnits(JNIEnv * env,
Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedAltitudeUnits(JNIEnv * env, jclass) jclass)
{ {
auto const localizedUnits = platform::GetLocalizedAltitudeUnits(); auto const localizedUnits = platform::GetLocalizedAltitudeUnits();
return MakeJavaPair(env, localizedUnits.m_high, localizedUnits.m_low); return MakeJavaPair(env, localizedUnits.m_high, localizedUnits.m_low);
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedSpeedUnits(JNIEnv * env, jclass)
Java_app_organicmaps_sdk_util_StringUtils_nativeGetLocalizedSpeedUnits(JNIEnv * env, jclass)
{ {
return jni::ToJavaString(env, platform::GetLocalizedSpeedUnits()); return jni::ToJavaString(env, platform::GetLocalizedSpeedUnits());
} }
} // extern "C" } // extern "C"

Some files were not shown because too many files have changed in this diff Show More