diff --git a/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java b/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java index 6d6fc0499f..6c0fda477f 100644 --- a/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java +++ b/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java @@ -2,10 +2,14 @@ package org.thoughtcrime.securesms.jobmanager.impl; import android.app.Application; import android.app.job.JobInfo; +import android.telephony.ServiceState; +import android.telephony.TelephonyManager; + import androidx.annotation.NonNull; import org.thoughtcrime.securesms.jobmanager.Constraint; import org.thoughtcrime.securesms.sms.TelephonyServiceState; +import org.thoughtcrime.securesms.util.ServiceUtil; public class CellServiceConstraint implements Constraint { @@ -24,8 +28,7 @@ public class CellServiceConstraint implements Constraint { @Override public boolean isMet() { - TelephonyServiceState telephonyServiceState = new TelephonyServiceState(); - return telephonyServiceState.isConnected(application); + return CellServiceConstraintObserver.getInstance(application).hasService(); } @Override diff --git a/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java b/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java index fd0971dc57..de83be9b0b 100644 --- a/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java +++ b/src/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java @@ -13,9 +13,19 @@ public class CellServiceConstraintObserver implements ConstraintObserver { private static final String REASON = CellServiceConstraintObserver.class.getSimpleName(); - private Notifier notifier; + private Notifier notifier; + private ServiceState lastKnownState; - public CellServiceConstraintObserver(@NonNull Application application) { + private static CellServiceConstraintObserver instance; + + public static synchronized CellServiceConstraintObserver getInstance(@NonNull Application application) { + if (instance == null) { + instance = new CellServiceConstraintObserver(application); + } + return instance; + } + + private CellServiceConstraintObserver(@NonNull Application application) { TelephonyManager telephonyManager = (TelephonyManager) application.getSystemService(Context.TELEPHONY_SERVICE); ServiceStateListener serviceStateListener = new ServiceStateListener(); @@ -27,9 +37,15 @@ public class CellServiceConstraintObserver implements ConstraintObserver { this.notifier = notifier; } + public boolean hasService() { + return lastKnownState != null && lastKnownState.getState() == ServiceState.STATE_IN_SERVICE; + } + private class ServiceStateListener extends PhoneStateListener { @Override public void onServiceStateChanged(ServiceState serviceState) { + lastKnownState = serviceState; + if (serviceState.getState() == ServiceState.STATE_IN_SERVICE && notifier != null) { notifier.onConstraintMet(REASON); } diff --git a/src/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/src/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index f3af1c707e..07b6162a09 100644 --- a/src/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/src/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -85,7 +85,7 @@ public final class JobManagerFactories { } public static List getConstraintObservers(@NonNull Application application) { - return Arrays.asList(new CellServiceConstraintObserver(application), + return Arrays.asList(CellServiceConstraintObserver.getInstance(application), new NetworkConstraintObserver(application), new SqlCipherMigrationConstraintObserver()); }