(FRONT) FRONT (2025)

Signal.  Return to WebRTC service  

   1:  package com.voipplus.mmsclient.WebRTC;
   2:  
   3:  import livekit.org.webrtc.IceCandidate;
   4:  import livekit.org.webrtc.SessionDescription;
   5:  import okhttp3.OkHttpClient;
   6:  import okhttp3.Request;
   7:  import okhttp3.Response;
   8:  import okhttp3.WebSocket;
   9:  import okhttp3.WebSocketListener;
  10:  import org.json.JSONException;
  11:  import org.json.JSONObject;
  12:  
  13:  public class SignalingManager {
  14:      private static final String TAG = "SignalingManager";
  15:      private String signalingServerUrl;
  16:      private WebSocket webSocket;
  17:      private boolean webSocketConnected = false;
  18:      private final WebRTCService webRTCService;
  19:  
  20:      public SignalingManager(WebRTCService webRTCService) {
  21:          this.webRTCService = webRTCService;
  22:      }
  23:  
  24:      // <editor-fold desc="Initialization and Configuration">
  25:      public void setSignalingServerUrl(String url) {
  26:          WebRTCUtils.debugInfo(TAG, "🔗 Setting WebSocket URL: " + url,
  27:                  webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  28:                  webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  29:          this.signalingServerUrl = url;
  30:          initWebSocket();
  31:      }
  32:      // </editor-fold>
  33:  
  34:      // <editor-fold desc="WebSocket Management">
  35:      public void initWebSocket() {
  36:          WebRTCUtils.debugInfo(TAG, "🌍 initWebSocket: Called. webSocketConnected=" + webSocketConnected,
  37:                  webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  38:                  webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  39:  
  40:          if (signalingServerUrl == null || signalingServerUrl.isEmpty()) {
  41:              WebRTCUtils.debugInfo(TAG, "❌ WebSocket URL is not set. Cannot initialize WebSocket.",
  42:                      webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  43:                      webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  44:              return;
  45:          }
  46:  
  47:          if (webSocketConnected) {
  48:              WebRTCUtils.debugInfo(TAG, "✅ WebSocket is already connected.",
  49:                      webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  50:                      webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  51:              return;
  52:          }
  53:  
  54:          webRTCService.updateWebRTCState(WebRTCState.CONNECTING_WEBSOCKET);
  55:  
  56:          OkHttpClient client = new OkHttpClient();
  57:          Request request = new Request.Builder().url(signalingServerUrl).build();
  58:          webSocket = client.newWebSocket(request, new WebSocketListener() {
  59:              @Override
  60:              public void onOpen(WebSocket webSocket, Response response) {
  61:                  WebRTCUtils.debugInfo(TAG, "✅ WebSocket connected.",
  62:                          webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  63:                          webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  64:                  webSocketConnected = true;
  65:                  webRTCService.updateWebRTCState(WebRTCState.WEBSOCKET_CONNECTED);
  66:              }
  67:  
  68:              @Override
  69:              public void onMessage(WebSocket webSocket, String text) {
  70:                  WebRTCUtils.debugInfo(TAG, "📩 Received WebSocket message: " + text,
  71:                          webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  72:                          webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  73:  
  74:                  try {
  75:                      JSONObject json = new JSONObject(text);
  76:                      String type = json.getString("type");
  77:  
  78:                      WebRTCUtils.debugInfo(TAG, "📡 Answer type" + type,
  79:                              webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  80:                              webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  81:  
  82:  
  83:  
  84:                      if ("answer".equals(type)) {
  85:                          String sdp = json.getString("sdp");
  86:                          SessionDescription remoteSessionDescription = new SessionDescription(SessionDescription.Type.ANSWER, sdp);
  87:  
  88:                          WebRTCUtils.debugInfo(TAG, "📡 Received SDP Answer: Applying...",
  89:                                  webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
  90:                                  webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
  91:  
  92:                          // 🔴 Ensure we call handleRemoteAnswer properly
  93:                          webRTCService.handleRemoteAnswer(remoteSessionDescription);
  94:                      }
  95:                      else if ("candidate".equals(type)) {
  96:                          IceCandidate candidate = new IceCandidate(
  97:                                  json.getString("sdpMid"),
  98:                                  json.getInt("sdpMLineIndex"),
  99:                                  json.getString("candidate")
 100:                          );
 101:  
 102:                          WebRTCUtils.debugInfo(TAG, "📡 Received ICE Candidate: " + candidate.sdp,
 103:                                  webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 104:                                  webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 105:  
 106:                          webRTCService.getPeerConnectionManager().handleIceCandidate(candidate);
 107:                      }
 108:                  } catch (JSONException e) {
 109:                      WebRTCUtils.debugInfo(TAG, "❌ Failed to parse WebSocket message: " + text,
 110:                              webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 111:                              webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 112:                  }
 113:              }
 114:  
 115:  
 116:              @Override
 117:              public void onFailure(WebSocket webSocket, Throwable t, Response response) {
 118:                  WebRTCUtils.debugInfo(TAG, "❌ WebSocket connection failed: " + t.getMessage(),
 119:                          webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 120:                          webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 121:                  webSocketConnected = false;
 122:                  webRTCService.updateWebRTCState(WebRTCState.ERROR);
 123:              }
 124:          });
 125:      }
 126:  
 127:      public boolean isWebSocketConnected() {
 128:          return webSocketConnected;
 129:      }
 130:  
 131:      public boolean isWebSocketReady() {
 132:          return webRTCService.getWebRTCState() == WebRTCState.WEBSOCKET_CONNECTED;
 133:      }
 134:      // </editor-fold>
 135:  
 136:      // <editor-fold desc="Signaling Message Handling">
 137:      public void sendSignalingMessage(String message) {
 138:          WebRTCUtils.debugInfo(TAG, "sendSignalingMessage: Called. webRTCState=" + webRTCService.getWebRTCState() +
 139:                          ", webSocketConnected=" + webSocketConnected +
 140:                          ", message=" + message,
 141:                  webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 142:                  webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 143:  
 144:          if (!webSocketConnected) {
 145:              WebRTCUtils.debugInfo(TAG, "❌ WebSocket is not connected. Cannot send signaling message.",
 146:                      webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 147:                      webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 148:              return;
 149:          }
 150:  
 151:          if (webSocket != null) {
 152:              webSocket.send(message);
 153:          } else {
 154:              WebRTCUtils.debugInfo(TAG, "❌ WebSocket is null. Cannot send signaling message.",
 155:                      webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
 156:                      webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
 157:          }
 158:      }
 159:  
 160:      public void sendIceCandidateToSignalingServer(IceCandidate iceCandidate) {
 161:          sendSignalingMessage("{"type": "candidate", "candidate": "" + iceCandidate.sdp + "", " +
 162:                  ""sdpMid": "" + iceCandidate.sdpMid + "", "sdpMLineIndex": " + iceCandidate.sdpMLineIndex + "}");
 163:      }
 164:      // </editor-fold>
 165:  
 166:      // <editor-fold desc="Accessors">
 167:      public String getSignalingServerUrl() {
 168:          return signalingServerUrl;
 169:      }
 170:  
 171:      public WebSocket getWebSocket() {
 172:          return webSocket;
 169:      }
 170:  
 171:      public WebSocket getWebSocket() {
 172:          return webSocket;
 169:      }
 170:  
 169:      }
 169:      }
 169:      }
 170:  
 171:      public WebSocket getWebSocket() {
 172:          return webSocket;
 173:      }
 174:      // </editor-fold>
 175:  }
 176:  

Return to WebRTC service




Android context:




Testing context:



Comments ( )
Link to this page: http://www.vb-net.com/AndroidMosaic/Signal.htm
< THANKS ME>