1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-25 22:39:22 +00:00

Create WebSocket connection

This commit is contained in:
Pierre HUBERT 2021-04-15 09:15:11 +02:00
parent 4652694eb9
commit d9662ed189

View File

@ -17,16 +17,33 @@ import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.neovisionaries.ws.client.WebSocket;
import com.neovisionaries.ws.client.WebSocketAdapter;
import com.neovisionaries.ws.client.WebSocketException;
import com.neovisionaries.ws.client.WebSocketFactory;
import com.neovisionaries.ws.client.WebSocketFrame;
import org.communiquons.comunic.MainActivity; import org.communiquons.comunic.MainActivity;
import org.communiquons.comunic.R; import org.communiquons.comunic.R;
public class NotificationsService extends Service { import java.util.List;
import java.util.Map;
public class NotificationsService extends Service implements Runnable {
private static final String TAG = NotificationsService.class.getSimpleName(); private static final String TAG = NotificationsService.class.getSimpleName();
public static final String CHANNEL_ID = "IndependentPushServiceChannel"; public static final String CHANNEL_ID = "IndependentPushServiceChannel";
private static final String INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE = "independent-push-notifications-service"; private static final String INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE = "independent-push-notifications-service";
private static final String WS_URL_PREF_KEY = "ws_url"; private static final String WS_URL_PREF_KEY = "ws_url";
private static final int CONNECT_TIMEOUT = 1000;
private static final int RECONNECT_INTERVAL = 10000;
private static final int PING_INTERVAL = 15000;
private Thread thread;
private boolean stop = false;
private final Object lock = new Object();
public static void configure(@NonNull String wsURL, @NonNull Context context) { public static void configure(@NonNull String wsURL, @NonNull Context context) {
SharedPreferences prefs = context.getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE); SharedPreferences prefs = context.getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE);
@ -54,10 +71,12 @@ public class NotificationsService extends Service {
SharedPreferences prefs = context.getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE); SharedPreferences prefs = context.getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE);
if (!prefs.contains(WS_URL_PREF_KEY)) { if (!prefs.contains(WS_URL_PREF_KEY)) {
System.err.println("Independent push notifications service not configured ! Skipping!"); Log.v(TAG, "Independent push notifications service not configured ! Skipping!");
return; return;
} }
Log.v(TAG, "Start independent push notifications service...");
Intent intent = new Intent(context, NotificationsService.class); Intent intent = new Intent(context, NotificationsService.class);
ContextCompat.startForegroundService(context, intent); ContextCompat.startForegroundService(context, intent);
} }
@ -104,13 +123,90 @@ public class NotificationsService extends Service {
public void onDestroy() { public void onDestroy() {
Log.v(TAG, "Destroying service"); Log.v(TAG, "Destroying service");
super.onDestroy(); super.onDestroy();
if (thread != null) {
thread.interrupt();
stop = true;
}
} }
private void initService() { private void initService() {
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
try {
while (!stop) {
try {
connect();
} catch (InterruptedException e) {
Log.e(TAG, "Thread interrupted!");
return;
} catch (Exception e) {
Log.e(TAG, "Failed to connect to push notifications service!");
e.printStackTrace();
}
// Wait attempting new connection
// noinspection BusyWait
Thread.sleep(RECONNECT_INTERVAL * 1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
Log.e(TAG, "Stop thread");
}
}
private void connect() throws Exception {
String url = getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE) String url = getSharedPreferences(INDEPENDENT_PUSH_NOTIFICATIONS_SERVICE, MODE_PRIVATE)
.getString(WS_URL_PREF_KEY, null); .getString(WS_URL_PREF_KEY, null);
System.out.println("START HEAVY WORK HERE !!!!"); Log.v(TAG, "Connect to " + url);
System.out.println("Connect to " + url);
WebSocket ws = new WebSocketFactory().createSocket(url, CONNECT_TIMEOUT);
ws.setPingInterval(PING_INTERVAL);
ws.addListener(new WebSocketAdapter() {
@Override
public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws Exception {
Log.v(TAG, "Connected to independent push notifications service!");
}
@Override
public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) throws Exception {
Log.v(TAG, "Disconnect from independent push notifications websocket!");
lock.notify();
}
@Override
public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
handleTextFrame(frame);
}
@Override
public void onError(WebSocket websocket, WebSocketException cause) throws Exception {
Log.e(TAG, "An error occured, closing WebSocket!");
cause.printStackTrace();
websocket.disconnect();
}
});
ws.connect();
// wait for connection to complete
synchronized (lock) {
lock.wait();
}
}
private void handleTextFrame(WebSocketFrame frame) {
if (!frame.isTextFrame())
return;
Log.v(TAG, "Got text frame!");
Log.v(TAG, frame.getPayloadText());
} }
} }