mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-08 20:18:34 +00:00
Add a charging constraint to the backup job.
This commit is contained in:
parent
7108fc81a9
commit
19cc43c442
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,8 @@ import org.thoughtcrime.securesms.jobmanager.ConstraintObserver;
|
|||||||
import org.thoughtcrime.securesms.jobmanager.Job;
|
import org.thoughtcrime.securesms.jobmanager.Job;
|
||||||
import org.thoughtcrime.securesms.jobmanager.JobMigration;
|
import org.thoughtcrime.securesms.jobmanager.JobMigration;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.CellServiceConstraintObserver;
|
import org.thoughtcrime.securesms.jobmanager.impl.CellServiceConstraintObserver;
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint;
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraintObserver;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
|
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver;
|
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkOrCellServiceConstraint;
|
import org.thoughtcrime.securesms.jobmanager.impl.NetworkOrCellServiceConstraint;
|
||||||
@ -158,6 +160,7 @@ public final class JobManagerFactories {
|
|||||||
|
|
||||||
public static Map<String, Constraint.Factory> getConstraintFactories(@NonNull Application application) {
|
public static Map<String, Constraint.Factory> getConstraintFactories(@NonNull Application application) {
|
||||||
return new HashMap<String, Constraint.Factory>() {{
|
return new HashMap<String, Constraint.Factory>() {{
|
||||||
|
put(ChargingConstraint.KEY, new ChargingConstraint.Factory());
|
||||||
put(NetworkConstraint.KEY, new NetworkConstraint.Factory(application));
|
put(NetworkConstraint.KEY, new NetworkConstraint.Factory(application));
|
||||||
put(NetworkOrCellServiceConstraint.KEY, new NetworkOrCellServiceConstraint.Factory(application));
|
put(NetworkOrCellServiceConstraint.KEY, new NetworkOrCellServiceConstraint.Factory(application));
|
||||||
put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application));
|
put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application));
|
||||||
@ -168,6 +171,7 @@ public final class JobManagerFactories {
|
|||||||
|
|
||||||
public static List<ConstraintObserver> getConstraintObservers(@NonNull Application application) {
|
public static List<ConstraintObserver> getConstraintObservers(@NonNull Application application) {
|
||||||
return Arrays.asList(CellServiceConstraintObserver.getInstance(application),
|
return Arrays.asList(CellServiceConstraintObserver.getInstance(application),
|
||||||
|
new ChargingConstraintObserver(application),
|
||||||
new NetworkConstraintObserver(application),
|
new NetworkConstraintObserver(application),
|
||||||
new SqlCipherMigrationConstraintObserver(),
|
new SqlCipherMigrationConstraintObserver(),
|
||||||
new WebsocketDrainedConstraintObserver());
|
new WebsocketDrainedConstraintObserver());
|
||||||
|
@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
|
|||||||
import org.thoughtcrime.securesms.database.NoExternalStorageException;
|
import org.thoughtcrime.securesms.database.NoExternalStorageException;
|
||||||
import org.thoughtcrime.securesms.jobmanager.Data;
|
import org.thoughtcrime.securesms.jobmanager.Data;
|
||||||
import org.thoughtcrime.securesms.jobmanager.Job;
|
import org.thoughtcrime.securesms.jobmanager.Job;
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint;
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
||||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||||
@ -36,12 +37,21 @@ public final class LocalBackupJob extends BaseJob {
|
|||||||
public static final String TEMP_BACKUP_FILE_PREFIX = ".backup";
|
public static final String TEMP_BACKUP_FILE_PREFIX = ".backup";
|
||||||
public static final String TEMP_BACKUP_FILE_SUFFIX = ".tmp";
|
public static final String TEMP_BACKUP_FILE_SUFFIX = ".tmp";
|
||||||
|
|
||||||
public LocalBackupJob() {
|
public LocalBackupJob(boolean forceNow) {
|
||||||
this(new Job.Parameters.Builder()
|
this(buildParameters(forceNow));
|
||||||
.setQueue("__LOCAL_BACKUP__")
|
}
|
||||||
.setMaxInstances(1)
|
|
||||||
.setMaxAttempts(3)
|
private static @NonNull Job.Parameters buildParameters(boolean forceNow) {
|
||||||
.build());
|
Job.Parameters.Builder builder = new Job.Parameters.Builder()
|
||||||
|
.setQueue("__LOCAL_BACKUP__")
|
||||||
|
.setMaxInstances(1)
|
||||||
|
.setMaxAttempts(3);
|
||||||
|
|
||||||
|
if (!forceNow) {
|
||||||
|
builder.addConstraint(ChargingConstraint.KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocalBackupJob(@NonNull Job.Parameters parameters) {
|
private LocalBackupJob(@NonNull Job.Parameters parameters) {
|
||||||
|
@ -153,7 +153,7 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
.ifNecessary()
|
.ifNecessary()
|
||||||
.onAllGranted(() -> {
|
.onAllGranted(() -> {
|
||||||
Log.i(TAG, "Queing backup...");
|
Log.i(TAG, "Queing backup...");
|
||||||
ApplicationDependencies.getJobManager().add(new LocalBackupJob());
|
ApplicationDependencies.getJobManager().add(new LocalBackupJob(true));
|
||||||
})
|
})
|
||||||
.withPermanentDenialDialog(getString(R.string.ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups))
|
.withPermanentDenialDialog(getString(R.string.ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups))
|
||||||
.execute();
|
.execute();
|
||||||
|
@ -24,7 +24,7 @@ public class LocalBackupListener extends PersistentAlarmManagerListener {
|
|||||||
@Override
|
@Override
|
||||||
protected long onAlarm(Context context, long scheduledTime) {
|
protected long onAlarm(Context context, long scheduledTime) {
|
||||||
if (TextSecurePreferences.isBackupEnabled(context)) {
|
if (TextSecurePreferences.isBackupEnabled(context)) {
|
||||||
ApplicationDependencies.getJobManager().add(new LocalBackupJob());
|
ApplicationDependencies.getJobManager().add(new LocalBackupJob(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
return setNextBackupTimeToIntervalFromNow(context);
|
return setNextBackupTimeToIntervalFromNow(context);
|
||||||
|
@ -5,14 +5,12 @@ import android.app.ActivityManager;
|
|||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.job.JobScheduler;
|
import android.app.job.JobScheduler;
|
||||||
import android.content.ClipData;
|
|
||||||
import android.content.ClipboardManager;
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.display.DisplayManager;
|
import android.hardware.display.DisplayManager;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.Vibrator;
|
import android.os.Vibrator;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@ -80,7 +78,7 @@ public class ServiceUtil {
|
|||||||
return (JobScheduler) context.getSystemService(JobScheduler.class);
|
return (JobScheduler) context.getSystemService(JobScheduler.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
|
@RequiresApi(22)
|
||||||
public static @Nullable SubscriptionManager getSubscriptionManager(@NonNull Context context) {
|
public static @Nullable SubscriptionManager getSubscriptionManager(@NonNull Context context) {
|
||||||
return (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
|
return (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user