Merge "Remove LoadThumbnailTask to avoid using AsyncTask"
diff --git a/src/com/android/customization/model/grid/GridOptionsManager.java b/src/com/android/customization/model/grid/GridOptionsManager.java
index da1139e..f16d1d0 100644
--- a/src/com/android/customization/model/grid/GridOptionsManager.java
+++ b/src/com/android/customization/model/grid/GridOptionsManager.java
@@ -16,11 +16,10 @@
 package com.android.customization.model.grid;
 
 import android.content.Context;
-import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.customization.model.CustomizationManager;
@@ -31,12 +30,16 @@
 import com.android.wallpaper.util.PreviewUtils;
 
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * {@link CustomizationManager} for interfacing with the launcher to handle {@link GridOption}s.
  */
 public class GridOptionsManager implements CustomizationManager<GridOption> {
 
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
+
     private static GridOptionsManager sGridOptionsManager;
 
     private final LauncherGridOptionsProvider mProvider;
@@ -81,7 +84,18 @@
 
     @Override
     public void fetchOptions(OptionsFetchedListener<GridOption> callback, boolean reload) {
-        new FetchTask(mProvider, callback, reload).execute();
+        sExecutorService.submit(() -> {
+            List<GridOption> gridOptions = mProvider.fetch(reload);
+            new Handler(Looper.getMainLooper()).post(() -> {
+                if (callback != null) {
+                    if (gridOptions != null && !gridOptions.isEmpty()) {
+                        callback.onOptionsLoaded(gridOptions);
+                    } else {
+                        callback.onError(null);
+                    }
+                }
+            });
+        });
     }
 
     /** Call through content provider API to render preview */
@@ -89,41 +103,4 @@
             PreviewUtils.WorkspacePreviewCallback callback) {
         mProvider.renderPreview(gridName, bundle, callback);
     }
-
-    private static class FetchTask extends AsyncTask<Void, Void, List<GridOption>> {
-        private final LauncherGridOptionsProvider mProvider;
-        @Nullable private final OptionsFetchedListener<GridOption> mCallback;
-        private final boolean mReload;
-
-        private FetchTask(@NonNull LauncherGridOptionsProvider provider,
-                @Nullable OptionsFetchedListener<GridOption> callback, boolean reload) {
-            mCallback = callback;
-            mProvider = provider;
-            mReload = reload;
-        }
-
-        @Override
-        protected List<GridOption> doInBackground(Void[] params) {
-            return mProvider.fetch(mReload);
-        }
-
-        @Override
-        protected void onPostExecute(List<GridOption> gridOptions) {
-            if (mCallback != null) {
-                if (gridOptions != null && !gridOptions.isEmpty()) {
-                    mCallback.onOptionsLoaded(gridOptions);
-                } else {
-                    mCallback.onError(null);
-                }
-            }
-        }
-
-        @Override
-        protected void onCancelled() {
-            super.onCancelled();
-            if (mCallback != null) {
-                mCallback.onError(null);
-            }
-        }
-    }
 }