| /* |
| * 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); |
| } |
| } |
| } |