kopia lustrzana https://github.com/ryukoposting/Signal-Android
Only perform subscriber id keep-alive when the user foregrounds the app.
rodzic
19a95f479e
commit
1893896254
|
@ -54,6 +54,7 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob;
|
||||||
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
|
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
|
||||||
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
|
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
|
||||||
import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
|
import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
|
||||||
|
import org.thoughtcrime.securesms.jobs.SubscriptionKeepAliveJob;
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||||
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
|
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
|
||||||
import org.thoughtcrime.securesms.logging.PersistentLogger;
|
import org.thoughtcrime.securesms.logging.PersistentLogger;
|
||||||
|
@ -61,7 +62,6 @@ import org.thoughtcrime.securesms.messageprocessingalarm.MessageProcessReceiver;
|
||||||
import org.thoughtcrime.securesms.migrations.ApplicationMigrations;
|
import org.thoughtcrime.securesms.migrations.ApplicationMigrations;
|
||||||
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
||||||
import org.thoughtcrime.securesms.providers.BlobProvider;
|
import org.thoughtcrime.securesms.providers.BlobProvider;
|
||||||
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
|
|
||||||
import org.thoughtcrime.securesms.ratelimit.RateLimitUtil;
|
import org.thoughtcrime.securesms.ratelimit.RateLimitUtil;
|
||||||
import org.thoughtcrime.securesms.registration.RegistrationUtil;
|
import org.thoughtcrime.securesms.registration.RegistrationUtil;
|
||||||
import org.thoughtcrime.securesms.ringrtc.RingRtcLogger;
|
import org.thoughtcrime.securesms.ringrtc.RingRtcLogger;
|
||||||
|
@ -70,7 +70,6 @@ import org.thoughtcrime.securesms.service.KeyCachingService;
|
||||||
import org.thoughtcrime.securesms.service.LocalBackupListener;
|
import org.thoughtcrime.securesms.service.LocalBackupListener;
|
||||||
import org.thoughtcrime.securesms.service.RotateSenderCertificateListener;
|
import org.thoughtcrime.securesms.service.RotateSenderCertificateListener;
|
||||||
import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener;
|
import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener;
|
||||||
import org.thoughtcrime.securesms.service.SubscriberIdKeepAliveListener;
|
|
||||||
import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
|
import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
|
||||||
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
|
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
|
||||||
import org.thoughtcrime.securesms.util.AppForegroundObserver;
|
import org.thoughtcrime.securesms.util.AppForegroundObserver;
|
||||||
|
@ -193,6 +192,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
|
||||||
ApplicationDependencies.getFrameRateTracker().start();
|
ApplicationDependencies.getFrameRateTracker().start();
|
||||||
ApplicationDependencies.getMegaphoneRepository().onAppForegrounded();
|
ApplicationDependencies.getMegaphoneRepository().onAppForegrounded();
|
||||||
ApplicationDependencies.getDeadlockDetector().start();
|
ApplicationDependencies.getDeadlockDetector().start();
|
||||||
|
SubscriptionKeepAliveJob.launchSubscriberIdKeepAliveJobIfNecessary();
|
||||||
|
|
||||||
SignalExecutors.BOUNDED.execute(() -> {
|
SignalExecutors.BOUNDED.execute(() -> {
|
||||||
FeatureFlags.refreshIfNecessary();
|
FeatureFlags.refreshIfNecessary();
|
||||||
|
@ -334,7 +334,6 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
|
||||||
LocalBackupListener.schedule(this);
|
LocalBackupListener.schedule(this);
|
||||||
RotateSenderCertificateListener.schedule(this);
|
RotateSenderCertificateListener.schedule(this);
|
||||||
MessageProcessReceiver.startOrUpdateAlarm(this);
|
MessageProcessReceiver.startOrUpdateAlarm(this);
|
||||||
SubscriberIdKeepAliveListener.schedule(this);
|
|
||||||
|
|
||||||
if (BuildConfig.PLAY_STORE_DISABLED) {
|
if (BuildConfig.PLAY_STORE_DISABLED) {
|
||||||
UpdateApkRefreshListener.schedule(this);
|
UpdateApkRefreshListener.schedule(this);
|
||||||
|
|
|
@ -29,11 +29,22 @@ public class SubscriptionKeepAliveJob extends BaseJob {
|
||||||
private static final String TAG = Log.tag(SubscriptionKeepAliveJob.class);
|
private static final String TAG = Log.tag(SubscriptionKeepAliveJob.class);
|
||||||
private static final long JOB_TIMEOUT = TimeUnit.DAYS.toMillis(3);
|
private static final long JOB_TIMEOUT = TimeUnit.DAYS.toMillis(3);
|
||||||
|
|
||||||
public SubscriptionKeepAliveJob() {
|
public static void launchSubscriberIdKeepAliveJobIfNecessary() {
|
||||||
|
long nextLaunchTime = SignalStore.donationsValues().getLastKeepAliveLaunchTime() + TimeUnit.DAYS.toMillis(3);
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
|
||||||
|
if (nextLaunchTime <= now) {
|
||||||
|
ApplicationDependencies.getJobManager().add(new SubscriptionKeepAliveJob());
|
||||||
|
SignalStore.donationsValues().setLastKeepAliveLaunchTime(now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SubscriptionKeepAliveJob() {
|
||||||
this(new Parameters.Builder()
|
this(new Parameters.Builder()
|
||||||
.setQueue(KEY)
|
.setQueue(KEY)
|
||||||
.addConstraint(NetworkConstraint.KEY)
|
.addConstraint(NetworkConstraint.KEY)
|
||||||
.setMaxInstancesForQueue(1)
|
.setMaxInstancesForQueue(1)
|
||||||
|
.setMaxAttempts(Parameters.UNLIMITED)
|
||||||
.setLifespan(JOB_TIMEOUT)
|
.setLifespan(JOB_TIMEOUT)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
@ -68,22 +79,15 @@ public class SubscriptionKeepAliveJob extends BaseJob {
|
||||||
.putSubscription(subscriber.getSubscriberId())
|
.putSubscription(subscriber.getSubscriberId())
|
||||||
.blockingGet();
|
.blockingGet();
|
||||||
|
|
||||||
if (!response.getResult().isPresent()) {
|
verifyResponse(response);
|
||||||
if (response.getStatus() == 403) {
|
Log.i(TAG, "Successful call to PUT subscription ID");
|
||||||
Log.w(TAG, "Response code 403, possibly corrupted subscription id.");
|
|
||||||
// TODO [alex] - Probably need some UX around this, or some kind of protocol.
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IOException("Failed to ping subscription service.");
|
|
||||||
}
|
|
||||||
|
|
||||||
ServiceResponse<ActiveSubscription> activeSubscriptionResponse = ApplicationDependencies.getDonationsService()
|
ServiceResponse<ActiveSubscription> activeSubscriptionResponse = ApplicationDependencies.getDonationsService()
|
||||||
.getSubscription(subscriber.getSubscriberId())
|
.getSubscription(subscriber.getSubscriberId())
|
||||||
.blockingGet();
|
.blockingGet();
|
||||||
|
|
||||||
if (!response.getResult().isPresent()) {
|
verifyResponse(activeSubscriptionResponse);
|
||||||
throw new IOException("Failed to perform active subscription check");
|
Log.i(TAG, "Successful call to GET active subscription");
|
||||||
}
|
|
||||||
|
|
||||||
ActiveSubscription activeSubscription = activeSubscriptionResponse.getResult().get();
|
ActiveSubscription activeSubscription = activeSubscriptionResponse.getResult().get();
|
||||||
if (activeSubscription.getActiveSubscription() == null || !activeSubscription.getActiveSubscription().isActive()) {
|
if (activeSubscription.getActiveSubscription() == null || !activeSubscription.getActiveSubscription().isActive()) {
|
||||||
|
@ -97,9 +101,29 @@ public class SubscriptionKeepAliveJob extends BaseJob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private <T> void verifyResponse(@NonNull ServiceResponse<T> response) throws Exception {
|
||||||
|
if (response.getExecutionError().isPresent()) {
|
||||||
|
Log.w(TAG, "Failed with an execution error. Scheduling retry.", response.getExecutionError().get(), true);
|
||||||
|
throw new RetryableException();
|
||||||
|
} else if (response.getApplicationError().isPresent()) {
|
||||||
|
switch (response.getStatus()) {
|
||||||
|
case 403:
|
||||||
|
case 404:
|
||||||
|
Log.w(TAG, "Invalid or malformed subscriber id. Status: " + response.getStatus(), response.getApplicationError().get(), true);
|
||||||
|
throw new IOException();
|
||||||
|
default:
|
||||||
|
Log.w(TAG, "An unknown server error occurred: " + response.getStatus(), response.getApplicationError().get(), true);
|
||||||
|
throw new RetryableException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean onShouldRetry(@NonNull Exception e) {
|
protected boolean onShouldRetry(@NonNull Exception e) {
|
||||||
return true;
|
return e instanceof RetryableException;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class RetryableException extends Exception {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Factory implements Job.Factory<SubscriptionKeepAliveJob> {
|
public static class Factory implements Job.Factory<SubscriptionKeepAliveJob> {
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
package org.thoughtcrime.securesms.service;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
|
||||||
import org.thoughtcrime.securesms.jobs.SubscriptionKeepAliveJob;
|
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manages the scheduling of jobs for keeping a subscription id alive.
|
|
||||||
*/
|
|
||||||
public class SubscriberIdKeepAliveListener extends PersistentAlarmManagerListener {
|
|
||||||
|
|
||||||
private static final long INTERVAL = TimeUnit.DAYS.toMillis(3);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected long getNextScheduledExecutionTime(Context context) {
|
|
||||||
return SignalStore.donationsValues().getLastKeepAliveLaunchTime() + INTERVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected long onAlarm(Context context, long scheduledTime) {
|
|
||||||
if (SignalStore.donationsValues().getSubscriber() != null) {
|
|
||||||
ApplicationDependencies.getJobManager().add(new SubscriptionKeepAliveJob());
|
|
||||||
}
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
SignalStore.donationsValues().setLastKeepAliveLaunchTime(now);
|
|
||||||
|
|
||||||
return now + INTERVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void schedule(Context context) {
|
|
||||||
new SubscriberIdKeepAliveListener().onReceive(context, new Intent());
|
|
||||||
}
|
|
||||||
}
|
|
Ładowanie…
Reference in New Issue