packages/apps/Dialer/java/com/android/incallui/calllocation/impl/LocationUrlBuilder.java

178 lines
6.4 KiB
Java
Raw Normal View History

2025-08-25 08:38:42 +08:00
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.incallui.calllocation.impl;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.location.Location;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import java.util.Locale;
class LocationUrlBuilder {
// Static Map API path constants.
private static final String HTTPS_SCHEME = "https";
private static final String MAPS_API_DOMAIN = "maps.googleapis.com";
private static final String MAPS_PATH = "maps";
private static final String API_PATH = "api";
private static final String STATIC_MAP_PATH = "staticmap";
private static final String GEOCODE_PATH = "geocode";
private static final String GEOCODE_OUTPUT_TYPE = "json";
// Static Map API parameter constants.
private static final String KEY_PARAM_KEY = "key";
private static final String CENTER_PARAM_KEY = "center";
private static final String ZOOM_PARAM_KEY = "zoom";
private static final String SCALE_PARAM_KEY = "scale";
private static final String SIZE_PARAM_KEY = "size";
private static final String MARKERS_PARAM_KEY = "markers";
private static final String ZOOM_PARAM_VALUE = Integer.toString(16);
private static final String LAT_LONG_DELIMITER = ",";
private static final String MARKER_DELIMITER = "|";
private static final String MARKER_STYLE_DELIMITER = ":";
private static final String MARKER_STYLE_COLOR = "color";
private static final String MARKER_STYLE_COLOR_RED = "red";
private static final String LAT_LNG_PARAM_KEY = "latlng";
private static final String ANDROID_API_KEY_VALUE = "AIzaSyAXdDnif6B7sBYxU8hzw9qAp3pRPVHs060";
private static final String BROWSER_API_KEY_VALUE = "AIzaSyBfLlvWYndiQ3RFEHli65qGQH36QIxdyCI";
/**
* Generates the URL to a static map image for the given location.
*
* <p>This image has the following characteristics:
*
* <p>- It is centered at the given latitude and longitutde. - It is scaled according to the
* device's pixel density. - There is a red marker at the given latitude and longitude.
*
* <p>Source: https://developers.google.com/maps/documentation/staticmaps/
*
* @param contxt The context.
* @param Location A location.
* @return The URL of a static map image url of the given location.
*/
public static String getStaticMapUrl(Context context, Location location) {
final Uri.Builder builder = new Uri.Builder();
Resources res = context.getResources();
String size =
res.getDimensionPixelSize(R.dimen.location_map_width)
+ "x"
+ res.getDimensionPixelSize(R.dimen.location_map_height);
builder
.scheme(HTTPS_SCHEME)
.authority(MAPS_API_DOMAIN)
.appendPath(MAPS_PATH)
.appendPath(API_PATH)
.appendPath(STATIC_MAP_PATH)
.appendQueryParameter(CENTER_PARAM_KEY, getFormattedLatLng(location))
.appendQueryParameter(ZOOM_PARAM_KEY, ZOOM_PARAM_VALUE)
.appendQueryParameter(SIZE_PARAM_KEY, size)
.appendQueryParameter(SCALE_PARAM_KEY, Float.toString(res.getDisplayMetrics().density))
.appendQueryParameter(MARKERS_PARAM_KEY, getMarkerUrlParamValue(location))
.appendQueryParameter(KEY_PARAM_KEY, ANDROID_API_KEY_VALUE);
return builder.build().toString();
}
/**
* Generates the URL for a request to reverse geocode the given location.
*
* <p>Source: https://developers.google.com/maps/documentation/geocoding/#ReverseGeocoding
*
* @param Location A location.
*/
public static String getReverseGeocodeUrl(Location location) {
final Uri.Builder builder = new Uri.Builder();
builder
.scheme(HTTPS_SCHEME)
.authority(MAPS_API_DOMAIN)
.appendPath(MAPS_PATH)
.appendPath(API_PATH)
.appendPath(GEOCODE_PATH)
.appendPath(GEOCODE_OUTPUT_TYPE)
.appendQueryParameter(LAT_LNG_PARAM_KEY, getFormattedLatLng(location))
.appendQueryParameter(KEY_PARAM_KEY, BROWSER_API_KEY_VALUE);
return builder.build().toString();
}
public static Intent getShowMapIntent(
Location location, @Nullable CharSequence addressLine1, @Nullable CharSequence addressLine2) {
String latLong = getFormattedLatLng(location);
String url = String.format(Locale.US, "geo: %s?q=%s", latLong, latLong);
// Add a map label
if (addressLine1 != null) {
if (addressLine2 != null) {
url +=
String.format(Locale.US, "(%s, %s)", addressLine1.toString(), addressLine2.toString());
} else {
url += String.format(Locale.US, "(%s)", addressLine1.toString());
}
} else {
// TODO(mdooley): i18n
url +=
String.format(
Locale.US,
"(Latitude: %f, Longitude: %f)",
location.getLatitude(),
location.getLongitude());
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setPackage("com.google.android.apps.maps");
return intent;
}
/**
* Returns a comma-separated latitude and longitude pair, formatted for use as a URL parameter
* value.
*
* @param location A location.
* @return The comma-separated latitude and longitude pair of that location.
*/
@VisibleForTesting
static String getFormattedLatLng(Location location) {
return location.getLatitude() + LAT_LONG_DELIMITER + location.getLongitude();
}
/**
* Returns the URL parameter value for the marker, specifying its style and position.
*
* @param location A location.
* @return The URL parameter value for the marker.
*/
@VisibleForTesting
static String getMarkerUrlParamValue(Location location) {
return MARKER_STYLE_COLOR
+ MARKER_STYLE_DELIMITER
+ MARKER_STYLE_COLOR_RED
+ MARKER_DELIMITER
+ getFormattedLatLng(location);
}
}