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