Fix NPE a Bitmap reference at the Utils.resizeBitmapIfNeeded (#2573)
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/rememberLottieComposition.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/rememberLottieComposition.kt
index 5a66cfd..ed4fb76 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/rememberLottieComposition.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/rememberLottieComposition.kt
@@ -1,6 +1,7 @@
package com.airbnb.lottie.compose
import android.content.Context
+import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Typeface
import android.util.Base64
@@ -238,15 +239,18 @@
Logger.warning("Unable to open asset.", e)
return
}
- try {
+ val bitmap: Bitmap? = try {
val opts = BitmapFactory.Options()
opts.inScaled = true
opts.inDensity = 160
- var bitmap = BitmapFactory.decodeStream(inputStream, null, opts)
- bitmap = Utils.resizeBitmapIfNeeded(bitmap, asset.width, asset.height)
- asset.bitmap = bitmap
+ BitmapFactory.decodeStream(inputStream, null, opts)
} catch (e: IllegalArgumentException) {
Logger.warning("Unable to decode image.", e)
+ null
+ }
+
+ if (bitmap != null) {
+ asset.bitmap = Utils.resizeBitmapIfNeeded(bitmap, asset.width, asset.height)
}
}
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java b/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
index e309d09..57b723c 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
@@ -710,8 +710,10 @@
return null;
}
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
- bitmap = Utils.resizeBitmapIfNeeded(bitmap, asset.getWidth(), asset.getHeight());
- asset.setBitmap(bitmap);
+ if (bitmap != null) {
+ bitmap = Utils.resizeBitmapIfNeeded(bitmap, asset.getWidth(), asset.getHeight());
+ asset.setBitmap(bitmap);
+ }
}
}
}
diff --git a/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java b/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
index dfd07fa..2d735c5 100644
--- a/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
+++ b/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
@@ -106,7 +106,19 @@
Logger.warning("data URL did not have correct base64 format.", e);
return null;
}
- bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
+
+ try {
+ bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
+ } catch (IllegalArgumentException e) {
+ Logger.warning("Unable to decode image `" + id + "`.", e);
+ return null;
+ }
+
+ if (bitmap == null) {
+ Logger.warning("Decoded image `" + id + "` is null.");
+ return null;
+ }
+
Bitmap resizedBitmap = Utils.resizeBitmapIfNeeded(bitmap, asset.getWidth(), asset.getHeight());
return putBitmap(id, resizedBitmap);
}
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
index 788c9f3..22a3ec6 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
@@ -280,7 +280,7 @@
* Resize the bitmap to exactly the same size as the specified dimension, changing the aspect ratio if needed.
* Returns the original bitmap if the dimensions already match.
*/
- public static Bitmap resizeBitmapIfNeeded(Bitmap bitmap, int width, int height) {
+ public static Bitmap resizeBitmapIfNeeded(@NonNull Bitmap bitmap, int width, int height) {
if (bitmap.getWidth() == width && bitmap.getHeight() == height) {
return bitmap;
}