[android] - harden offline region creation, add include method, expose world bounds, update tests (#8517)
This commit is contained in:
@@ -5,12 +5,16 @@ import android.os.Parcelable;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.mapbox.mapboxsdk.exceptions.InvalidLatLngBoundsException;
|
||||
import com.mapbox.services.android.telemetry.constants.GeoConstants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A geographical area representing a latitude/longitude aligned rectangle.
|
||||
* <p>
|
||||
* This class does not wrap values to the world bounds.
|
||||
* </p>
|
||||
*/
|
||||
public class LatLngBounds implements Parcelable {
|
||||
|
||||
@@ -36,6 +40,18 @@ public class LatLngBounds implements Parcelable {
|
||||
this.mLonWest = westLongitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the world bounds.
|
||||
*
|
||||
* @return the bounds representing the world
|
||||
*/
|
||||
public static LatLngBounds world() {
|
||||
return new LatLngBounds.Builder()
|
||||
.include(new LatLng(GeoConstants.MAX_LATITUDE, GeoConstants.MAX_LONGITUDE))
|
||||
.include(new LatLng(GeoConstants.MIN_LATITUDE, GeoConstants.MIN_LONGITUDE))
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the centerpoint of this LatLngBounds by simple interpolation and returns
|
||||
* it as a point. This is a non-geodesic calculation which is not the geographic center.
|
||||
@@ -47,22 +63,78 @@ public class LatLngBounds implements Parcelable {
|
||||
(this.mLonEast + this.mLonWest) / 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the north latitude value of this bounds.
|
||||
*
|
||||
* @return double latitude value for north
|
||||
*/
|
||||
public double getLatNorth() {
|
||||
return this.mLatNorth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the south latitude value of this bounds.
|
||||
*
|
||||
* @return double latitude value for south
|
||||
*/
|
||||
public double getLatSouth() {
|
||||
return this.mLatSouth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the east longitude value of this bounds.
|
||||
*
|
||||
* @return double longitude value for east
|
||||
*/
|
||||
public double getLonEast() {
|
||||
return this.mLonEast;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the west longitude value of this bounds.
|
||||
*
|
||||
* @return double longitude value for west
|
||||
*/
|
||||
public double getLonWest() {
|
||||
return this.mLonWest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latitude-longitude pair of the south west corner of this bounds.
|
||||
*
|
||||
* @return LatLng of the south west corner
|
||||
*/
|
||||
public LatLng getSouthWest() {
|
||||
return new LatLng(mLatSouth, mLonWest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latitude-longitude paur if the north east corner of this bounds.
|
||||
*
|
||||
* @return LatLng of the north east corner
|
||||
*/
|
||||
public LatLng getNorthEast() {
|
||||
return new LatLng(mLatNorth, mLonEast);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latitude-longitude pair of the south east corner of this bounds.
|
||||
*
|
||||
* @return LatLng of the south east corner
|
||||
*/
|
||||
public LatLng getSouthEast() {
|
||||
return new LatLng(mLatSouth, mLonEast);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latitude-longitude pair of the north west corner of this bounds.
|
||||
*
|
||||
* @return LatLng of the north west corner
|
||||
*/
|
||||
public LatLng getNorthWest() {
|
||||
return new LatLng(mLatNorth, mLonWest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the area spanned by this LatLngBounds
|
||||
*
|
||||
@@ -133,8 +205,27 @@ public class LatLngBounds implements Parcelable {
|
||||
return new LatLngBounds(maxLat, maxLon, minLat, minLon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of LatLng objects resembling this bounds.
|
||||
*
|
||||
* @return an array of 2 LatLng objects.
|
||||
*/
|
||||
public LatLng[] toLatLngs() {
|
||||
return new LatLng[] {new LatLng(mLatNorth, mLonEast), new LatLng(mLatSouth, mLonWest)};
|
||||
return new LatLng[] {getNorthEast(), getSouthWest()};
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a LatLngBounds from current bounds with an additional latitude-longitude pair.
|
||||
*
|
||||
* @param latLng the latitude lognitude pair to include in the bounds.
|
||||
* @return the newly constructed bounds
|
||||
*/
|
||||
public LatLngBounds include(LatLng latLng) {
|
||||
return new LatLngBounds.Builder()
|
||||
.include(getNorthEast())
|
||||
.include(getSouthWest())
|
||||
.include(latLng)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -159,19 +250,28 @@ public class LatLngBounds implements Parcelable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether this LatLngBounds contains a point and the point
|
||||
* does not touch its boundary.
|
||||
* Determines whether this LatLngBounds contains a point.
|
||||
*
|
||||
* @param latLng the point which may be contained
|
||||
* @return true, if the point is contained within the box.
|
||||
* @return true, if the point is contained within the bounds
|
||||
*/
|
||||
public boolean contains(final ILatLng latLng) {
|
||||
final double latitude = latLng.getLatitude();
|
||||
final double longitude = latLng.getLongitude();
|
||||
return ((latitude < this.mLatNorth)
|
||||
&& (latitude > this.mLatSouth))
|
||||
&& ((longitude < this.mLonEast)
|
||||
&& (longitude > this.mLonWest));
|
||||
return ((latitude <= this.mLatNorth)
|
||||
&& (latitude >= this.mLatSouth))
|
||||
&& ((longitude <= this.mLonEast)
|
||||
&& (longitude >= this.mLonWest));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether this LatLngBounds contains another bounds.
|
||||
*
|
||||
* @param other the bounds which may be contained
|
||||
* @return true, if the bounds is contained within the bounds
|
||||
*/
|
||||
public boolean contains(final LatLngBounds other) {
|
||||
return contains(other.getNorthEast()) && contains(other.getSouthWest());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,6 +5,8 @@ import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.mapbox.mapboxsdk.R;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
|
||||
import com.mapbox.mapboxsdk.net.ConnectivityReceiver;
|
||||
import com.mapbox.mapboxsdk.storage.FileSource;
|
||||
|
||||
@@ -26,7 +28,6 @@ public class OfflineManager {
|
||||
System.loadLibrary("mapbox-gl");
|
||||
}
|
||||
|
||||
|
||||
// Native peer pointer
|
||||
private long nativePtr;
|
||||
|
||||
@@ -139,7 +140,8 @@ public class OfflineManager {
|
||||
*
|
||||
* @param callback the callback to be invoked
|
||||
*/
|
||||
public void listOfflineRegions(@NonNull final ListOfflineRegionsCallback callback) {
|
||||
public void listOfflineRegions(@NonNull
|
||||
final ListOfflineRegionsCallback callback) {
|
||||
listOfflineRegions(fileSource, new ListOfflineRegionsCallback() {
|
||||
|
||||
@Override
|
||||
@@ -180,10 +182,15 @@ public class OfflineManager {
|
||||
* @param metadata the metadata in bytes
|
||||
* @param callback the callback to be invoked
|
||||
*/
|
||||
public void createOfflineRegion(
|
||||
@NonNull OfflineRegionDefinition definition,
|
||||
@NonNull byte[] metadata,
|
||||
@NonNull final CreateOfflineRegionCallback callback) {
|
||||
public void createOfflineRegion(@NonNull OfflineRegionDefinition definition, @NonNull byte[] metadata,
|
||||
final CreateOfflineRegionCallback callback) {
|
||||
if (!isValidOfflineRegionDefinition(definition)) {
|
||||
callback.onError(
|
||||
String.format(context.getString(R.string.mapbox_offline_error_region_definition_invalid),
|
||||
definition.getBounds())
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
ConnectivityReceiver.instance(context).activate();
|
||||
createOfflineRegion(fileSource, definition, metadata, new CreateOfflineRegionCallback() {
|
||||
@@ -212,6 +219,16 @@ public class OfflineManager {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates if the offline region definition bounds is valid for an offline region download.
|
||||
*
|
||||
* @param definition the offline region definition
|
||||
* @return true if the region fits the world bounds.
|
||||
*/
|
||||
private boolean isValidOfflineRegionDefinition(OfflineRegionDefinition definition) {
|
||||
return LatLngBounds.world().contains(definition.getBounds());
|
||||
}
|
||||
|
||||
/*
|
||||
* Changing or bypassing this limit without permission from Mapbox is prohibited
|
||||
* by the Mapbox Terms of Service.
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
package com.mapbox.mapboxsdk.offline;
|
||||
|
||||
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
|
||||
|
||||
/**
|
||||
* This is the interface that all Offline Region definitions have to implement.
|
||||
* <p>
|
||||
* For the present, a tile pyramid is the only type of offline region.
|
||||
*/
|
||||
public interface OfflineRegionDefinition {
|
||||
|
||||
LatLngBounds getBounds();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user