diff options
author | Tim Krüger <t@timkrueger.me> | 2022-11-07 14:20:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-07 14:20:32 +0300 |
commit | 5a392be92e49896f4daee2d7da81929251c498c9 (patch) | |
tree | fc441c5e417626e0d9561bbff3003b1988f50e7e /app | |
parent | 3d89d6b22f5fc84cae30014d7f1e82863547b813 (diff) | |
parent | 4b4b9da2b1156917a2e1e8d698a52cdc697f4f03 (diff) |
Merge pull request #2541 from nextcloud/keep-retrying-with-exponential-backoff-if-pulling-signaling-messages-fails
Keep retrying with exponential backoff if pulling signaling messages fails
Diffstat (limited to 'app')
-rw-r--r-- | app/src/main/java/com/nextcloud/talk/activities/CallActivity.java | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 507211a84..ecdefcfae 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -138,6 +138,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import javax.inject.Inject; @@ -1472,6 +1473,8 @@ public class CallActivity extends CallBaseActivity { int apiVersion = ApiUtils.getSignalingApiVersion(conversationUser, new int[]{ApiUtils.APIv3, 2, 1}); + AtomicInteger delayOnError = new AtomicInteger(0); + ncApi.pullSignalingMessages(credentials, ApiUtils.getUrlForSignaling(apiVersion, baseUrl, @@ -1480,7 +1483,22 @@ public class CallActivity extends CallBaseActivity { .observeOn(AndroidSchedulers.mainThread()) .repeatWhen(observable -> observable) .takeWhile(observable -> isConnectionEstablished()) - .retry(3, observable -> isConnectionEstablished()) + .doOnNext(value -> delayOnError.set(0)) + .retryWhen(errors -> errors + .flatMap(error -> { + if (!isConnectionEstablished()) { + return Observable.error(error); + } + + if (delayOnError.get() == 0) { + delayOnError.set(1); + } else if (delayOnError.get() < 16) { + delayOnError.set(delayOnError.get() * 2); + } + + return Observable.timer(delayOnError.get(), TimeUnit.SECONDS); + }) + ) .subscribe(new Observer<SignalingOverall>() { @Override public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) { |