Commit 0727fecc authored by Marcin Wiacek's avatar Marcin Wiacek Committed by Commit Bot

Migrate AsyncTask into @IntDef

@IntDef/@StringDef annotation are preferred way for declaring
set of String/int values.

1. they need less space in APK than enum, see
https://developer.android.com/topic/performance/reduce-apk-size#remove-enums
2. they give more control over allowed values than "static final" values

Main goal of patches from this series is writing "static final" values, enum and some classes in one common @IntDef/@StringDef form:

1. with @IntDef/@StringDef first, @Retention second
   and related @interface third
2. with values inside @interface
3. with NUM_ENTRIES declaring number of entries if necessary
4. with comment about numbering from 0 without gaps when necessary
5. with @Retention(RetentionPolicy.SOURCE)
6. without "static final" in the @interface

Change-Id: Ic1bf8f93ac2d697571272870e03d6d96b0534ea6
Reviewed-on: https://chromium-review.googlesource.com/c/1370183
Commit-Queue: Marcin Wiącek <marcin@mwiacek.com>
Commit-Queue: agrieve <agrieve@chromium.org>
Reviewed-by: default avataragrieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#616001}
parent 292508f0
...@@ -6,6 +6,7 @@ package org.chromium.base.task; ...@@ -6,6 +6,7 @@ package org.chromium.base.task;
import android.os.Binder; import android.os.Binder;
import android.os.Process; import android.os.Process;
import android.support.annotation.IntDef;
import android.support.annotation.MainThread; import android.support.annotation.MainThread;
import android.support.annotation.WorkerThread; import android.support.annotation.WorkerThread;
...@@ -13,6 +14,8 @@ import org.chromium.base.ThreadUtils; ...@@ -13,6 +14,8 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.annotations.DoNotInline; import org.chromium.base.annotations.DoNotInline;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
...@@ -47,7 +50,7 @@ public abstract class AsyncTask<Result> { ...@@ -47,7 +50,7 @@ public abstract class AsyncTask<Result> {
private final Callable<Result> mWorker; private final Callable<Result> mWorker;
private final FutureTask<Result> mFuture; private final FutureTask<Result> mFuture;
private volatile Status mStatus = Status.PENDING; private volatile @Status int mStatus = Status.PENDING;
private final AtomicBoolean mCancelled = new AtomicBoolean(); private final AtomicBoolean mCancelled = new AtomicBoolean();
private final AtomicBoolean mTaskInvoked = new AtomicBoolean(); private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
...@@ -63,19 +66,21 @@ public abstract class AsyncTask<Result> { ...@@ -63,19 +66,21 @@ public abstract class AsyncTask<Result> {
* Indicates the current status of the task. Each status will be set only once * Indicates the current status of the task. Each status will be set only once
* during the lifetime of a task. * during the lifetime of a task.
*/ */
public enum Status { @IntDef({Status.PENDING, Status.RUNNING, Status.FINISHED})
@Retention(RetentionPolicy.SOURCE)
public @interface Status {
/** /**
* Indicates that the task has not been executed yet. * Indicates that the task has not been executed yet.
*/ */
PENDING, int PENDING = 0;
/** /**
* Indicates that the task is running. * Indicates that the task is running.
*/ */
RUNNING, int RUNNING = 1;
/** /**
* Indicates that {@link AsyncTask#onPostExecute} has finished. * Indicates that {@link AsyncTask#onPostExecute} has finished.
*/ */
FINISHED, int FINISHED = 2;
} }
@SuppressWarnings("NoAndroidAsyncTaskCheck") @SuppressWarnings("NoAndroidAsyncTaskCheck")
...@@ -127,7 +132,7 @@ public abstract class AsyncTask<Result> { ...@@ -127,7 +132,7 @@ public abstract class AsyncTask<Result> {
* *
* @return The current status. * @return The current status.
*/ */
public final Status getStatus() { public final @Status int getStatus() {
return mStatus; return mStatus;
} }
...@@ -283,10 +288,10 @@ public abstract class AsyncTask<Result> { ...@@ -283,10 +288,10 @@ public abstract class AsyncTask<Result> {
private void executionPreamble() { private void executionPreamble() {
if (mStatus != Status.PENDING) { if (mStatus != Status.PENDING) {
switch (mStatus) { switch (mStatus) {
case RUNNING: case Status.RUNNING:
throw new IllegalStateException("Cannot execute task:" throw new IllegalStateException("Cannot execute task:"
+ " the task is already running."); + " the task is already running.");
case FINISHED: case Status.FINISHED:
throw new IllegalStateException("Cannot execute task:" throw new IllegalStateException("Cannot execute task:"
+ " the task has already been executed " + " the task has already been executed "
+ "(a task can be executed only once)"); + "(a task can be executed only once)");
......
...@@ -20,7 +20,7 @@ public class ShadowAsyncTask<Result> { ...@@ -20,7 +20,7 @@ public class ShadowAsyncTask<Result> {
private final FutureTask<Result> future; private final FutureTask<Result> future;
private final Callable<Result> worker; private final Callable<Result> worker;
private AsyncTask.Status status = AsyncTask.Status.PENDING; private @AsyncTask.Status int status = AsyncTask.Status.PENDING;
public ShadowAsyncTask() { public ShadowAsyncTask() {
worker = new Callable<Result>() { worker = new Callable<Result>() {
...@@ -119,7 +119,7 @@ public class ShadowAsyncTask<Result> { ...@@ -119,7 +119,7 @@ public class ShadowAsyncTask<Result> {
} }
@Implementation @Implementation
public AsyncTask.Status getStatus() { public @AsyncTask.Status int getStatus() {
return status; return status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment