package cgeo.geocaching;
import cgeo.geocaching.apps.navi.NavigationAppFactory;
import cgeo.geocaching.apps.navi.NavigationSelectionActionProvider;
import cgeo.geocaching.calendar.CalendarAdder;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.AbstractUIFactory;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
/**
* Shared menu handling for all activities having menu items related to a cache. <br>
* TODO: replace by a fragment
*
*/
public final class CacheMenuHandler extends AbstractUIFactory {
private CacheMenuHandler() {
// utility class
}
/**
* Methods to be implemented by the activity to react to the cache menu selections.
*
*/
interface ActivityInterface {
void navigateTo();
void showNavigationMenu();
void cachesAround();
}
public static boolean onMenuItemSelected(final MenuItem item, @NonNull final CacheMenuHandler.ActivityInterface activityInterface, final Geocache cache) {
final Activity activity;
if (activityInterface instanceof Activity) {
activity = (Activity) activityInterface;
} else {
activity = ((Fragment) activityInterface).getActivity();
}
switch (item.getItemId()) {
case R.id.menu_default_navigation:
activityInterface.navigateTo();
return true;
case R.id.menu_navigate:
final NavigationSelectionActionProvider navigationProvider = (NavigationSelectionActionProvider) MenuItemCompat.getActionProvider(item);
if (navigationProvider == null) {
activityInterface.showNavigationMenu();
return true;
}
return false;
case R.id.menu_caches_around:
activityInterface.cachesAround();
return true;
case R.id.menu_show_in_browser:
cache.openInBrowser(activity);
return true;
case R.id.menu_share:
/* If the share menu is a shareActionProvider do nothing and let the share ActionProvider do the work */
final ShareActionProvider shareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(item);
if (shareActionProvider == null) {
cache.shareCache(activity, res);
return true;
}
return false;
case R.id.menu_calendar:
CalendarAdder.addToCalendar(activity, cache);
return true;
default:
return false;
}
}
public static void onPrepareOptionsMenu(final Menu menu, final Geocache cache) {
if (cache == null) {
return;
}
final boolean hasCoords = cache.getCoords() != null;
menu.findItem(R.id.menu_default_navigation).setVisible(hasCoords);
menu.findItem(R.id.menu_navigate).setVisible(hasCoords);
menu.findItem(R.id.menu_delete).setVisible(cache.isOffline());
menu.findItem(R.id.menu_caches_around).setVisible(hasCoords && cache.supportsCachesAround());
menu.findItem(R.id.menu_calendar).setVisible(cache.canBeAddedToCalendar());
menu.findItem(R.id.menu_log_visit).setVisible(cache.supportsLogging() && !Settings.getLogOffline());
menu.findItem(R.id.menu_log_visit_offline).setVisible(cache.supportsLogging() && Settings.getLogOffline());
menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName());
final MenuItem shareItem = menu.findItem(R.id.menu_share);
final ShareActionProvider shareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(shareItem);
if (shareActionProvider != null) {
shareActionProvider.setShareIntent(cache.getShareIntent());
}
}
public static void addMenuItems(final MenuInflater inflater, final Menu menu, final Geocache cache) {
inflater.inflate(R.menu.cache_options, menu);
onPrepareOptionsMenu(menu, cache);
}
public static void addMenuItems(final Activity activity, final Menu menu, final Geocache cache) {
addMenuItems(activity.getMenuInflater(), menu, cache);
}
}