101 lines
5.0 KiB
Java
101 lines
5.0 KiB
Java
package androidx.work.impl.constraints;
|
|
|
|
import android.content.Context;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.work.Logger;
|
|
import androidx.work.impl.constraints.controllers.BatteryChargingController;
|
|
import androidx.work.impl.constraints.controllers.BatteryNotLowController;
|
|
import androidx.work.impl.constraints.controllers.ConstraintController;
|
|
import androidx.work.impl.constraints.controllers.NetworkConnectedController;
|
|
import androidx.work.impl.constraints.controllers.NetworkMeteredController;
|
|
import androidx.work.impl.constraints.controllers.NetworkNotRoamingController;
|
|
import androidx.work.impl.constraints.controllers.NetworkUnmeteredController;
|
|
import androidx.work.impl.constraints.controllers.StorageNotLowController;
|
|
import androidx.work.impl.model.WorkSpec;
|
|
import androidx.work.impl.utils.taskexecutor.TaskExecutor;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
public class WorkConstraintsTracker implements ConstraintController.OnConstraintUpdatedCallback {
|
|
private static final String TAG = Logger.tagWithPrefix("WorkConstraintsTracker");
|
|
@Nullable
|
|
private final WorkConstraintsCallback mCallback;
|
|
private final ConstraintController<?>[] mConstraintControllers;
|
|
private final Object mLock = new Object();
|
|
|
|
public WorkConstraintsTracker(@NonNull Context context, @NonNull TaskExecutor taskExecutor, @Nullable WorkConstraintsCallback workConstraintsCallback) {
|
|
Context applicationContext = context.getApplicationContext();
|
|
this.mCallback = workConstraintsCallback;
|
|
this.mConstraintControllers = new ConstraintController[]{new BatteryChargingController(applicationContext, taskExecutor), new BatteryNotLowController(applicationContext, taskExecutor), new StorageNotLowController(applicationContext, taskExecutor), new NetworkConnectedController(applicationContext, taskExecutor), new NetworkUnmeteredController(applicationContext, taskExecutor), new NetworkNotRoamingController(applicationContext, taskExecutor), new NetworkMeteredController(applicationContext, taskExecutor)};
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public WorkConstraintsTracker(@Nullable WorkConstraintsCallback workConstraintsCallback, ConstraintController<?>[] constraintControllerArr) {
|
|
this.mCallback = workConstraintsCallback;
|
|
this.mConstraintControllers = constraintControllerArr;
|
|
}
|
|
|
|
public boolean areAllConstraintsMet(@NonNull String str) {
|
|
synchronized (this.mLock) {
|
|
ConstraintController<?>[] constraintControllerArr = this.mConstraintControllers;
|
|
for (ConstraintController<?> constraintController : constraintControllerArr) {
|
|
if (constraintController.isWorkSpecConstrained(str)) {
|
|
Logger.get().debug(TAG, String.format("Work %s constrained by %s", str, constraintController.getClass().getSimpleName()), new Throwable[0]);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.work.impl.constraints.controllers.ConstraintController.OnConstraintUpdatedCallback
|
|
public void onConstraintMet(@NonNull List<String> list) {
|
|
synchronized (this.mLock) {
|
|
ArrayList arrayList = new ArrayList();
|
|
for (String str : list) {
|
|
if (areAllConstraintsMet(str)) {
|
|
Logger.get().debug(TAG, String.format("Constraints met for %s", str), new Throwable[0]);
|
|
arrayList.add(str);
|
|
}
|
|
}
|
|
WorkConstraintsCallback workConstraintsCallback = this.mCallback;
|
|
if (workConstraintsCallback != null) {
|
|
workConstraintsCallback.onAllConstraintsMet(arrayList);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // androidx.work.impl.constraints.controllers.ConstraintController.OnConstraintUpdatedCallback
|
|
public void onConstraintNotMet(@NonNull List<String> list) {
|
|
synchronized (this.mLock) {
|
|
WorkConstraintsCallback workConstraintsCallback = this.mCallback;
|
|
if (workConstraintsCallback != null) {
|
|
workConstraintsCallback.onAllConstraintsNotMet(list);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void replace(@NonNull Iterable<WorkSpec> iterable) {
|
|
synchronized (this.mLock) {
|
|
for (ConstraintController<?> constraintController : this.mConstraintControllers) {
|
|
constraintController.setCallback(null);
|
|
}
|
|
for (ConstraintController<?> constraintController2 : this.mConstraintControllers) {
|
|
constraintController2.replace(iterable);
|
|
}
|
|
for (ConstraintController<?> constraintController3 : this.mConstraintControllers) {
|
|
constraintController3.setCallback(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void reset() {
|
|
synchronized (this.mLock) {
|
|
for (ConstraintController<?> constraintController : this.mConstraintControllers) {
|
|
constraintController.reset();
|
|
}
|
|
}
|
|
}
|
|
}
|