summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/com/android/dialer/callcomposer/camera/CameraManager.java22
-rw-r--r--java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java (renamed from java/com/android/dialer/callcomposer/camera/ImagePersistTask.java)61
-rw-r--r--java/com/android/dialer/common/concurrent/FallibleAsyncTask.java2
-rw-r--r--java/com/android/dialer/shortcuts/ShortcutRefresher.java31
4 files changed, 69 insertions, 47 deletions
diff --git a/java/com/android/dialer/callcomposer/camera/CameraManager.java b/java/com/android/dialer/callcomposer/camera/CameraManager.java
index 783b57ec3..f79f6548c 100644
--- a/java/com/android/dialer/callcomposer/camera/CameraManager.java
+++ b/java/com/android/dialer/callcomposer/camera/CameraManager.java
@@ -35,6 +35,7 @@ import com.android.dialer.callcomposer.camera.camerafocus.FocusOverlayManager;
import com.android.dialer.callcomposer.camera.camerafocus.RenderOverlay;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutors;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
@@ -457,9 +458,9 @@ public class CameraManager implements FocusOverlayManager.Listener {
int height;
if (mRotation == 90 || mRotation == 270) {
// Is rotated, so swapping dimensions is desired
- //noinspection SuspiciousNameCombination
+ // noinspection SuspiciousNameCombination
width = size.height;
- //noinspection SuspiciousNameCombination
+ // noinspection SuspiciousNameCombination
height = size.width;
} else {
width = size.width;
@@ -467,9 +468,20 @@ public class CameraManager implements FocusOverlayManager.Listener {
}
LogUtil.i(
"CameraManager.onPictureTaken", "taken picture size: " + bytes.length + " bytes");
- new ImagePersistTask(
- width, height, heightPercent, bytes, mCameraPreview.getContext(), callback)
- .execute();
+ DialerExecutors.createNonUiTaskBuilder(
+ new ImagePersistWorker(
+ width, height, heightPercent, bytes, mCameraPreview.getContext()))
+ .onSuccess(
+ (result) -> {
+ callback.onMediaReady(
+ result.getUri(), "image/jpeg", result.getWidth(), result.getHeight());
+ })
+ .onFailure(
+ (throwable) -> {
+ callback.onMediaFailed(new Exception("Persisting image failed", throwable));
+ })
+ .build()
+ .executeSerial(null);
}
};
diff --git a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java
index 8620701fe..26b0bde00 100644
--- a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java
+++ b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java
@@ -22,13 +22,16 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
import android.support.v4.content.FileProvider;
+import com.android.dialer.callcomposer.camera.ImagePersistWorker.Result;
import com.android.dialer.callcomposer.camera.exif.ExifInterface;
import com.android.dialer.callcomposer.util.BitmapResizer;
import com.android.dialer.common.Assert;
-import com.android.dialer.common.concurrent.FallibleAsyncTask;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
import com.android.dialer.constants.Constants;
import com.android.dialer.util.DialerUtils;
+import com.google.auto.value.AutoValue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -36,52 +39,70 @@ import java.io.OutputStream;
/** Persisting image routine. */
@TargetApi(VERSION_CODES.M)
-public class ImagePersistTask extends FallibleAsyncTask<Void, Void, Uri> {
+public class ImagePersistWorker implements Worker<Void, Result> {
private int mWidth;
private int mHeight;
private final float mHeightPercent;
private final byte[] mBytes;
private final Context mContext;
- private final CameraManager.MediaCallback mCallback;
- ImagePersistTask(
+ @AutoValue
+ abstract static class Result {
+
+ public static Builder builder() {
+ return new AutoValue_ImagePersistWorker_Result.Builder();
+ }
+
+ @NonNull
+ abstract Uri getUri();
+
+ abstract int getWidth();
+
+ abstract int getHeight();
+
+ @AutoValue.Builder
+ abstract static class Builder {
+ abstract Builder setUri(@NonNull Uri uri);
+
+ abstract Builder setWidth(int width);
+
+ abstract Builder setHeight(int height);
+
+ abstract Result build();
+ }
+ }
+
+ ImagePersistWorker(
final int width,
final int height,
final float heightPercent,
final byte[] bytes,
- final Context context,
- final CameraManager.MediaCallback callback) {
+ final Context context) {
Assert.checkArgument(heightPercent >= 0 && heightPercent <= 1);
Assert.isNotNull(bytes);
Assert.isNotNull(context);
- Assert.isNotNull(callback);
mWidth = width;
mHeight = height;
mHeightPercent = heightPercent;
mBytes = bytes;
mContext = context;
- mCallback = callback;
}
@Override
- protected Uri doInBackgroundFallible(final Void... params) throws Exception {
+ public Result doInBackground(Void unused) throws Exception {
File outputFile = DialerUtils.createShareableFile(mContext);
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
writeClippedBitmap(outputStream);
}
- return FileProvider.getUriForFile(
- mContext, Constants.get().getFileProviderAuthority(), outputFile);
- }
-
- @Override
- protected void onPostExecute(FallibleTaskResult<Uri> result) {
- if (result.isFailure()) {
- mCallback.onMediaFailed(new Exception("Persisting image failed", result.getThrowable()));
- } else {
- mCallback.onMediaReady(result.getResult(), "image/jpeg", mWidth, mHeight);
- }
+ return Result.builder()
+ .setUri(
+ FileProvider.getUriForFile(
+ mContext, Constants.get().getFileProviderAuthority(), outputFile))
+ .setWidth(mWidth)
+ .setHeight(mHeight)
+ .build();
}
private void writeClippedBitmap(OutputStream outputStream) throws IOException {
diff --git a/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java b/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java
index 6d02fe67f..c7a7f36a6 100644
--- a/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java
+++ b/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java
@@ -30,7 +30,9 @@ import com.google.auto.value.AutoValue;
* @param <ParamsT> the type of the parameters sent to the task upon execution
* @param <ProgressT> the type of the progress units published during the background computation
* @param <ResultT> the type of the result of the background computation
+ * @deprecated Please use {@link DialerExecutors}.
*/
+@Deprecated
public abstract class FallibleAsyncTask<ParamsT, ProgressT, ResultT>
extends AsyncTask<ParamsT, ProgressT, FallibleTaskResult<ResultT>> {
diff --git a/java/com/android/dialer/shortcuts/ShortcutRefresher.java b/java/com/android/dialer/shortcuts/ShortcutRefresher.java
index 120382dc5..496f3f02a 100644
--- a/java/com/android/dialer/shortcuts/ShortcutRefresher.java
+++ b/java/com/android/dialer/shortcuts/ShortcutRefresher.java
@@ -20,21 +20,17 @@ import android.content.Context;
import android.os.Build;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
-import android.support.annotation.WorkerThread;
import com.android.contacts.common.list.ContactEntry;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.AsyncTaskExecutor;
-import com.android.dialer.common.concurrent.AsyncTaskExecutors;
-import com.android.dialer.common.concurrent.FallibleAsyncTask;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.common.concurrent.DialerExecutors;
import java.util.ArrayList;
import java.util.List;
/** Refreshes launcher shortcuts from UI components using provided list of contacts. */
public final class ShortcutRefresher {
- private static final AsyncTaskExecutor EXECUTOR = AsyncTaskExecutors.createThreadPoolExecutor();
-
/** Asynchronously updates launcher shortcuts using the provided list of contacts. */
@MainThread
public static void refresh(@NonNull Context context, List<ContactEntry> contacts) {
@@ -49,36 +45,27 @@ public final class ShortcutRefresher {
return;
}
- //noinspection unchecked
- EXECUTOR.submit(Task.ID, new Task(context), new ArrayList<>(contacts));
+ DialerExecutors.createNonUiTaskBuilder(new RefreshWorker(context))
+ .build()
+ .executeSerial(new ArrayList<>(contacts));
}
- private static final class Task extends FallibleAsyncTask<List<ContactEntry>, Void, Void> {
- private static final String ID = "ShortcutRefresher.Task";
-
+ private static final class RefreshWorker implements Worker<List<ContactEntry>, Void> {
private final Context context;
- Task(Context context) {
+ RefreshWorker(Context context) {
this.context = context;
}
- /**
- * @param params array containing exactly one element, the list of contacts from favorites
- * tiles, ordered in tile order.
- */
- @SafeVarargs
@Override
- @NonNull
- @WorkerThread
- protected final Void doInBackgroundFallible(List<ContactEntry>... params) {
- Assert.isWorkerThread();
+ public Void doInBackground(List<ContactEntry> contacts) {
LogUtil.enterBlock("ShortcutRefresher.Task.doInBackground");
// Only dynamic shortcuts are maintained from UI components. Pinned shortcuts are maintained
// by the job scheduler. This is because a pinned contact may not necessarily still be in the
// favorites tiles, so refreshing it would require an additional database query. We don't want
// to incur the cost of that extra database query every time the favorites tiles change.
- new DynamicShortcuts(context, new IconFactory(context)).refresh(params[0]); // Blocking
+ new DynamicShortcuts(context, new IconFactory(context)).refresh(contacts); // Blocking
return null;
}