Add a charging constraint to the backup job.

This commit is contained in:
Greyson Parrelli
2020-09-15 13:21:14 -04:00
parent 7108fc81a9
commit 19cc43c442
7 changed files with 128 additions and 11 deletions

View File

@@ -0,0 +1,43 @@
package org.thoughtcrime.securesms.jobmanager.impl;
import android.app.job.JobInfo;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.jobmanager.Constraint;
/**
* Job constraint for determining whether or not the device is actively charging.
*/
public class ChargingConstraint implements Constraint {
public static final String KEY = "ChargingConstraint";
private ChargingConstraint() {
}
@Override
public boolean isMet() {
return ChargingConstraintObserver.isCharging();
}
@Override
public @NonNull String getFactoryKey() {
return KEY;
}
@RequiresApi(26)
@Override
public void applyToJobInfo(@NonNull JobInfo.Builder jobInfoBuilder) {
jobInfoBuilder.setRequiresCharging(true);
}
public static final class Factory implements Constraint.Factory<ChargingConstraint> {
@Override
public ChargingConstraint create() {
return new ChargingConstraint();
}
}
}

View File

@@ -0,0 +1,62 @@
package org.thoughtcrime.securesms.jobmanager.impl;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.jobmanager.ConstraintObserver;
/**
* Observes the charging state of the device and notifies the JobManager system when appropriate.
*/
public class ChargingConstraintObserver implements ConstraintObserver {
private static final String REASON = ChargingConstraintObserver.class.getSimpleName();
private static final int STATUS_BATTERY = 0;
private final Application application;
private static volatile boolean charging;
public ChargingConstraintObserver(@NonNull Application application) {
this.application = application;
}
@Override
public void register(@NonNull Notifier notifier) {
Intent intent = application.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean wasCharging = charging;
charging = isCharging(intent);
if (charging && !wasCharging) {
notifier.onConstraintMet(REASON);
}
}
}, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
charging = isCharging(intent);
}
public static boolean isCharging() {
return charging;
}
private static boolean isCharging(@Nullable Intent intent) {
if (intent == null) {
return false;
}
int status = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, STATUS_BATTERY);
return status != STATUS_BATTERY;
}
}