blob: ff237af3699db72c17d090380efeaa8fda03a840 [file] [log] [blame]
/*
* Copyright 2020 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 android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* A specification for querying {@link WorkRequest}s. This is comprised of 4 components; namely
* ids, unique work names, tags & work states.
* <p>
* A {@link List} of {@link WorkRequest} ids, or a {@link List} of unique work names, or a
* {@link List} of {@link WorkRequest} tags, or a {@link List} of {@link WorkInfo.State} can be
* specified.
* <p>
* Each component in a {@link WorkQuery} is {@code AND}-ed with the others. Each value in a
* component is {@code OR}-ed.
* <p>
* Example:
* {@code (id1 OR id2 OR ...) AND (name1 OR name2 OR ...) AND (tag1 OR tag2 OR ...) AND (state1
* OR state2 OR ...)}
*/
public final class WorkQuery {
private final List<UUID> mIds;
private final List<String> mUniqueWorkNames;
private final List<String> mTags;
private final List<WorkInfo.State> mStates;
// Synthetic access
@SuppressWarnings("WeakerAccess")
WorkQuery(@NonNull Builder builder) {
mIds = builder.mIds;
mUniqueWorkNames = builder.mUniqueWorkNames;
mTags = builder.mTags;
mStates = builder.mStates;
}
/**
* @return The {@link List} of {@link WorkRequest} ids being queried.
*/
@NonNull
public List<UUID> getIds() {
return mIds;
}
/**
* @return the {@link List} of unique works name being queried
*/
@NonNull
public List<String> getUniqueWorkNames() {
return mUniqueWorkNames;
}
/**
* @return the {@link List} of tags being queried
*/
@NonNull
public List<String> getTags() {
return mTags;
}
/**
* @return the {@link List} of {@link WorkInfo.State}s being queried
*/
@NonNull
public List<WorkInfo.State> getStates() {
return mStates;
}
/**
* A builder for {@link WorkQuery}.
*/
public static final class Builder {
// Synthetic access
List<UUID> mIds;
// Synthetic access
List<String> mUniqueWorkNames;
// Synthetic access
List<String> mTags;
// Synthetic access
List<WorkInfo.State> mStates;
private Builder() {
mIds = new ArrayList<>();
mUniqueWorkNames = new ArrayList<>();
mTags = new ArrayList<>();
mStates = new ArrayList<>();
}
/**
* Creates a {@link WorkQuery.Builder} with a {@link List} of {@link WorkRequest} ids.
*
* @param ids The {@link List} of {@link WorkRequest} ids.
* @return a {@link Builder} instance
*/
@NonNull
@SuppressLint("BuilderSetStyle")
public static Builder fromIds(@NonNull List<UUID> ids) {
Builder builder = new Builder();
builder.addIds(ids);
return builder;
}
/**
* Creates a {@link WorkQuery.Builder} with a {@link List} of {@code uniqueWorkNames}.
*
* @param uniqueWorkNames The {@link List} of unique work names
* @return a {@link Builder} instance
*/
@NonNull
@SuppressLint("BuilderSetStyle")
public static Builder fromUniqueWorkNames(@NonNull List<String> uniqueWorkNames) {
Builder builder = new Builder();
builder.addUniqueWorkNames(uniqueWorkNames);
return builder;
}
/**
* Creates a {@link WorkQuery.Builder} with a {@link List} of {@link WorkRequest} tags.
*
* @param tags The {@link List} of {@link WorkRequest} tags
* @return a {@link Builder} instance
*/
@NonNull
@SuppressLint("BuilderSetStyle")
public static Builder fromTags(@NonNull List<String> tags) {
Builder builder = new Builder();
builder.addTags(tags);
return builder;
}
/**
* Creates a {@link WorkQuery.Builder} with a {@link List} of {@link WorkInfo.State} states.
*
* @param states The {@link List} of {@link WorkInfo.State} to add to the {@link WorkQuery}
* @return a {@link Builder} instance
*/
@NonNull
@SuppressLint("BuilderSetStyle")
public static Builder fromStates(@NonNull List<WorkInfo.State> states) {
Builder builder = new Builder();
builder.addStates(states);
return builder;
}
/**
* Adds a {@link List} of {@link WorkRequest} {@code ids} to the {@link WorkQuery}
*
* @param ids The {@link List} {@link WorkRequest} {@code ids} to add
* @return the instance of the {@link Builder}
*/
@NonNull
public Builder addIds(@NonNull List<UUID> ids) {
mIds.addAll(ids);
return this;
}
/**
* Adds a {@link List} of {@code uniqueWorkNames} to the {@link WorkQuery}
*
* @param uniqueWorkNames The {@link List} of unique work names to add
* @return the instance of the {@link Builder}
*/
@NonNull
public Builder addUniqueWorkNames(@NonNull List<String> uniqueWorkNames) {
mUniqueWorkNames.addAll(uniqueWorkNames);
return this;
}
/**
* Adds a {@link List} of {@link WorkRequest} tag to the {@link WorkQuery}.
*
* @param tags The {@link List} of {@link WorkRequest} tags to add
* @return the instance of the {@link Builder}
*/
@NonNull
public Builder addTags(@NonNull List<String> tags) {
mTags.addAll(tags);
return this;
}
/**
* Adds a {@link List} of {@link WorkInfo.State}s to the {@link WorkQuery}.
*
* @param states The {@link List} of {@link WorkInfo.State}s to add
* @return the instance of the {@link Builder}
*/
@NonNull
public Builder addStates(@NonNull List<WorkInfo.State> states) {
mStates.addAll(states);
return this;
}
/**
* Creates an instance of {@link WorkQuery}.
*
* @return the {@link WorkQuery} instance
*/
@NonNull
public WorkQuery build() {
if (mIds.isEmpty()
&& mUniqueWorkNames.isEmpty()
&& mTags.isEmpty()
&& mStates.isEmpty()) {
String message =
"Must specify ids, uniqueNames, tags or states when building a WorkQuery";
throw new IllegalArgumentException(message);
}
return new WorkQuery(this);
}
}
}