package net.osmand.core.samples.android.sample1.mapcontextmenu;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import net.osmand.core.samples.android.sample1.MainActivity;
import net.osmand.core.samples.android.sample1.OsmandResources;
import net.osmand.core.samples.android.sample1.R;
import net.osmand.core.samples.android.sample1.SampleApplication;
import net.osmand.core.samples.android.sample1.SampleUtils;
import net.osmand.core.samples.android.sample1.data.PointDescription;
import net.osmand.core.samples.android.sample1.mapcontextmenu.controllers.AmenityMenuController;
import net.osmand.core.samples.android.sample1.mapcontextmenu.controllers.MyLocationMenuController;
import net.osmand.core.samples.android.sample1.mapcontextmenu.controllers.PointDescriptionMenuController;
import net.osmand.data.Amenity;
import net.osmand.data.LatLon;
public abstract class MenuController extends BaseMenuController {
public static class MenuState {
public static final int HEADER_ONLY = 1;
public static final int HALF_SCREEN = 2;
public static final int FULL_SCREEN = 4;
}
public enum MenuType {
STANDARD,
MULTI_LINE
}
protected MenuBuilder builder;
private int currentMenuState;
private MenuType menuType = MenuType.STANDARD;
private PointDescription pointDescription;
private LatLon latLon;
private boolean active;
protected TitleButtonController leftTitleButtonController;
protected TitleButtonController rightTitleButtonController;
protected TitleButtonController topRightTitleButtonController;
//protected TopToolbarController toolbarController;
public MenuController(MenuBuilder builder, PointDescription pointDescription, MainActivity mainActivity) {
super(mainActivity);
this.pointDescription = pointDescription;
this.builder = builder;
this.currentMenuState = getInitialMenuState();
this.builder.setLight(isLight());
}
public void build(View rootView) {
builder.build(rootView);
}
public static MenuController getMenuController(MainActivity mainActivity,
LatLon latLon, PointDescription pointDescription, Object object,
MenuType menuType) {
SampleApplication app = mainActivity.getMyApplication();
MenuController menuController = null;
if (object != null) {
if (object instanceof Amenity) {
menuController = new AmenityMenuController(mainActivity, pointDescription, (Amenity) object);
} else if (object instanceof LatLon) {
if (pointDescription.isMyLocation()) {
menuController = new MyLocationMenuController(mainActivity, pointDescription);
}
}
}
if (menuController == null) {
menuController = new PointDescriptionMenuController(mainActivity, pointDescription);
}
menuController.menuType = menuType;
menuController.setLatLon(latLon);
return menuController;
}
public void update(PointDescription pointDescription, Object object) {
setPointDescription(pointDescription);
setObject(object);
}
protected void setPointDescription(PointDescription pointDescription) {
this.pointDescription = pointDescription;
}
protected abstract void setObject(Object object);
protected abstract Object getObject();
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public void addPlainMenuItem(int iconId, String text, boolean needLinks, boolean isUrl, OnClickListener onClickListener) {
builder.addPlainMenuItem(iconId, text, needLinks, isUrl, onClickListener);
}
public void clearPlainMenuItems() {
builder.clearPlainMenuItems();
}
public void addPlainMenuItems(String typeStr, PointDescription pointDescription, LatLon latLon) {
addMyLocationToPlainItems(latLon);
}
protected void addMyLocationToPlainItems(LatLon latLon) {
addPlainMenuItem(OsmandResources.getDrawableId("ic_action_get_my_location"), PointDescription.getLocationName(getMainActivity().getMyApplication(),
latLon.getLatitude(), latLon.getLongitude(), true).replaceAll("\n", " "), false, false, null);
}
public PointDescription getPointDescription() {
return pointDescription;
}
public int getInitialMenuState() {
if (isLandscapeLayout()) {
return MenuState.FULL_SCREEN;
} else {
return getInitialMenuStatePortrait();
}
}
public int getSupportedMenuStates() {
if (isLandscapeLayout()) {
return MenuState.FULL_SCREEN;
} else {
return getSupportedMenuStatesPortrait();
}
}
protected int getInitialMenuStatePortrait() {
return MenuState.HEADER_ONLY;
}
protected int getSupportedMenuStatesPortrait() {
return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
}
public int getCurrentMenuState() {
return currentMenuState;
}
public MenuType getMenuType() {
return menuType;
}
public boolean slideUp() {
int v = currentMenuState;
for (int i = 0; i < 2; i++) {
v = v << 1;
if ((v & getSupportedMenuStates()) != 0) {
currentMenuState = v;
return true;
}
}
return false;
}
public boolean slideDown() {
int v = currentMenuState;
for (int i = 0; i < 2; i++) {
v = v >> 1;
if ((v & getSupportedMenuStates()) != 0) {
currentMenuState = v;
return true;
}
}
return false;
}
public void setCurrentMenuState(int currentMenuState) {
this.currentMenuState = currentMenuState;
}
public TitleButtonController getLeftTitleButtonController() {
return leftTitleButtonController;
}
public TitleButtonController getRightTitleButtonController() {
return rightTitleButtonController;
}
public TitleButtonController getTopRightTitleButtonController() {
return topRightTitleButtonController;
}
/*
public TopToolbarController getToolbarController() {
return toolbarController;
}
public boolean hasBackAction() {
return toolbarController != null;
}
*/
public LatLon getLatLon() {
return latLon;
}
public boolean supportZoomIn() {
return true;
}
public boolean fabVisible() {
return true;
}
public boolean buttonsVisible() {
return true;
}
public boolean handleSingleTapOnMap() {
return false;
}
public boolean needStreetName() {
return !displayDistanceDirection();
}
public boolean needTypeStr() {
return true;
}
public boolean displayStreetNameInTitle() {
return false;
}
public boolean displayDistanceDirection() {
return false;
}
public int getLeftIconId() {
return 0;
}
public Drawable getLeftIcon() {
return null;
}
public Drawable getSecondLineTypeIcon() {
return null;
}
public String getTypeStr() {
return "";
}
public String getCommonTypeStr() {
return "";
}
public String getNameStr() {
return pointDescription.getName();
}
public boolean hasCustomAddressLine() {
return builder.hasCustomAddressLine();
}
public void buildCustomAddressLine(LinearLayout ll) {
builder.buildCustomAddressLine(ll);
}
public abstract class TitleButtonController {
public String caption = "";
public int leftIconId = 0;
public boolean needRightText = false;
public String rightTextCaption = "";
public boolean visible = true;
public Drawable getLeftIcon() {
if (leftIconId != 0) {
return getIcon(leftIconId, isLight() ? R.color.map_widget_blue : R.color.osmand_orange);
} else {
return null;
}
}
public abstract void buttonPressed();
}
public void onShow() {
/*
if (toolbarController != null) {
getMainActivity().showTopToolbar(toolbarController);
}
*/
}
public void onHide() {
}
public void onClose() {
/*
if (toolbarController != null) {
getMainActivity().hideTopToolbar(toolbarController);
}
*/
}
public void onAcquireNewController(PointDescription pointDescription, Object object) {
}
public void setLatLon(@NonNull LatLon latLon) {
this.latLon = latLon;
if (builder != null) {
builder.setLatLon(latLon);
}
}
/*
public static class ContextMenuToolbarController extends TopToolbarController {
private MenuController menuController;
public ContextMenuToolbarController(MenuController menuController) {
super(TopToolbarControllerType.CONTEXT_MENU);
this.menuController = menuController;
}
public MenuController getMenuController() {
return menuController;
}
}
*/
public static int getObjectPriority(Object o) {
if (o instanceof Amenity) {
return 100;
}
return 1000;
}
public static LatLon getObjectLocation(Object o) {
if (o instanceof Amenity) {
return ((Amenity) o).getLocation();
}
return null;
}
public static PointDescription getObjectName(Object o) {
if (o instanceof Amenity) {
return new PointDescription(PointDescription.POINT_TYPE_POI, ((Amenity) o).getName(
SampleApplication.LANGUAGE, SampleApplication.TRANSLITERATE));
} else if (o instanceof PointDescription) {
return (PointDescription) o;
}
return null;
}
}