Change WebsocketDrainedConstraint to DecryptionsDrainedConstraint.

This commit is contained in:
Greyson Parrelli
2020-12-08 16:51:03 -05:00
parent 84e9282f87
commit 9f8e31db78
7 changed files with 121 additions and 40 deletions

View File

@@ -20,6 +20,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.jobs.PushDecryptDrainedJob;
import org.thoughtcrime.securesms.messages.IncomingMessageProcessor.Processor;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
@@ -30,6 +31,7 @@ import org.whispersystems.signalservice.api.SignalServiceMessagePipe;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
@@ -47,16 +49,17 @@ public class IncomingMessageObserver {
private final Context context;
private final SignalServiceNetworkAccess networkAccess;
private final List<Runnable> websocketDrainedListeners;
private final List<Runnable> decryptionDrainedListeners;
private boolean appVisible;
private volatile boolean websocketDrained;
private volatile boolean networkDrained;
private volatile boolean decryptionDrained;
public IncomingMessageObserver(@NonNull Context context) {
this.context = context;
this.networkAccess = ApplicationDependencies.getSignalServiceNetworkAccess();
this.websocketDrainedListeners = new CopyOnWriteArrayList<>();
this.context = context;
this.networkAccess = ApplicationDependencies.getSignalServiceNetworkAccess();
this.decryptionDrainedListeners = new CopyOnWriteArrayList<>();
new MessageRetrievalThread().start();
@@ -82,7 +85,8 @@ public class IncomingMessageObserver {
synchronized (IncomingMessageObserver.this) {
if (!NetworkConstraint.isMet(context)) {
Log.w(TAG, "Lost network connection. Shutting down our websocket connections and resetting the drained state.");
websocketDrained = false;
networkDrained = false;
decryptionDrained = false;
shutdown(pipe, unidentifiedPipe);
}
IncomingMessageObserver.this.notifyAll();
@@ -91,15 +95,31 @@ public class IncomingMessageObserver {
}, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
public synchronized void addWebsocketDrainedListener(@NonNull Runnable listener) {
websocketDrainedListeners.add(listener);
if (websocketDrained) {
public synchronized void addDecryptionDrainedListener(@NonNull Runnable listener) {
decryptionDrainedListeners.add(listener);
if (decryptionDrained) {
listener.run();
}
}
public boolean isWebsocketDrained() {
return websocketDrained;
public boolean isDecryptionDrained() {
return decryptionDrained;
}
public void notifyDecryptionsDrained() {
List<Runnable> listenersToTrigger = new ArrayList<>(decryptionDrainedListeners.size());
synchronized (this) {
if (networkDrained && !decryptionDrained) {
Log.i(TAG, "Decryptions newly drained.");
decryptionDrained = true;
listenersToTrigger.addAll(decryptionDrainedListeners);
}
}
for (Runnable listener : listenersToTrigger) {
listener.run();
}
}
private synchronized void onAppForegrounded() {
@@ -195,13 +215,10 @@ public class IncomingMessageObserver {
}
});
if (!result.isPresent() && !websocketDrained) {
Log.i(TAG, "Websocket was newly-drained. Triggering listeners.");
websocketDrained = true;
for (Runnable listener : websocketDrainedListeners) {
listener.run();
}
if (!result.isPresent() && !networkDrained) {
Log.i(TAG, "Network was newly-drained. Enqueuing a job to listen for decryption draining.");
networkDrained = true;
ApplicationDependencies.getJobManager().add(new PushDecryptDrainedJob());
}
} catch (TimeoutException e) {
Log.w(TAG, "Application level read timeout...");