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 @@ +