diff --git a/app/build.gradle b/app/build.gradle index 75606804..a5ad3de6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,8 @@ android { dependencies { implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.7.3' + implementation 'com.github.woltapp:blurhash:f41a23cc50' + implementation 'com.github.florent37:glidepalette:2.1.2' implementation 'com.google.android.exoplayer:exoplayer:2.11.4' implementation 'com.google.android.material:material:1.2.1' diff --git a/app/src/main/java/com/dkanada/gramophone/glide/BlurTransformation.java b/app/src/main/java/com/dkanada/gramophone/glide/BlurTransformation.java index e25bdae9..1e3b2792 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/BlurTransformation.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/BlurTransformation.java @@ -4,10 +4,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; -import android.os.Build; import android.renderscript.Allocation; import android.renderscript.Element; -import android.renderscript.RSRuntimeException; import android.renderscript.RenderScript; import android.renderscript.ScriptIntrinsicBlur; import androidx.annotation.FloatRange; @@ -15,8 +13,6 @@ import androidx.annotation.NonNull; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; -import com.dkanada.gramophone.BuildConfig; -import com.dkanada.gramophone.helper.StackBlur; import com.dkanada.gramophone.util.ImageUtil; import java.security.MessageDigest; @@ -28,25 +24,16 @@ public class BlurTransformation extends BitmapTransformation { private float blurRadius; private int sampling; - private void init(Builder builder) { + private BlurTransformation(Builder builder) { + super(); + this.context = builder.context; this.blurRadius = builder.blurRadius; this.sampling = builder.sampling; } - private BlurTransformation(Builder builder) { - super(); - init(builder); - } - - private BlurTransformation(Builder builder, BitmapPool bitmapPool) { - super(); - init(builder); - } - public static class Builder { private Context context; - private BitmapPool bitmapPool; private float blurRadius = DEFAULT_BLUR_RADIUS; private int sampling; @@ -72,25 +59,13 @@ public class BlurTransformation extends BitmapTransformation { return this; } - /** - * @param bitmapPool The BitmapPool to use. - * @return the same Builder - */ - public Builder bitmapPool(BitmapPool bitmapPool) { - this.bitmapPool = bitmapPool; - return this; - } - public BlurTransformation build() { - if (bitmapPool != null) { - return new BlurTransformation(this, bitmapPool); - } return new BlurTransformation(this); } } @Override - protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { + protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { int sampling; if (this.sampling == 0) { sampling = ImageUtil.calculateInSampleSize(toTransform.getWidth(), toTransform.getHeight(), 100); @@ -104,39 +79,25 @@ public class BlurTransformation extends BitmapTransformation { int scaledHeight = height / sampling; Bitmap out = pool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888); - if (out == null) { - out = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888); - } - Canvas canvas = new Canvas(out); canvas.scale(1 / (float) sampling, 1 / (float) sampling); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(toTransform, 0, 0, paint); - if (Build.VERSION.SDK_INT >= 17) { - try { - final RenderScript rs = RenderScript.create(context.getApplicationContext()); - final Allocation input = Allocation.createFromBitmap(rs, out, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); - final Allocation output = Allocation.createTyped(rs, input.getType()); - final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); + final RenderScript renderScript = RenderScript.create(context.getApplicationContext()); + final Allocation input = Allocation.createFromBitmap(renderScript, out, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); + final Allocation output = Allocation.createTyped(renderScript, input.getType()); + final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); - script.setRadius(blurRadius); - script.setInput(input); - script.forEach(output); + script.setRadius(blurRadius); + script.setInput(input); + script.forEach(output); - output.copyTo(out); + output.copyTo(out); + renderScript.destroy(); - rs.destroy(); - - return out; - } catch (RSRuntimeException e) { - // on some devices RenderScript.create() throws: android.support.v8.renderscript.RSRuntimeException: Error loading libRSSupport library - if (BuildConfig.DEBUG) e.printStackTrace(); - } - } - - return StackBlur.blur(out, blurRadius); + return out; } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideModule.java b/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideModule.java index 503edbec..f4c024d2 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideModule.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideModule.java @@ -9,8 +9,10 @@ import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; import com.bumptech.glide.Registry; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory; import com.bumptech.glide.module.GlideModule; +import com.bumptech.glide.request.RequestOptions; import com.dkanada.gramophone.App; import com.dkanada.gramophone.glide.palette.BitmapPaletteTranscoder; import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper; @@ -21,19 +23,17 @@ import java.io.File; public class CustomGlideModule implements GlideModule { @Override public void applyOptions(@NonNull Context context, GlideBuilder builder) { - builder.setDiskCache(new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() { - @Override - public File getCacheDirectory() { - String folder = "/Gelli/images"; - return PreferenceUtil.getInstance(App.getInstance()).getExternalDirectory() - ? new File(Environment.getExternalStorageDirectory() + folder) - : new File(App.getInstance().getApplicationInfo().dataDir + folder); - } - }, PreferenceUtil.getInstance(App.getInstance()).getCacheSize())); + File file = PreferenceUtil.getInstance(context).getExternalDirectory() + ? new File(Environment.getExternalStorageDirectory() + "/Gelli/images") + : new File(App.getInstance().getApplicationInfo().dataDir + "/glide"); + + int size = PreferenceUtil.getInstance(context).getCacheSize(); + builder.setDiskCache(new DiskLruCacheFactory(() -> file, size)); + builder.setDefaultRequestOptions(new RequestOptions().format(DecodeFormat.PREFER_RGB_565)); } @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { - registry.register(Bitmap.class, BitmapPaletteWrapper.class, new BitmapPaletteTranscoder(glide.getBitmapPool())); + registry.register(Bitmap.class, BitmapPaletteWrapper.class, new BitmapPaletteTranscoder()); } } diff --git a/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideRequest.java b/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideRequest.java index fa12419d..f92444ff 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideRequest.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/CustomGlideRequest.java @@ -8,13 +8,11 @@ import androidx.annotation.NonNull; import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.RequestManager; -import com.bumptech.glide.load.Key; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions; -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.transition.ViewAnimationFactory; -import com.bumptech.glide.signature.MediaStoreSignature; +import com.bumptech.glide.signature.ObjectKey; import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.glide.palette.BitmapPaletteWrapper; @@ -98,7 +96,7 @@ public class CustomGlideRequest { .centerCrop() .error(DEFAULT_IMAGE) .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) - .signature(createSignature(item)); + .signature(new ObjectKey(item != null ? item : 0)); } public static String createUrl(String item) { @@ -108,8 +106,4 @@ public class CustomGlideRequest { return App.getApiClient().GetImageUrl(item, options); } - - public static Key createSignature(String item) { - return new MediaStoreSignature("image/jpeg", item != null ? item.hashCode() : 0, 0); - } } diff --git a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteResource.java b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteResource.java index 54529ad8..f5126586 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteResource.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteResource.java @@ -3,17 +3,13 @@ package com.dkanada.gramophone.glide.palette; import androidx.annotation.NonNull; import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.util.Util; public class BitmapPaletteResource implements Resource { - private final BitmapPaletteWrapper bitmapPaletteWrapper; - private final BitmapPool bitmapPool; - public BitmapPaletteResource(BitmapPaletteWrapper bitmapPaletteWrapper, BitmapPool bitmapPool) { + public BitmapPaletteResource(BitmapPaletteWrapper bitmapPaletteWrapper) { this.bitmapPaletteWrapper = bitmapPaletteWrapper; - this.bitmapPool = bitmapPool; } @NonNull @@ -22,6 +18,7 @@ public class BitmapPaletteResource implements Resource { return BitmapPaletteWrapper.class; } + @NonNull @Override public BitmapPaletteWrapper get() { return bitmapPaletteWrapper; diff --git a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteTranscoder.java b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteTranscoder.java index 2a6d2b24..99fa8355 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteTranscoder.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteTranscoder.java @@ -6,21 +6,13 @@ import androidx.annotation.NonNull; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.dkanada.gramophone.util.ThemeUtil; public class BitmapPaletteTranscoder implements ResourceTranscoder { - private final BitmapPool bitmapPool; - - public BitmapPaletteTranscoder(BitmapPool bitmapPool) { - this.bitmapPool = bitmapPool; - } - @Override public Resource transcode(@NonNull Resource resource, @NonNull Options options) { - Bitmap bitmap = resource.get(); - BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, ThemeUtil.generatePalette(bitmap)); - return new BitmapPaletteResource(bitmapPaletteWrapper, bitmapPool); + BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(resource.get(), ThemeUtil.generatePalette(resource.get())); + return new BitmapPaletteResource(bitmapPaletteWrapper); } } \ No newline at end of file diff --git a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteWrapper.java b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteWrapper.java index ccd077d1..3aaa89f8 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteWrapper.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteWrapper.java @@ -4,19 +4,19 @@ import android.graphics.Bitmap; import androidx.palette.graphics.Palette; public class BitmapPaletteWrapper { - private final Bitmap mBitmap; - private final Palette mPalette; + private final Bitmap bitmap; + private final Palette palette; public BitmapPaletteWrapper(Bitmap bitmap, Palette palette) { - mBitmap = bitmap; - mPalette = palette; + this.bitmap = bitmap; + this.palette = palette; } public Bitmap getBitmap() { - return mBitmap; + return bitmap; } public Palette getPalette() { - return mPalette; + return palette; } }