Skip to content

Instantly share code, notes, and snippets.

@jirevwe
Created December 26, 2017 21:55
Show Gist options
  • Save jirevwe/0cbbe216f29df47f46d7595657bef4e1 to your computer and use it in GitHub Desktop.
Save jirevwe/0cbbe216f29df47f46d7595657bef4e1 to your computer and use it in GitHub Desktop.
package ng.smartalumni.smartsocket;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URISyntaxException;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public final class SmartSocket {
/**
* Socket Listeners ids
*/
private static final String NEW_USER_TO_SERVER = "new_user_to_server";
private static final String ON_NEW_USER_TO_CLIENT = "new_user_to_client";
private static final String ENTER_ROOM_TO_SERVER = "enter_room_to_server";
private static final String MESSAGE_TO_SERVER = "message_to_server";
private static final String MESSAGE_TO_CLIENT = "message_to_client";
private static Handler uiThreadHandler = null;
private static Handler socketConnectHandler = null;
private static Socket socketInternal;
private static ChatRoomHandler chatRoomHandler;
/**
* CUSTOM EVENT DEFINITIONS
*/
private static Emitter.Listener onConnected = new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUIThread(new Runnable() {
@Override
public void run() {
if (chatRoomHandler != null) chatRoomHandler.onConnected("Connected");
}
});
}
};
private static Emitter.Listener onGetMessageToClient = new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUIThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
if (chatRoomHandler != null) chatRoomHandler.onMessageReceived(data);
}
});
}
};
private static Emitter.Listener onNewUserToClient = new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUIThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
if (chatRoomHandler != null) chatRoomHandler.onUserJoinServer(data);
}
});
}
};
private static final Runnable runnable = new Runnable() {
@Override
public void run() {
if (!socketInternal.connected()) {
socketInternal.off(Socket.EVENT_CONNECT, onConnected);
socketInternal.off(ON_NEW_USER_TO_CLIENT, onNewUserToClient);
socketInternal.off(MESSAGE_TO_CLIENT, onGetMessageToClient);
connect();
}
}
};
static {
uiThreadHandler = new Handler(Looper.getMainLooper());
socketConnectHandler = new Handler(Looper.getMainLooper());
}
private SmartSocket(String url) {
try {
socketInternal = IO.socket(url);
} catch (URISyntaxException e) {
}
}
public static Socket getSocket() {
return socketInternal;
}
public static void setChatRoomHandler(ChatRoomHandler handler) {
chatRoomHandler = handler;
}
public static SmartSocket initialize(String url) {
return new SmartSocket(url);
}
private static void runOnUIThread(Runnable runnable) {
if (uiThreadHandler != null) {
uiThreadHandler.post(runnable);
} else {
runnable.run();
}
}
public static void createServerConnection(@NonNull final String id, @NonNull final Object user) {
if (socketInternal.connected()) {
try {
JSONObject data = new JSONObject();
data.put("user", user);
data.put("school_id", id);
socketInternal.emit(NEW_USER_TO_SERVER, data);
} catch (JSONException e) {
}
} else {
if (chatRoomHandler != null)
chatRoomHandler.onSocketError("SOCKET STATE IS" + socketInternal.connected());
}
}
public static void connect() {
socketInternal.connect();
socketInternal.on(Socket.EVENT_CONNECT, onConnected);
socketInternal.on(ON_NEW_USER_TO_CLIENT, onNewUserToClient);
socketInternal.on(MESSAGE_TO_CLIENT, onGetMessageToClient);
socketConnectHandler.postDelayed(runnable, 3000);
}
public static void joinRoom(String user_id, String room_id) {
if (socketInternal.connected()) {
try {
JSONObject data = new JSONObject();
data.put("user_id", user_id);
data.put("room_id", room_id);
socketInternal.emit(ENTER_ROOM_TO_SERVER, data);
} catch (JSONException e) {
}
} else {
if (chatRoomHandler != null)
chatRoomHandler.onSocketError("SOCKET STATE IS" + socketInternal.connected());
}
}
public static void sendMessage(String room_id, JSONObject message) {
try {
JSONObject data = new JSONObject();
data.put("room_id", room_id);
data.put("message", message);
socketInternal.emit(MESSAGE_TO_SERVER, data);
} catch (JSONException e) {
}
}
public static void disconnect() {
socketInternal.disconnect();
if (chatRoomHandler != null) {
chatRoomHandler.onDisconnected("Disconnected");
chatRoomHandler = null;
}
socketInternal.off(Socket.EVENT_CONNECT, onConnected);
socketInternal.off(ON_NEW_USER_TO_CLIENT, onNewUserToClient);
socketInternal.off(MESSAGE_TO_CLIENT, onGetMessageToClient);
}
public interface ChatRoomHandler {
void onDisconnected(String data);
void onConnected(String data);
void onMessageReceived(JSONObject data);
void onUserJoinServer(JSONObject data);
void onSocketError(String error);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment