package com.angrykings; import android.util.Log; import de.tavendo.autobahn.WebSocketConnection; import de.tavendo.autobahn.WebSocketException; import de.tavendo.autobahn.WebSocketHandler; import de.tavendo.autobahn.WebSocketOptions; public class ServerConnection { private static final String TAG = "com.angrykings.ServerConnection"; public interface OnMessageHandler { void onMessage(String payload); } public static abstract class OnStartHandler{ public abstract void onStart(); } private final WebSocketConnection connection = new WebSocketConnection(); private static ServerConnection instance; private OnMessageHandler handler; private ServerConnection() { } public static ServerConnection getInstance() { if (instance == null) { instance = new ServerConnection(); } return instance; } public boolean isConnected() { return this.connection.isConnected(); } public OnMessageHandler getHandler() { return handler; } // TODO implement so that activities don't have to override handlers public void setHandler(OnMessageHandler handler) { this.handler = handler; } /** * Connects to our WebSocket Server. Only needs to be called ONCE in the whole app lifecycle. * * @param startHandler */ //TODO As long the connection persists, do not restart public void start(final OnStartHandler startHandler) { try { WebSocketOptions webSocketOptions = new WebSocketOptions(); webSocketOptions.setMaxMessagePayloadSize(GameConfig.WEBSOCKET_MAX_PAYLOAD_SIZE); webSocketOptions.setMaxFramePayloadSize(GameConfig.WEBSOCKET_MAX_FRAME_SIZE); Log.i(TAG, "connecting to " + GameConfig.WEBSERVICE_URI + " ..."); connection.connect(GameConfig.WEBSERVICE_URI, new WebSocketHandler() { @Override public void onOpen() { Log.i(TAG, "Status: Connected"); startHandler.onStart(); } @Override public void onTextMessage(String payload) { int length = payload.length(); if (length > 128) Log.i(TAG, "received " + length + " bytes: " + payload.substring(0, 128) + " ..."); else Log.i(TAG, "received " + length + " bytes: " + payload); handler.onMessage(payload); } @Override public void onClose(int code, String reason) { Log.i(TAG, "Connection lost."); } }, webSocketOptions); } catch (WebSocketException e) { Log.i(TAG, e.toString()); } } /** * Sends a text message to the server. * @param payload */ public void sendTextMessage(String payload) { int length = payload.length(); if (length > 128) Log.i(TAG, "sent " + length + " bytes: " + payload.substring(0, 128) + " ..."); else Log.i(TAG, "sent " + length + " bytes: " + payload); if(this.connection == null) Log.e(TAG, "connection is null :/"); this.connection.sendTextMessage(payload); } }