package cgeo.geocaching.apps.navi; import cgeo.geocaching.R; import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.models.Waypoint; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.ProcessUtils; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; public class OsmAndApp extends AbstractPointNavigationApp { private static final String PARAM_NAME = "name"; private static final String PARAM_LAT = "lat"; private static final String PARAM_LON = "lon"; private static final String PREFIX = "osmand.api://"; private static final String GET_INFO = "get_info"; private static final String ADD_MAP_MARKER = "add_map_marker"; protected OsmAndApp() { super(getString(R.string.cache_menu_osmand), null); } @Override public boolean isInstalled() { return ProcessUtils.isIntentAvailable(Intent.ACTION_VIEW, Uri.parse(PREFIX + GET_INFO)); } @Override public void navigate(@NonNull final Context context, @NonNull final Geocache cache) { final Geopoint coords = cache.getCoords(); assert coords != null; // guaranteed by super class navigate(context, coords, cache.getName()); } @Override public void navigate(@NonNull final Context context, @NonNull final Waypoint waypoint) { final Geopoint coords = waypoint.getCoords(); assert coords != null; // guaranteed by super class navigate(context, coords, waypoint.getName()); } @Override public void navigate(@NonNull final Context context, @NonNull final Geopoint coords) { navigate(context, coords, context.getString(R.string.osmand_marker_cgeo)); } private static void navigate(@NonNull final Context context, @NonNull final Geopoint coords, @NonNull final String markerName) { final Parameters params = new Parameters(PARAM_LAT, String.valueOf(coords.getLatitude()), PARAM_LON, String.valueOf(coords.getLongitude()), PARAM_NAME, markerName); context.startActivity(buildIntent(params)); } private static Intent buildIntent(@Nullable final Parameters parameters) { final StringBuilder stringBuilder = new StringBuilder(PREFIX); stringBuilder.append(ADD_MAP_MARKER); if (parameters != null && !parameters.isEmpty()) { stringBuilder.append('?'); stringBuilder.append(parameters.toString()); } return new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuilder.toString())); } }