blob: c1417ee2d059a6a7e77443750201a44e13b5e067 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.work;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
/**
* Information about a particular {@link WorkRequest} containing the id of the WorkRequest, its
* current {@link State}, output, tags, and run attempt count. Note that output is only available
* for the terminal states ({@link State#SUCCEEDED} and {@link State#FAILED}).
*/
public final class WorkInfo {
private @NonNull UUID mId;
private @NonNull State mState;
private @NonNull Data mOutputData;
private @NonNull Set<String> mTags;
private @NonNull Data mProgress;
private int mRunAttemptCount;
/**
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public WorkInfo(
@NonNull UUID id,
@NonNull State state,
@NonNull Data outputData,
@NonNull List<String> tags,
@NonNull Data progress,
int runAttemptCount) {
mId = id;
mState = state;
mOutputData = outputData;
mTags = new HashSet<>(tags);
mProgress = progress;
mRunAttemptCount = runAttemptCount;
}
/**
* Gets the identifier of the {@link WorkRequest}.
*
* @return The identifier of a {@link WorkRequest}
*/
public @NonNull UUID getId() {
return mId;
}
/**
* Gets the current {@link State} of the {@link WorkRequest}.
*
* @return The current {@link State} of the {@link WorkRequest}
*/
public @NonNull State getState() {
return mState;
}
/**
* Gets the output {@link Data} for the {@link WorkRequest}. If the WorkRequest is unfinished,
* this is always {@link Data#EMPTY}.
*
* @return The output {@link Data} of the {@link WorkRequest}
*/
public @NonNull Data getOutputData() {
return mOutputData;
}
/**
* Gets the {@link Set} of tags associated with the {@link WorkRequest}.
*
* @return The {@link Set} of tags associated with the {@link WorkRequest}
*/
public @NonNull Set<String> getTags() {
return mTags;
}
/**
* Gets the progress {@link Data} associated with the {@link WorkRequest}.
*
* @return The progress {@link Data} associated with the {@link WorkRequest}
*/
public @NonNull Data getProgress() {
return mProgress;
}
/**
* Gets the run attempt count of the {@link WorkRequest}. Note that for
* {@link PeriodicWorkRequest}s, the run attempt count gets reset between successful runs.
*
* @return The run attempt count of the {@link WorkRequest}.
*/
@IntRange(from = 0)
public int getRunAttemptCount() {
return mRunAttemptCount;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WorkInfo workInfo = (WorkInfo) o;
if (mRunAttemptCount != workInfo.mRunAttemptCount) return false;
if (!mId.equals(workInfo.mId)) return false;
if (mState != workInfo.mState) return false;
if (!mOutputData.equals(workInfo.mOutputData)) return false;
if (!mTags.equals(workInfo.mTags)) return false;
return mProgress.equals(workInfo.mProgress);
}
@Override
public int hashCode() {
int result = mId.hashCode();
result = 31 * result + mState.hashCode();
result = 31 * result + mOutputData.hashCode();
result = 31 * result + mTags.hashCode();
result = 31 * result + mProgress.hashCode();
result = 31 * result + mRunAttemptCount;
return result;
}
@Override
public String toString() {
return "WorkInfo{"
+ "mId='" + mId + '\''
+ ", mState=" + mState
+ ", mOutputData=" + mOutputData
+ ", mTags=" + mTags
+ ", mProgress=" + mProgress
+ '}';
}
/**
* The current lifecycle state of a {@link WorkRequest}.
*/
public enum State {
/**
* Used to indicate that the {@link WorkRequest} is enqueued and eligible to run when its
* {@link Constraints} are met and resources are available.
*/
ENQUEUED,
/**
* Used to indicate that the {@link WorkRequest} is currently being executed.
*/
RUNNING,
/**
* Used to indicate that the {@link WorkRequest} has completed in a successful state. Note
* that {@link PeriodicWorkRequest}s will never enter this state (they will simply go back
* to {@link #ENQUEUED} and be eligible to run again).
*/
SUCCEEDED,
/**
* Used to indicate that the {@link WorkRequest} has completed in a failure state. All
* dependent work will also be marked as {@code #FAILED} and will never run.
*/
FAILED,
/**
* Used to indicate that the {@link WorkRequest} is currently blocked because its
* prerequisites haven't finished successfully.
*/
BLOCKED,
/**
* Used to indicate that the {@link WorkRequest} has been cancelled and will not execute.
* All dependent work will also be marked as {@code #CANCELLED} and will not run.
*/
CANCELLED;
/**
* Returns {@code true} if this State is considered finished.
*
* @return {@code true} for {@link #SUCCEEDED}, {@link #FAILED}, and * {@link #CANCELLED}
* states
*/
public boolean isFinished() {
return (this == SUCCEEDED || this == FAILED || this == CANCELLED);
}
}
}