mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 12:59:21 +00:00
Create WebSocket connection
This commit is contained in:
parent
4652694eb9
commit
d9662ed189
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user