From 8830f98cb11c0efdbd660c6b7a82dd9ea047ac9f Mon Sep 17 00:00:00 2001
From: Tobrun Van Nuland
Date: Mon, 19 Oct 2020 12:07:41 +0200
Subject: [PATCH] [compass] - deprecate bitmap API, introduce drawable resource
ID API instead
---
.../mapboxsdk/constants/MapboxConstants.java | 1 +
.../mapboxsdk/maps/MapboxMapOptions.java | 48 ++++++++++++---
.../com/mapbox/mapboxsdk/maps/UiSettings.java | 60 ++++++++++++++++---
.../mapboxsdk/maps/widgets/CompassView.java | 21 +++++++
.../src/main/res-public/values/public.xml | 1 +
.../src/main/res/values/attrs.xml | 1 +
6 files changed, 117 insertions(+), 15 deletions(-)
diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
index 99e162671..d573e4264 100644
--- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
+++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
@@ -225,6 +225,7 @@ public class MapboxConstants {
public static final String STATE_COMPASS_MARGIN_BOTTOM = "mapbox_compassMarginBottom";
public static final String STATE_COMPASS_FADE_WHEN_FACING_NORTH = "mapbox_compassFade";
public static final String STATE_COMPASS_IMAGE_BITMAP = "mapbox_compassImage";
+ public static final String STATE_COMPASS_IMAGE_RES = "mapbox_compassImageRes";
public static final String STATE_LOGO_GRAVITY = "mapbox_logoGravity";
public static final String STATE_LOGO_MARGIN_LEFT = "mapbox_logoMarginLeft";
public static final String STATE_LOGO_MARGIN_TOP = "mapbox_logoMarginTop";
diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java
index bb136bfbf..44bcc788c 100644
--- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java
+++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java
@@ -9,11 +9,11 @@
import android.os.Parcelable;
import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import androidx.core.content.res.ResourcesCompat;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -50,6 +50,8 @@ public class MapboxMapOptions implements Parcelable {
private boolean fadeCompassFacingNorth = true;
private int compassGravity = Gravity.TOP | Gravity.END;
private int[] compassMargins;
+ @DrawableRes
+ private int compassImageResource;
private Drawable compassImage;
private boolean logoEnabled = true;
@@ -117,6 +119,7 @@ private MapboxMapOptions(Parcel in) {
if (compassBitmap != null) {
compassImage = new BitmapDrawable(compassBitmap);
}
+ compassImageResource = in.readInt();
logoEnabled = in.readByte() != 0;
logoGravity = in.readInt();
@@ -233,12 +236,12 @@ static MapboxMapOptions createFromAttributes(@NonNull MapboxMapOptions mapboxMap
FOUR_DP * pxlRatio))});
mapboxMapOptions.compassFadesWhenFacingNorth(typedArray.getBoolean(
R.styleable.mapbox_MapView_mapbox_uiCompassFadeFacingNorth, true));
- Drawable compassDrawable = typedArray.getDrawable(
- R.styleable.mapbox_MapView_mapbox_uiCompassDrawable);
- if (compassDrawable == null) {
- compassDrawable = ResourcesCompat.getDrawable(context.getResources(), R.drawable.mapbox_compass_icon, null);
- }
+
+ Drawable compassDrawable = typedArray.getDrawable(R.styleable.mapbox_MapView_mapbox_uiCompassDrawable);
mapboxMapOptions.compassImage(compassDrawable);
+ mapboxMapOptions.compassImageResource(
+ typedArray.getInt(R.styleable.mapbox_MapView_mapbox_uiCompassDrawableRes, R.drawable.mapbox_compass_icon)
+ );
mapboxMapOptions.logoEnabled(typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_uiLogo, true));
mapboxMapOptions.logoGravity(typedArray.getInt(R.styleable.mapbox_MapView_mapbox_uiLogoGravity,
@@ -470,6 +473,7 @@ public MapboxMapOptions compassFadesWhenFacingNorth(boolean compassFadeWhenFacin
*
* @param compass the drawable to show as image compass
* @return This
+ * @deprecated use {@link #compassImageResource} instead
*/
@NonNull
public MapboxMapOptions compassImage(Drawable compass) {
@@ -477,6 +481,21 @@ public MapboxMapOptions compassImage(Drawable compass) {
return this;
}
+ /**
+ * Specifies the image of the CompassView.
+ *
+ * By default this value is R.drawable.mapbox_compass_icon.
+ *
+ *
+ * @param compassImageResource the drawable resource id to show as image compass
+ * @return This
+ */
+ @NonNull
+ public MapboxMapOptions compassImageResource(@DrawableRes int compassImageResource) {
+ this.compassImageResource = compassImageResource;
+ return this;
+ }
+
/**
* Specifies the visibility state of a logo for a map view.
*
@@ -946,10 +965,21 @@ public boolean getCompassFadeFacingNorth() {
*
* @return the drawable used as compass image
*/
+ @Deprecated
public Drawable getCompassImage() {
return compassImage;
}
+ /**
+ * Get the current configured CompassView image resource id.
+ *
+ * @return the resource id of the used as compass image
+ */
+ @DrawableRes
+ public int getCompassImageResource() {
+ return compassImageResource;
+ }
+
/**
* Get the current configured visibility state for mapbox_compass_icon for a map view.
*
@@ -1171,7 +1201,7 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeByte((byte) (fadeCompassFacingNorth ? 1 : 0));
dest.writeParcelable(compassImage != null
? BitmapUtils.getBitmapFromDrawable(compassImage) : null, flags);
-
+ dest.writeInt(compassImageResource);
dest.writeByte((byte) (logoEnabled ? 1 : 0));
dest.writeInt(logoGravity);
dest.writeIntArray(logoMargins);
@@ -1233,6 +1263,9 @@ public boolean equals(@Nullable Object o) {
: options.compassImage != null) {
return false;
}
+ if (compassImageResource != options.compassImageResource) {
+ return false;
+ }
if (compassGravity != options.compassGravity) {
return false;
}
@@ -1339,6 +1372,7 @@ public int hashCode() {
result = 31 * result + (fadeCompassFacingNorth ? 1 : 0);
result = 31 * result + compassGravity;
result = 31 * result + (compassImage != null ? compassImage.hashCode() : 0);
+ result = 31 * result + compassImageResource;
result = 31 * result + Arrays.hashCode(compassMargins);
result = 31 * result + (logoEnabled ? 1 : 0);
result = 31 * result + logoGravity;
diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java
index b59e944d5..b411534e7 100644
--- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java
+++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java
@@ -12,6 +12,7 @@
import android.widget.ImageView;
import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
import androidx.annotation.FloatRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -19,7 +20,6 @@
import androidx.annotation.UiThread;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.ContextCompat;
-import androidx.core.content.res.ResourcesCompat;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.camera.CameraPosition;
@@ -193,10 +193,10 @@ private void initialiseCompass(MapboxMapOptions options, @NonNull Resources reso
setCompassMargins(tenDp, tenDp, tenDp, tenDp);
}
setCompassFadeFacingNorth(options.getCompassFadeFacingNorth());
- if (options.getCompassImage() == null) {
- options.compassImage(ResourcesCompat.getDrawable(resources, R.drawable.mapbox_compass_icon, null));
+ if (options.getCompassImage() != null) {
+ setCompassImage(options.getCompassImage());
}
- setCompassImage(options.getCompassImage());
+ setCompassImageResource(options.getCompassImageResource());
}
private void saveCompass(Bundle outState) {
@@ -207,8 +207,14 @@ private void saveCompass(Bundle outState) {
outState.putInt(MapboxConstants.STATE_COMPASS_MARGIN_BOTTOM, getCompassMarginBottom());
outState.putInt(MapboxConstants.STATE_COMPASS_MARGIN_RIGHT, getCompassMarginRight());
outState.putBoolean(MapboxConstants.STATE_COMPASS_FADE_WHEN_FACING_NORTH, isCompassFadeWhenFacingNorth());
- outState.putByteArray(MapboxConstants.STATE_COMPASS_IMAGE_BITMAP,
- BitmapUtils.getByteArrayFromDrawable(getCompassImage()));
+
+ // Remove below when we remove deprecated code for bitmap API, only leave else clause
+ if (compassView != null && compassView.isLegacyImageDrawableSetter()) {
+ outState.putByteArray(MapboxConstants.STATE_COMPASS_IMAGE_BITMAP,
+ BitmapUtils.getByteArrayFromDrawable(getCompassImage()));
+ } else {
+ outState.putInt(MapboxConstants.STATE_COMPASS_IMAGE_RES, getCompassImageResource());
+ }
}
private void restoreCompass(Bundle savedInstanceState) {
@@ -224,8 +230,13 @@ private void restoreCompass(Bundle savedInstanceState) {
savedInstanceState.getInt(MapboxConstants.STATE_COMPASS_MARGIN_RIGHT),
savedInstanceState.getInt(MapboxConstants.STATE_COMPASS_MARGIN_BOTTOM));
setCompassFadeFacingNorth(savedInstanceState.getBoolean(MapboxConstants.STATE_COMPASS_FADE_WHEN_FACING_NORTH));
- setCompassImage(BitmapUtils.getDrawableFromByteArray(
- mapView.getContext(), savedInstanceState.getByteArray(MapboxConstants.STATE_COMPASS_IMAGE_BITMAP)));
+
+ if (savedInstanceState.containsKey(MapboxConstants.STATE_COMPASS_IMAGE_BITMAP)) {
+ setCompassImage(BitmapUtils.getDrawableFromByteArray(
+ mapView.getContext(), savedInstanceState.getByteArray(MapboxConstants.STATE_COMPASS_IMAGE_BITMAP)));
+ } else {
+ setCompassImageResource(savedInstanceState.getInt(MapboxConstants.STATE_COMPASS_IMAGE_RES));
+ }
}
private void initialiseLogo(MapboxMapOptions options, @NonNull Resources resources) {
@@ -387,13 +398,29 @@ public void setCompassFadeFacingNorth(boolean compassFadeFacingNorth) {
*
*
* @param compass the drawable to show as image compass
+ * @deprecated use {@link #setCompassImageResource(int)} instead
*/
+ @Deprecated
public void setCompassImage(@NonNull Drawable compass) {
if (compassView != null) {
compassView.setCompassImage(compass);
}
}
+ /**
+ * Specifies the CompassView image.
+ *
+ * By default this value is R.drawable.mapbox_compass_icon.
+ *
+ *
+ * @param drawableRes the resource id of the drawable to show as image compass
+ */
+ public void setCompassImageResource(@DrawableRes int drawableRes) {
+ if (compassView != null) {
+ compassView.setCompassImageResource(drawableRes);
+ }
+ }
+
/**
* Returns whether the compass performs a fading animation out when facing north.
*
@@ -480,8 +507,10 @@ public int getCompassMarginBottom() {
* Get the current configured CompassView image.
*
* @return the drawable used as compass image
+ * @deprecated use {@link #getCompassImageResource()} instead
*/
@Nullable
+ @Deprecated
public Drawable getCompassImage() {
if (compassView != null) {
return compassView.getCompassImage();
@@ -490,6 +519,21 @@ public Drawable getCompassImage() {
}
}
+ /**
+ * Get the current configured id of the CompassView drawable resource.
+ *
+ * @return the drawable resource id used as compass image
+ */
+ @DrawableRes
+ @Nullable
+ public int getCompassImageResource() {
+ if (compassView != null) {
+ return compassView.getCompassImageResource();
+ } else {
+ return R.drawable.mapbox_compass_icon;
+ }
+ }
+
void update(@NonNull CameraPosition cameraPosition) {
clockwiseBearing = -cameraPosition.bearing;
if (compassView != null) {
diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
index 551aad36f..37c5fd516 100644
--- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
+++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
@@ -2,6 +2,8 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
+
+import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
@@ -35,6 +37,9 @@ public final class CompassView extends ImageView implements Runnable {
private ViewPropertyAnimatorCompat fadeAnimator;
private MapboxMap.OnCompassAnimationListener compassAnimationListener;
private boolean isAnimating = false;
+ @DrawableRes
+ private int compassImageResource;
+ private boolean legacyImageDrawableSetter = false;
public CompassView(@NonNull Context context) {
super(context);
@@ -139,8 +144,10 @@ public boolean isFadeCompassViewFacingNorth() {
* Set the CompassView image.
*
* @param compass the drawable to use as compass image
+ * @deprecated use {@link #setCompassImageResource(int)} instead
*/
public void setCompassImage(Drawable compass) {
+ legacyImageDrawableSetter = true;
setImageDrawable(compass);
}
@@ -148,6 +155,7 @@ public void setCompassImage(Drawable compass) {
* Get the current configured CompassView image.
*
* @return the drawable used as compass image
+ * @deprecated use {@link #getCompassImageResource()} instead
*/
public Drawable getCompassImage() {
return getDrawable();
@@ -176,4 +184,17 @@ private void notifyCompassAnimationListenerWhenAnimating() {
compassAnimationListener.onCompassAnimation();
}
}
+
+ public int getCompassImageResource() {
+ return compassImageResource;
+ }
+
+ public void setCompassImageResource(int drawableRes) {
+ this.compassImageResource = drawableRes;
+ setImageResource(compassImageResource);
+ }
+
+ public boolean isLegacyImageDrawableSetter() {
+ return legacyImageDrawableSetter;
+ }
}
diff --git a/MapboxGLAndroidSDK/src/main/res-public/values/public.xml b/MapboxGLAndroidSDK/src/main/res-public/values/public.xml
index a5e759f6c..ca0757bbe 100644
--- a/MapboxGLAndroidSDK/src/main/res-public/values/public.xml
+++ b/MapboxGLAndroidSDK/src/main/res-public/values/public.xml
@@ -50,6 +50,7 @@
+
diff --git a/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/MapboxGLAndroidSDK/src/main/res/values/attrs.xml
index 4acf3301c..56f3c2a9e 100644
--- a/MapboxGLAndroidSDK/src/main/res/values/attrs.xml
+++ b/MapboxGLAndroidSDK/src/main/res/values/attrs.xml
@@ -60,6 +60,7 @@
+