package com.mapswithme.maps.api;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
public class MwmRequest
{
// **
private List<MWMPoint> mPoints = new ArrayList<MWMPoint>();
private PendingIntent mPendingIntent;
private String mTitle;
private double mZoomLevel = 1;
private boolean mReturnOnBalloonClick;
private boolean mPickPoint = false;
private String mCustomButtonName = "";
// **
public MwmRequest setCustomButtonName(String buttonName)
{
mCustomButtonName = buttonName != null ? buttonName : "";
return this;
}
public MwmRequest setTitle(String title)
{
mTitle = title;
return this;
}
public MwmRequest setPickPointMode(boolean pickPoint)
{
mPickPoint = pickPoint;
return this;
}
public MwmRequest addPoint(MWMPoint point)
{
mPoints.add(point);
return this;
}
public MwmRequest addPoint(double lat, double lon, String name, String id)
{
return addPoint(new MWMPoint(lat, lon, name, id));
}
public MwmRequest setPoints(Collection<MWMPoint> points)
{
mPoints = new ArrayList<MWMPoint>(points);
return this;
}
public MwmRequest setReturnOnBalloonClick(boolean doReturn)
{
mReturnOnBalloonClick = doReturn;
return this;
}
public MwmRequest setZoomLevel(double zoomLevel)
{
mZoomLevel = zoomLevel;
return this;
}
public MwmRequest setPendingIntent(PendingIntent pi)
{
mPendingIntent = pi;
return this;
}
public Intent toIntent(Context context)
{
final Intent mwmIntent = new Intent(Const.ACTION_MWM_REQUEST);
// url
final String mwmUrl = createMwmUrl(context, mTitle, mZoomLevel, mPoints).toString();
mwmIntent.putExtra(Const.EXTRA_URL, mwmUrl);
// title
mwmIntent.putExtra(Const.EXTRA_TITLE, mTitle);
// more
mwmIntent.putExtra(Const.EXTRA_RETURN_ON_BALLOON_CLICK, mReturnOnBalloonClick);
// pick point
mwmIntent.putExtra(Const.EXTRA_PICK_POINT, mPickPoint);
// custom button name
mwmIntent.putExtra(Const.EXTRA_CUSTOM_BUTTON_NAME, mCustomButtonName);
final boolean hasIntent = mPendingIntent != null;
mwmIntent.putExtra(Const.EXTRA_HAS_PENDING_INTENT, hasIntent);
if (hasIntent)
mwmIntent.putExtra(Const.EXTRA_CALLER_PENDING_INTENT, mPendingIntent);
addCommonExtras(context, mwmIntent);
return mwmIntent;
}
/**
* @Hidden
* This method is internal only.
* Used for compatibility.
*/
MwmRequest setPoints(MWMPoint[] points)
{
return setPoints(Arrays.asList(points));
}
// Below are utilities from MapsWithMeApi because we are not "Feature Envy"
private static StringBuilder createMwmUrl(Context context, String title, double zoomLevel, List<MWMPoint> points)
{
final StringBuilder urlBuilder = new StringBuilder("mapswithme://map?");
// version
urlBuilder.append("v=").append(Const.API_VERSION).append("&");
// back url, always not null
urlBuilder.append("backurl=").append(getCallbackAction(context)).append("&");
// title
appendIfNotNull(urlBuilder, "appname", title);
// zoom
appendIfNotNull(urlBuilder, "z", isValidZoomLevel(zoomLevel) ? String.valueOf(zoomLevel) : null);
// points
for (final MWMPoint point : points)
{
if (point != null)
{
urlBuilder.append("ll=").append(String.format(Locale.US, "%f,%f&", point.getLat(), point.getLon()));
appendIfNotNull(urlBuilder, "n", point.getName());
appendIfNotNull(urlBuilder, "id", point.getId());
appendIfNotNull(urlBuilder, "s", point.getStyleForUrl());
}
}
return urlBuilder;
}
private static String getCallbackAction(Context context)
{
return Const.CALLBACK_PREFIX + context.getPackageName();
}
@SuppressLint("NewApi")
private static Intent addCommonExtras(Context context, Intent intent)
{
intent.putExtra(Const.EXTRA_CALLER_APP_INFO, context.getApplicationInfo());
intent.putExtra(Const.EXTRA_API_VERSION, Const.API_VERSION);
return intent;
}
private static StringBuilder appendIfNotNull(StringBuilder builder, String key, String value)
{
if (value != null)
builder.append(key).append("=").append(Uri.encode(value)).append("&");
return builder;
}
private static boolean isValidZoomLevel(double zoom)
{
return zoom >= MapsWithMeApi.ZOOM_MIN && zoom <= MapsWithMeApi.ZOOM_MAX;
}
}