package net.osmand.plus.quickaction.actions;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.openseamapsplugin.NauticalMapsPlugin;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.SwitchableAction;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.render.RenderingRulesStorage;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class MapStyleAction extends SwitchableAction<String> {
public static final int TYPE = 14;
private final static String KEY_STYLES = "styles";
public MapStyleAction() {
super(TYPE);
}
public MapStyleAction(QuickAction quickAction) {
super(quickAction);
}
@Override
public void execute(MapActivity activity) {
List<String> mapStyles = getFilteredStyles();
String curStyle = activity.getMyApplication().getSettings().RENDERER.get();
int index = mapStyles.indexOf(curStyle);
String nextStyle = mapStyles.get(0);
if (index >= 0 && index + 1 < mapStyles.size()) {
nextStyle = mapStyles.get(index + 1);
}
RenderingRulesStorage loaded = activity.getMyApplication()
.getRendererRegistry().getRenderer(nextStyle);
if (loaded != null) {
OsmandMapTileView view = activity.getMapView();
view.getSettings().RENDERER.set(nextStyle);
activity.getMyApplication().getRendererRegistry().setCurrentSelectedRender(loaded);
ConfigureMapMenu.refreshMapComplete(activity);
Toast.makeText(activity, activity.getString(R.string.quick_action_map_style_switch, nextStyle), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity, R.string.renderer_load_exception, Toast.LENGTH_SHORT).show();
}
}
public List<String> getFilteredStyles() {
List<String> filtered = new ArrayList<>();
boolean enabled = OsmandPlugin.getEnabledPlugin(NauticalMapsPlugin.class) != null;
if (enabled) return loadListFromParams();
else {
for (String style : loadListFromParams()) {
if (!style.equals(RendererRegistry.NAUTICAL_RENDER)) {
filtered.add(style);
}
}
}
return filtered;
}
@Override
protected int getAddBtnText() {
return R.string.quick_action_map_style_action;
}
@Override
protected int getDiscrHint() {
return R.string.quick_action_page_list_descr;
}
@Override
protected int getDiscrTitle() {
return R.string.quick_action_map_styles;
}
@Override
protected String getListKey() {
return KEY_STYLES;
}
@Override
protected View.OnClickListener getOnAddBtnClickListener(final MapActivity activity, final Adapter adapter) {
return new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder bld = new AlertDialog.Builder(activity);
bld.setTitle(R.string.renderers);
final OsmandApplication app = activity.getMyApplication();
final List<String> visibleNamesList = new ArrayList<>();
final Collection<String> rendererNames = app.getRendererRegistry().getRendererNames();
final String[] items = rendererNames.toArray(new String[rendererNames.size()]);
final boolean nauticalPluginDisabled = OsmandPlugin.getEnabledPlugin(NauticalMapsPlugin.class) == null;
for (String item : items) {
if (nauticalPluginDisabled && item.equals(RendererRegistry.NAUTICAL_RENDER)) {
continue;
}
visibleNamesList.add(item.replace('_', ' ').replace('-', ' '));
}
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(activity, R.layout.dialog_text_item);
arrayAdapter.addAll(visibleNamesList);
bld.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String renderer = visibleNamesList.get(i);
RenderingRulesStorage loaded = app.getRendererRegistry().getRenderer(renderer);
if (loaded != null) {
adapter.addItem(renderer, activity);
}
dialogInterface.dismiss();
}
});
bld.setNegativeButton(R.string.shared_string_dismiss, null);
bld.show();
}
};
}
@Override
protected void saveListToParams(List<String> styles) {
getParams().put(getListKey(), TextUtils.join(",", styles));
}
@Override
protected List<String> loadListFromParams() {
List<String> styles = new ArrayList<>();
String filtersId = getParams().get(getListKey());
if (filtersId != null && !filtersId.trim().isEmpty()) {
Collections.addAll(styles, filtersId.split(","));
}
return styles;
}
@Override
protected String getItemName(String item) {
return item;
}
@Override
protected String getTitle(List<String> filters) {
if (filters.isEmpty()) return "";
return filters.size() > 1
? filters.get(0) + " +" + (filters.size() - 1)
: filters.get(0);
}
}