Skip to content

Commit

Permalink
Fix not working scheduled reconnect
Browse files Browse the repository at this point in the history
Documentation for postDelayed:
> Causes the Runnable r to be added to the message queue, to be run
> after the specified amount of time elapses.
> The runnable will be run on the thread to which this handler
> is attached.
> <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
> Time spent in deep sleep will add an additional delay to execution.

TL;DR: if the CPU is in deep sleep, the postDelayed runnable won't be executed.
  • Loading branch information
jmattheis committed Jun 13, 2020
1 parent fe9e431 commit 91dfd88
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package com.github.gotify.service;

import android.app.AlarmManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Handler;
import com.github.gotify.SSLSettings;
import com.github.gotify.Utils;
import com.github.gotify.api.Callback;
import com.github.gotify.api.CertUtils;
import com.github.gotify.client.model.Message;
import com.github.gotify.log.Log;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
Expand All @@ -17,8 +20,9 @@
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;

public class WebSocketConnection {
class WebSocketConnection {
private final ConnectivityManager connectivityManager;
private final AlarmManager alarmManager;
private OkHttpClient client;

private final Handler reconnectHandler = new Handler();
Expand All @@ -41,8 +45,10 @@ public class WebSocketConnection {
String baseUrl,
SSLSettings settings,
String token,
ConnectivityManager connectivityManager) {
ConnectivityManager connectivityManager,
AlarmManager alarmManager) {
this.connectivityManager = connectivityManager;
this.alarmManager = alarmManager;
OkHttpClient.Builder builder =
new OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS)
Expand Down Expand Up @@ -119,14 +125,25 @@ public synchronized void close() {
}
}

public synchronized void scheduleReconnect(long millis) {
reconnectHandler.removeCallbacks(reconnectCallback);

Log.i(
"WebSocket: scheduling a restart in "
+ TimeUnit.SECONDS.convert(millis, TimeUnit.MILLISECONDS)
+ " second(s)");
reconnectHandler.postDelayed(reconnectCallback, millis);
public synchronized void scheduleReconnect(long seconds) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.i(
"WebSocket: scheduling a restart in "
+ seconds
+ " second(s) (via alarm manager)");
final Calendar future = Calendar.getInstance();
future.add(Calendar.SECOND, (int) seconds);
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
future.getTimeInMillis(),
"reconnect-tag",
this::start,
null);
} else {
Log.i("WebSocket: scheduling a restart in " + seconds + " second(s)");
reconnectHandler.removeCallbacks(reconnectCallback);
reconnectHandler.postDelayed(reconnectCallback, TimeUnit.SECONDS.toMillis(seconds));
}
}

private class Listener extends WebSocketListener {
Expand Down Expand Up @@ -191,7 +208,7 @@ public void onFailure(WebSocket webSocket, Throwable t, Response response) {
int minutes = Math.min(errorCount * 2 - 1, 20);

onNetworkFailure.execute(minutes);
scheduleReconnect(TimeUnit.MINUTES.toMillis(minutes));
scheduleReconnect(TimeUnit.MINUTES.toSeconds(minutes));
}

super.onFailure(webSocket, t, response);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.gotify.service;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
Expand Down Expand Up @@ -30,7 +31,6 @@
import com.github.gotify.messages.MessagesActivity;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class WebSocketService extends Service {
Expand Down Expand Up @@ -92,10 +92,15 @@ private void startPushService() {

ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

connection =
new WebSocketConnection(
settings.url(), settings.sslSettings(), settings.token(), cm)
settings.url(),
settings.sslSettings(),
settings.token(),
cm,
alarmManager)
.onOpen(this::onOpen)
.onClose(() -> foreground(getString(R.string.websocket_closed)))
.onBadRequest(this::onBadRequest)
Expand All @@ -121,7 +126,7 @@ private void doReconnect() {
return;
}

connection.scheduleReconnect(TimeUnit.SECONDS.toMillis(5));
connection.scheduleReconnect(5);
}

private void onBadRequest(String message) {
Expand Down

0 comments on commit 91dfd88

Please sign in to comment.