// Signature format: 4.0
package androidx.work {

  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
    ctor public ArrayCreatingInputMerger();
    method public androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
  }

  public enum BackoffPolicy {
    method public static androidx.work.BackoffPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.BackoffPolicy[] values();
    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
  }

  public final class Configuration {
    method public String? getDefaultProcessName();
    method public java.util.concurrent.Executor getExecutor();
    method public androidx.core.util.Consumer<java.lang.Throwable>? getInitializationExceptionHandler();
    method public androidx.work.InputMergerFactory getInputMergerFactory();
    method public int getMaxJobSchedulerId();
    method public int getMinJobSchedulerId();
    method public androidx.work.RunnableScheduler getRunnableScheduler();
    method public androidx.core.util.Consumer<java.lang.Throwable>? getSchedulingExceptionHandler();
    method public java.util.concurrent.Executor getTaskExecutor();
    method public androidx.work.WorkerFactory getWorkerFactory();
    property public final String? defaultProcessName;
    property public final java.util.concurrent.Executor executor;
    property public final androidx.core.util.Consumer<java.lang.Throwable>? initializationExceptionHandler;
    property public final androidx.work.InputMergerFactory inputMergerFactory;
    property public final int maxJobSchedulerId;
    property public final int minJobSchedulerId;
    property public final androidx.work.RunnableScheduler runnableScheduler;
    property public final androidx.core.util.Consumer<java.lang.Throwable>? schedulingExceptionHandler;
    property public final java.util.concurrent.Executor taskExecutor;
    property public final androidx.work.WorkerFactory workerFactory;
    field public static final androidx.work.Configuration.Companion Companion;
    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
  }

  public static final class Configuration.Builder {
    ctor public Configuration.Builder();
    method public androidx.work.Configuration build();
    method public androidx.work.Configuration.Builder setDefaultProcessName(String processName);
    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor executor);
    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> exceptionHandler);
    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory inputMergerFactory);
    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId);
    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int maxSchedulerLimit);
    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int loggingLevel);
    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler runnableScheduler);
    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> schedulingExceptionHandler);
    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor taskExecutor);
    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory workerFactory);
  }

  public static final class Configuration.Companion {
  }

  public static interface Configuration.Provider {
    method public androidx.work.Configuration getWorkManagerConfiguration();
    property public abstract androidx.work.Configuration workManagerConfiguration;
  }

  public final class Constraints {
    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
    ctor public Constraints(androidx.work.Constraints other);
    method public long getContentTriggerMaxDelayMillis();
    method public long getContentTriggerUpdateDelayMillis();
    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
    method public androidx.work.NetworkType getRequiredNetworkType();
    method public boolean requiresBatteryNotLow();
    method public boolean requiresCharging();
    method @RequiresApi(23) public boolean requiresDeviceIdle();
    method public boolean requiresStorageNotLow();
    property public final long contentTriggerMaxDelayMillis;
    property public final long contentTriggerUpdateDelayMillis;
    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
    property public final androidx.work.NetworkType requiredNetworkType;
    field public static final androidx.work.Constraints.Companion Companion;
    field public static final androidx.work.Constraints NONE;
  }

  public static final class Constraints.Builder {
    ctor public Constraints.Builder();
    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri uri, boolean triggerForDescendants);
    method public androidx.work.Constraints build();
    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType networkType);
    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean requiresBatteryNotLow);
    method public androidx.work.Constraints.Builder setRequiresCharging(boolean requiresCharging);
    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean requiresDeviceIdle);
    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean requiresStorageNotLow);
    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration duration);
    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration duration);
  }

  public static final class Constraints.Companion {
  }

  public static final class Constraints.ContentUriTrigger {
    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
    method public android.net.Uri getUri();
    method public boolean isTriggeredForDescendants();
    property public final boolean isTriggeredForDescendants;
    property public final android.net.Uri uri;
  }

  public final class Data {
    ctor public Data(androidx.work.Data);
    method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
    method public boolean getBoolean(String, boolean);
    method public boolean[]? getBooleanArray(String);
    method public byte getByte(String, byte);
    method public byte[]? getByteArray(String);
    method public double getDouble(String, double);
    method public double[]? getDoubleArray(String);
    method public float getFloat(String, float);
    method public float[]? getFloatArray(String);
    method public int getInt(String, int);
    method public int[]? getIntArray(String);
    method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
    method public long getLong(String, long);
    method public long[]? getLongArray(String);
    method public String? getString(String);
    method public String![]? getStringArray(String);
    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
    method public byte[] toByteArray();
    field public static final androidx.work.Data EMPTY;
    field public static final int MAX_DATA_BYTES = 10240; // 0x2800
  }

  public static final class Data.Builder {
    ctor public Data.Builder();
    method public androidx.work.Data build();
    method public androidx.work.Data.Builder putAll(androidx.work.Data);
    method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
    method public androidx.work.Data.Builder putBoolean(String, boolean);
    method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
    method public androidx.work.Data.Builder putByte(String, byte);
    method public androidx.work.Data.Builder putByteArray(String, byte[]);
    method public androidx.work.Data.Builder putDouble(String, double);
    method public androidx.work.Data.Builder putDoubleArray(String, double[]);
    method public androidx.work.Data.Builder putFloat(String, float);
    method public androidx.work.Data.Builder putFloatArray(String, float[]);
    method public androidx.work.Data.Builder putInt(String, int);
    method public androidx.work.Data.Builder putIntArray(String, int[]);
    method public androidx.work.Data.Builder putLong(String, long);
    method public androidx.work.Data.Builder putLongArray(String, long[]);
    method public androidx.work.Data.Builder putString(String, String?);
    method public androidx.work.Data.Builder putStringArray(String, String![]);
  }

  public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
    ctor public DelegatingWorkerFactory();
    method public final void addFactory(androidx.work.WorkerFactory);
    method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
  }

  public enum ExistingPeriodicWorkPolicy {
    method public static androidx.work.ExistingPeriodicWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.ExistingPeriodicWorkPolicy[] values();
    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy CANCEL_AND_REENQUEUE;
    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
    enum_constant @Deprecated public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy UPDATE;
  }

  public enum ExistingWorkPolicy {
    method public static androidx.work.ExistingWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.ExistingWorkPolicy[] values();
    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND_OR_REPLACE;
    enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
    enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
  }

  public final class ForegroundInfo {
    ctor public ForegroundInfo(int, android.app.Notification);
    ctor public ForegroundInfo(int, android.app.Notification, int);
    method public int getForegroundServiceType();
    method public android.app.Notification getNotification();
    method public int getNotificationId();
  }

  public interface ForegroundUpdater {
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
  }

  public abstract class InputMerger {
    ctor public InputMerger();
    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
  }

  public abstract class InputMergerFactory {
    ctor public InputMergerFactory();
    method public abstract androidx.work.InputMerger? createInputMerger(String className);
  }

  public abstract class ListenableWorker {
    ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
    method public final android.content.Context getApplicationContext();
    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo!> getForegroundInfoAsync();
    method public final java.util.UUID getId();
    method public final androidx.work.Data getInputData();
    method @RequiresApi(28) public final android.net.Network? getNetwork();
    method @IntRange(from=0) public final int getRunAttemptCount();
    method public final java.util.Set<java.lang.String!> getTags();
    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
    method public final boolean isStopped();
    method public void onStopped();
    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
    method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
  }

  public abstract static class ListenableWorker.Result {
    method public static androidx.work.ListenableWorker.Result failure();
    method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
    method public abstract androidx.work.Data getOutputData();
    method public static androidx.work.ListenableWorker.Result retry();
    method public static androidx.work.ListenableWorker.Result success();
    method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
  }

  public enum NetworkType {
    method public static androidx.work.NetworkType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.NetworkType[] values();
    enum_constant public static final androidx.work.NetworkType CONNECTED;
    enum_constant public static final androidx.work.NetworkType METERED;
    enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
    enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
    enum_constant @RequiresApi(30) public static final androidx.work.NetworkType TEMPORARILY_UNMETERED;
    enum_constant public static final androidx.work.NetworkType UNMETERED;
  }

  public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
    method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
    method public static java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
    field public static final androidx.work.OneTimeWorkRequest.Companion Companion;
  }

  public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
    ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass);
    method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger> inputMerger);
  }

  public static final class OneTimeWorkRequest.Companion {
    method public androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
    method public java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
  }

  public final class OneTimeWorkRequestKt {
    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
  }

  public interface Operation {
    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
    method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
  }

  public abstract static class Operation.State {
  }

  public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
    ctor public Operation.State.FAILURE(Throwable);
    method public Throwable getThrowable();
  }

  public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
  }

  public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
  }

  public enum OutOfQuotaPolicy {
    method public static androidx.work.OutOfQuotaPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.OutOfQuotaPolicy[] values();
    enum_constant public static final androidx.work.OutOfQuotaPolicy DROP_WORK_REQUEST;
    enum_constant public static final androidx.work.OutOfQuotaPolicy RUN_AS_NON_EXPEDITED_WORK_REQUEST;
  }

  public final class OverwritingInputMerger extends androidx.work.InputMerger {
    ctor public OverwritingInputMerger();
    method public androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
  }

  public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
    field public static final androidx.work.PeriodicWorkRequest.Companion Companion;
    field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
    field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
  }

  public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval);
    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexInterval, java.util.concurrent.TimeUnit flexIntervalTimeUnit);
    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval, java.time.Duration flexInterval);
  }

  public static final class PeriodicWorkRequest.Companion {
  }

  public final class PeriodicWorkRequestKt {
    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
  }

  public interface ProgressUpdater {
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
  }

  public interface RunnableScheduler {
    method public void cancel(Runnable);
    method public void scheduleWithDelay(@IntRange(from=0) long, Runnable);
  }

  public abstract class WorkContinuation {
    ctor public WorkContinuation();
    method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
    method public abstract androidx.work.Operation enqueue();
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
    method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
  }

  public final class WorkInfo {
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation, optional androidx.work.Constraints constraints);
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation);
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount);
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress);
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData);
    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags);
    method public androidx.work.Constraints getConstraints();
    method public int getGeneration();
    method public java.util.UUID getId();
    method public androidx.work.Data getOutputData();
    method public androidx.work.Data getProgress();
    method @IntRange(from=0L) public int getRunAttemptCount();
    method public androidx.work.WorkInfo.State getState();
    method public java.util.Set<java.lang.String> getTags();
    property public final androidx.work.Constraints constraints;
    property public final int generation;
    property public final java.util.UUID id;
    property public final androidx.work.Data outputData;
    property public final androidx.work.Data progress;
    property @IntRange(from=0L) public final int runAttemptCount;
    property public final androidx.work.WorkInfo.State state;
    property public final java.util.Set<java.lang.String> tags;
  }

  public enum WorkInfo.State {
    method public final boolean isFinished();
    method public static androidx.work.WorkInfo.State valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.work.WorkInfo.State[] values();
    property public final boolean isFinished;
    enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
    enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
    enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
    enum_constant public static final androidx.work.WorkInfo.State FAILED;
    enum_constant public static final androidx.work.WorkInfo.State RUNNING;
    enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
  }

  public abstract class WorkManager {
    method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public abstract androidx.work.Operation cancelAllWork();
    method public abstract androidx.work.Operation cancelAllWorkByTag(String);
    method public abstract androidx.work.Operation cancelUniqueWork(String);
    method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
    method public abstract android.app.PendingIntent createCancelPendingIntent(java.util.UUID);
    method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
    method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
    method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
    method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public abstract androidx.work.Configuration getConfiguration();
    method @Deprecated public static androidx.work.WorkManager getInstance();
    method public static androidx.work.WorkManager getInstance(android.content.Context);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
    method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
    method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData(androidx.work.WorkQuery);
    method public static void initialize(android.content.Context, androidx.work.Configuration);
    method public static boolean isInitialized();
    method public abstract androidx.work.Operation pruneWork();
    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkManager.UpdateResult!> updateWork(androidx.work.WorkRequest);
  }

  public enum WorkManager.UpdateResult {
    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_FOR_NEXT_RUN;
    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_IMMEDIATELY;
    enum_constant public static final androidx.work.WorkManager.UpdateResult NOT_APPLIED;
  }

  public final class WorkManagerInitializer implements androidx.startup.Initializer<androidx.work.WorkManager> {
    ctor public WorkManagerInitializer();
    method public androidx.work.WorkManager create(android.content.Context);
    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
  }

  public final class WorkQuery {
    method public static androidx.work.WorkQuery fromIds(java.util.List<java.util.UUID!>);
    method public static androidx.work.WorkQuery fromIds(java.util.UUID!...);
    method public static androidx.work.WorkQuery fromStates(java.util.List<androidx.work.WorkInfo.State!>);
    method public static androidx.work.WorkQuery fromStates(androidx.work.WorkInfo.State!...);
    method public static androidx.work.WorkQuery fromTags(java.util.List<java.lang.String!>);
    method public static androidx.work.WorkQuery fromTags(java.lang.String!...);
    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.lang.String!...);
    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.util.List<java.lang.String!>);
    method public java.util.List<java.util.UUID!> getIds();
    method public java.util.List<androidx.work.WorkInfo.State!> getStates();
    method public java.util.List<java.lang.String!> getTags();
    method public java.util.List<java.lang.String!> getUniqueWorkNames();
  }

  public static final class WorkQuery.Builder {
    method public androidx.work.WorkQuery.Builder addIds(java.util.List<java.util.UUID!>);
    method public androidx.work.WorkQuery.Builder addStates(java.util.List<androidx.work.WorkInfo.State!>);
    method public androidx.work.WorkQuery.Builder addTags(java.util.List<java.lang.String!>);
    method public androidx.work.WorkQuery.Builder addUniqueWorkNames(java.util.List<java.lang.String!>);
    method public androidx.work.WorkQuery build();
    method public static androidx.work.WorkQuery.Builder fromIds(java.util.List<java.util.UUID!>);
    method public static androidx.work.WorkQuery.Builder fromStates(java.util.List<androidx.work.WorkInfo.State!>);
    method public static androidx.work.WorkQuery.Builder fromTags(java.util.List<java.lang.String!>);
    method public static androidx.work.WorkQuery.Builder fromUniqueWorkNames(java.util.List<java.lang.String!>);
  }

  public abstract class WorkRequest {
    method public java.util.UUID getId();
    property public java.util.UUID id;
    field public static final androidx.work.WorkRequest.Companion Companion;
    field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
    field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
    field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
  }

  public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder<B, ?>, W extends androidx.work.WorkRequest> {
    method public final B addTag(String tag);
    method public final W build();
    method public final B keepResultsForAtLeast(long duration, java.util.concurrent.TimeUnit timeUnit);
    method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration duration);
    method public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, long backoffDelay, java.util.concurrent.TimeUnit timeUnit);
    method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, java.time.Duration duration);
    method public final B setConstraints(androidx.work.Constraints constraints);
    method public B setExpedited(androidx.work.OutOfQuotaPolicy policy);
    method public final B setId(java.util.UUID id);
    method public B setInitialDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
    method @RequiresApi(26) public B setInitialDelay(java.time.Duration duration);
    method public final B setInputData(androidx.work.Data inputData);
  }

  public static final class WorkRequest.Companion {
  }

  public abstract class Worker extends androidx.work.ListenableWorker {
    ctor public Worker(android.content.Context, androidx.work.WorkerParameters);
    method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
    method @WorkerThread public androidx.work.ForegroundInfo getForegroundInfo();
    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
  }

  public abstract class WorkerFactory {
    ctor public WorkerFactory();
    method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
  }

  public final class WorkerParameters {
    method @IntRange(from=0) public int getGeneration();
    method public java.util.UUID getId();
    method public androidx.work.Data getInputData();
    method @RequiresApi(28) public android.net.Network? getNetwork();
    method @IntRange(from=0) public int getRunAttemptCount();
    method public java.util.Set<java.lang.String!> getTags();
    method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
    method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
  }

}

package androidx.work.multiprocess {

  public abstract class RemoteWorkContinuation {
    method public static androidx.work.multiprocess.RemoteWorkContinuation combine(java.util.List<androidx.work.multiprocess.RemoteWorkContinuation!>);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue();
    method public final androidx.work.multiprocess.RemoteWorkContinuation then(androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.multiprocess.RemoteWorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
  }

  public abstract class RemoteWorkManager {
    method public final androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public final androidx.work.multiprocess.RemoteWorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWork();
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWorkByTag(String);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelUniqueWork(String);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelWorkById(java.util.UUID);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(androidx.work.WorkRequest);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(java.util.List<androidx.work.WorkRequest!>);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
    method public static androidx.work.multiprocess.RemoteWorkManager getInstance(android.content.Context);
    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
  }

}

