[Android] Fix crash while blurring covers
Geoffrey Métais
git at videolan.org
Thu Jan 24 11:07:52 CET 2019
vlc-android | branch: master | Geoffrey Métais <geoffrey.metais at gmail.com> | Thu Jan 24 11:07:14 2019 +0100| [9f146f3c6d6de04fbf31c10ba911519880fc4d62] | committer: Geoffrey Métais
Fix crash while blurring covers
Fix #735
> https://code.videolan.org/videolan/vlc-android/commit/9f146f3c6d6de04fbf31c10ba911519880fc4d62
---
.../src/org/videolan/vlc/gui/helpers/UiTools.java | 69 +++++++++++-----------
1 file changed, 36 insertions(+), 33 deletions(-)
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.java b/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.java
index 273bfcd60..a4f636a35 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.java
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.java
@@ -32,7 +32,6 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.TypedArray;
-import androidx.databinding.BindingAdapter;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
@@ -40,19 +39,11 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.preference.PreferenceManager;
import android.renderscript.Allocation;
import android.renderscript.Element;
+import android.renderscript.RSInvalidStateException;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import com.google.android.material.snackbar.Snackbar;
-import androidx.fragment.app.FragmentActivity;
-import androidx.core.content.ContextCompat;
-import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
import android.text.Html;
import android.text.TextUtils;
import android.view.DragAndDropPermissions;
@@ -70,11 +61,12 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
+import com.google.android.material.snackbar.Snackbar;
+
import org.videolan.libvlc.util.AndroidUtil;
import org.videolan.medialibrary.Medialibrary;
import org.videolan.medialibrary.media.MediaLibraryItem;
import org.videolan.medialibrary.media.MediaWrapper;
-import org.videolan.vlc.BuildConfig;
import org.videolan.vlc.MediaParsingService;
import org.videolan.vlc.R;
import org.videolan.vlc.VLCApplication;
@@ -90,6 +82,15 @@ import org.videolan.vlc.viewmodels.SortableModel;
import java.util.List;
import java.util.Locale;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
+import androidx.databinding.BindingAdapter;
+import androidx.fragment.app.FragmentActivity;
+
public class UiTools {
private static final String TAG = "VLC/UiTools";
@@ -310,37 +311,39 @@ public class UiTools {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
public static Bitmap blurBitmap(Bitmap bitmap, float radius) {
- if (bitmap == null || bitmap.getConfig() == null)
- return null;
+ if (bitmap == null || bitmap.getConfig() == null) return null;
+ try {
+ //Let's create an empty bitmap with the same size of the bitmap we want to blur
+ final Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
- //Let's create an empty bitmap with the same size of the bitmap we want to blur
- Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
+ //Instantiate a new Renderscript
+ final RenderScript rs = RenderScript.create(VLCApplication.getAppContext());
- //Instantiate a new Renderscript
- RenderScript rs = RenderScript.create(VLCApplication.getAppContext());
+ //Create an Intrinsic Blur Script using the Renderscript
+ ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
- //Create an Intrinsic Blur Script using the Renderscript
- ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
+ //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
+ final Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
+ final Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
- //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
- Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
- Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
+ //Set the radius of the blur
+ blurScript.setRadius(radius);
- //Set the radius of the blur
- blurScript.setRadius(radius);
+ //Perform the Renderscript
+ blurScript.setInput(allIn);
+ blurScript.forEach(allOut);
- //Perform the Renderscript
- blurScript.setInput(allIn);
- blurScript.forEach(allOut);
+ //Copy the final bitmap created by the out Allocation to the outBitmap
+ allOut.copyTo(outBitmap);
- //Copy the final bitmap created by the out Allocation to the outBitmap
- allOut.copyTo(outBitmap);
+ //After finishing everything, we destroy the Renderscript.
+ rs.destroy();
- //After finishing everything, we destroy the Renderscript.
- rs.destroy();
-
- return outBitmap;
+ return outBitmap;
+ } catch (RSInvalidStateException ignored) {
+ return null;
+ }
}
public static void updateSortTitles(MediaBrowserFragment sortable) {
More information about the Android
mailing list