blob: d33851e64a07937967a2540834a4a3331240d483 [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 android.os.Build;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
/**
* A {@link WorkRequest} for non-repeating work.
* <p>
* OneTimeWorkRequests can be put in simple or complex graphs of work by using methods like
* {@link WorkManager#beginWith(OneTimeWorkRequest)} or {@link WorkManager#beginWith(List)}.
*/
public final class OneTimeWorkRequest extends WorkRequest {
/**
* Creates a {@link OneTimeWorkRequest} with defaults from a {@link ListenableWorker} class
* name.
*
* @param workerClass An {@link ListenableWorker} class name
* @return A {@link OneTimeWorkRequest} constructed by using defaults in the {@link Builder}
*/
public static @NonNull OneTimeWorkRequest from(
@NonNull Class<? extends ListenableWorker> workerClass) {
return new OneTimeWorkRequest.Builder(workerClass).build();
}
/**
* Creates a list of {@link OneTimeWorkRequest}s with defaults from an array of
* {@link ListenableWorker} class names.
*
* @param workerClasses A list of {@link ListenableWorker} class names
* @return A list of {@link OneTimeWorkRequest} constructed by using defaults in the {@link
* Builder}
*/
public static @NonNull List<OneTimeWorkRequest> from(
@NonNull List<Class<? extends ListenableWorker>> workerClasses) {
List<OneTimeWorkRequest> workList = new ArrayList<>(workerClasses.size());
for (Class<? extends ListenableWorker> workerClass : workerClasses) {
workList.add(new OneTimeWorkRequest.Builder(workerClass).build());
}
return workList;
}
OneTimeWorkRequest(Builder builder) {
super(builder.mId, builder.mWorkSpec, builder.mTags);
}
/**
* Builder for {@link OneTimeWorkRequest}s.
*/
public static final class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
/**
* Creates a {@link OneTimeWorkRequest}.
*
* @param workerClass The {@link ListenableWorker} class to run for this work
*/
public Builder(@NonNull Class<? extends ListenableWorker> workerClass) {
super(workerClass);
mWorkSpec.inputMergerClassName = OverwritingInputMerger.class.getName();
}
/**
* Specifies the {@link InputMerger} class name for this {@link OneTimeWorkRequest}.
* <p>
* Before workers run, they receive input {@link Data} from their parent workers, as well as
* anything specified directly to them via {@link WorkRequest.Builder#setInputData(Data)}.
* An InputMerger takes all of these objects and converts them to a single merged
* {@link Data} to be used as the worker input. The default InputMerger is
* {@link OverwritingInputMerger}. This library also offers
* {@link ArrayCreatingInputMerger}; you can also specify your own.
*
* @param inputMerger The class name of the {@link InputMerger} for this
* {@link OneTimeWorkRequest}
* @return The current {@link Builder}
*/
public @NonNull Builder setInputMerger(@NonNull Class<? extends InputMerger> inputMerger) {
mWorkSpec.inputMergerClassName = inputMerger.getName();
return this;
}
@Override
@NonNull OneTimeWorkRequest buildInternal() {
if (mBackoffCriteriaSet
&& Build.VERSION.SDK_INT >= 23
&& mWorkSpec.constraints.requiresDeviceIdle()) {
throw new IllegalArgumentException(
"Cannot set backoff criteria on an idle mode job");
}
return new OneTimeWorkRequest(this);
}
@Override
@NonNull Builder getThis() {
return this;
}
}
}