package org.mtransit.android.util;
import org.mtransit.android.R;
import org.mtransit.android.commons.ColorUtils;
import org.mtransit.android.commons.MTLog;
import org.mtransit.android.commons.ResourceUtils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.util.LruCache;
import android.util.Pair;
import android.view.ViewGroup;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
public final class MapUtils implements MTLog.Loggable {
private static final String TAG = MapUtils.class.getSimpleName();
@Override
public String getLogTag() {
return TAG;
}
public static final int MAP_TYPE_NORMAL = GoogleMap.MAP_TYPE_NORMAL;
public static final int MAP_TYPE_SATELLITE = GoogleMap.MAP_TYPE_HYBRID;
public static final String PREFS_LCL_MAP_TYPE = "pMapType";
public static final int PREFS_LCL_MAP_TYPE_DEFAULT = MAP_TYPE_NORMAL;
public static final int DEFAULT_MARKET_COLOR = Color.WHITE;
private static final String MAP_DIRECTION_URL_PART_1 = "http://maps.google.com/maps";
private static final String MAP_DIRECTION_URL_SOURCE_ADDRESS_PARAM = "saddr";
private static final String MAP_DIRECTION_URL_DESTINATION_ADDRESS_PARAM = "daddr";
private static final String MAP_DIRECTION_URL_DIRECTION_FLAG_PARAM = "dirflg";
private static final String MAP_DIRECTION_URL_DIRECTION_FLAG_PARAM_PUBLIC_TRANSIT_VALUE = "r";
public static void showDirection(Activity activity, double lat, double lng, Double optStartLat, Double optStartLng, String optQuery) {
Uri gmmIntentUri = Uri.parse(MAP_DIRECTION_URL_PART_1);
if (optStartLat != null && optStartLng != null) {
gmmIntentUri = gmmIntentUri.buildUpon().appendQueryParameter(MAP_DIRECTION_URL_SOURCE_ADDRESS_PARAM, optStartLat + "," + optStartLng).build();
}
gmmIntentUri = gmmIntentUri.buildUpon().appendQueryParameter(MAP_DIRECTION_URL_DESTINATION_ADDRESS_PARAM, lat + "," + lng).build();
gmmIntentUri = gmmIntentUri.buildUpon()
.appendQueryParameter(MAP_DIRECTION_URL_DIRECTION_FLAG_PARAM, MAP_DIRECTION_URL_DIRECTION_FLAG_PARAM_PUBLIC_TRANSIT_VALUE).build();
startMapIntent(activity, gmmIntentUri);
}
private static final String GOOGLE_MAPS_PKG = "com.google.android.apps.maps";
private static void startMapIntent(Activity activity, Uri gmmIntentUri) {
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage(GOOGLE_MAPS_PKG);
String label = activity.getString(R.string.google_maps);
if (mapIntent.resolveActivity(activity.getPackageManager()) == null) {
mapIntent.setPackage(null); // clear Google Maps targeting
label = activity.getString(R.string.map);
}
LinkUtils.open(activity, mapIntent, label, false);
}
private static final int MAP_WITH_BUTTONS_CAMERA_PADDING_IN_SP = 64;
private static Integer mapWithButtonsCameraPaddingInPx = null;
public static int getMapWithButtonsCameraPaddingInPx(Context context) {
if (mapWithButtonsCameraPaddingInPx == null) {
mapWithButtonsCameraPaddingInPx = (int) ResourceUtils.convertSPtoPX(context, MAP_WITH_BUTTONS_CAMERA_PADDING_IN_SP);
}
return mapWithButtonsCameraPaddingInPx;
}
private static final int MAP_WITHOUT_BUTTONS_CAMERA_PADDING_IN_SP = 32;
private static Integer mapWithoutButtonsCameraPaddingInPx = null;
public static int getMapWithoutButtonsCameraPaddingInPx(Context context) {
if (mapWithoutButtonsCameraPaddingInPx == null) {
mapWithoutButtonsCameraPaddingInPx = (int) ResourceUtils.convertSPtoPX(context, MAP_WITHOUT_BUTTONS_CAMERA_PADDING_IN_SP);
}
return mapWithoutButtonsCameraPaddingInPx;
}
public static void fixScreenFlickering(ViewGroup viewGroup) {
// https://code.google.com/p/gmaps-api-issues/issues/detail?id=4639
if (viewGroup == null) {
return;
}
viewGroup.requestTransparentRegion(viewGroup);
}
private static LruCache<Pair<Integer, Integer>, BitmapDescriptor> cache = new LruCache<Pair<Integer, Integer>, BitmapDescriptor>(128);
public static BitmapDescriptor getIcon(Context context, int iconResId, int color) {
Pair<Integer, Integer> key = new Pair<Integer, Integer>(iconResId, color);
if (color == Color.BLACK) {
color = Color.DKGRAY; // black is too dark to colorize bitmap;
}
BitmapDescriptor cachedBitmap = cache.get(key);
if (cachedBitmap != null) {
return cachedBitmap;
}
Bitmap newBase = ColorUtils.colorizeBitmapResource(context, color, iconResId);
BitmapDescriptor newBitmapDescriptor = BitmapDescriptorFactory.fromBitmap(newBase);
cache.put(key, newBitmapDescriptor);
return newBitmapDescriptor;
}
}