package cgeo.geocaching.ui; import cgeo.geocaching.R; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.models.Waypoint; import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.view.ActionProvider; import android.support.v4.view.MenuItemCompat; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.SubMenu; /** * Action provider that lists all waypoints of a cache. Can be used to select a certain waypoint out of multiple ones in * navigation related activities. */ public class WaypointSelectionActionProvider extends AbstractMenuActionProvider { private Callback callback; private Geocache geocache; public interface Callback { void onWaypointSelected(final Waypoint waypoint); void onGeocacheSelected(final Geocache geocache); } /** * Creates a new instance. ActionProvider classes should always implement a * constructor that takes a single Context parameter for inflating from menu XML. * * @param context * Context for accessing resources. */ public WaypointSelectionActionProvider(final Context context) { super(context); } public void setCallback(final Callback callback) { this.callback = callback; } @Override public void onPrepareSubMenu(final SubMenu subMenu) { if (callback == null) { return; } addWaypoints(subMenu); } private void addWaypoints(final SubMenu subMenu) { subMenu.clear(); for (final Waypoint waypoint : geocache.getWaypoints()) { if (waypoint.getCoords() != null) { subMenu.add(Menu.NONE, waypoint.getId(), Menu.NONE, waypoint.getName()).setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { callback.onWaypointSelected(waypoint); return true; } }); } } subMenu.add(Menu.NONE, Menu.NONE, Menu.NONE, getContext().getString(R.string.cache)).setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { callback.onGeocacheSelected(geocache); return true; } }); } public static void initialize(@NonNull final MenuItem menuItem, @NonNull final Geocache cache, @NonNull final Callback callback) { final ActionProvider actionProvider = MenuItemCompat.getActionProvider(menuItem); if (actionProvider instanceof WaypointSelectionActionProvider) { final WaypointSelectionActionProvider waypointsAction = (WaypointSelectionActionProvider) actionProvider; waypointsAction.setCallback(callback); waypointsAction.setCache(cache); menuItem.setVisible(hasTargets(cache)); } } private static boolean hasTargets(final Geocache cache) { for (final Waypoint waypoint : cache.getWaypoints()) { if (waypoint.getCoords() != null) { return true; } } return false; } private void setCache(final Geocache cache) { geocache = cache; } }