diff options
author | Tobrun <tobrun@mapbox.com> | 2016-04-20 10:31:57 +0200 |
---|---|---|
committer | Tobrun <tobrun@mapbox.com> | 2016-04-23 07:16:37 +0200 |
commit | f469cee1b4f39137264ebae277ab405d1e3e7c3b (patch) | |
tree | 6431c710e679041633b74583f9f00ec64922a047 | |
parent | f40715d05e38c78f94318a5e90cd2145b485c695 (diff) | |
download | qtlocation-mapboxgl-f469cee1b4f39137264ebae277ab405d1e3e7c3b.tar.gz |
[android] #4396 - fixup mason build issue
16 files changed, 716 insertions, 96 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index c61b98926b..c9878f8751 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -79,7 +79,10 @@ import com.mapbox.mapboxsdk.exceptions.TelemetryServiceNotConfiguredException; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.layers.CustomLayer; +import com.mapbox.mapboxsdk.location.LocationListener; +import com.mapbox.mapboxsdk.location.LocationServices; import com.mapbox.mapboxsdk.maps.widgets.CompassView; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; import com.mapbox.mapboxsdk.maps.widgets.UserLocationView; import com.mapbox.mapboxsdk.telemetry.MapboxEvent; import com.mapbox.mapboxsdk.telemetry.MapboxEventManager; @@ -261,6 +264,7 @@ public class MapView extends FrameLayout { mMapboxMap.setStyleUrl(style); } + mMapboxMap.setMyLocationEnabled(options.getLocationEnabled()); // Enable gestures @@ -592,6 +596,7 @@ public class MapView extends FrameLayout { mNativeMapView.setPitch(pitch, actualDuration); } + // // Direction // @@ -1104,18 +1109,28 @@ public class MapView extends FrameLayout { return; } - if (left == mContentPaddingLeft && top == mContentPaddingTop && right == mContentPaddingRight && bottom == mContentPaddingBottom) { - return; - } +// if (left == mContentPaddingLeft && top == mContentPaddingTop && right == mContentPaddingRight && bottom == mContentPaddingBottom) { +// return; +// } mContentPaddingLeft = left; mContentPaddingTop = top; mContentPaddingRight = right; mContentPaddingBottom = bottom; + int[] userLocationViewPadding = mMapboxMap.getMyLocationViewSettings().getPadding(); + left += userLocationViewPadding[0]; + top += userLocationViewPadding[1]; + right += userLocationViewPadding[2]; + bottom += userLocationViewPadding[3]; + mNativeMapView.setContentPadding(top / mScreenDensity, left / mScreenDensity, bottom / mScreenDensity, right / mScreenDensity); } + public void invalidateContentPadding() { + setContentPadding(mContentPaddingLeft, mContentPaddingTop, mContentPaddingRight, mContentPaddingBottom); + } + double getMetersPerPixelAtLatitude(@FloatRange(from = -180, to = 180) double latitude) { if (mDestroyed) { return 0; @@ -1544,11 +1559,7 @@ public class MapView extends FrameLayout { zoom(true, e.getX(), e.getY()); } else { // Zoom in on user location view - - // TODO fix padding issue -// PointF centerPoint = mUserLocationView.getMarkerScreenPoint(); -// zoom(true, centerPoint.x, centerPoint.y); - zoom(true, getWidth() / 2, getHeight() / 2); + zoom(true, mUserLocationView.getCenterX(), mUserLocationView.getCenterY()); } break; } @@ -2334,8 +2345,13 @@ public class MapView extends FrameLayout { return mUserLocationView.getLocation(); } - void setOnMyLocationChangeListener(@Nullable MapboxMap.OnMyLocationChangeListener listener) { - mUserLocationView.setOnMyLocationChangeListener(listener); + void setOnMyLocationChangeListener(@Nullable final MapboxMap.OnMyLocationChangeListener listener) { + LocationServices.getLocationServices(getContext()).addLocationListener(new LocationListener() { + @Override + public void onLocationChanged(Location location) { + listener.onMyLocationChange(location); + } + }); } void setMyLocationTrackingMode(@MyLocationTracking.Mode int myLocationTrackingMode) { @@ -2491,6 +2507,10 @@ public class MapView extends FrameLayout { mMapboxMap = mapboxMap; } + UserLocationView getUserLocationView() { + return mUserLocationView; + } + @UiThread void snapshot(@NonNull final MapboxMap.SnapshotReadyCallback callback, @Nullable final Bitmap bitmap) { final TextureView textureView = (TextureView) findViewById(R.id.textureView); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index c929271bf9..2df391c7ff 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -32,6 +32,7 @@ import com.mapbox.mapboxsdk.constants.MyLocationTracking; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.layers.CustomLayer; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; import java.util.ArrayList; import java.util.List; @@ -51,6 +52,7 @@ public class MapboxMap { private MapView mMapView; private UiSettings mUiSettings; private TrackingSettings mTrackingSettings; + private MyLocationViewSettings myLocationViewSettings; private Projection mProjection; private CameraPosition mCameraPosition; private boolean mInvalidCameraPosition; @@ -188,6 +190,20 @@ public class MapboxMap { } // + // MyLocationViewSettings + // + + /** + * Gets the settings of the user location for the map. + */ + public MyLocationViewSettings getMyLocationViewSettings() { + if (myLocationViewSettings == null) { + myLocationViewSettings = new MyLocationViewSettings(mMapView); + } + return myLocationViewSettings; + } + + // // Projection // @@ -727,7 +743,7 @@ public class MapboxMap { Polyline polyline; List<Polyline> polylines = new ArrayList<>(count); - if(count>0) { + if (count > 0) { for (PolylineOptions options : polylineOptionsList) { polyline = options.getPolyline(); if (!polyline.getPoints().isEmpty()) { @@ -791,7 +807,7 @@ public class MapboxMap { Polygon polygon; List<Polygon> polygons = new ArrayList<>(count); - if(count>0) { + if (count > 0) { for (PolygonOptions polygonOptions : polygonOptionsList) { polygon = polygonOptions.getPolygon(); if (!polygon.getPoints().isEmpty()) { @@ -802,7 +818,7 @@ public class MapboxMap { long[] ids = mMapView.addPolygons(polygons); // if unit tests or polygons correcly added to map - if(ids==null || ids.length==polygons.size()) { + if (ids == null || ids.length == polygons.size()) { long id = 0; for (int i = 0; i < polygons.size(); i++) { polygon = polygons.get(i); @@ -931,7 +947,7 @@ public class MapboxMap { * Removes all markers, polylines, polygons, overlays, etc from the map. */ @UiThread - public void clear(){ + public void clear() { removeAnnotations(); } @@ -1491,11 +1507,11 @@ public class MapboxMap { return mMapView; } - void setUiSettings(UiSettings uiSettings){ + void setUiSettings(UiSettings uiSettings) { mUiSettings = uiSettings; } - void setProjection(Projection projection){ + void setProjection(Projection projection) { mProjection = projection; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java index 44f113e70e..8bd4112434 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java @@ -5,6 +5,8 @@ import android.support.annotation.UiThread; import android.view.Gravity; import android.view.View; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; + /** * Settings for the user interface of a MapboxMap. To obtain this interface, call getUiSettings(). */ @@ -12,6 +14,7 @@ public class UiSettings { private MapView mapView; + private MyLocationViewSettings myLocationViewSettings; private ViewSettings compassSettings; private ViewSettings logoSettings; private ViewSettings attributionSettings; @@ -544,4 +547,12 @@ public class UiSettings { mapView.setCompassMargins(getCompassMarginLeft(), getCompassMarginTop(), getCompassMarginRight(), getCompassMarginBottom()); mapView.setAttributionMargins(getAttributionMarginLeft(), getAttributionMarginTop(), getAttributionMarginRight(), getAttributionMarginBottom()); } + + public MyLocationViewSettings getMyLocationViewSettings() { + return myLocationViewSettings; + } + + public void setMyLocationViewSettings(MyLocationViewSettings myLocationViewSettings) { + this.myLocationViewSettings = myLocationViewSettings; + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettings.java new file mode 100644 index 0000000000..ca95dbc7df --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettings.java @@ -0,0 +1,148 @@ +package com.mapbox.mapboxsdk.maps.widgets; + +import android.graphics.drawable.Drawable; +import android.support.annotation.ColorInt; +import android.support.annotation.IntRange; + +import com.mapbox.mapboxsdk.R; +import com.mapbox.mapboxsdk.maps.MapView; + +public class MyLocationViewSettings { + + private MapView mapView; + private UserLocationView userLocationView; + + // + // State + // + + private boolean enabled; + + // + // Foreground + // + + private Drawable foregroundDrawable; + private Drawable foregroundBearingDrawable; + + @ColorInt + private int foregroundTintColor; + + // + // Background + // + + private Drawable backgroundDrawable; + private int[] backgroundOffset = new int[4]; + + @ColorInt + private int backgroundTintColor; + + // + // Accuracy + // + + private int arruracyAlpha; + + @ColorInt + private int accuracyTintColor; + + // + // Padding + // + + private int[] padding = new int[4]; + + public MyLocationViewSettings(MapView mapView) { + this.mapView = mapView; + this.userLocationView = (UserLocationView) mapView.findViewById(R.id.userLocationView); + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + userLocationView.setEnabled(enabled); + } + + public void setForegroundDrawable(Drawable foregroundDrawable, Drawable foregroundBearingDrawable) { + this.foregroundDrawable = foregroundDrawable; + this.foregroundBearingDrawable = foregroundBearingDrawable; + userLocationView.setForegroundDrawables(foregroundDrawable, foregroundBearingDrawable); + } + + public Drawable getForegroundDrawable() { + return foregroundDrawable; + } + + public Drawable getForegroundBearingDrawable() { + return foregroundBearingDrawable; + } + + public void setForegroundTintColor(@ColorInt int foregroundTintColor) { + this.foregroundTintColor = foregroundTintColor; + userLocationView.setForegroundDrawableTint(foregroundTintColor); + } + + public int getForegroundTintColor() { + return foregroundTintColor; + } + + public void setBackgroundDrawable(Drawable backgroundDrawable) { + this.backgroundDrawable = backgroundDrawable; + userLocationView.setShadowDrawable(backgroundDrawable); + } + + public Drawable getBackgroundDrawable() { + return backgroundDrawable; + } + + public void setBackgroundTintColor(@ColorInt int backgroundTintColor) { + this.backgroundTintColor = backgroundTintColor; + userLocationView.setShadowDrawableTint(backgroundTintColor); + } + + public int getBackgroundTintColor() { + return backgroundTintColor; + } + + public void setBackgroundOffset(int left, int top, int right, int bottom) { + backgroundOffset = new int[]{left, top, right, bottom}; + userLocationView.setShadowDrawable(backgroundDrawable, left, top, right, bottom); + } + + public int[] getBackgroundOffset() { + return backgroundOffset; + } + + public void setPadding(int left, int top, int right, int bottom) { + padding = new int[]{left, top, right, bottom}; + userLocationView.setContentPadding(padding); + mapView.invalidateContentPadding(); + } + + public int[] getPadding() { + return padding; + } + + public int getAccuracyAlpha() { + return arruracyAlpha; + } + + public void setAccuracyAlpha(@IntRange(from = 0, to = 255) int arruracyAlpha) { + this.arruracyAlpha = arruracyAlpha; + userLocationView.setAccuracyAlpha(arruracyAlpha); + } + + public int getAccuracyTintColor() { + return accuracyTintColor; + } + + public void setAccuracyTintColor(@ColorInt int accuracyTintColor) { + this.accuracyTintColor = accuracyTintColor; + userLocationView.setAccuracyTint(accuracyTintColor); + } + +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java index cd663d663a..467b1f97e0 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java @@ -1,5 +1,7 @@ package com.mapbox.mapboxsdk.maps.widgets; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; @@ -19,10 +21,11 @@ import android.support.annotation.ColorInt; import android.support.annotation.FloatRange; import android.support.annotation.IntRange; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.View; +import android.view.animation.Animation; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -41,7 +44,7 @@ import java.lang.ref.WeakReference; /** * UI element overlaid on a map to show the user's location. */ -public final class UserLocationView extends View { +public class UserLocationView extends View { private LatLng latLng; private float gpsDirection; @@ -51,6 +54,8 @@ public final class UserLocationView extends View { private Drawable foregroundBearingDrawable; private Drawable backgroundDrawable; + private int[] contentPadding = new int[4]; + private MyBearingListener mBearingChangeListener; // Accuracy @@ -80,7 +85,15 @@ public final class UserLocationView extends View { private Location location; private UserLocationListener userLocationListener; - private ValueAnimator LocationChangeAnimator; + private ValueAnimator locationChangeAnimator; + private MarkerCoordinateAnimatorListener markerCoordinateAnimatorListener; + public LatLng interpolatedLocation; + public LatLng previousLocation; + + private float previousDirection; + + private long locationUpdateTimestamp; + private long locationUpdateDuration; public UserLocationView(Context context) { super(context); @@ -101,13 +114,11 @@ public final class UserLocationView extends View { setEnabled(false); userLocationBehaviour = new UserLocationBehaviourFactory().getBehaviouralModel(MyLocationTracking.TRACKING_NONE); - - LocationChangeAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); - LocationChangeAnimator.setDuration(1000); + markerCoordinateAnimatorListener = new MarkerCoordinateAnimatorListener(userLocationBehaviour); accuracyPaint = new Paint(); accuracyPaint.setColor(ContextCompat.getColor(context, R.color.mapbox_blue)); - accuracyPaint.setAlpha(80); + accuracyPaint.setAlpha(100); setShadowDrawable(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_shadow)); setForegroundDrawables(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_normal), ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_bearing)); @@ -153,8 +164,11 @@ public final class UserLocationView extends View { backgroundDrawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); } - public final void setAccurancyTint(@ColorInt int color, @IntRange(from = 0, to = 100) int alpha) { + public final void setAccuracyTint(@ColorInt int color) { accuracyPaint.setColor(color); + } + + public final void setAccuracyAlpha(@IntRange(from = 0, to = 255) int alpha) { accuracyPaint.setAlpha(alpha); } @@ -256,7 +270,7 @@ public final class UserLocationView extends View { } void updateOnNextFrame() { -// mapboxMap.invalidate(); + mapboxMap.invalidate(); } public void onPause() { @@ -299,12 +313,11 @@ public final class UserLocationView extends View { * @param enableGps true if GPS is to be enabled, false if GPS is to be disabled */ private void toggleGps(boolean enableGps) { - LocationServices locationServices = LocationServices.getLocationServices(getContext()); - if (enableGps) { // Set an initial location if one available Location lastLocation = locationServices.getLastLocation(); + if (lastLocation != null) { location = lastLocation; } @@ -313,13 +326,10 @@ public final class UserLocationView extends View { userLocationListener = new UserLocationListener(this); } - // Register for Location Updates locationServices.addLocationListener(userLocationListener); } else { // Disable location and user dot location = null; - - // Deregister for Location Updates locationServices.removeLocationListener(userLocationListener); } @@ -340,12 +350,6 @@ public final class UserLocationView extends View { userLocationBehaviour.update(location); } - public void setOnMyLocationChangeListener(@Nullable MapboxMap.OnMyLocationChangeListener listener) { - // todo deprecate this - // onMyLocationChangeListener = listener; - } - - public void setMyBearingTrackingMode(@MyBearingTracking.Mode int myBearingTrackingMode) { this.myBearingTrackingMode = myBearingTrackingMode; if (myBearingTrackingMode == MyBearingTracking.COMPASS) { @@ -377,8 +381,6 @@ public final class UserLocationView extends View { private void setCompass(float bearing) { if (myLocationTrackingMode == MyLocationTracking.TRACKING_NONE) { -// // animate marker -//// showDirection = true; float oldDir = compassDirection; float newDir = bearing; float diff = oldDir - newDir; @@ -389,21 +391,21 @@ public final class UserLocationView extends View { } compassDirection = newDir; invalidate(); - - } else if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { -// cancelAnimations(); -// if (myBearingTrackingMode == MyBearingTracking.COMPASS) { -// // always show north & change map gpsDirection -// showDirection = true; -// gpsDirection = 0; -// compassDirection = 0; -// update(); -// } - } else { -// showDirection = false; } } + public float getCenterX() { + return getX() + getMeasuredWidth() / 2; + } + + public float getCenterY() { + return getY() + getMeasuredHeight() / 2; + } + + public void setContentPadding(int[] padding) { + contentPadding = padding; + } + private static class UserLocationListener implements LocationListener { private WeakReference<UserLocationView> mUserLocationView; @@ -466,10 +468,6 @@ public final class UserLocationView extends View { mSensorManager.unregisterListener(this, mMagnetometer); } - public float getCompassBearing() { - return mCurrentDegree; - } - @Override public void onSensorChanged(SensorEvent event) { if (paused) { @@ -522,12 +520,11 @@ public final class UserLocationView extends View { private double mToLat; private double mToLng; - private MarkerCoordinateAnimatorListener(UserLocationBehaviour behaviour, LatLng from, LatLng to) { + private double mCurrentLat; + private double mCurrentLon; + + private MarkerCoordinateAnimatorListener(UserLocationBehaviour behaviour) { this.behaviour = behaviour; - mFromLat = from.getLatitude(); - mFromLng = from.getLongitude(); - mToLat = to.getLatitude(); - mToLng = to.getLongitude(); } @Override @@ -536,8 +533,21 @@ public final class UserLocationView extends View { double latitude = mFromLat + (mToLat - mFromLat) * frac; double longitude = mFromLng + (mToLng - mFromLng) * frac; behaviour.update(latitude, longitude); + mCurrentLat = latitude; + mCurrentLon = longitude; updateOnNextFrame(); } + + public LatLng getLatLng() { + return new LatLng(mCurrentLat, mCurrentLon); + } + + public void update() { + mFromLat = mCurrentLat; + mFromLng = mCurrentLon; + mToLat = interpolatedLocation.getLatitude(); + mToLng = interpolatedLocation.getLongitude(); + } } private class UserLocationBehaviourFactory { @@ -556,52 +566,139 @@ public final class UserLocationView extends View { abstract void update(@NonNull Location location); public void update(double lat, double lon) { - latLng.setLatitude(lat); - latLng.setLongitude(lon); + if (latLng != null) { + latLng.setLatitude(lat); + latLng.setLongitude(lon); + } } abstract void invalidate(); - } private class UserLocationTrackingBehaviour extends UserLocationBehaviour { @Override void update(@NonNull Location location) { - if (latLng == null || !latLng.equals(new LatLng(location))) { + if (latLng == null) { + // first location fix latLng = new LatLng(location); - CameraPosition.Builder builder = new CameraPosition.Builder().target(latLng); - if (myBearingTrackingMode != MyBearingTracking.NONE && location.hasBearing()) { - builder.bearing(location.getBearing()); - } + locationUpdateTimestamp = SystemClock.elapsedRealtime(); + return; + } + + // update timestamp + long previousUpdateTimeStamp = locationUpdateTimestamp; + locationUpdateTimestamp = SystemClock.elapsedRealtime(); + + // calculate animation duration + long locationUpdateDuration; + if (previousUpdateTimeStamp == 0) { + locationUpdateDuration = 0; + } else { + // TODO remove 10 * hack to multiply duration to workaround easing interpolation (easeCamera) + locationUpdateDuration = 10 * (locationUpdateTimestamp - previousUpdateTimeStamp); + } + + // calculate interpolated location + previousLocation = latLng; + latLng = new LatLng(location); + interpolatedLocation = new LatLng((latLng.getLatitude() + previousLocation.getLatitude()) / 2, (latLng.getLongitude() + previousLocation.getLongitude()) / 2); + + // build new camera + CameraPosition.Builder builder = new CameraPosition.Builder().target(interpolatedLocation); - if (location.hasAccuracy()) { - accuracy = location.getAccuracy(); + // add direction + if (myBearingTrackingMode == MyBearingTracking.GPS){ + if(location.hasBearing()) { + builder.bearing(location.getBearing()); + gpsDirection = 0; } + } - gpsDirection = 0; - mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), 300, null); + // add accuracy + if (location.hasAccuracy()) { + accuracy = location.getAccuracy(); } + + // animate to new camera + mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), (int) locationUpdateDuration, null); } @Override void invalidate() { - int[] contentPadding = mapboxMap.getPadding(); + int[] mapPadding = mapboxMap.getPadding(); UiSettings uiSettings = mapboxMap.getUiSettings(); - // screenLocation = new PointF(x, y); - setX((uiSettings.getWidth() - getWidth() + contentPadding[0] - contentPadding[2]) / 2); - setY((uiSettings.getHeight() - getHeight() - contentPadding[3] + contentPadding[1]) / 2); + setX((uiSettings.getWidth() - getWidth() + mapPadding[0] - mapPadding[2]) / 2 + (contentPadding[0] - contentPadding[2]) / 2); + setY((uiSettings.getHeight() - getHeight() - mapPadding[3] + mapPadding[1]) / 2 + (contentPadding[1] - contentPadding[3]) / 2); } } private class UserLocationShowBehaviour extends UserLocationBehaviour { - private float previousDirection; - @Override - void update(@NonNull Location location) { - LatLng previousCoordinate = ((latLng == null) ? new LatLng(location) : latLng); + void update(@NonNull final Location location) { + + if (latLng == null) { + // first location update + latLng = new LatLng(location); + locationUpdateTimestamp = SystemClock.elapsedRealtime(); + return; + } + + // update location + previousLocation = latLng; latLng = new LatLng(location); + + // calculate update time + long previousUpdateTimeStamp = locationUpdateTimestamp; + locationUpdateTimestamp = SystemClock.elapsedRealtime(); + locationUpdateDuration = locationUpdateTimestamp - previousUpdateTimeStamp; + + // calculate interpolated entity + interpolatedLocation = new LatLng((latLng.getLatitude() + previousLocation.getLatitude()) / 2, (latLng.getLongitude() + previousLocation.getLongitude()) / 2); + + Log.v("TAG", "LOCATIONS " + previousLocation + " " + interpolatedLocation); + + + if (locationChangeAnimator == null) { + Log.v("TAG", "START"); + locationChangeAnimator = ValueAnimator.ofFloat(1.0f); +// locationChangeAnimator.setRepeatMode(ValueAnimator.RESTART); +// locationChangeAnimator.setRepeatCount(ValueAnimator.INFINITE); + locationChangeAnimator.setDuration(locationUpdateDuration + 500); + + markerCoordinateAnimatorListener = new MarkerCoordinateAnimatorListener(this); + markerCoordinateAnimatorListener.update(); + locationChangeAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + Log.v("TAG", "END"); + markerCoordinateAnimatorListener.update(); + } + + @Override + public void onAnimationRepeat(Animator animation) { + super.onAnimationRepeat(animation); + Log.v("TAG", "REPEAT@"); + markerCoordinateAnimatorListener.update(); + } + + @Override + public void onAnimationStart(Animator animation) { + super.onAnimationStart(animation); + Log.v("TAG","START"); + } + }); + locationChangeAnimator.addUpdateListener(markerCoordinateAnimatorListener); + } else { + Log.v("TAG", "CONTINUE"); + markerCoordinateAnimatorListener.update(); +// long currentPlayTime = locationChangeAnimator.getCurrentPlayTime(); +// locationChangeAnimator.setDuration(locationChangeAnimator.getDuration()+locationUpdateTimestamp); +// locationChangeAnimator.setCurrentPlayTime(currentPlayTime); + } + if (location.hasBearing()) { gpsDirection = clamp(location.getBearing() - (float) mapboxMap.getCameraPosition().bearing); } @@ -610,8 +707,10 @@ public final class UserLocationView extends View { accuracy = location.getAccuracy(); } - LocationChangeAnimator.addUpdateListener(new MarkerCoordinateAnimatorListener(this, previousCoordinate, latLng)); - LocationChangeAnimator.start(); + if (!locationChangeAnimator.isRunning()) { + locationChangeAnimator.start(); + } + } private float clamp(float direction) { @@ -629,10 +728,13 @@ public final class UserLocationView extends View { void invalidate() { PointF screenLocation = projection.toScreenLocation(latLng); if (screenLocation != null) { - setX(screenLocation.x - getWidth() / 2); - setY(screenLocation.y - getHeight() / 2); + setX((screenLocation.x - getWidth() / 2)); + setY((screenLocation.y - getHeight() / 2)); } } } + public class Anim extends Animation{ + + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index a6e1f044c8..f5bb81be27 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -17,7 +17,18 @@ <attr name="style_url" format="string" /> <attr name="access_token" format="string" /> <attr name="style_classes" format="string" /> + + <!-- My Location--> <attr name="my_location_enabled" format="boolean" /> + <attr name="my_location_tint" format="color" /> + <attr name="my_location_foreground" format="reference" /> + <attr name="my_location_background" format="reference" /> + <attr name="my_location_background_left" format="integer" /> + <attr name="my_location_background_top" format="integer" /> + <attr name="my_location_background_right" format="integer" /> + <attr name="my_location_background_bottom" format="integer" /> + + <!-- Compass --> <attr name="compass_enabled" format="boolean" /> <attr name="compass_gravity"> <flag name="top" value="0x30" /> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 72f65ba1ae..30c7ca7b25 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -121,9 +121,10 @@ android:name="@string/category" android:value="@string/category_camera" /> </activity> - <activity android:name=".activity.customlayer.CustomLayerActivity" - android:description="@string/description_custom_layer" - android:label="@string/activity_custom_layer"> + <activity + android:name=".activity.customlayer.CustomLayerActivity" + android:description="@string/description_custom_layer" + android:label="@string/activity_custom_layer"> <meta-data android:name="@string/category" android:value="@string/category_custom_layer" /> @@ -137,6 +138,14 @@ android:value="@string/category_userlocation" /> </activity> <activity + android:name=".activity.userlocation.MyLocationCustomisationActivity" + android:description="@string/description_user_location_customization" + android:label="@string/activity_user_tracking_mode"> + <meta-data + android:name="@string/category" + android:value="@string/category_userlocation" /> + </activity> + <activity android:name=".activity.annotation.PolygonActivity" android:description="@string/description_polygon" android:label="@string/activity_polygon"> @@ -192,7 +201,7 @@ android:label="@string/activity_debug_mode"> <meta-data android:name="@string/category" - android:value="@string/category_maplayout"/> + android:value="@string/category_maplayout" /> </activity> <activity android:name=".activity.offline.OfflineActivity" diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java index 72f1e0aed3..9d514b2870 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java @@ -6,8 +6,10 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.StringRes; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; @@ -120,7 +122,7 @@ public class FeatureOverviewActivity extends AppCompatActivity { for (ActivityInfo info : app.activities) { if (info.name.startsWith(packageName) && !info.name.equals(FeatureOverviewActivity.class.getName())) { String label = getString(info.labelRes); - String description = getString(info.descriptionRes); + String description = resolveString(info.descriptionRes); String category = resolveMetaData(info.metaData, metaDataKey); features.add(new Feature(info.name, label, description, category)); } @@ -147,6 +149,14 @@ public class FeatureOverviewActivity extends AppCompatActivity { return category; } + private String resolveString(@StringRes int stringRes){ + try{ + return getString(stringRes); + }catch (Resources.NotFoundException e){ + return "-"; + } + } + @Override protected void onPostExecute(List<Feature> features) { super.onPostExecute(features); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationCustomisationActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationCustomisationActivity.java new file mode 100644 index 0000000000..6be4a0f3c7 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationCustomisationActivity.java @@ -0,0 +1,177 @@ +package com.mapbox.mapboxsdk.testapp.activity.userlocation; + +import android.graphics.Color; +import android.location.Location; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.constants.Style; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.location.LocationListener; +import com.mapbox.mapboxsdk.location.LocationServices; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.MapboxMapOptions; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; +import com.mapbox.mapboxsdk.testapp.R; + +public class MyLocationCustomisationActivity extends AppCompatActivity implements LocationListener, OnMapReadyCallback { + + private MapView mMapView; + private MapboxMap mMapboxMap; + private Location mLocation; + + private Bundle savedState; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_location_customisation); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + } + + savedState = savedInstanceState; + + LocationServices locationServices = LocationServices.getLocationServices(this); + locationServices.addLocationListener(this); + locationServices.toggleGPS(true); + } + + @Override + public void onLocationChanged(Location location) { + if (location != null) { + if (mMapView == null) { + findViewById(R.id.progress).setVisibility(View.GONE); + + MapboxMapOptions mapboxMapOptions = new MapboxMapOptions(); + mapboxMapOptions.accessToken(getString(R.string.mapbox_access_token)); + mapboxMapOptions.styleUrl(Style.MAPBOX_STREETS); + mapboxMapOptions.locationEnabled(true); + mapboxMapOptions.camera(new CameraPosition.Builder() + .target(new LatLng(location)) + .zoom(11) + .tilt(25) + .build()); + + mMapView = new MapView(this, mapboxMapOptions); + ((ViewGroup) findViewById(R.id.container)).addView(mMapView); + + mMapView.onCreate(savedState); + mMapView.getMapAsync(this); + mMapView.onResume(); + mLocation = location; + } + } + } + + @Override + public void onMapReady(MapboxMap mapboxMap) { + MyLocationViewSettings locationViewSettings = mapboxMap.getMyLocationViewSettings(); + + locationViewSettings.setBackgroundTintColor(Color.YELLOW); + locationViewSettings.setBackgroundOffset(32, 32, 0, 0); + + locationViewSettings.setForegroundTintColor(Color.GREEN); + + locationViewSettings.setAccuracyTintColor(Color.RED); + locationViewSettings.setAccuracyAlpha(100); + } + + private void showSnackBar() { + String desc = "Loc Chg: "; + boolean noInfo = true; + if (mLocation.hasSpeed()) { + desc += String.format("Spd = %.1f km/h ", mLocation.getSpeed() * 3.6f); + noInfo = false; + } + if (mLocation.hasAltitude()) { + desc += String.format("Alt = %.0f m ", mLocation.getAltitude()); + noInfo = false; + } + if (noInfo) { + desc += "No extra info"; + } + Snackbar.make(findViewById(android.R.id.content), desc, Snackbar.LENGTH_SHORT).show(); + } + + @Override + public void onResume() { + super.onResume(); + if (mMapView != null) { + mMapView.onResume(); + } + } + + @Override + public void onPause() { + super.onPause(); + if (mMapView != null) { + mMapView.onPause(); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mMapView != null) { + mMapView.onSaveInstanceState(outState); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mMapView != null) { + mMapView.onDestroy(); + } + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + if (mMapView != null) { + mMapView.onLowMemory(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_tracking, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + case R.id.action_toggle_dismissible_tracking: + boolean state = !item.isChecked(); + mMapboxMap.getTrackingSettings().setDismissTrackingOnGesture(state); + Toast.makeText(this, "Dismiss tracking mode on gesture = " + state, Toast.LENGTH_SHORT).show(); + item.setChecked(state); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + +}
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java index 99d39ae8b9..27763ad4ae 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java @@ -24,6 +24,7 @@ import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.mapboxsdk.maps.TrackingSettings; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; import com.mapbox.mapboxsdk.testapp.R; public class MyLocationTrackingModeActivity extends AppCompatActivity implements MapboxMap.OnMyLocationChangeListener, AdapterView.OnItemSelectedListener { @@ -56,6 +57,9 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements public void onMapReady(@NonNull MapboxMap mapboxMap) { mMapboxMap = mapboxMap; + MyLocationViewSettings locationViewSettings = mapboxMap.getMyLocationViewSettings(); + locationViewSettings.setPadding(0, (int) getResources().getDimension(R.dimen.locationview_padding_top), 0, 0); + mapboxMap.setOnMyLocationChangeListener(MyLocationTrackingModeActivity.this); ArrayAdapter<CharSequence> locationTrackingAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_tracking_mode, android.R.layout.simple_spinner_item); @@ -70,14 +74,6 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements mBearingSpinner.setAdapter(bearingTrackingAdapter); mBearingSpinner.setOnItemSelectedListener(MyLocationTrackingModeActivity.this); - try { - mapboxMap.setMyLocationEnabled(true); - } catch (SecurityException e) { - //should not occur, permission was checked in FeatureOverviewActivity - Toast.makeText(MyLocationTrackingModeActivity.this, - "Location permission is not available", Toast.LENGTH_SHORT).show(); - finish(); - } mapboxMap.setOnMyLocationTrackingModeChangeListener(new MapboxMap.OnMyLocationTrackingModeChangeListener() { @Override @@ -110,6 +106,7 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements if (mLocation == null) { // initial location to reposition map mMapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 14)); + mMapboxMap.setMyLocationEnabled(true); mLocationSpinner.setEnabled(true); mBearingSpinner.setEnabled(true); } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_customisation.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_customisation.xml new file mode 100644 index 0000000000..75218423fb --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_customisation.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <android.support.v7.widget.Toolbar + android:id="@id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="@color/primary" + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> + + <FrameLayout + android:id="@id/progress" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v4.widget.ContentLoadingProgressBar + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" /> + + </FrameLayout> + + +</LinearLayout> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/dimens.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/dimens.xml index 102a625fc8..80cb7ae79f 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/dimens.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/dimens.xml @@ -7,4 +7,6 @@ <dimen name="map_padding_bottom">256dp</dimen> <dimen name="map_padding_right">32dp</dimen> <dimen name="toolbar_shadow">4dp</dimen> + + <dimen name="locationview_padding_top">350dp</dimen> </resources> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml index 48a9927549..9b316d0c31 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml @@ -2,6 +2,7 @@ <resources> <item name="mapView" type="id" /> <item name="fab" type="id" /> + <item name="progress" type="id" /> <item name="imageView" type="id" /> <item name="toolbar" type="id" /> <item name="container" type="id" /> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index cab80fab7b..28e5a824f0 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -36,6 +36,7 @@ <string name="activity_double_map">Double Map Activity</string> <string name="activity_snapshot">Snapshot Activity</string> <string name="activity_user_tracking_mode">User tracking mode</string> + <string name="activity_user_tracking_customization">User location customization</string> <string name="activity_custom_layer">Custom Layer</string> <string name="activity_map_padding">Map Padding</string> <string name="activity_debug_mode">Debug Mode</string> @@ -44,6 +45,7 @@ <!-- Description --> <string name="description_user_location_tracking">Tracks the location of the user</string> + <string name="description_user_location_customization">Customize the location of the user</string> <string name="description_custom_layer">Overlay a custom native layer on the map</string> <string name="description_info_window_adapter">Learn how to create a custom InfoWindow</string> <string name="description_cameraposition">CameraPosition capabilities</string> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java index 589084d17c..50f5842db6 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java @@ -166,5 +166,6 @@ public class MapboxMapOptionsTest { assertEquals("test", new MapboxMapOptions().accessToken("test").getAccessToken()); assertNotEquals("nottest", new MapboxMapOptions().accessToken("test").getStyle()); } + } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettingsTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettingsTest.java new file mode 100644 index 0000000000..65a73f5ba8 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationViewSettingsTest.java @@ -0,0 +1,84 @@ +package com.mapbox.mapboxsdk.maps.widgets; + +import android.graphics.Color; +import android.graphics.drawable.Drawable; + +import com.mapbox.mapboxsdk.maps.MapView; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; + +import java.util.Arrays; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +public class MyLocationViewSettingsTest { + + @InjectMocks + MapView mMapView = mock(MapView.class); + + @InjectMocks + UserLocationView userLocationView = mock(UserLocationView.class); + + MyLocationViewSettings locationViewSettings; + + @Before + public void beforeTest() { + locationViewSettings = new MyLocationViewSettings(mMapView, userLocationView); + } + + @Test + public void testSanity() { + assertNotNull("should not be null", locationViewSettings); + } + + @Test + public void testForegroundDrawables() { + Drawable foregroundDrawable = mock(Drawable.class); + Drawable foregroundBearingDrawable = mock(Drawable.class); + locationViewSettings.setForegroundDrawable(foregroundDrawable, foregroundBearingDrawable); + assertEquals("foreground should match", foregroundDrawable, locationViewSettings.getForegroundDrawable()); + assertEquals("foreground bearing should match", foregroundBearingDrawable, locationViewSettings.getForegroundBearingDrawable()); + } + + @Test + public void testBackgroundDrawable() { + Drawable backgroundDrawable = mock(Drawable.class); + locationViewSettings.setBackgroundDrawable(backgroundDrawable); + assertEquals("foreground should match", backgroundDrawable, locationViewSettings.getBackgroundDrawable()); + } + + @Test + public void testBackgroundOffset() { + int[] offset = new int[]{1, 2, 3, 4}; + locationViewSettings.setBackgroundOffset(1, 2, 3, 4); + assertTrue("offsets should match", Arrays.equals(offset, locationViewSettings.getBackgroundOffset())); + } + + @Test + public void testForegroundTint() { + int color = Color.RED; + locationViewSettings.setForegroundTintColor(Color.RED); + assertEquals("color should match", color, locationViewSettings.getForegroundTintColor()); + } + + @Test + public void testBackgroundTint(){ + int color = Color.RED; + locationViewSettings.setBackgroundTintColor(Color.RED); + assertEquals("color should match", color, locationViewSettings.getBackgroundTintColor()); + } + + @Test + public void testEnabled() { + assertFalse("initial state should be false", locationViewSettings.isEnabled()); + locationViewSettings.setEnabled(true); + assertTrue("state should be true", locationViewSettings.isEnabled()); + } + +} |