178 lines
7.0 KiB
Java
178 lines
7.0 KiB
Java
package androidx.work.impl.workers;
|
|
|
|
import android.content.Context;
|
|
import android.text.TextUtils;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.work.ListenableWorker;
|
|
import androidx.work.Logger;
|
|
import androidx.work.WorkerParameters;
|
|
import androidx.work.impl.WorkDatabase;
|
|
import androidx.work.impl.WorkManagerImpl;
|
|
import androidx.work.impl.constraints.WorkConstraintsCallback;
|
|
import androidx.work.impl.constraints.WorkConstraintsTracker;
|
|
import androidx.work.impl.model.WorkSpec;
|
|
import androidx.work.impl.utils.futures.SettableFuture;
|
|
import androidx.work.impl.utils.taskexecutor.TaskExecutor;
|
|
import c.i.b.d.a.a;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
public class ConstraintTrackingWorker extends ListenableWorker implements WorkConstraintsCallback {
|
|
public static final String ARGUMENT_CLASS_NAME = "androidx.work.impl.workers.ConstraintTrackingWorker.ARGUMENT_CLASS_NAME";
|
|
private static final String TAG = Logger.tagWithPrefix("ConstraintTrkngWrkr");
|
|
public volatile boolean mAreConstraintsUnmet = false;
|
|
@Nullable
|
|
private ListenableWorker mDelegate;
|
|
public SettableFuture<ListenableWorker.Result> mFuture = SettableFuture.create();
|
|
public final Object mLock = new Object();
|
|
private WorkerParameters mWorkerParameters;
|
|
|
|
/* renamed from: androidx.work.impl.workers.ConstraintTrackingWorker$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements Runnable {
|
|
public AnonymousClass1() {
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ConstraintTrackingWorker.this.setupAndRunConstraintTrackingWork();
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.work.impl.workers.ConstraintTrackingWorker$2 reason: invalid class name */
|
|
public class AnonymousClass2 implements Runnable {
|
|
public final /* synthetic */ a val$innerFuture;
|
|
|
|
public AnonymousClass2(a aVar) {
|
|
this.val$innerFuture = aVar;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
synchronized (ConstraintTrackingWorker.this.mLock) {
|
|
if (ConstraintTrackingWorker.this.mAreConstraintsUnmet) {
|
|
ConstraintTrackingWorker.this.setFutureRetry();
|
|
} else {
|
|
ConstraintTrackingWorker.this.mFuture.setFuture(this.val$innerFuture);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public ConstraintTrackingWorker(@NonNull Context context, @NonNull WorkerParameters workerParameters) {
|
|
super(context, workerParameters);
|
|
this.mWorkerParameters = workerParameters;
|
|
}
|
|
|
|
@Nullable
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
@VisibleForTesting
|
|
public ListenableWorker getDelegate() {
|
|
return this.mDelegate;
|
|
}
|
|
|
|
@Override // androidx.work.ListenableWorker
|
|
@NonNull
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
@VisibleForTesting
|
|
public TaskExecutor getTaskExecutor() {
|
|
return WorkManagerImpl.getInstance(getApplicationContext()).getWorkTaskExecutor();
|
|
}
|
|
|
|
@NonNull
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
@VisibleForTesting
|
|
public WorkDatabase getWorkDatabase() {
|
|
return WorkManagerImpl.getInstance(getApplicationContext()).getWorkDatabase();
|
|
}
|
|
|
|
@Override // androidx.work.ListenableWorker
|
|
public boolean isRunInForeground() {
|
|
ListenableWorker listenableWorker = this.mDelegate;
|
|
return listenableWorker != null && listenableWorker.isRunInForeground();
|
|
}
|
|
|
|
@Override // androidx.work.impl.constraints.WorkConstraintsCallback
|
|
public void onAllConstraintsMet(@NonNull List<String> list) {
|
|
}
|
|
|
|
@Override // androidx.work.impl.constraints.WorkConstraintsCallback
|
|
public void onAllConstraintsNotMet(@NonNull List<String> list) {
|
|
Logger.get().debug(TAG, String.format("Constraints changed for %s", list), new Throwable[0]);
|
|
synchronized (this.mLock) {
|
|
this.mAreConstraintsUnmet = true;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.work.ListenableWorker
|
|
public void onStopped() {
|
|
super.onStopped();
|
|
ListenableWorker listenableWorker = this.mDelegate;
|
|
if (listenableWorker != null) {
|
|
listenableWorker.stop();
|
|
}
|
|
}
|
|
|
|
public void setFutureFailed() {
|
|
this.mFuture.set(ListenableWorker.Result.failure());
|
|
}
|
|
|
|
public void setFutureRetry() {
|
|
this.mFuture.set(ListenableWorker.Result.retry());
|
|
}
|
|
|
|
public void setupAndRunConstraintTrackingWork() {
|
|
String string = getInputData().getString(ARGUMENT_CLASS_NAME);
|
|
if (TextUtils.isEmpty(string)) {
|
|
Logger.get().error(TAG, "No worker to delegate to.", new Throwable[0]);
|
|
setFutureFailed();
|
|
return;
|
|
}
|
|
ListenableWorker createWorkerWithDefaultFallback = getWorkerFactory().createWorkerWithDefaultFallback(getApplicationContext(), string, this.mWorkerParameters);
|
|
this.mDelegate = createWorkerWithDefaultFallback;
|
|
if (createWorkerWithDefaultFallback == null) {
|
|
Logger.get().debug(TAG, "No worker to delegate to.", new Throwable[0]);
|
|
setFutureFailed();
|
|
return;
|
|
}
|
|
WorkSpec workSpec = getWorkDatabase().workSpecDao().getWorkSpec(getId().toString());
|
|
if (workSpec == null) {
|
|
setFutureFailed();
|
|
return;
|
|
}
|
|
WorkConstraintsTracker workConstraintsTracker = new WorkConstraintsTracker(getApplicationContext(), getTaskExecutor(), this);
|
|
workConstraintsTracker.replace(Collections.singletonList(workSpec));
|
|
if (workConstraintsTracker.areAllConstraintsMet(getId().toString())) {
|
|
Logger.get().debug(TAG, String.format("Constraints met for delegate %s", string), new Throwable[0]);
|
|
try {
|
|
a<ListenableWorker.Result> startWork = this.mDelegate.startWork();
|
|
startWork.addListener(new AnonymousClass2(startWork), getBackgroundExecutor());
|
|
} catch (Throwable th) {
|
|
Logger logger = Logger.get();
|
|
String str = TAG;
|
|
logger.debug(str, String.format("Delegated worker %s threw exception in startWork.", string), th);
|
|
synchronized (this.mLock) {
|
|
if (this.mAreConstraintsUnmet) {
|
|
Logger.get().debug(str, "Constraints were unmet, Retrying.", new Throwable[0]);
|
|
setFutureRetry();
|
|
} else {
|
|
setFutureFailed();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
Logger.get().debug(TAG, String.format("Constraints not met for delegate %s. Requesting retry.", string), new Throwable[0]);
|
|
setFutureRetry();
|
|
}
|
|
}
|
|
|
|
@Override // androidx.work.ListenableWorker
|
|
@NonNull
|
|
public a<ListenableWorker.Result> startWork() {
|
|
getBackgroundExecutor().execute(new AnonymousClass1());
|
|
return this.mFuture;
|
|
}
|
|
}
|