diff options
-rw-r--r-- | java/com/android/dialer/callcomposer/camera/CameraManager.java | 22 | ||||
-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.java | 2 | ||||
-rw-r--r-- | java/com/android/dialer/shortcuts/ShortcutRefresher.java | 31 |
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; } |