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; } }