Merge "Calculate crop and colors in the background on ImagePreviewFragment" into sc-dev
diff --git a/src/com/android/wallpaper/picker/ImagePreviewFragment.java b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
index 251b073..c41d394 100755
--- a/src/com/android/wallpaper/picker/ImagePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
@@ -38,6 +38,7 @@
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Bundle;
+import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Surface;
@@ -81,6 +82,8 @@
import java.io.ByteArrayOutputStream;
import java.util.Locale;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
@@ -92,10 +95,14 @@
private static final String TAG = "ImagePreviewFragment";
private static final float DEFAULT_WALLPAPER_MAX_ZOOM = 8f;
+ private static final Executor sExecutor = Executors.newCachedThreadPool();
private final WallpaperSurfaceCallback mWallpaperSurfaceCallback =
new WallpaperSurfaceCallback();
+ private final AtomicInteger mImageScaleChangeCounter = new AtomicInteger(0);
+ private final AtomicInteger mRecalculateColorCounter = new AtomicInteger(0);
+
private SubsamplingScaleImageView mFullResImageView;
private Asset mWallpaperAsset;
private Point mScreenSize;
@@ -104,7 +111,6 @@
private TouchForwardingLayout mTouchForwardingLayout;
private ConstraintLayout mContainer;
private SurfaceView mWallpaperSurface;
- private AtomicInteger mImageScaleChangeCounter = new AtomicInteger(0);
protected SurfaceView mWorkspaceSurface;
protected WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
@@ -344,25 +350,31 @@
new BitmapCropper.Callback() {
@Override
public void onBitmapCropped(Bitmap croppedBitmap) {
- boolean shouldRecycle = false;
- ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
- if (croppedBitmap.compress(Bitmap.CompressFormat.PNG, 100, tmpOut)) {
- byte[] outByteArray = tmpOut.toByteArray();
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inPreferredColorSpace = ColorSpace.get(ColorSpace.Named.SRGB);
- Bitmap decodedPng = BitmapFactory.decodeByteArray(outByteArray, 0,
- outByteArray.length);
- croppedBitmap = decodedPng;
- }
- if (croppedBitmap.getConfig() == Bitmap.Config.HARDWARE) {
- croppedBitmap = croppedBitmap.copy(Bitmap.Config.ARGB_8888, false);
- shouldRecycle = true;
- }
- WallpaperColors colors = WallpaperColors.fromBitmap(croppedBitmap);
- if (shouldRecycle) {
- croppedBitmap.recycle();
- }
- onWallpaperColorsChanged(colors);
+ mRecalculateColorCounter.incrementAndGet();
+ sExecutor.execute(() -> {
+ boolean shouldRecycle = false;
+ ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
+ Bitmap cropped = croppedBitmap;
+ if (cropped.compress(Bitmap.CompressFormat.PNG, 100, tmpOut)) {
+ byte[] outByteArray = tmpOut.toByteArray();
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inPreferredColorSpace =
+ ColorSpace.get(ColorSpace.Named.SRGB);
+ cropped = BitmapFactory.decodeByteArray(outByteArray, 0,
+ outByteArray.length);
+ }
+ if (cropped.getConfig() == Bitmap.Config.HARDWARE) {
+ cropped = cropped.copy(Bitmap.Config.ARGB_8888, false);
+ shouldRecycle = true;
+ }
+ WallpaperColors colors = WallpaperColors.fromBitmap(cropped);
+ if (shouldRecycle) {
+ cropped.recycle();
+ }
+ if (mRecalculateColorCounter.decrementAndGet() == 0) {
+ Handler.getMain().post(() -> onWallpaperColorsChanged(colors));
+ }
+ });
}
@Override