220 lines
7.2 KiB
Java
220 lines
7.2 KiB
Java
|
package androidx.work;
|
||
|
|
||
|
import android.annotation.SuppressLint;
|
||
|
import android.os.Build;
|
||
|
import androidx.annotation.IntRange;
|
||
|
import androidx.annotation.NonNull;
|
||
|
import androidx.annotation.RestrictTo;
|
||
|
import androidx.work.impl.DefaultRunnableScheduler;
|
||
|
import java.util.concurrent.Executor;
|
||
|
import java.util.concurrent.Executors;
|
||
|
public final class Configuration {
|
||
|
@SuppressLint({"MinMaxConstant"})
|
||
|
public static final int MIN_SCHEDULER_LIMIT = 20;
|
||
|
@NonNull
|
||
|
public final Executor mExecutor;
|
||
|
@NonNull
|
||
|
public final InputMergerFactory mInputMergerFactory;
|
||
|
private final boolean mIsUsingDefaultTaskExecutor;
|
||
|
public final int mLoggingLevel;
|
||
|
public final int mMaxJobSchedulerId;
|
||
|
public final int mMaxSchedulerLimit;
|
||
|
public final int mMinJobSchedulerId;
|
||
|
@NonNull
|
||
|
public final RunnableScheduler mRunnableScheduler;
|
||
|
@NonNull
|
||
|
public final Executor mTaskExecutor;
|
||
|
@NonNull
|
||
|
public final WorkerFactory mWorkerFactory;
|
||
|
|
||
|
public static final class Builder {
|
||
|
public Executor mExecutor;
|
||
|
public InputMergerFactory mInputMergerFactory;
|
||
|
public int mLoggingLevel;
|
||
|
public int mMaxJobSchedulerId;
|
||
|
public int mMaxSchedulerLimit;
|
||
|
public int mMinJobSchedulerId;
|
||
|
public RunnableScheduler mRunnableScheduler;
|
||
|
public Executor mTaskExecutor;
|
||
|
public WorkerFactory mWorkerFactory;
|
||
|
|
||
|
public Builder() {
|
||
|
this.mLoggingLevel = 4;
|
||
|
this.mMinJobSchedulerId = 0;
|
||
|
this.mMaxJobSchedulerId = Integer.MAX_VALUE;
|
||
|
this.mMaxSchedulerLimit = 20;
|
||
|
}
|
||
|
|
||
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
||
|
public Builder(@NonNull Configuration configuration) {
|
||
|
this.mExecutor = configuration.mExecutor;
|
||
|
this.mWorkerFactory = configuration.mWorkerFactory;
|
||
|
this.mInputMergerFactory = configuration.mInputMergerFactory;
|
||
|
this.mTaskExecutor = configuration.mTaskExecutor;
|
||
|
this.mLoggingLevel = configuration.mLoggingLevel;
|
||
|
this.mMinJobSchedulerId = configuration.mMinJobSchedulerId;
|
||
|
this.mMaxJobSchedulerId = configuration.mMaxJobSchedulerId;
|
||
|
this.mMaxSchedulerLimit = configuration.mMaxSchedulerLimit;
|
||
|
this.mRunnableScheduler = configuration.mRunnableScheduler;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Configuration build() {
|
||
|
return new Configuration(this);
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setExecutor(@NonNull Executor executor) {
|
||
|
this.mExecutor = executor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setInputMergerFactory(@NonNull InputMergerFactory inputMergerFactory) {
|
||
|
this.mInputMergerFactory = inputMergerFactory;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setJobSchedulerJobIdRange(int i, int i2) {
|
||
|
if (i2 - i >= 1000) {
|
||
|
this.mMinJobSchedulerId = i;
|
||
|
this.mMaxJobSchedulerId = i2;
|
||
|
return this;
|
||
|
}
|
||
|
throw new IllegalArgumentException("WorkManager needs a range of at least 1000 job ids.");
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setMaxSchedulerLimit(int i) {
|
||
|
if (i >= 20) {
|
||
|
this.mMaxSchedulerLimit = Math.min(i, 50);
|
||
|
return this;
|
||
|
}
|
||
|
throw new IllegalArgumentException("WorkManager needs to be able to schedule at least 20 jobs in JobScheduler.");
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setMinimumLoggingLevel(int i) {
|
||
|
this.mLoggingLevel = i;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setRunnableScheduler(@NonNull RunnableScheduler runnableScheduler) {
|
||
|
this.mRunnableScheduler = runnableScheduler;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setTaskExecutor(@NonNull Executor executor) {
|
||
|
this.mTaskExecutor = executor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Builder setWorkerFactory(@NonNull WorkerFactory workerFactory) {
|
||
|
this.mWorkerFactory = workerFactory;
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public interface Provider {
|
||
|
@NonNull
|
||
|
Configuration getWorkManagerConfiguration();
|
||
|
}
|
||
|
|
||
|
public Configuration(@NonNull Builder builder) {
|
||
|
Executor executor = builder.mExecutor;
|
||
|
if (executor == null) {
|
||
|
this.mExecutor = createDefaultExecutor();
|
||
|
} else {
|
||
|
this.mExecutor = executor;
|
||
|
}
|
||
|
Executor executor2 = builder.mTaskExecutor;
|
||
|
if (executor2 == null) {
|
||
|
this.mIsUsingDefaultTaskExecutor = true;
|
||
|
this.mTaskExecutor = createDefaultExecutor();
|
||
|
} else {
|
||
|
this.mIsUsingDefaultTaskExecutor = false;
|
||
|
this.mTaskExecutor = executor2;
|
||
|
}
|
||
|
WorkerFactory workerFactory = builder.mWorkerFactory;
|
||
|
if (workerFactory == null) {
|
||
|
this.mWorkerFactory = WorkerFactory.getDefaultWorkerFactory();
|
||
|
} else {
|
||
|
this.mWorkerFactory = workerFactory;
|
||
|
}
|
||
|
InputMergerFactory inputMergerFactory = builder.mInputMergerFactory;
|
||
|
if (inputMergerFactory == null) {
|
||
|
this.mInputMergerFactory = InputMergerFactory.getDefaultInputMergerFactory();
|
||
|
} else {
|
||
|
this.mInputMergerFactory = inputMergerFactory;
|
||
|
}
|
||
|
RunnableScheduler runnableScheduler = builder.mRunnableScheduler;
|
||
|
if (runnableScheduler == null) {
|
||
|
this.mRunnableScheduler = new DefaultRunnableScheduler();
|
||
|
} else {
|
||
|
this.mRunnableScheduler = runnableScheduler;
|
||
|
}
|
||
|
this.mLoggingLevel = builder.mLoggingLevel;
|
||
|
this.mMinJobSchedulerId = builder.mMinJobSchedulerId;
|
||
|
this.mMaxJobSchedulerId = builder.mMaxJobSchedulerId;
|
||
|
this.mMaxSchedulerLimit = builder.mMaxSchedulerLimit;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
private Executor createDefaultExecutor() {
|
||
|
return Executors.newFixedThreadPool(Math.max(2, Math.min(Runtime.getRuntime().availableProcessors() - 1, 4)));
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Executor getExecutor() {
|
||
|
return this.mExecutor;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public InputMergerFactory getInputMergerFactory() {
|
||
|
return this.mInputMergerFactory;
|
||
|
}
|
||
|
|
||
|
public int getMaxJobSchedulerId() {
|
||
|
return this.mMaxJobSchedulerId;
|
||
|
}
|
||
|
|
||
|
@IntRange(from = 20, to = 50)
|
||
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
||
|
public int getMaxSchedulerLimit() {
|
||
|
return Build.VERSION.SDK_INT == 23 ? this.mMaxSchedulerLimit / 2 : this.mMaxSchedulerLimit;
|
||
|
}
|
||
|
|
||
|
public int getMinJobSchedulerId() {
|
||
|
return this.mMinJobSchedulerId;
|
||
|
}
|
||
|
|
||
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
||
|
public int getMinimumLoggingLevel() {
|
||
|
return this.mLoggingLevel;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public RunnableScheduler getRunnableScheduler() {
|
||
|
return this.mRunnableScheduler;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public Executor getTaskExecutor() {
|
||
|
return this.mTaskExecutor;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public WorkerFactory getWorkerFactory() {
|
||
|
return this.mWorkerFactory;
|
||
|
}
|
||
|
|
||
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
||
|
public boolean isUsingDefaultTaskExecutor() {
|
||
|
return this.mIsUsingDefaultTaskExecutor;
|
||
|
}
|
||
|
}
|