From d24cea0ddc8fb87a8f103f271cbfbbd525a20713 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 12 Jun 2023 18:16:05 +0300 Subject: [PATCH 1/6] Add 3d relief option --- .../aidlapi/OsmAndCustomizationConstants.java | 1 + OsmAnd/res/layout/list_item_osmpro_icon.xml | 80 +++++++++++++++++++ OsmAnd/res/values/strings.xml | 4 + .../osmand/plus/chooseplan/OsmAndFeature.java | 7 +- .../plus/configmap/ConfigureMapMenu.java | 41 ++++++++++ .../plus/configmap/MapLayerMenuListener.java | 13 +++ .../plus/download/DownloadActivityType.java | 2 +- .../plus/download/DownloadResources.java | 6 -- .../plus/download/ui/ItemViewHolder.java | 7 ++ .../development/OsmandDevelopmentPlugin.java | 2 +- .../plus/settings/backend/OsmandSettings.java | 2 + .../plus/widgets/ctxmenu/ViewCreator.java | 5 +- .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 13 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 OsmAnd/res/layout/list_item_osmpro_icon.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index a00de1b69d6..7605c4a933e 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -50,6 +50,7 @@ public interface OsmAndCustomizationConstants { String WIKIPEDIA_ID = SHOW_ITEMS_ID_SCHEME + "wikipedia"; String MAP_MARKERS_ID = SHOW_ITEMS_ID_SCHEME + "map_markers"; String MAP_SOURCE_ID = SHOW_ITEMS_ID_SCHEME + "map_source"; + String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; String MAP_BORDERS_ID = SHOW_ITEMS_ID_SCHEME + "map_borders"; String RECORDING_LAYER = SHOW_ITEMS_ID_SCHEME + "recording_layer"; String DEPTH_CONTOURS = SHOW_ITEMS_ID_SCHEME + "depth_contours"; diff --git a/OsmAnd/res/layout/list_item_osmpro_icon.xml b/OsmAnd/res/layout/list_item_osmpro_icon.xml new file mode 100644 index 00000000000..baed2d17181 --- /dev/null +++ b/OsmAnd/res/layout/list_item_osmpro_icon.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index ac53da22977..27a9c8adb76 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,6 +10,10 @@ - For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand Thx - Hardy --> + + Terrain map + 3D Relief + Own and observe the scale model of your neighborhood or the whole continent. Close the dialog Allow via ferrata Allow via ferrata paths. diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java b/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java index add37952394..5995cdc38e2 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java @@ -15,6 +15,7 @@ public enum OsmAndFeature { HOURLY_MAP_UPDATES(R.string.daily_map_updates, R.string.purchases_feature_desc_hourly_map_updates, R.drawable.ic_action_map_updates_colored_day, R.drawable.ic_action_map_updates_colored_night), CROSS_BUY(R.string.shared_string_cross_buy, R.string.purchases_feature_desc_cross_buy, R.drawable.ic_action_cross_buy_colored_day, R.drawable.ic_action_cross_buy_colored_night), WEATHER(R.string.shared_string_weather, R.string.weather_plugin_description, R.drawable.ic_action_umbrella_colored, R.drawable.ic_action_umbrella_colored_night), + RELIEF_3D(R.string.relief_3d, R.string.relief_3d_description, R.drawable.ic_action_3d_relief_colored_day, R.drawable.ic_action_3d_relief_colored_night), MONTHLY_MAP_UPDATES(R.string.monthly_map_updates, R.string.purchases_feature_desc_monthly_map_updates, R.drawable.ic_action_monthly_map_updates_colored_day, R.drawable.ic_action_monthly_map_updates_colored_night), UNLIMITED_MAP_DOWNLOADS(R.string.unlimited_map_downloads, R.string.purchases_feature_desc_unlimited_map_download, R.drawable.ic_action_unlimited_downloads_colored_day, R.drawable.ic_action_unlimited_download_colored_night), ANDROID_AUTO(R.string.android_auto, R.string.purchases_feature_desc_android_auto, R.drawable.ic_action_android_auto_colored, R.drawable.ic_action_android_auto_colored_night), @@ -82,7 +83,8 @@ public boolean isAvailableInMapsPlus() { EXTERNAL_SENSORS_SUPPORT, TERRAIN, NAUTICAL, - WEATHER + WEATHER, + RELIEF_3D ); public static final List OSMAND_PRO_PREVIEW_FEATURES = Arrays.asList( @@ -96,7 +98,8 @@ public boolean isAvailableInMapsPlus() { EXTERNAL_SENSORS_SUPPORT, TERRAIN, NAUTICAL, - WEATHER + WEATHER, + RELIEF_3D ); public static final List MAPS_PLUS_FEATURES = Arrays.asList( diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index 7a2d9918cb9..f36deda6dc4 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -7,6 +7,7 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.GPX_FILES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.HIDE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_BORDERS_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_LANGUAGE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MAGNIFIER_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MARKERS_ID; @@ -19,8 +20,10 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROAD_STYLE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID; +import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_COLOR_SCHEME; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_WIDTH; import static net.osmand.plus.plugins.osmedit.OsmEditingPlugin.RENDERING_CATEGORY_OSM_ASSISTANT; @@ -51,10 +54,12 @@ import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DetailsBottomSheet; import net.osmand.plus.dialogs.SelectMapStyleBottomSheetDialogFragment; +import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.render.RendererRegistry; @@ -228,6 +233,8 @@ private void createLayersItems(@NonNull List customRules, PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); app.getAidlApi().registerLayerContextMenu(adapter, activity); + addRelief3DItem(adapter, activity, nightMode, listener); + selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); adapter.addItem(new ContextMenuItem(MAP_BORDERS_ID) .setTitleId(R.string.show_borders_of_downloaded_maps, activity) @@ -238,6 +245,40 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } + private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + boolean nightMode, + MapLayerMenuListener listener) { + OsmandApplication app = activity.getMyApplication(); + if (app.useOpenGlRenderer()) { + boolean enabled3DMode = app.getSettings().ENABLE_3D_MAPS.get(); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setLayout(R.layout.list_item_osmpro_icon) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setUseNaturalSecondIconColor(true) + .setSecondaryIcon(!InAppPurchaseHelper.isOsmAndProAvailable(app) ? (nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day) : INVALID_ID) + .setListener(listener); + + if (!Version.isPaidVersion(app)) { + item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); + } + + ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); + if (terrainItem == null) { + terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); + } + if (terrainItem != null) { + item.setOrder(terrainItem.getOrder()); + } + adapter.addItem(item); + } + } + private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java index 51978457ecf..473f2fa34a5 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java @@ -7,14 +7,20 @@ import androidx.annotation.Nullable; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; +import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.configmap.tracks.TracksFragment; +import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsFragment; import net.osmand.plus.plugins.PluginsHelper; import net.osmand.plus.plugins.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.backend.preferences.BooleanPreference; +import net.osmand.plus.settings.backend.preferences.OsmandPreference; import net.osmand.plus.track.helpers.GpxSelectionHelper; import net.osmand.plus.transport.TransportLinesMenu; import net.osmand.plus.views.MapLayers; @@ -103,6 +109,13 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu return false; } else if (itemId == R.string.show_borders_of_downloaded_maps) { settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.set(isChecked); + } else if (itemId == R.string.relief_3d) { + if (Version.isPaidVersion(mapActivity.getMyApplication())) { + settings.ENABLE_3D_MAPS.set(isChecked); + item.setDescription(mapActivity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + } else { + ChoosePlanFragment.showInstance(mapActivity, OsmAndFeature.RELIEF_3D); + } } if (uiAdapter != null) { uiAdapter.onDataSetChanged(); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index cd2d235eddc..810e5975d0f 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -72,7 +72,7 @@ public class DownloadActivityType { public static final DownloadActivityType WEATHER_FORECAST = new DownloadActivityType(R.string.weather_forecast, R.drawable.ic_action_umbrella, "weather", 90); public static final DownloadActivityType GEOTIFF_FILE = - new DownloadActivityType(R.string.download_heightmap_maps, R.drawable.ic_action_altitude, "geotiff", 85); + new DownloadActivityType(R.string.terrain_map, R.drawable.ic_action_altitude, "geotiff", 85); private final int stringResource; private final int iconResource; diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index 1ca743d8716..e09c62d054a 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -393,12 +393,6 @@ protected boolean prepareData(List resources) { } continue; } - if (ii.getType() == DownloadActivityType.GEOTIFF_FILE) { - OsmandDevelopmentPlugin plugin = PluginsHelper.getPlugin(OsmandDevelopmentPlugin.class); - if (plugin == null || !plugin.isHeightmapEnabled()) { - continue; - } - } if (ii.getType() == DownloadActivityType.HEIGHTMAP_FILE_LEGACY) { // Hide heightmaps of sqlite format continue; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 2925d879cde..5cb33b84285 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -2,6 +2,7 @@ import static net.osmand.plus.download.DownloadActivityType.DEPTH_CONTOUR_FILE; import static net.osmand.plus.download.DownloadActivityType.DEPTH_MAP_FILE; +import static net.osmand.plus.download.DownloadActivityType.GEOTIFF_FILE; import static net.osmand.plus.download.DownloadActivityType.HILLSHADE_FILE; import static net.osmand.plus.download.DownloadActivityType.SLOPE_FILE; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; @@ -106,6 +107,7 @@ protected enum RightButtonAction { DOWNLOAD, ASK_FOR_SEAMARKS_PLUGIN, ASK_FOR_SRTM_PLUGIN_PURCHASE, + ASK_FOR_RELIEF_3D_PURCHASE, ASK_FOR_SRTM_PLUGIN_ENABLE, ASK_FOR_FULL_VERSION_PURCHASE, ASK_FOR_DEPTH_CONTOURS_PURCHASE, @@ -471,6 +473,8 @@ public RightButtonAction getClickAction(@NonNull DownloadItem item) { action = RightButtonAction.ASK_FOR_FULL_VERSION_PURCHASE; } else if ((item.getType() == DEPTH_CONTOUR_FILE || item.getType() == DEPTH_MAP_FILE) && !depthContoursPurchased) { action = RightButtonAction.ASK_FOR_DEPTH_CONTOURS_PURCHASE; + } else if (type == GEOTIFF_FILE && !Version.isPaidVersion(context.getMyApplication())) { + action = RightButtonAction.ASK_FOR_RELIEF_3D_PURCHASE; } } return action; @@ -493,6 +497,9 @@ public void onClick(View v) { context.getMyApplication().logEvent("in_app_purchase_show_from_weather_context_menu"); ChoosePlanFragment.showInstance(context, OsmAndFeature.WEATHER); break; + case ASK_FOR_RELIEF_3D_PURCHASE: + ChoosePlanFragment.showInstance(context, OsmAndFeature.RELIEF_3D); + break; case ASK_FOR_DEPTH_CONTOURS_PURCHASE: ChoosePlanFragment.showInstance(context, OsmAndFeature.NAUTICAL); break; diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java index b1926ee5c82..3907ac1ec5d 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java @@ -74,7 +74,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { WidgetsAvailabilityHelper.regWidgetVisibility(DEV_TARGET_DISTANCE, noAppMode); ENABLE_HEIGHTMAP = registerBooleanPreference("show_heightmaps", false).makeGlobal().makeShared().cache(); - ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + ENABLE_3D_MAPS = settings.ENABLE_3D_MAPS; DISABLE_VERTEX_HILLSHADE_3D = registerBooleanPreference("disable_vertex_hillshade_3d", true).makeGlobal().makeShared().cache(); GENERATE_SLOPE_FROM_3D_MAPS = registerBooleanPreference("generate_slope_from_3d_maps", true).makeGlobal().makeShared().cache(); GENERATE_HILLSHADE_FROM_3D_MAPS = registerBooleanPreference("generate_hillshade_from_3d_maps", true).makeGlobal().makeShared().cache(); diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 4ee06cea32c..7a012fca791 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -834,6 +834,8 @@ public boolean enablePlugin(String pluginId, boolean enable) { return false; } + public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + public final CommonPreference COMPASS_VISIBILITY = new EnumStringPreference(this, "compass_visibility", CompassVisibility.VISIBLE_IF_MAP_ROTATED, CompassVisibility.values()) { @Override diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index a04dc50cbe7..a56dbf84078 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -120,7 +120,7 @@ public View getView(@NonNull ContextMenuItem item, @Nullable View convertView) { ImageView secondaryIcon = convertView.findViewById(R.id.secondary_icon); if (secondaryIcon != null) { - setupSecondaryIcon(secondaryIcon, item.getSecondaryIcon()); + setupSecondaryIcon(secondaryIcon, item.getSecondaryIcon(), item); } CompoundButton toggle = convertView.findViewById(R.id.toggle_item); @@ -335,9 +335,10 @@ private void setupIcon(@NonNull AppCompatImageView icon, @NonNull ContextMenuIte } } - private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId) { + private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId, @NonNull ContextMenuItem item) { if (secondaryIconId != INVALID_ID) { int colorId = ColorUtilities.getDefaultIconColorId(nightMode); + colorId = item.useNaturalSecondIconColor() ? 0 : colorId; Drawable drawable = iconsCache.getIcon(secondaryIconId, colorId); secondaryIcon.setImageDrawable(drawable); if (secondaryIconId == R.drawable.ic_action_additional_option) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index 18ae70bcf29..edf6f4a45ba 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -41,6 +41,7 @@ public class ContextMenuItem { private String secondaryDescription; private boolean useNaturalIconColor; + private boolean useNaturalSecondIconColor; @ColorInt private Integer color; @DrawableRes @@ -130,6 +131,10 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } + public boolean useNaturalSecondIconColor() { + return useNaturalSecondIconColor; + } + @ColorInt @Nullable public Integer getColor() { @@ -268,6 +273,12 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } + @NonNull + public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { + this.useNaturalSecondIconColor = useNaturalSecondIconColor; + return this; + } + @NonNull public ContextMenuItem setColor(@ColorInt @Nullable Integer color) { this.color = color; From e91cd387506445f03b6a13d44298ec4d13410209 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 08:18:53 +0300 Subject: [PATCH 2/6] Add terrain card in configure map --- .../aidlapi/OsmAndCustomizationConstants.java | 2 + .../res/layout/card_divider_16dp_margin.xml | 14 ++++ .../layout/list_item_terrain_description.xml | 83 +++++++++++++++++++ OsmAnd/res/values/strings.xml | 3 +- .../plus/configmap/CategoryAnimator.java | 8 +- .../plus/configmap/ConfigureMapFragment.java | 12 +-- .../plus/configmap/ConfigureMapMenu.java | 60 +++++++++++++- .../osmand/plus/plugins/PluginsHelper.java | 16 ++++ .../plus/widgets/ctxmenu/CtxMenuUtils.java | 16 ++++ .../plus/widgets/ctxmenu/ViewCreator.java | 14 ++++ .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 11 files changed, 227 insertions(+), 12 deletions(-) create mode 100644 OsmAnd/res/layout/card_divider_16dp_margin.xml create mode 100644 OsmAnd/res/layout/list_item_terrain_description.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index 7605c4a933e..b9808caf4ce 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -42,6 +42,8 @@ public interface OsmAndCustomizationConstants { String APP_PROFILES_ID = CONFIGURE_MAP_ITEM_ID_SCHEME + "app_profiles"; String SHOW_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "category"; + String TERRAIN_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "terrain_category"; + String TERRAIN_DESCRIPTION_ID = SHOW_ITEMS_ID_SCHEME + "terrain_description"; String FAVORITES_ID = SHOW_ITEMS_ID_SCHEME + "favorites"; String POI_OVERLAY_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay"; String POI_OVERLAY_LABELS_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay_labels"; diff --git a/OsmAnd/res/layout/card_divider_16dp_margin.xml b/OsmAnd/res/layout/card_divider_16dp_margin.xml new file mode 100644 index 00000000000..e872af12021 --- /dev/null +++ b/OsmAnd/res/layout/card_divider_16dp_margin.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/list_item_terrain_description.xml b/OsmAnd/res/layout/list_item_terrain_description.xml new file mode 100644 index 00000000000..9982ff58717 --- /dev/null +++ b/OsmAnd/res/layout/list_item_terrain_description.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 27a9c8adb76..6a8ff4d386b 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,7 +10,8 @@ - For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand Thx - Hardy --> - + Slope uses colors to visualize terrain steepness. You can read more about Slopes in %1$s. + Terrain contour lines, full hillshade map with dark shades and slope maps with colors to show peaks and lowlands. Terrain map 3D Relief Own and observe the scale model of your neighborhood or the whole continent. diff --git a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java index ae9b4f5a64c..fab048c7e23 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java +++ b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java @@ -114,7 +114,11 @@ private void onBeforeAnimation() { divider.setVisibility(View.VISIBLE); // Description will be invisible until collapsing animation finished - tvDescription.setVisibility(View.INVISIBLE); + if (category.getDescription() == null) { + tvDescription.setVisibility(View.GONE); + } else { + tvDescription.setVisibility(View.INVISIBLE); + } } private void onMainAnimationUpdate(int val, float minValue, float maxValue) { @@ -150,7 +154,7 @@ private void onMainAnimationFinished() { // Update views visibility AndroidUiHelper.updateVisibility(divider, isExpanding); - AndroidUiHelper.updateVisibility(tvDescription, !isExpanding); + AndroidUiHelper.updateVisibility(tvDescription, !isExpanding && category.getDescription() != null); AndroidUiHelper.updateVisibility(itemsContainer, isExpanding); // Set items container height as WRAP_CONTENT diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java index 887913e2f8c..b48757d4617 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java @@ -155,9 +155,7 @@ private void bindCategoryView(@NonNull ContextMenuItem category, @NonNull List nestedItems) { // Use the same layout for all categories views category.setLayout(R.layout.list_item_expandable_category); - List titles = CtxMenuUtils.getNames(nestedItems); - String description = TextUtils.join(", ", titles); - category.setDescription(description); + category.setDescription(CtxMenuUtils.getCategoryDescription(nestedItems)); String id = category.getId(); int standardId = category.getTitleId(); @@ -194,11 +192,13 @@ private void bindItemView(@NonNull ContextMenuItem item, @NonNull ViewGroup cont View existedView = views.get(standardId); View view = viewCreator.getView(item, existedView); view.setTag(R.id.item_as_tag, item); - view.setOnClickListener(getItemsClickListener()); + if (item.isClickable()) { + view.setOnClickListener(getItemsClickListener()); + } if (existedView == null) { views.put(standardId, view); container.addView(view); - if (item.getLayout() != R.layout.mode_toggles) { + if (item.getLayout() != R.layout.mode_toggles && item.isClickable()) { setupSelectableBg(view); } } @@ -213,7 +213,7 @@ private void updateCategoryView(@NonNull ContextMenuItem category) { ImageView ivIndicator = view.findViewById(R.id.explicit_indicator); ivIndicator.setImageResource(isCollapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up); - AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed); + AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed && category.getDescription() != null); AndroidUiHelper.updateVisibility(view.findViewById(R.id.items_container), !isCollapsed); AndroidUiHelper.updateVisibility(view.findViewById(R.id.divider), !isCollapsed); } diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index f36deda6dc4..566ace9e44e 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -20,6 +20,8 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROAD_STYLE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_DESCRIPTION_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID; @@ -56,11 +58,15 @@ import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; +import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DetailsBottomSheet; import net.osmand.plus.dialogs.SelectMapStyleBottomSheetDialogFragment; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; +import net.osmand.plus.plugins.srtm.SRTMPlugin; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -87,6 +93,7 @@ import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -140,12 +147,41 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { List customRules = ConfigureMapUtils.getCustomRules(app, UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); + if (app.useOpenGlRenderer()) { + createTerrainItems(customRules, adapter, mapActivity, nightMode); + } PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); createRenderingAttributeItems(customRules, adapter, mapActivity, nightMode); return adapter; } + private void createTerrainItems(@NonNull List customRules, + @NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + boolean nightMode) { + OsmandApplication app = activity.getMyApplication(); + MapLayerMenuListener listener = new MapLayerMenuListener(activity); + + adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) + .setCategory(true) + .setTitle(app.getString(R.string.shared_string_terrain)) + .setLayout(R.layout.list_group_title_with_switch)); + + if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); + addRelief3DItem(adapter, activity, nightMode, listener); + } else { + addTerrainDescriptionItem(adapter, activity); + if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { + adapter.addItem(new ContextMenuItem("nautical_divider") + .setLayout(R.layout.card_divider_16dp_margin) + .setClickable(false)); + } + } + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(NauticalMapsPlugin.class)); + } + private void createLayersItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, @@ -230,11 +266,17 @@ private void createLayersItems(@NonNull List customRules, .setItemDeleteAction(settings.MAP_ONLINE_DATA, settings.MAP_TILE_SOURCES) .setListener(listener)); - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); + if (app.useOpenGlRenderer()) { + ArrayList terrainPlugins = new ArrayList<>(); + terrainPlugins.add(SRTMPlugin.class); + terrainPlugins.add(NauticalMapsPlugin.class); + PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); + } else { + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); + addRelief3DItem(adapter, activity, nightMode, listener); + } app.getAidlApi().registerLayerContextMenu(adapter, activity); - addRelief3DItem(adapter, activity, nightMode, listener); - selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); adapter.addItem(new ContextMenuItem(MAP_BORDERS_ID) .setTitleId(R.string.show_borders_of_downloaded_maps, activity) @@ -245,6 +287,18 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } + private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) + .setLayout(R.layout.list_item_terrain_description) + .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) + .setClickable(false) + .setSpecialViewListener((uiAdapter, view, item, isChecked) -> { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); + return true; + })); + } + private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, boolean nightMode, diff --git a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java index e831fa8ebb5..528ee52befc 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java +++ b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java @@ -611,6 +611,22 @@ public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, } } + public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List plugins) { + for (OsmandPlugin plugin : getAvailablePlugins()) { + if (plugins.contains(plugin.getClass())) { + plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); + } + } + } + + public static void registerLayerContextMenuExcluded(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List excludedPlugins) { + for (OsmandPlugin plugin : getAvailablePlugins()) { + if (!excludedPlugins.contains(plugin.getClass())) { + plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); + } + } + } + public static void registerConfigureMapCategory(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.registerConfigureMapCategoryActions(adapter, mapActivity, customRules); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java index 6bfe031c970..56e41e698b6 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java @@ -3,6 +3,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.plus.OsmandApplication; import net.osmand.plus.settings.backend.OsmAndAppCustomization; @@ -32,6 +33,21 @@ public static List getNames(@NonNull List items) { return itemNames; } + @Nullable + public static String getCategoryDescription(@NonNull List items) { + List itemNames = new ArrayList<>(); + for (ContextMenuItem item : items) { + String title = item.getTitle(); + if (title != null) { + itemNames.add(title); + } + } + if (itemNames.isEmpty()) { + return null; + } + return TextUtils.join(", ", itemNames); + } + public static void removeHiddenItems(@NonNull ContextMenuAdapter adapter) { OsmandApplication app = adapter.getApplication(); List items = adapter.getItems(); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index a56dbf84078..9c974cd5c67 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -181,6 +181,8 @@ private View getSpecialView(@LayoutRes int layoutId, @NonNull ContextMenuItem it return getHelpToImproveItemView(convertView); } else if (layoutId == R.layout.main_menu_drawer_osmand_version) { return getOsmAndVersionView(convertView, item); + } else if (layoutId == R.layout.list_item_terrain_description) { + return getTerrainDescriptionView(convertView, item); } return null; } @@ -285,6 +287,18 @@ private View getHelpToImproveItemView(@NonNull View view) { return view; } + private View getTerrainDescriptionView(@NonNull View view, @NonNull ContextMenuItem item) { + View btnGet = view.findViewById(R.id.button_get); + UiUtilities.setupDialogButton(nightMode, btnGet, UiUtilities.DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); + btnGet.setOnClickListener(v -> { + ItemClickListener listener = item.getSpecialViewClickListener(); + if (listener != null) { + listener.onContextMenuClick(uiAdapter, view, item, false); + } + }); + return view; + } + @NonNull private View getOsmAndVersionView(@NonNull View view, @NonNull ContextMenuItem item) { TextView osmAndVersionText = view.findViewById(R.id.osmand_version); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index edf6f4a45ba..1858325ea4d 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -58,6 +58,7 @@ public class ContextMenuItem { private OnRefreshCallback onRefreshCallback; private ItemClickListener itemClickListener; + private ItemClickListener specialViewClickListener; private ItemLongClickListener itemLongClickListener; private OnIntegerValueChangedListener integerListener; private ProgressListener progressListener; @@ -176,6 +177,10 @@ public ItemClickListener getItemClickListener() { return itemClickListener; } + public ItemClickListener getSpecialViewClickListener() { + return specialViewClickListener; + } + @Nullable public ItemLongClickListener getItemLongClickListener() { return itemLongClickListener; @@ -346,6 +351,12 @@ public ContextMenuItem setListener(@Nullable ItemClickListener itemClickListener return this; } + @NonNull + public ContextMenuItem setSpecialViewListener(@Nullable ItemClickListener specialViewClickListener) { + this.specialViewClickListener = specialViewClickListener; + return this; + } + @NonNull public ContextMenuItem setLongClickListener(@Nullable ItemLongClickListener longClickListener) { this.itemLongClickListener = longClickListener; From 5de9c433e18fddee8f346caf1d8e1822e4fbd5d7 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 08:21:57 +0300 Subject: [PATCH 3/6] Terrain redesign --- .../layout/configure_map_option_fragment.xml | 119 +++++++ OsmAnd/res/layout/fragment_terrain.xml | 290 +++++++----------- .../layout/terrain_visibility_fragment.xml | 36 +++ .../layout/terrain_zoom_levels_fragment.xml | 49 +++ .../osmand/plus/activities/MapActivity.java | 6 + .../configmap/ConfigureMapOptionFragment.java | 223 ++++++++++++++ .../osmand/plus/plugins/srtm/SRTMPlugin.java | 28 +- .../plus/plugins/srtm/TerrainFragment.java | 180 +++++------ .../osmand/plus/plugins/srtm/TerrainMode.java | 14 +- .../srtm/TerrainVisibilityFragment.java | 118 +++++++ .../srtm/TerrainZoomLevelsFragment.java | 129 ++++++++ .../mapwidgets/WidgetsVisibilityHelper.java | 19 +- 12 files changed, 920 insertions(+), 291 deletions(-) create mode 100644 OsmAnd/res/layout/configure_map_option_fragment.xml create mode 100644 OsmAnd/res/layout/terrain_visibility_fragment.xml create mode 100644 OsmAnd/res/layout/terrain_zoom_levels_fragment.xml create mode 100644 OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java diff --git a/OsmAnd/res/layout/configure_map_option_fragment.xml b/OsmAnd/res/layout/configure_map_option_fragment.xml new file mode 100644 index 00000000000..8b5221a6c92 --- /dev/null +++ b/OsmAnd/res/layout/configure_map_option_fragment.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_terrain.xml b/OsmAnd/res/layout/fragment_terrain.xml index 370fa9f395a..d990da72ce9 100644 --- a/OsmAnd/res/layout/fragment_terrain.xml +++ b/OsmAnd/res/layout/fragment_terrain.xml @@ -3,8 +3,8 @@ xmlns:osmand="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:descendantFocusability="blocksDescendants" android:layout_height="match_parent" + android:descendantFocusability="blocksDescendants" android:orientation="vertical"> + android:layout_height="match_parent" + android:background="?attr/activity_background_basic" + android:orientation="vertical"> - - - - - - - - @@ -124,200 +100,164 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/content_padding" - android:paddingTop="@dimen/content_padding_small" - android:paddingEnd="@dimen/content_padding"> + android:paddingStart="@dimen/content_padding"> - + osmand:typeface="@string/font_roboto_medium" /> - + android:layout_gravity="center_vertical" + android:layout_weight="0" + android:background="?attr/selectableItemBackground" + android:paddingHorizontal="@dimen/content_padding" + android:paddingVertical="16dp"> + + + + + + - + android:layout_marginTop="@dimen/content_padding_small_half" + android:layout_marginEnd="@dimen/content_padding" + android:layout_marginBottom="@dimen/content_padding" + android:lineSpacingExtra="@dimen/line_spacing_extra_description" + android:text="@string/terrain_slider_description" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_desc_text_size" /> + + - - + android:layout_height="@dimen/setting_list_item_large_height" + android:background="?attr/selectableItemBackground" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + android:textSize="@dimen/default_list_text_size" + osmand:typeface="@string/font_roboto_regular" /> - + android:paddingHorizontal="@dimen/content_padding" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_list_text_size" + tools:text="25%" /> + + android:orientation="horizontal"> - + android:layout_margin="@dimen/content_padding" + android:src="@drawable/ic_action_layers" + android:tint="?attr/default_icon_color" /> - - - + + + tools:text="25%" /> - - - - - - - - - - - - - - - - @@ -332,13 +272,12 @@ + + + android:focusable="false" + android:minHeight="@dimen/toolbar_height" /> diff --git a/OsmAnd/res/layout/terrain_visibility_fragment.xml b/OsmAnd/res/layout/terrain_visibility_fragment.xml new file mode 100644 index 00000000000..2fd8b052a79 --- /dev/null +++ b/OsmAnd/res/layout/terrain_visibility_fragment.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml new file mode 100644 index 00000000000..28f389e08f7 --- /dev/null +++ b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 792ec0b84e4..62fa37de6d0 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -77,6 +77,7 @@ import net.osmand.plus.base.ContextMenuFragment; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.configmap.ConfigureMapFragment; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; import net.osmand.plus.dashboard.DashBaseFragment; import net.osmand.plus.dashboard.DashboardOnMap; import net.osmand.plus.dialogs.CrashBottomSheetDialogFragment; @@ -2066,6 +2067,11 @@ public DownloadTilesFragment getDownloadTilesFragment() { return getFragment(DownloadTilesFragment.TAG); } + @Nullable + public ConfigureMapOptionFragment getConfigureMapOptionFragment() { + return getFragment(ConfigureMapOptionFragment.TAG); + } + @Nullable public WeatherForecastFragment getWeatherForecastFragment() { return getFragment(WeatherForecastFragment.TAG); diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java new file mode 100644 index 00000000000..3e93283da6e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java @@ -0,0 +1,223 @@ +package net.osmand.plus.configmap; + +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.BACK_TO_LOC_BUTTON_ID; +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.ZOOM_IN_BUTTON_ID; +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.ZOOM_OUT_BUTTON_ID; +import static net.osmand.plus.utils.UiUtilities.setupDialogButton; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.BaseOsmAndFragment; +import net.osmand.plus.dashboard.DashboardOnMap; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.ColorUtilities; +import net.osmand.plus.utils.UiUtilities; +import net.osmand.plus.views.MapLayers; +import net.osmand.plus.views.controls.maphudbuttons.MyLocationButton; +import net.osmand.plus.views.controls.maphudbuttons.ZoomInButton; +import net.osmand.plus.views.controls.maphudbuttons.ZoomOutButton; +import net.osmand.plus.views.layers.MapControlsLayer; +import net.osmand.plus.views.layers.MapInfoLayer; +import net.osmand.plus.views.mapwidgets.widgets.RulerWidget; + +import java.util.Arrays; +import java.util.Collections; + +public abstract class ConfigureMapOptionFragment extends BaseOsmAndFragment { + + public static final String TAG = ConfigureMapOptionFragment.class.getSimpleName(); + private RulerWidget rulerWidget; + private View applyButton; + protected LinearLayout contentContainer; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + updateNightMode(); + MapActivity activity = requireMapActivity(); + View view = themedInflater.inflate(R.layout.configure_map_option_fragment, container, false); + AndroidUtils.addStatusBarPadding21v(activity, view); + + contentContainer = view.findViewById(R.id.main_content); + applyButton = view.findViewById(R.id.apply_button); + applyButton.setOnClickListener(viewOnCLick -> { + onApplyButtonClick(); + activity.onBackPressed(); + }); + + activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + activity.getSupportFragmentManager().popBackStack(); + activity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.TERRAIN, false); + } + }); + + updateApplyButton(false); + setupToolBar(view); + buildZoomButtons(view); + moveCompassButton(view); + setupMainContent(); + + requireMapActivity().refreshMap(); + return view; + } + + protected abstract String getToolbarTitle(); + + protected void onResetToDefault() { + } + + protected void onApplyButtonClick() { + } + + protected abstract void setupMainContent(); + + @Override + public int getStatusBarColorId() { + AndroidUiHelper.setStatusBarContentColor(getView(), nightMode); + return ColorUtilities.getListBgColorId(nightMode); + } + + @Override + protected boolean isUsedOnMap() { + return true; + } + + protected void updateApplyButton(boolean enable) { + applyButton.setEnabled(enable); + setupDialogButton(nightMode, applyButton, enable ? UiUtilities.DialogButtonType.PRIMARY : UiUtilities.DialogButtonType.STROKED, getString(R.string.shared_string_apply)); + } + + protected void refreshMap() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.refreshMap(); + } + } + + private void buildZoomButtons(@NonNull View view) { + View zoomButtonsView = view.findViewById(R.id.map_hud_controls); + + MapActivity activity = requireMapActivity(); + MapLayers mapLayers = activity.getMapLayers(); + MapControlsLayer layer = mapLayers.getMapControlsLayer(); + + layer.addMapButton(new ZoomInButton(activity, view.findViewById(R.id.map_zoom_in_button), ZOOM_IN_BUTTON_ID)); + layer.addMapButton(new ZoomOutButton(activity, view.findViewById(R.id.map_zoom_out_button), ZOOM_OUT_BUTTON_ID)); + layer.addMapButton(new MyLocationButton(activity, view.findViewById(R.id.map_my_location_button), BACK_TO_LOC_BUTTON_ID, false)); + + AndroidUiHelper.updateVisibility(zoomButtonsView, true); + + MapInfoLayer mapInfoLayer = mapLayers.getMapInfoLayer(); + rulerWidget = mapInfoLayer.setupRulerWidget(view.findViewById(R.id.map_ruler_layout)); + } + + private void setupToolBar(@NonNull View view) { + TextView title = view.findViewById(R.id.title); + title.setText(getToolbarTitle()); + + ImageView backButton = view.findViewById(R.id.back_button); + backButton.setImageDrawable(getIcon(AndroidUtils.getNavigationIconResId(requireMapActivity()), ColorUtilities.getDefaultIconColorId(nightMode))); + backButton.setOnClickListener(v -> { + MapActivity activity = getMapActivity(); + if (activity != null) { + activity.onBackPressed(); + } + }); + + ImageButton resetButton = view.findViewById(R.id.reset_button); + resetButton.setImageDrawable(getIcon(R.drawable.ic_action_reset, ColorUtilities.getDefaultIconColorId(nightMode))); + resetButton.setOnClickListener(view1 -> onResetToDefault()); + } + + private void moveCompassButton(@NonNull View view) { + int btnSizePx = getDimensionPixelSize(R.dimen.map_small_button_size); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(btnSizePx, btnSizePx); + int toolbarHeight = getDimensionPixelSize(R.dimen.toolbar_height); + int topMargin = getDimensionPixelSize(R.dimen.map_small_button_margin); + int startMargin = getDimensionPixelSize(R.dimen.map_button_margin); + AndroidUtils.setMargins(params, startMargin, topMargin + toolbarHeight, 0, 0); + + MapActivity activity = getMapActivity(); + if (activity != null) { + MapLayers mapLayers = activity.getMapLayers(); + MapControlsLayer mapControlsLayer = mapLayers.getMapControlsLayer(); + mapControlsLayer.moveCompassButton((ViewGroup) view, params); + } + } + + @Override + public void onResume() { + super.onResume(); + + MapActivity mapActivity = requireMapActivity(); + mapActivity.disableDrawer(); + updateWidgetsVisibility(mapActivity, View.GONE); + } + + @Override + public void onPause() { + super.onPause(); + + MapActivity mapActivity = requireMapActivity(); + mapActivity.enableDrawer(); + updateWidgetsVisibility(mapActivity, View.VISIBLE); + } + + private void updateWidgetsVisibility(@NonNull MapActivity activity, int visibility) { + AndroidUiHelper.setVisibility(activity, visibility, R.id.map_left_widgets_panel, + R.id.map_right_widgets_panel, R.id.map_center_info); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + MapLayers mapLayers = mapActivity.getMapLayers(); + + MapControlsLayer layer = mapLayers.getMapControlsLayer(); + layer.removeMapButtons(Arrays.asList(ZOOM_IN_BUTTON_ID, ZOOM_OUT_BUTTON_ID, BACK_TO_LOC_BUTTON_ID)); + layer.restoreCompassButton(); + + if (rulerWidget != null) { + MapInfoLayer mapInfoLayer = mapLayers.getMapInfoLayer(); + mapInfoLayer.removeRulerWidgets(Collections.singletonList(rulerWidget)); + } + } + requireMapActivity().refreshMap(); + } + + @Nullable + public MapActivity getMapActivity() { + FragmentActivity activity = getActivity(); + if (activity instanceof MapActivity) { + return (MapActivity) activity; + } else { + return null; + } + } + + @NonNull + protected MapActivity requireMapActivity() { + return ((MapActivity) requireActivity()); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index 92725cd12a5..2441dcbac82 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -2,10 +2,7 @@ import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; import android.graphics.drawable.Drawable; -import android.view.ContextThemeWrapper; import android.view.View; import net.osmand.data.LatLon; @@ -46,7 +43,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; @@ -263,6 +259,30 @@ public int getTerrainTransparency() { return 100; } + public void resetZoomLevelsToDefault() { + switch (getTerrainMode()) { + case HILLSHADE: + HILLSHADE_MIN_ZOOM.resetToDefault(); + HILLSHADE_MAX_ZOOM.resetToDefault(); + break; + case SLOPE: + SLOPE_MIN_ZOOM.resetToDefault(); + SLOPE_MAX_ZOOM.resetToDefault(); + break; + } + } + + public void resetTransparencyToDefault() { + switch (getTerrainMode()) { + case HILLSHADE: + HILLSHADE_TRANSPARENCY.resetToDefault(); + break; + case SLOPE: + SLOPE_TRANSPARENCY.resetToDefault(); + break; + } + } + public int getTerrainMinZoom() { int minSupportedZoom = TERRAIN_MIN_SUPPORTED_ZOOM; int minZoom = minSupportedZoom; diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java index a0ea9d5b825..9194d1c42f8 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java @@ -55,12 +55,17 @@ import net.osmand.plus.widgets.ctxmenu.ViewCreator; import net.osmand.plus.widgets.ctxmenu.callback.ItemClickListener; import net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem; +import net.osmand.plus.widgets.popup.PopUpMenu; +import net.osmand.plus.widgets.popup.PopUpMenuDisplayData; +import net.osmand.plus.widgets.popup.PopUpMenuItem; +import net.osmand.plus.widgets.popup.PopUpMenuWidthMode; import net.osmand.plus.widgets.style.CustomTypefaceSpan; import org.apache.commons.logging.Log; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.List; @@ -74,55 +79,27 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL private int profileColor; + private TextView visibilityTv; + private TextView zoomLevelsTv; + private TextView coloSchemeTv; + private View legend; + private TextView downloadDescriptionTv; - private TextView transparencyValueTv; private TextView descriptionTv; - private LinearLayout customRadioButton; - private TextView minZoomTv; - private TextView maxZoomTv; private TextView stateTv; private SwitchCompat switchCompat; private ImageView iconIv; private LinearLayout emptyState; - private LinearLayout legendContainer; + private View emptyStateDivider; private LinearLayout contentContainer; private LinearLayout downloadContainer; - private View legendBottomDivider; private View titleBottomDivider; - private View legendTopDivider; private View downloadTopDivider; private View downloadBottomDivider; - private Slider transparencySlider; - private RangeSlider zoomSlider; private ObservableListView observableListView; private ContextMenuListAdapter listAdapter; - private final Slider.OnChangeListener transparencySliderChangeListener = new Slider.OnChangeListener() { - @Override - public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { - if (fromUser) { - String transparencyStr = (int) value + "%"; - transparencyValueTv.setText(transparencyStr); - srtmPlugin.setTerrainTransparency((int) Math.ceil(value * 2.55), srtmPlugin.getTerrainMode()); - refreshMap(); - } - } - }; - - private final RangeSlider.OnChangeListener zoomSliderChangeListener = new RangeSlider.OnChangeListener() { - @Override - public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) { - List values = slider.getValues(); - if (values.size() > 1) { - minZoomTv.setText(String.valueOf(values.get(0).intValue())); - maxZoomTv.setText(String.valueOf(values.get(1).intValue())); - srtmPlugin.setTerrainZoomValues(values.get(0).intValue(), values.get(1).intValue(), srtmPlugin.getTerrainMode()); - refreshMap(); - } - } - }; - @Nullable private MapActivity getMapActivity() { Activity activity = getActivity(); @@ -153,66 +130,86 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c showHideTopShadow(root); + visibilityTv = root.findViewById(R.id.visibility_value); + zoomLevelsTv = root.findViewById(R.id.zoom_value); + coloSchemeTv = root.findViewById(R.id.color_scheme_name); + legend = root.findViewById(R.id.legend); + TextView emptyStateDescriptionTv = root.findViewById(R.id.empty_state_description); - TextView slopeReadMoreTv = root.findViewById(R.id.slope_read_more_tv); TextView titleTv = root.findViewById(R.id.title_tv); downloadDescriptionTv = root.findViewById(R.id.download_description_tv); - transparencyValueTv = root.findViewById(R.id.transparency_value_tv); - legendBottomDivider = root.findViewById(R.id.legend_bottom_divider); - transparencySlider = root.findViewById(R.id.transparency_slider); titleBottomDivider = root.findViewById(R.id.titleBottomDivider); - legendTopDivider = root.findViewById(R.id.legend_top_divider); contentContainer = root.findViewById(R.id.content_container); - legendContainer = root.findViewById(R.id.legend_container); switchCompat = root.findViewById(R.id.switch_compat); descriptionTv = root.findViewById(R.id.description); emptyState = root.findViewById(R.id.empty_state); + emptyStateDivider = root.findViewById(R.id.empty_state_divider); stateTv = root.findViewById(R.id.state_tv); iconIv = root.findViewById(R.id.icon_iv); - zoomSlider = root.findViewById(R.id.zoom_slider); - minZoomTv = root.findViewById(R.id.zoom_value_min); - maxZoomTv = root.findViewById(R.id.zoom_value_max); - customRadioButton = root.findViewById(R.id.custom_radio_buttons); - TextView hillshadeBtn = root.findViewById(R.id.left_button); - TextView slopeBtn = root.findViewById(R.id.right_button); downloadContainer = root.findViewById(R.id.download_container); downloadTopDivider = root.findViewById(R.id.download_container_top_divider); downloadBottomDivider = root.findViewById(R.id.download_container_bottom_divider); observableListView = root.findViewById(R.id.list_view); titleTv.setText(R.string.shared_string_terrain); - String wikiString = getString(R.string.shared_string_wikipedia); - String readMoreText = String.format( - getString(R.string.slope_read_more), - wikiString - ); - String wikiSlopeUrl = getString(R.string.url_wikipedia_slope); String pluginUrl = getString(R.string.osmand_features_contour_lines_plugin); String emptyStateText = getString(R.string.terrain_empty_state_text) + "\n" + pluginUrl; - setupClickableText(slopeReadMoreTv, readMoreText, wikiString, wikiSlopeUrl, false); setupClickableText(emptyStateDescriptionTv, emptyStateText, pluginUrl, pluginUrl, true); switchCompat.setChecked(terrainEnabled); - hillshadeBtn.setOnClickListener(this); - hillshadeBtn.setText(R.string.shared_string_hillshade); switchCompat.setOnClickListener(this); - slopeBtn.setOnClickListener(this); - slopeBtn.setText(R.string.shared_string_slope); - - UiUtilities.setupSlider(transparencySlider, nightMode, profileColor); - UiUtilities.setupSlider(zoomSlider, nightMode, profileColor, true); - - transparencySlider.addOnChangeListener(transparencySliderChangeListener); - zoomSlider.addOnChangeListener(zoomSliderChangeListener); - transparencySlider.setValueTo(100); - transparencySlider.setValueFrom(0); - UiUtilities.setupCompoundButton(switchCompat, nightMode, UiUtilities.CompoundButtonType.PROFILE_DEPENDENT); + setupColorSchemeCard(root); updateUiMode(); return root; } + private void updateColorSchemeCard(TerrainMode mode) { + int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); + String transparency = transparencyValue + "%"; + visibilityTv.setText(transparency); + + int minZoom = srtmPlugin.getTerrainMinZoom(); + int maxZoom = srtmPlugin.getTerrainMaxZoom(); + String zoomLevels = minZoom + " - " + maxZoom; + zoomLevelsTv.setText(zoomLevels); + coloSchemeTv.setText(mode.nameId); + AndroidUiHelper.updateVisibility(legend, mode == SLOPE); + } + + private void setupColorSchemeCard(@NonNull View root) { + View colorSchemeBtn = root.findViewById(R.id.color_scheme_button); + colorSchemeBtn.setOnClickListener(view -> { + List menuItems = new ArrayList<>(); + for (TerrainMode mode : TerrainMode.values()) { + menuItems.add(new PopUpMenuItem.Builder(app) + .setTitle(getString(mode.nameId)) + .setOnClickListener(v -> setupTerrainMode(mode)) + .create()); + } + PopUpMenuDisplayData displayData = new PopUpMenuDisplayData(); + displayData.anchorView = view; + displayData.menuItems = menuItems; + displayData.nightMode = nightMode; + displayData.layoutId = R.layout.popup_menu_item_checkbox; + displayData.widthMode = PopUpMenuWidthMode.STANDARD; + PopUpMenu.show(displayData); + }); + + View visibilityBtn = root.findViewById(R.id.visibility_button); + View zoomLevelsBtn = root.findViewById(R.id.zoom_levels_button); + + visibilityBtn.setOnClickListener(view -> { + getMapActivity().getDashboard().hideDashboard(); + TerrainVisibilityFragment.showInstance(requireActivity().getSupportFragmentManager()); + }); + zoomLevelsBtn.setOnClickListener(view -> { + getMapActivity().getDashboard().hideDashboard(); + TerrainZoomLevelsFragment.showInstance(requireActivity().getSupportFragmentManager()); + }); + } + private void showHideTopShadow(@NonNull View view) { boolean portrait = AndroidUiHelper.isOrientationPortrait(requireActivity()); AndroidUiHelper.updateVisibility(view.findViewById(R.id.shadow_on_map), portrait); @@ -223,38 +220,29 @@ public void onClick(View view) { int id = view.getId(); if (id == R.id.switch_compat) { onSwitchClick(); - } else if (id == R.id.left_button) { - setupTerrainMode(HILLSHADE); - } else if (id == R.id.right_button) { - setupTerrainMode(SLOPE); } } private void updateUiMode() { TerrainMode mode = srtmPlugin.getTerrainMode(); if (terrainEnabled) { - int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); - String transparency = transparencyValue + "%"; - int minZoom = srtmPlugin.getTerrainMinZoom(); - int maxZoom = srtmPlugin.getTerrainMaxZoom(); iconIv.setImageDrawable(uiUtilities.getPaintedIcon(R.drawable.ic_action_hillshade_dark, profileColor)); stateTv.setText(R.string.shared_string_enabled); - transparencySlider.setValue(transparencyValue); - transparencyValueTv.setText(transparency); - zoomSlider.setValueFrom(SRTMPlugin.TERRAIN_MIN_SUPPORTED_ZOOM); - zoomSlider.setValueTo(SRTMPlugin.TERRAIN_MAX_SUPPORTED_ZOOM); - zoomSlider.setValues((float) minZoom, (float) maxZoom); - - minZoomTv.setText(String.valueOf(minZoom)); - maxZoomTv.setText(String.valueOf(maxZoom)); switch (mode) { case HILLSHADE: descriptionTv.setText(R.string.hillshade_description); downloadDescriptionTv.setText(R.string.hillshade_download_description); break; case SLOPE: - descriptionTv.setText(R.string.slope_description); + descriptionTv.setText(R.string.slope_legend_description); + String wikiString = getString(R.string.shared_string_wikipedia); + String readMoreText = String.format( + getString(R.string.slope_legend_description), + wikiString + ); + String wikiSlopeUrl = getString(R.string.url_wikipedia_slope); + setupClickableText(descriptionTv, readMoreText, wikiString, wikiSlopeUrl, false); downloadDescriptionTv.setText(R.string.slope_download_description); break; } @@ -268,31 +256,16 @@ private void updateUiMode() { stateTv.setText(R.string.shared_string_disabled); } adjustGlobalVisibility(); - adjustLegendVisibility(mode); - adjustModeButtons(mode); + updateColorSchemeCard(mode); } private void adjustGlobalVisibility() { emptyState.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); + emptyStateDivider.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); titleBottomDivider.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); contentContainer.setVisibility(terrainEnabled ? View.VISIBLE : View.GONE); } - private void adjustLegendVisibility(TerrainMode mode) { - int visibility = mode == SLOPE ? View.VISIBLE : View.GONE; - legendContainer.setVisibility(visibility); - legendBottomDivider.setVisibility(visibility); - legendTopDivider.setVisibility(visibility); - } - - private void adjustModeButtons(TerrainMode mode) { - if (mode == SLOPE) { - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, END); - } else { - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, START); - } - } - private void setupClickableText(TextView textView, String text, String clickableText, @@ -348,13 +321,6 @@ private void setupTerrainMode(TerrainMode mode) { } } - private void refreshMap() { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - mapActivity.refreshMap(); - } - } - private void updateLayers() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java index 596e5691ddc..d46b14f6419 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java @@ -1,6 +1,16 @@ package net.osmand.plus.plugins.srtm; +import androidx.annotation.StringRes; + +import net.osmand.plus.R; + public enum TerrainMode { - HILLSHADE, - SLOPE + HILLSHADE(R.string.shared_string_hillshade), + SLOPE(R.string.shared_string_slope); + + final int nameId; + + TerrainMode(@StringRes int nameId) { + this.nameId = nameId; + } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java new file mode 100644 index 00000000000..c8f716ea2be --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java @@ -0,0 +1,118 @@ +package net.osmand.plus.plugins.srtm; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.slider.Slider; + +import net.osmand.plus.R; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.UiUtilities; + +public class TerrainVisibilityFragment extends ConfigureMapOptionFragment { + public static final String VISIBILITY = "visibility"; + + private SRTMPlugin srtmPlugin; + private TextView visibilityTv; + private Slider visibilitySlider; + + private int originalVisibilityValue; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + + if (savedInstanceState != null && savedInstanceState.containsKey(VISIBILITY)) { + originalVisibilityValue = savedInstanceState.getInt(VISIBILITY); + } else if (srtmPlugin != null) { + originalVisibilityValue = srtmPlugin.getTerrainTransparency(); + } + } + + @Override + public void onDestroy() { + srtmPlugin.setTerrainTransparency(originalVisibilityValue, srtmPlugin.getTerrainMode()); + super.onDestroy(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(VISIBILITY, originalVisibilityValue); + } + + @Override + protected String getToolbarTitle() { + return getString(R.string.gpx_visibility_txt); + } + + @Override + protected void onResetToDefault() { + srtmPlugin.resetTransparencyToDefault(); + updateApplyButton(isChangesMade()); + setupSlider(); + refreshMap(); + } + + @Override + protected void setupMainContent() { + View view = themedInflater.inflate(R.layout.terrain_visibility_fragment, null, false); + visibilitySlider = view.findViewById(R.id.transparency_slider); + visibilityTv = view.findViewById(R.id.transparency_value_tv); + + setupSlider(); + contentContainer.addView(view); + } + + @Override + protected void onApplyButtonClick() { + originalVisibilityValue = srtmPlugin.getTerrainTransparency(); + } + + private void setupSlider() { + int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); + String transparency = transparencyValue + "%"; + visibilityTv.setText(transparency); + + visibilitySlider.addOnChangeListener(transparencySliderChangeListener); + visibilitySlider.setValueTo(100); + visibilitySlider.setValueFrom(0); + visibilitySlider.setValue(transparencyValue); + int profileColor = settings.getApplicationMode().getProfileColor(nightMode); + UiUtilities.setupSlider(visibilitySlider, nightMode, profileColor); + } + + private final Slider.OnChangeListener transparencySliderChangeListener = new Slider.OnChangeListener() { + @Override + public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { + if (fromUser) { + String transparencyStr = (int) value + "%"; + visibilityTv.setText(transparencyStr); + srtmPlugin.setTerrainTransparency((int) Math.ceil(value * 2.55), srtmPlugin.getTerrainMode()); + updateApplyButton(isChangesMade()); + refreshMap(); + } + } + }; + + private boolean isChangesMade() { + return srtmPlugin.getTerrainTransparency() != originalVisibilityValue; + } + + public static void showInstance(@NonNull FragmentManager manager) { + if (AndroidUtils.isFragmentCanBeAdded(manager, TAG)) { + manager.beginTransaction() + .replace(R.id.fragmentContainer, new TerrainVisibilityFragment(), TAG) + .addToBackStack(null) + .commitAllowingStateLoss(); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java new file mode 100644 index 00000000000..de0c015a9ee --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java @@ -0,0 +1,129 @@ +package net.osmand.plus.plugins.srtm; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.slider.RangeSlider; + +import net.osmand.plus.R; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.UiUtilities; + +import java.util.List; + +public class TerrainZoomLevelsFragment extends ConfigureMapOptionFragment { + public static final String MIN_VALUE = "min_value"; + public static final String MAX_VALUE = "max_value"; + + private SRTMPlugin srtmPlugin; + private TextView minZoomTv; + private TextView maxZoomTv; + private RangeSlider zoomSlider; + + private int originalMinZoomValue; + private int originalMaxZoomValue; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + + if (savedInstanceState != null && savedInstanceState.containsKey(MAX_VALUE) && savedInstanceState.containsKey(MIN_VALUE)) { + originalMaxZoomValue = savedInstanceState.getInt(MAX_VALUE); + originalMinZoomValue = savedInstanceState.getInt(MIN_VALUE); + } else if (srtmPlugin != null) { + originalMaxZoomValue = srtmPlugin.getTerrainMaxZoom(); + originalMinZoomValue = srtmPlugin.getTerrainMinZoom(); + } + } + + @Override + public void onDestroy() { + srtmPlugin.setTerrainZoomValues(originalMinZoomValue, originalMaxZoomValue, srtmPlugin.getTerrainMode()); + super.onDestroy(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(MAX_VALUE, originalMaxZoomValue); + outState.putInt(MIN_VALUE, originalMinZoomValue); + } + + @Override + protected String getToolbarTitle() { + return getString(R.string.shared_string_zoom_levels); + } + + @Override + protected void onResetToDefault() { + srtmPlugin.resetZoomLevelsToDefault(); + updateApplyButton(isChangesMade()); + setupSlider(); + refreshMap(); + } + + @Override + protected void setupMainContent() { + View view = themedInflater.inflate(R.layout.terrain_zoom_levels_fragment, null, false); + zoomSlider = view.findViewById(R.id.zoom_slider); + minZoomTv = view.findViewById(R.id.zoom_value_min); + maxZoomTv = view.findViewById(R.id.zoom_value_max); + + setupSlider(); + contentContainer.addView(view); + } + + @Override + protected void onApplyButtonClick() { + originalMinZoomValue = srtmPlugin.getTerrainMinZoom(); + originalMaxZoomValue = srtmPlugin.getTerrainMaxZoom(); + } + + private void setupSlider() { + minZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_min), srtmPlugin.getTerrainMinZoom())); + maxZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_max), srtmPlugin.getTerrainMaxZoom())); + + zoomSlider.setValueFrom(SRTMPlugin.TERRAIN_MIN_SUPPORTED_ZOOM); + zoomSlider.setValueTo(SRTMPlugin.TERRAIN_MAX_SUPPORTED_ZOOM); + zoomSlider.setValues((float) srtmPlugin.getTerrainMinZoom(), (float) srtmPlugin.getTerrainMaxZoom()); + + int profileColor = settings.getApplicationMode().getProfileColor(nightMode); + UiUtilities.setupSlider(zoomSlider, nightMode, profileColor, true); + zoomSlider.addOnChangeListener(zoomSliderChangeListener); + } + + private final RangeSlider.OnChangeListener zoomSliderChangeListener = new RangeSlider.OnChangeListener() { + @Override + public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) { + List values = slider.getValues(); + if (values.size() > 1) { + minZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_min), values.get(0).intValue())); + maxZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_max), values.get(1).intValue())); + srtmPlugin.setTerrainZoomValues(values.get(0).intValue(), values.get(1).intValue(), srtmPlugin.getTerrainMode()); + updateApplyButton(isChangesMade()); + refreshMap(); + } + } + }; + + private boolean isChangesMade() { + return srtmPlugin.getTerrainMinZoom() != originalMinZoomValue || srtmPlugin.getTerrainMaxZoom() != originalMaxZoomValue; + } + + public static void showInstance(@NonNull FragmentManager manager) { + if (AndroidUtils.isFragmentCanBeAdded(manager, TAG)) { + manager.beginTransaction() + .replace(R.id.fragmentContainer, new TerrainZoomLevelsFragment(), TAG) + .addToBackStack(null) + .commitAllowingStateLoss(); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java index 526d020d9bc..e54631f342b 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java @@ -90,7 +90,8 @@ private boolean shouldShowTopCoordinatesWidget() { && !isInFollowTrackMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldHideMapMarkersWidget() { @@ -102,7 +103,8 @@ public boolean shouldHideMapMarkersWidget() { || isInRouteLineAppearanceMode() || isInGpsFilteringMode() || isInWeatherForecastMode() - || isSelectingTilesZone(); + || isSelectingTilesZone() + || isInConfigureMapOptionMode(); } public static boolean isMapMarkerBarWidgetEnabled(@NonNull MapActivity mapActivity) { @@ -134,7 +136,8 @@ public boolean shouldShowBottomMenuButtons() { && !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldShowZoomButtons() { @@ -177,7 +180,8 @@ public boolean shouldShowTopButtons() { && !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldShowBackToLocationButton() { @@ -223,7 +227,8 @@ public boolean shouldShowDownloadMapWidget() { return !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } private boolean isQuickActionLayerOn() { @@ -327,6 +332,10 @@ private boolean isInGpsFilteringMode() { return mapActivity.getGpsFilterFragment() != null; } + private boolean isInConfigureMapOptionMode() { + return mapActivity.getConfigureMapOptionFragment() != null; + } + private boolean isInWeatherForecastMode() { return mapActivity.getWeatherForecastFragment() != null; } From ea46956a5baae08e8b8ba213156d249f5b876694 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 09:53:35 +0300 Subject: [PATCH 4/6] Review fix --- OsmAnd/res/layout/list_item_icon_and_menu.xml | 10 +++ OsmAnd/res/layout/list_item_osmpro_icon.xml | 80 ------------------- .../plus/configmap/ConfigureMapMenu.java | 44 +--------- .../plus/configmap/MapLayerMenuListener.java | 7 -- .../plus/download/ui/ItemViewHolder.java | 8 +- .../DevelopmentSettingsFragment.java | 2 +- .../development/OsmandDevelopmentPlugin.java | 8 +- .../osmand/plus/plugins/srtm/SRTMPlugin.java | 43 ++++++++++ .../plus/settings/backend/OsmandSettings.java | 2 +- .../plus/widgets/ctxmenu/ViewCreator.java | 15 ++++ .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 11 files changed, 91 insertions(+), 139 deletions(-) delete mode 100644 OsmAnd/res/layout/list_item_osmpro_icon.xml diff --git a/OsmAnd/res/layout/list_item_icon_and_menu.xml b/OsmAnd/res/layout/list_item_icon_and_menu.xml index 1e1e436c032..b78d7520564 100644 --- a/OsmAnd/res/layout/list_item_icon_and_menu.xml +++ b/OsmAnd/res/layout/list_item_icon_and_menu.xml @@ -53,6 +53,16 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index 566ace9e44e..82bd494759e 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -148,7 +148,7 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); if (app.useOpenGlRenderer()) { - createTerrainItems(customRules, adapter, mapActivity, nightMode); + createTerrainItems(customRules, adapter, mapActivity); } PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); @@ -158,19 +158,16 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { private void createTerrainItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity, - boolean nightMode) { + @NonNull MapActivity activity) { OsmandApplication app = activity.getMyApplication(); - MapLayerMenuListener listener = new MapLayerMenuListener(activity); adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) .setCategory(true) .setTitle(app.getString(R.string.shared_string_terrain)) .setLayout(R.layout.list_group_title_with_switch)); - if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + if (Version.isPaidVersion(app)) { PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); - addRelief3DItem(adapter, activity, nightMode, listener); } else { addTerrainDescriptionItem(adapter, activity); if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { @@ -273,7 +270,6 @@ private void createLayersItems(@NonNull List customRules, PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); } else { PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); - addRelief3DItem(adapter, activity, nightMode, listener); } app.getAidlApi().registerLayerContextMenu(adapter, activity); @@ -299,40 +295,6 @@ private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, })); } - private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity, - boolean nightMode, - MapLayerMenuListener listener) { - OsmandApplication app = activity.getMyApplication(); - if (app.useOpenGlRenderer()) { - boolean enabled3DMode = app.getSettings().ENABLE_3D_MAPS.get(); - ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) - .setLayout(R.layout.list_item_osmpro_icon) - .setTitleId(R.string.relief_3d, app) - .setIcon(R.drawable.ic_action_3d_relief) - .setUseNaturalSecondIconColor(true) - .setSecondaryIcon(!InAppPurchaseHelper.isOsmAndProAvailable(app) ? (nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day) : INVALID_ID) - .setListener(listener); - - if (!Version.isPaidVersion(app)) { - item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); - } else { - item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); - item.setSelected(enabled3DMode); - item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); - } - - ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); - if (terrainItem == null) { - terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); - } - if (terrainItem != null) { - item.setOrder(terrainItem.getOrder()); - } - adapter.addItem(item); - } - } - private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java index 473f2fa34a5..51e6b32ec62 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java @@ -109,13 +109,6 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu return false; } else if (itemId == R.string.show_borders_of_downloaded_maps) { settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.set(isChecked); - } else if (itemId == R.string.relief_3d) { - if (Version.isPaidVersion(mapActivity.getMyApplication())) { - settings.ENABLE_3D_MAPS.set(isChecked); - item.setDescription(mapActivity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); - } else { - ChoosePlanFragment.showInstance(mapActivity, OsmAndFeature.RELIEF_3D); - } } if (uiAdapter != null) { uiAdapter.onDataSetChanged(); diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 5cb33b84285..10aa37339a3 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -107,7 +107,7 @@ protected enum RightButtonAction { DOWNLOAD, ASK_FOR_SEAMARKS_PLUGIN, ASK_FOR_SRTM_PLUGIN_PURCHASE, - ASK_FOR_RELIEF_3D_PURCHASE, + ASK_FOR_3D_RELIEF_PURCHASE, ASK_FOR_SRTM_PLUGIN_ENABLE, ASK_FOR_FULL_VERSION_PURCHASE, ASK_FOR_DEPTH_CONTOURS_PURCHASE, @@ -473,8 +473,8 @@ public RightButtonAction getClickAction(@NonNull DownloadItem item) { action = RightButtonAction.ASK_FOR_FULL_VERSION_PURCHASE; } else if ((item.getType() == DEPTH_CONTOUR_FILE || item.getType() == DEPTH_MAP_FILE) && !depthContoursPurchased) { action = RightButtonAction.ASK_FOR_DEPTH_CONTOURS_PURCHASE; - } else if (type == GEOTIFF_FILE && !Version.isPaidVersion(context.getMyApplication())) { - action = RightButtonAction.ASK_FOR_RELIEF_3D_PURCHASE; + } else if (type == GEOTIFF_FILE && !InAppPurchaseHelper.isOsmAndProAvailable(context.getMyApplication())) { + action = RightButtonAction.ASK_FOR_3D_RELIEF_PURCHASE; } } return action; @@ -497,7 +497,7 @@ public void onClick(View v) { context.getMyApplication().logEvent("in_app_purchase_show_from_weather_context_menu"); ChoosePlanFragment.showInstance(context, OsmAndFeature.WEATHER); break; - case ASK_FOR_RELIEF_3D_PURCHASE: + case ASK_FOR_3D_RELIEF_PURCHASE: ChoosePlanFragment.showInstance(context, OsmAndFeature.RELIEF_3D); break; case ASK_FOR_DEPTH_CONTOURS_PURCHASE: diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java b/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java index 187117b8609..fb24a47de67 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java @@ -130,7 +130,7 @@ private void setupEnableHeightmapPref() { private void setupHeightmapRelatedPrefs() { boolean heightmapEnabled = plugin.isHeightmapEnabled(); - SwitchPreferenceEx enable3DMapsSwitch = findPreference(plugin.ENABLE_3D_MAPS.getId()); + SwitchPreferenceEx enable3DMapsSwitch = findPreference(settings.ENABLE_3D_MAPS.getId()); enable3DMapsSwitch.setIconSpaceReserved(false); enable3DMapsSwitch.setEnabled(heightmapEnabled); diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java index 3907ac1ec5d..352e5077a6f 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java @@ -58,7 +58,6 @@ public class OsmandDevelopmentPlugin extends OsmandPlugin { private final StateChangedListener generateHillshadeFrom3DMapsListener; public final OsmandPreference ENABLE_HEIGHTMAP; - public final OsmandPreference ENABLE_3D_MAPS; public final OsmandPreference DISABLE_VERTEX_HILLSHADE_3D; public final OsmandPreference GENERATE_SLOPE_FROM_3D_MAPS; public final OsmandPreference GENERATE_HILLSHADE_FROM_3D_MAPS; @@ -74,7 +73,6 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { WidgetsAvailabilityHelper.regWidgetVisibility(DEV_TARGET_DISTANCE, noAppMode); ENABLE_HEIGHTMAP = registerBooleanPreference("show_heightmaps", false).makeGlobal().makeShared().cache(); - ENABLE_3D_MAPS = settings.ENABLE_3D_MAPS; DISABLE_VERTEX_HILLSHADE_3D = registerBooleanPreference("disable_vertex_hillshade_3d", true).makeGlobal().makeShared().cache(); GENERATE_SLOPE_FROM_3D_MAPS = registerBooleanPreference("generate_slope_from_3d_maps", true).makeGlobal().makeShared().cache(); GENERATE_HILLSHADE_FROM_3D_MAPS = registerBooleanPreference("generate_hillshade_from_3d_maps", true).makeGlobal().makeShared().cache(); @@ -85,7 +83,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { mapContext.recreateHeightmapProvider(); } }; - ENABLE_3D_MAPS.addListener(enable3DMapsListener); + settings.ENABLE_3D_MAPS.addListener(enable3DMapsListener); disableVertexHillshade3DListener = change -> { MapRendererContext mapRendererContext = NativeCoreContext.getMapRendererContext(); @@ -113,7 +111,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { enableHeightmapListener = change -> { // Notify listeners of dependent preferences - if (ENABLE_3D_MAPS.get()) { + if (settings.ENABLE_3D_MAPS.get()) { enable3DMapsListener.stateChanged(change); } if (DISABLE_VERTEX_HILLSHADE_3D.get()) { @@ -265,7 +263,7 @@ public boolean isHeightmapEnabled() { // If enabled, map should be rendered with elevation data (in 3D) public boolean is3DMapsEnabled() { - return isHeightmapEnabled() && ENABLE_3D_MAPS.get(); + return isHeightmapEnabled() && settings.ENABLE_3D_MAPS.get(); } public boolean disableVertexHillshade3D() { diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index 2441dcbac82..0ec85ba7748 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -9,6 +9,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.chooseplan.button.PurchasingUtils; import net.osmand.plus.dashboard.DashboardOnMap; @@ -45,8 +46,11 @@ import androidx.annotation.Nullable; import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; +import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; +import static net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem.INVALID_ID; public class SRTMPlugin extends OsmandPlugin { @@ -356,6 +360,7 @@ protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapt } else { createContextMenuItems(adapter, mapActivity); } + add3DReliefItem(adapter, mapActivity); } } @@ -447,6 +452,44 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu ); } + private void add3DReliefItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + OsmandApplication app = activity.getMyApplication(); + if (app.useOpenGlRenderer() && !super.needsInstallation()) { + boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setUseNaturalSecondIconColor(true) + .setListener((uiAdapter, view, contextItem, isChecked) -> { + if (InAppPurchaseHelper.isOsmAndProAvailable(activity.getMyApplication())) { + settings.ENABLE_3D_MAPS.set(isChecked); + contextItem.setDescription(activity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + } else { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); + } + return true; + }); + + if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { + item.showProIcon(true); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); + } + + ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); + if (terrainItem == null) { + terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); + } + if (terrainItem != null) { + item.setOrder(terrainItem.getOrder()); + } + adapter.addItem(item); + } + } + @Nullable @Override protected String getRenderPropertyPrefix() { diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 7a012fca791..89546dee1b4 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -834,7 +834,7 @@ public boolean enablePlugin(String pluginId, boolean enable) { return false; } - public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeProfile().makeShared().cache(); public final CommonPreference COMPASS_VISIBILITY = new EnumStringPreference(this, "compass_visibility", CompassVisibility.VISIBLE_IF_MAP_ROTATED, CompassVisibility.values()) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index 9c974cd5c67..1ffd0d5957b 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -128,6 +128,16 @@ public View getView(@NonNull ContextMenuItem item, @Nullable View convertView) { setupToggle(toggle, convertView, item); } + if (item.isShowProIcon()) { + ImageView proIcon = convertView.findViewById(R.id.pro_icon); + if (proIcon != null) { + setupProIcon(proIcon); + } + if (toggle != null) { + AndroidUiHelper.updateVisibility(toggle, false); + } + } + Slider slider = convertView.findViewById(R.id.slider); if (slider != null) { setupSlider(slider, item); @@ -349,6 +359,11 @@ private void setupIcon(@NonNull AppCompatImageView icon, @NonNull ContextMenuIte } } + private void setupProIcon(@NonNull ImageView proIcon) { + proIcon.setImageDrawable(iconsCache.getIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day)); + AndroidUiHelper.updateVisibility(proIcon, true); + } + private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId, @NonNull ContextMenuItem item) { if (secondaryIconId != INVALID_ID) { int colorId = ColorUtilities.getDefaultIconColorId(nightMode); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index 1858325ea4d..f4c0eab1692 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -48,6 +48,7 @@ public class ContextMenuItem { private int icon = INVALID_ID; @DrawableRes private int secondaryIcon = INVALID_ID; + boolean showProIcon = false; private Boolean selected; private int progress = INVALID_ID; @@ -132,6 +133,10 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } + public boolean isShowProIcon() { + return showProIcon; + } + public boolean useNaturalSecondIconColor() { return useNaturalSecondIconColor; } @@ -278,6 +283,12 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } + @NonNull + public ContextMenuItem showProIcon(boolean showProIcon) { + this.showProIcon = showProIcon; + return this; + } + @NonNull public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { this.useNaturalSecondIconColor = useNaturalSecondIconColor; From 17b7d8c658643850e79fb66bcc0a3466de4a5aed Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Thu, 22 Jun 2023 10:22:49 +0300 Subject: [PATCH 5/6] Review fix --- .../aidlapi/OsmAndCustomizationConstants.java | 2 - .../res/layout/card_divider_16dp_margin.xml | 14 --- .../layout/list_item_terrain_description.xml | 43 +++++--- OsmAnd/res/values/strings.xml | 1 - .../plus/configmap/ConfigureMapMenu.java | 51 ++------- .../osmand/plus/plugins/PluginsHelper.java | 16 --- .../openseamaps/NauticalMapsPlugin.java | 8 +- .../osmand/plus/plugins/srtm/SRTMPlugin.java | 102 +++++++++++------- .../plus/widgets/ctxmenu/ViewCreator.java | 5 + .../widgets/ctxmenu/data/ContextMenuItem.java | 12 --- 10 files changed, 110 insertions(+), 144 deletions(-) delete mode 100644 OsmAnd/res/layout/card_divider_16dp_margin.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index 4fe7b1b0b72..a49379301bf 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -65,8 +65,6 @@ public interface OsmAndCustomizationConstants { String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines"; String TERRAIN_ID = SHOW_ITEMS_ID_SCHEME + "terrain"; String WEATHER_ID = SHOW_ITEMS_ID_SCHEME + "weather"; - String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; - String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category"; String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style"; String MAP_MODE_ID = RENDERING_ITEMS_ID_SCHEME + "map_mode"; diff --git a/OsmAnd/res/layout/card_divider_16dp_margin.xml b/OsmAnd/res/layout/card_divider_16dp_margin.xml deleted file mode 100644 index e872af12021..00000000000 --- a/OsmAnd/res/layout/card_divider_16dp_margin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout/list_item_terrain_description.xml b/OsmAnd/res/layout/list_item_terrain_description.xml index 9982ff58717..bb7002b5151 100644 --- a/OsmAnd/res/layout/list_item_terrain_description.xml +++ b/OsmAnd/res/layout/list_item_terrain_description.xml @@ -1,16 +1,18 @@ - + android:background="?attr/bg_color" + android:orientation="vertical"> + android:paddingHorizontal="@dimen/content_padding" + android:paddingTop="@dimen/content_padding"> + android:textSize="@dimen/default_desc_text_size" /> + android:layout_marginLeft="@dimen/content_padding" + android:layout_weight="0" + android:src="@drawable/ic_action_srtm_colored_day" /> @@ -41,8 +43,9 @@ android:id="@+id/button_get" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:layout_marginTop="@dimen/content_padding"> + android:layout_marginTop="@dimen/content_padding" + android:layout_marginBottom="@dimen/content_padding" + android:orientation="vertical"> @@ -80,4 +83,12 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 86100684369..748af691421 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -12,7 +12,6 @@ --> Free mode - Own and observe the scale model of your neighborhood or the whole continent. Slope uses colors to visualize terrain steepness. You can read more about Slopes in %1$s. Terrain contour lines, full hillshade map with dark shades and slope maps with colors to show peaks and lowlands. Terrain map diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index a0aa68453c8..0ab01164886 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -147,36 +147,20 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { List customRules = ConfigureMapUtils.getCustomRules(app, UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); - if (app.useOpenGlRenderer()) { - createTerrainItems(customRules, adapter, mapActivity); - } + registerTerrainCard(adapter, mapActivity, customRules); PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); createRenderingAttributeItems(customRules, adapter, mapActivity, nightMode); return adapter; } - private void createTerrainItems(@NonNull List customRules, - @NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity) { - OsmandApplication app = activity.getMyApplication(); - - adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) - .setCategory(true) - .setTitle(app.getString(R.string.shared_string_terrain)) - .setLayout(R.layout.list_group_title_with_switch)); - - if (Version.isPaidVersion(app)) { - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); - } else { - addTerrainDescriptionItem(adapter, activity); - if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { - adapter.addItem(new ContextMenuItem("nautical_divider") - .setLayout(R.layout.card_divider_16dp_margin) - .setClickable(false)); - } + private void registerTerrainCard(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + @NonNull List customRules) { + SRTMPlugin srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + if (srtmPlugin != null) { + srtmPlugin.registerTerrainCard(adapter, activity, customRules); } - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(NauticalMapsPlugin.class)); } private void createLayersItems(@NonNull List customRules, @@ -263,14 +247,7 @@ private void createLayersItems(@NonNull List customRules, .setItemDeleteAction(settings.MAP_ONLINE_DATA, settings.MAP_TILE_SOURCES) .setListener(listener)); - if (app.useOpenGlRenderer()) { - ArrayList terrainPlugins = new ArrayList<>(); - terrainPlugins.add(SRTMPlugin.class); - terrainPlugins.add(NauticalMapsPlugin.class); - PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); - } else { - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); - } + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); app.getAidlApi().registerLayerContextMenu(adapter, activity); selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); @@ -283,18 +260,6 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } - private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity) { - adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) - .setLayout(R.layout.list_item_terrain_description) - .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) - .setClickable(false) - .setSpecialViewListener((uiAdapter, view, item, isChecked) -> { - ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); - return true; - })); - } - private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java index c104e5fa472..fb192ca54b8 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java +++ b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java @@ -611,22 +611,6 @@ public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, } } - public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List plugins) { - for (OsmandPlugin plugin : getAvailablePlugins()) { - if (plugins.contains(plugin.getClass())) { - plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); - } - } - } - - public static void registerLayerContextMenuExcluded(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List excludedPlugins) { - for (OsmandPlugin plugin : getAvailablePlugins()) { - if (!excludedPlugins.contains(plugin.getClass())) { - plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); - } - } - } - public static void registerConfigureMapCategory(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.registerConfigureMapCategoryActions(adapter, mapActivity, customRules); diff --git a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java index 7fcd5b733e7..150f2a3a8bb 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java @@ -100,11 +100,17 @@ public String getId() { return PLUGIN_NAUTICAL; } + public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { + if ((isEnabled() || hasDepthMaps()) && app.useOpenGlRenderer()) { + createNauticalItem(adapter, mapActivity, customRules); + } + } + @Override public void registerLayerContextMenuActions(@NonNull ContextMenuAdapter menuAdapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if (isEnabled() || hasDepthMaps()) { + if ((isEnabled() || hasDepthMaps()) && !app.useOpenGlRenderer()) { createNauticalItem(menuAdapter, mapActivity, customRules); } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index f5ec5b36769..38432a87725 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -3,8 +3,9 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_DESCRIPTION_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; -import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; import static net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem.INVALID_ID; import android.app.Activity; @@ -20,6 +21,7 @@ import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.chooseplan.ChoosePlanFragment; import net.osmand.plus.chooseplan.OsmAndFeature; @@ -31,6 +33,7 @@ import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.OsmandPlugin; import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; @@ -359,9 +362,41 @@ private void removeTerrainLayer(@NonNull OsmandMapTileView mapView) { } } + public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { + if (isEnabled() && app.useOpenGlRenderer()) { + adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) + .setCategory(true) + .setTitle(app.getString(R.string.shared_string_terrain)) + .setLayout(R.layout.list_group_title_with_switch)); + + if (!Version.isPaidVersion(app)) { + addTerrainDescriptionItem(adapter, mapActivity); + } else { + createContextMenuItems(adapter, mapActivity); + add3DReliefItem(adapter, mapActivity); + } + NauticalMapsPlugin nauticalMapsPlugin = PluginsHelper.getPlugin(NauticalMapsPlugin.class); + if (nauticalMapsPlugin != null) { + nauticalMapsPlugin.registerTerrainCard(adapter, mapActivity, customRules); + } + } + } + + private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) + .setLayout(R.layout.list_item_terrain_description) + .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) + .setClickable(false) + .setListener((uiAdapter, view, item, isChecked) -> { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); + return true; + })); + } + @Override protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if (isEnabled()) { + if (isEnabled() && !app.useOpenGlRenderer()) { if (isLocked()) { PurchasingUtils.createPromoItem(adapter, mapActivity, OsmAndFeature.TERRAIN, TERRAIN_ID, @@ -370,7 +405,6 @@ protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapt } else { createContextMenuItems(adapter, mapActivity); } - add3DReliefItem(adapter, mapActivity); } } @@ -463,45 +497,35 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu } private void add3DReliefItem(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity) { - if (app.useOpenGlRenderer()) { - ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) - .setTitleId(R.string.relief_3d, app) - .setIcon(R.drawable.ic_action_3d_relief) - .setListener((uiAdapter, view, contextItem, isChecked) -> { - if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { - settings.ENABLE_3D_MAPS.set(isChecked); - contextItem.setColor(app, isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); - contextItem.setSelected(isChecked); - contextItem.setDescription(app.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); - uiAdapter.onDataSetChanged(); - - app.runInUIThread(() -> app.getOsmandMap().getMapLayers().getMapInfoLayer().recreateAllControls(activity)); - } else { - ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); - } - return true; - }); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setListener((uiAdapter, view, contextItem, isChecked) -> { + if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + settings.ENABLE_3D_MAPS.set(isChecked); + contextItem.setColor(app, isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); + contextItem.setSelected(isChecked); + contextItem.setDescription(app.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + uiAdapter.onDataSetChanged(); - boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); - if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { - boolean nightMode = isNightMode(activity, app); - item.setUseNaturalSecondIconColor(true); - item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); - } else { - item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); - item.setSelected(enabled3DMode); - item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); - } + app.runInUIThread(() -> app.getOsmandMap().getMapLayers().getMapInfoLayer().recreateAllControls(activity)); + } else { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); + } + return false; + }); - ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); - if (terrainItem == null) { - terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); - } - if (terrainItem != null) { - item.setOrder(terrainItem.getOrder()); - } - adapter.addItem(item); + boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); + if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { + boolean nightMode = isNightMode(activity, app); + item.setUseNaturalSecondIconColor(true); + item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); } + adapter.addItem(item); } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index 16ed175f7fe..c78fc5c22fe 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -30,6 +30,8 @@ import net.osmand.plus.activities.actions.AppModeDialog; import net.osmand.plus.dialogs.HelpArticleDialogFragment; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.utils.AndroidUtils; @@ -289,6 +291,9 @@ private View getHelpToImproveItemView(@NonNull View view) { private View getTerrainDescriptionView(@NonNull View view, @NonNull ContextMenuItem item) { View btnGet = view.findViewById(R.id.button_get); UiUtilities.setupDialogButton(nightMode, btnGet, UiUtilities.DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); + View divider = view.findViewById(R.id.bottom_divider); + AndroidUiHelper.updateVisibility(divider, PluginsHelper.isEnabled(NauticalMapsPlugin.class)); + btnGet.setOnClickListener(v -> { ItemClickListener listener = item.getItemClickListener(); if (listener != null) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index cf979016fea..60eaf46b5d5 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -48,8 +48,6 @@ public class ContextMenuItem { private int icon = INVALID_ID; @DrawableRes private int secondaryIcon = INVALID_ID; - boolean showProIcon = false; - private Boolean selected; private int progress = INVALID_ID; private boolean loading; @@ -132,10 +130,6 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } - public boolean isShowProIcon() { - return showProIcon; - } - public boolean useNaturalSecondIconColor() { return useNaturalSecondIconColor; } @@ -278,12 +272,6 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } - @NonNull - public ContextMenuItem showProIcon(boolean showProIcon) { - this.showProIcon = showProIcon; - return this; - } - @NonNull public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { this.useNaturalSecondIconColor = useNaturalSecondIconColor; From d872c464da4f5bbef18fbed413d495c677bd77d0 Mon Sep 17 00:00:00 2001 From: chumva Date: Tue, 27 Jun 2023 00:39:51 +0300 Subject: [PATCH 6/6] Small fixes --- .../aidlapi/OsmAndCustomizationConstants.java | 7 ++- .../layout/list_item_terrain_description.xml | 3 +- .../layout/terrain_visibility_fragment.xml | 2 +- .../layout/terrain_zoom_levels_fragment.xml | 2 +- OsmAnd/res/values/strings.xml | 20 +------ .../plus/configmap/CategoryAnimator.java | 16 ++--- .../plus/configmap/ConfigureMapFragment.java | 10 ++-- .../plus/configmap/ConfigureMapMenu.java | 22 ------- .../configmap/ConfigureMapOptionFragment.java | 59 +++++++++++-------- .../plus/configmap/MapLayerMenuListener.java | 6 -- .../openseamaps/NauticalMapsPlugin.java | 10 ++-- .../osmand/plus/plugins/srtm/SRTMPlugin.java | 14 +++-- .../plus/plugins/srtm/TerrainFragment.java | 4 -- .../plus/widgets/ctxmenu/ViewCreator.java | 12 ++-- .../widgets/ctxmenu/data/ContextMenuItem.java | 1 + 15 files changed, 76 insertions(+), 112 deletions(-) diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index a49379301bf..fdbd71308cf 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -42,8 +42,6 @@ public interface OsmAndCustomizationConstants { String APP_PROFILES_ID = CONFIGURE_MAP_ITEM_ID_SCHEME + "app_profiles"; String SHOW_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "category"; - String TERRAIN_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "terrain_category"; - String TERRAIN_DESCRIPTION_ID = SHOW_ITEMS_ID_SCHEME + "terrain_description"; String FAVORITES_ID = SHOW_ITEMS_ID_SCHEME + "favorites"; String POI_OVERLAY_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay"; String POI_OVERLAY_LABELS_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay_labels"; @@ -52,7 +50,6 @@ public interface OsmAndCustomizationConstants { String WIKIPEDIA_ID = SHOW_ITEMS_ID_SCHEME + "wikipedia"; String MAP_MARKERS_ID = SHOW_ITEMS_ID_SCHEME + "map_markers"; String MAP_SOURCE_ID = SHOW_ITEMS_ID_SCHEME + "map_source"; - String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; String MAP_BORDERS_ID = SHOW_ITEMS_ID_SCHEME + "map_borders"; String RECORDING_LAYER = SHOW_ITEMS_ID_SCHEME + "recording_layer"; String DEPTH_CONTOURS = SHOW_ITEMS_ID_SCHEME + "depth_contours"; @@ -64,7 +61,11 @@ public interface OsmAndCustomizationConstants { String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map"; String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines"; String TERRAIN_ID = SHOW_ITEMS_ID_SCHEME + "terrain"; + String TERRAIN_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "terrain_category"; + String TERRAIN_DESCRIPTION_ID = SHOW_ITEMS_ID_SCHEME + "terrain_description"; String WEATHER_ID = SHOW_ITEMS_ID_SCHEME + "weather"; + String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; + String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category"; String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style"; String MAP_MODE_ID = RENDERING_ITEMS_ID_SCHEME + "map_mode"; diff --git a/OsmAnd/res/layout/list_item_terrain_description.xml b/OsmAnd/res/layout/list_item_terrain_description.xml index bb7002b5151..94b6b8c36cd 100644 --- a/OsmAnd/res/layout/list_item_terrain_description.xml +++ b/OsmAnd/res/layout/list_item_terrain_description.xml @@ -2,7 +2,7 @@ @@ -34,7 +34,6 @@ android:layout_gravity="center_vertical" android:layout_marginStart="@dimen/content_padding" android:layout_marginLeft="@dimen/content_padding" - android:layout_weight="0" android:src="@drawable/ic_action_srtm_colored_day" /> diff --git a/OsmAnd/res/layout/terrain_visibility_fragment.xml b/OsmAnd/res/layout/terrain_visibility_fragment.xml index 2fd8b052a79..ae6ba311106 100644 --- a/OsmAnd/res/layout/terrain_visibility_fragment.xml +++ b/OsmAnd/res/layout/terrain_visibility_fragment.xml @@ -1,7 +1,7 @@ diff --git a/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml index 28f389e08f7..ac3fed565a6 100644 --- a/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml +++ b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml @@ -1,7 +1,7 @@ diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 748af691421..dd18dcb6aa6 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,30 +11,12 @@ Thx - Hardy --> - Free mode Slope uses colors to visualize terrain steepness. You can read more about Slopes in %1$s. Terrain contour lines, full hillshade map with dark shades and slope maps with colors to show peaks and lowlands. + Free mode Terrain map 3D Relief Own and observe the scale model of your neighborhood or the whole continent. - Explosives - Explosives - Gases - Gases - Flammable liquids - Flammable liquids - Flammable solids - Flammable solids - Oxidizing agents and organic peroxides - Oxidizing agents and organic peroxides - Toxic and infectious substances - Toxic and infectious substances - Radioactive substances - Radioactive substances - Corrosive substances - Corrosive substances - Miscellaneous - Miscellaneous Close the dialog Allow via ferrata Allow via ferrata paths. diff --git a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java index fab048c7e23..5e4e7e50fb4 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java +++ b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java @@ -62,9 +62,7 @@ private ValueAnimator startAnimation() { // Determine passed distance in current direction float currentHeaderHeight = header.getHeight(); float wholeDistance = maxHeaderHeight - minHeaderHeight; - float leftDistance = isExpanding ? - (currentHeaderHeight - minHeaderHeight) : - (maxHeaderHeight - currentHeaderHeight); + float leftDistance = isExpanding ? (currentHeaderHeight - minHeaderHeight) : (maxHeaderHeight - currentHeaderHeight); float passedDistance = wholeDistance - leftDistance; // Determine restrictions @@ -97,7 +95,7 @@ private ValueAnimator startAnimation() { private void calculateCommonParameters() { descHeight = getDimen(R.dimen.default_desc_line_height); int titleHeight = getDimen(R.dimen.default_title_line_height); - int verticalMargin = getDimen(R.dimen.content_padding_small)*2; + int verticalMargin = getDimen(R.dimen.content_padding_small) * 2; minHeaderHeight = titleHeight + verticalMargin - AndroidUtils.dpToPx(ctx, 3); maxHeaderHeight = minHeaderHeight + descHeight; @@ -114,11 +112,8 @@ private void onBeforeAnimation() { divider.setVisibility(View.VISIBLE); // Description will be invisible until collapsing animation finished - if (category.getDescription() == null) { - tvDescription.setVisibility(View.GONE); - } else { - tvDescription.setVisibility(View.INVISIBLE); - } + boolean hasDescription = category.getDescription() != null; + tvDescription.setVisibility(hasDescription ? View.INVISIBLE : View.GONE); } private void onMainAnimationUpdate(int val, float minValue, float maxValue) { @@ -152,9 +147,10 @@ private void onMainAnimationFinished() { ivIndicator.setRotation(0); ivIndicator.setImageResource(indicatorRes); + boolean hasDescription = category.getDescription() != null; // Update views visibility AndroidUiHelper.updateVisibility(divider, isExpanding); - AndroidUiHelper.updateVisibility(tvDescription, !isExpanding && category.getDescription() != null); + AndroidUiHelper.updateVisibility(tvDescription, !isExpanding && hasDescription); AndroidUiHelper.updateVisibility(itemsContainer, isExpanding); // Set items container height as WRAP_CONTENT diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java index b48757d4617..a454a63469c 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java @@ -2,7 +2,6 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -192,13 +191,15 @@ private void bindItemView(@NonNull ContextMenuItem item, @NonNull ViewGroup cont View existedView = views.get(standardId); View view = viewCreator.getView(item, existedView); view.setTag(R.id.item_as_tag, item); - if (item.isClickable()) { + + boolean clickable = item.isClickable(); + if (clickable) { view.setOnClickListener(getItemsClickListener()); } if (existedView == null) { views.put(standardId, view); container.addView(view); - if (item.getLayout() != R.layout.mode_toggles && item.isClickable()) { + if (item.getLayout() != R.layout.mode_toggles && clickable) { setupSelectableBg(view); } } @@ -213,7 +214,8 @@ private void updateCategoryView(@NonNull ContextMenuItem category) { ImageView ivIndicator = view.findViewById(R.id.explicit_indicator); ivIndicator.setImageResource(isCollapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up); - AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed && category.getDescription() != null); + boolean hasDescription = category.getDescription() != null; + AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed && hasDescription); AndroidUiHelper.updateVisibility(view.findViewById(R.id.items_container), !isCollapsed); AndroidUiHelper.updateVisibility(view.findViewById(R.id.divider), !isCollapsed); } diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index 0ab01164886..4270eec2d10 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -7,7 +7,6 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.GPX_FILES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.HIDE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_BORDERS_ID; -import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_LANGUAGE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MAGNIFIER_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MARKERS_ID; @@ -20,12 +19,8 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROAD_STYLE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID; -import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_CATEGORY_ID; -import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_DESCRIPTION_ID; -import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID; -import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_COLOR_SCHEME; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_WIDTH; import static net.osmand.plus.plugins.osmedit.OsmEditingPlugin.RENDERING_CATEGORY_OSM_ASSISTANT; @@ -56,17 +51,11 @@ import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.chooseplan.ChoosePlanFragment; -import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DetailsBottomSheet; import net.osmand.plus.dialogs.SelectMapStyleBottomSheetDialogFragment; -import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsHelper; -import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; -import net.osmand.plus.plugins.srtm.SRTMPlugin; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -93,7 +82,6 @@ import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -147,22 +135,12 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { List customRules = ConfigureMapUtils.getCustomRules(app, UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); - registerTerrainCard(adapter, mapActivity, customRules); PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); createRenderingAttributeItems(customRules, adapter, mapActivity, nightMode); return adapter; } - private void registerTerrainCard(@NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity, - @NonNull List customRules) { - SRTMPlugin srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); - if (srtmPlugin != null) { - srtmPlugin.registerTerrainCard(adapter, activity, customRules); - } - } - private void createLayersItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java index 3e93283da6e..b6528a32d2b 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java @@ -18,6 +18,7 @@ import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; import androidx.fragment.app.FragmentActivity; import net.osmand.plus.R; @@ -46,6 +47,32 @@ public abstract class ConfigureMapOptionFragment extends BaseOsmAndFragment { private View applyButton; protected LinearLayout contentContainer; + + @Override + protected boolean isUsedOnMap() { + return true; + } + + @Override + public int getStatusBarColorId() { + AndroidUiHelper.setStatusBarContentColor(getView(), nightMode); + return ColorUtilities.getListBgColorId(nightMode); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + MapActivity activity = requireMapActivity(); + activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + activity.getSupportFragmentManager().popBackStack(); + activity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.TERRAIN, false); + } + }); + } + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -61,24 +88,17 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c activity.onBackPressed(); }); - activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - activity.getSupportFragmentManager().popBackStack(); - activity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.TERRAIN, false); - } - }); - - updateApplyButton(false); setupToolBar(view); buildZoomButtons(view); moveCompassButton(view); setupMainContent(); + updateApplyButton(false); - requireMapActivity().refreshMap(); + refreshMap(); return view; } + protected abstract String getToolbarTitle(); protected void onResetToDefault() { @@ -89,17 +109,6 @@ protected void onApplyButtonClick() { protected abstract void setupMainContent(); - @Override - public int getStatusBarColorId() { - AndroidUiHelper.setStatusBarContentColor(getView(), nightMode); - return ColorUtilities.getListBgColorId(nightMode); - } - - @Override - protected boolean isUsedOnMap() { - return true; - } - protected void updateApplyButton(boolean enable) { applyButton.setEnabled(enable); setupDialogButton(nightMode, applyButton, enable ? UiUtilities.DialogButtonType.PRIMARY : UiUtilities.DialogButtonType.STROKED, getString(R.string.shared_string_apply)); @@ -130,11 +139,13 @@ private void buildZoomButtons(@NonNull View view) { } private void setupToolBar(@NonNull View view) { + ViewCompat.setElevation(view.findViewById(R.id.toolbar), 5.0f); + TextView title = view.findViewById(R.id.title); title.setText(getToolbarTitle()); ImageView backButton = view.findViewById(R.id.back_button); - backButton.setImageDrawable(getIcon(AndroidUtils.getNavigationIconResId(requireMapActivity()), ColorUtilities.getDefaultIconColorId(nightMode))); + backButton.setImageDrawable(getIcon(AndroidUtils.getNavigationIconResId(view.getContext()), ColorUtilities.getDefaultIconColorId(nightMode))); backButton.setOnClickListener(v -> { MapActivity activity = getMapActivity(); if (activity != null) { @@ -144,7 +155,7 @@ private void setupToolBar(@NonNull View view) { ImageButton resetButton = view.findViewById(R.id.reset_button); resetButton.setImageDrawable(getIcon(R.drawable.ic_action_reset, ColorUtilities.getDefaultIconColorId(nightMode))); - resetButton.setOnClickListener(view1 -> onResetToDefault()); + resetButton.setOnClickListener(v -> onResetToDefault()); } private void moveCompassButton(@NonNull View view) { @@ -203,7 +214,7 @@ public void onDestroyView() { mapInfoLayer.removeRulerWidgets(Collections.singletonList(rulerWidget)); } } - requireMapActivity().refreshMap(); + refreshMap(); } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java index 56c72e156da..5ca94a73e10 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java @@ -8,20 +8,14 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.chooseplan.ChoosePlanFragment; -import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.configmap.tracks.TracksFragment; -import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsFragment; import net.osmand.plus.plugins.PluginsHelper; import net.osmand.plus.plugins.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.preferences.BooleanPreference; -import net.osmand.plus.settings.backend.preferences.OsmandPreference; import net.osmand.plus.track.helpers.GpxSelectionHelper; import net.osmand.plus.transport.TransportLinesMenu; import net.osmand.plus.views.MapLayers; diff --git a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java index 150f2a3a8bb..5d741c87efc 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java @@ -100,8 +100,10 @@ public String getId() { return PLUGIN_NAUTICAL; } - public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if ((isEnabled() || hasDepthMaps()) && app.useOpenGlRenderer()) { + public void createAdapterItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity mapActivity, + @NonNull List customRules) { + if ((isEnabled() || hasDepthMaps())) { createNauticalItem(adapter, mapActivity, customRules); } } @@ -110,8 +112,8 @@ public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull Ma public void registerLayerContextMenuActions(@NonNull ContextMenuAdapter menuAdapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if ((isEnabled() || hasDepthMaps()) && !app.useOpenGlRenderer()) { - createNauticalItem(menuAdapter, mapActivity, customRules); + if (!app.useOpenGlRenderer()) { + createAdapterItem(menuAdapter, mapActivity, customRules); } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index 38432a87725..763e96827b1 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -21,7 +21,6 @@ import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.chooseplan.ChoosePlanFragment; import net.osmand.plus.chooseplan.OsmAndFeature; @@ -362,22 +361,25 @@ private void removeTerrainLayer(@NonNull OsmandMapTileView mapView) { } } - public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { + @Override + protected void registerConfigureMapCategoryActions(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity mapActivity, + @NonNull List customRules) { if (isEnabled() && app.useOpenGlRenderer()) { adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) .setCategory(true) .setTitle(app.getString(R.string.shared_string_terrain)) .setLayout(R.layout.list_group_title_with_switch)); - if (!Version.isPaidVersion(app)) { + if (isLocked()) { addTerrainDescriptionItem(adapter, mapActivity); } else { createContextMenuItems(adapter, mapActivity); add3DReliefItem(adapter, mapActivity); } - NauticalMapsPlugin nauticalMapsPlugin = PluginsHelper.getPlugin(NauticalMapsPlugin.class); - if (nauticalMapsPlugin != null) { - nauticalMapsPlugin.registerTerrainCard(adapter, mapActivity, customRules); + NauticalMapsPlugin nauticalPlugin = PluginsHelper.getPlugin(NauticalMapsPlugin.class); + if (nauticalPlugin != null) { + nauticalPlugin.createAdapterItem(adapter, mapActivity, customRules); } } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java index 9194d1c42f8..ebb2c17970e 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java @@ -4,8 +4,6 @@ import static net.osmand.plus.download.DownloadActivityType.SLOPE_FILE; import static net.osmand.plus.plugins.srtm.TerrainMode.HILLSHADE; import static net.osmand.plus.plugins.srtm.TerrainMode.SLOPE; -import static net.osmand.plus.utils.UiUtilities.CustomRadioButtonType.END; -import static net.osmand.plus.utils.UiUtilities.CustomRadioButtonType.START; import android.app.Activity; import android.content.Intent; @@ -31,8 +29,6 @@ import androidx.fragment.app.FragmentManager; import com.github.ksoichiro.android.observablescrollview.ObservableListView; -import com.google.android.material.slider.RangeSlider; -import com.google.android.material.slider.Slider; import net.osmand.PlatformUtil; import net.osmand.plus.R; diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index c78fc5c22fe..021b4e853d9 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -37,6 +37,7 @@ import net.osmand.plus.utils.AndroidUtils; import net.osmand.plus.utils.ColorUtilities; import net.osmand.plus.utils.UiUtilities; +import net.osmand.plus.utils.UiUtilities.DialogButtonType; import net.osmand.plus.widgets.ctxmenu.callback.ItemClickListener; import net.osmand.plus.widgets.ctxmenu.callback.OnDataChangeUiAdapter; import net.osmand.plus.widgets.ctxmenu.callback.OnIntegerValueChangedListener; @@ -288,18 +289,17 @@ private View getHelpToImproveItemView(@NonNull View view) { return view; } + @NonNull private View getTerrainDescriptionView(@NonNull View view, @NonNull ContextMenuItem item) { - View btnGet = view.findViewById(R.id.button_get); - UiUtilities.setupDialogButton(nightMode, btnGet, UiUtilities.DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); - View divider = view.findViewById(R.id.bottom_divider); - AndroidUiHelper.updateVisibility(divider, PluginsHelper.isEnabled(NauticalMapsPlugin.class)); - - btnGet.setOnClickListener(v -> { + View button = view.findViewById(R.id.button_get); + button.setOnClickListener(v -> { ItemClickListener listener = item.getItemClickListener(); if (listener != null) { listener.onContextMenuClick(uiAdapter, view, item, false); } }); + UiUtilities.setupDialogButton(nightMode, button, DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); + AndroidUiHelper.updateVisibility(view.findViewById(R.id.bottom_divider), PluginsHelper.isEnabled(NauticalMapsPlugin.class)); return view; } diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index 60eaf46b5d5..edf6f4a45ba 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -48,6 +48,7 @@ public class ContextMenuItem { private int icon = INVALID_ID; @DrawableRes private int secondaryIcon = INVALID_ID; + private Boolean selected; private int progress = INVALID_ID; private boolean loading;