blob: fe38da3264d0d313ea65f4e3069ee5e9e42301c8 [file] [log] [blame]
package com.airbnb.lottie;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import static junit.framework.Assert.assertNotNull;
class ImageAssetBitmapManager {
private final Context context;
private String imagesFolder;
@Nullable private ImageAssetDelegate assetDelegate;
private final Map<String, LottieImageAsset> imageAssets;
private final Map<String, Bitmap> bitmaps = new HashMap<>();
ImageAssetBitmapManager(Drawable.Callback callback, String imagesFolder,
ImageAssetDelegate assetDelegate, Map<String, LottieImageAsset> imageAssets) {
assertNotNull(callback);
this.imagesFolder = imagesFolder;
if (!TextUtils.isEmpty(imagesFolder) &&
this.imagesFolder.charAt(this.imagesFolder.length() - 1) != '/') {
this.imagesFolder += '/';
}
if (!(callback instanceof View)) {
Log.w(L.TAG, "LottieDrawable must be inside of a view for images to work.");
this.imageAssets = new HashMap<>();
context = null;
return;
}
context = ((View) callback).getContext();
this.imageAssets = imageAssets;
setAssetDelegate(assetDelegate);
}
void setAssetDelegate(@Nullable ImageAssetDelegate assetDelegate) {
this.assetDelegate = assetDelegate;
}
Bitmap bitmapForId(String id) {
Bitmap bitmap = bitmaps.get(id);
if (bitmap == null) {
LottieImageAsset imageAsset = imageAssets.get(id);
if (imageAsset == null) {
return null;
}
if (assetDelegate != null) {
bitmap = assetDelegate.fetchBitmap(imageAsset);
bitmaps.put(id, bitmap);
return bitmap;
}
InputStream is;
try {
if (TextUtils.isEmpty(imagesFolder)) {
throw new IllegalStateException("You must set an images folder before loading an image." +
" Set it with LottieComposition#setImagesFolder or LottieDrawable#setImagesFolder");
}
is = context.getAssets().open(imagesFolder + imageAsset.getFileName());
} catch (IOException e) {
Log.w(L.TAG, "Unable to open asset.", e);
return null;
}
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = true;
opts.inDensity = 160;
bitmap = BitmapFactory.decodeStream(is, null, opts);
bitmaps.put(id, bitmap);
}
return bitmap;
}
void recycleBitmaps() {
Iterator<Map.Entry<String, Bitmap>> it = bitmaps.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Bitmap> entry = it.next();
entry.getValue().recycle();
it.remove();
}
}
boolean hasSameContext(Context context) {
return context == null && this.context == null ||
context != null && this.context.equals(context);
}
}