diff --git a/app/src/main/java/org/torproject/snowflake/MyPersistentService.java b/app/src/main/java/org/torproject/snowflake/MyPersistentService.java index 9df38896ad18449f32fdfc17fea335b871d35eea..c02276e261a2a91e451ec390aedd140657e4e4df 100644 --- a/app/src/main/java/org/torproject/snowflake/MyPersistentService.java +++ b/app/src/main/java/org/torproject/snowflake/MyPersistentService.java @@ -25,6 +25,8 @@ import org.torproject.snowflake.pojo.AnswerBody; import org.torproject.snowflake.pojo.AnswerBodySDP; import org.torproject.snowflake.pojo.OfferRequestBody; import org.torproject.snowflake.pojo.SDPOfferResponse; +import org.torproject.snowflake.serialization.RelaySerialization; +import org.torproject.snowflake.serialization.SDPSerializer; import org.torproject.snowflake.services.GetOfferService; import org.torproject.snowflake.services.RetroServiceGenerator; import org.torproject.snowflake.services.SendAnswerService; @@ -34,8 +36,6 @@ import org.webrtc.PeerConnection; import org.webrtc.PeerConnectionFactory; import org.webrtc.SessionDescription; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -66,6 +66,7 @@ public class MyPersistentService extends Service { private CompositeDisposable compositeDisposable; private NotificationManager mNotificationManager; private boolean isConnectionAlive; + private boolean isWebSocketOpen; private SIDHelper sidHelper; private WebSocket webSocket; @@ -102,6 +103,7 @@ public class MyPersistentService extends Service { mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); isConnectionAlive = false; + isWebSocketOpen = false; sidHelper = SIDHelper.getInstance(); compositeDisposable = new CompositeDisposable(); sharedPreferences = getSharedPreferences(getString(R.string.sharedpreference_file), MODE_PRIVATE); //Assigning the shared preferences @@ -122,6 +124,7 @@ public class MyPersistentService extends Service { mainPeerConnection.dispose(); } + webSocket.close(1000, "Normal closure"); mNotificationManager.cancel(ForegroundServiceConstants.DEF_NOTIFICATION_ID); Log.d(TAG, "onDestroy: Service Destroyed"); super.onDestroy(); @@ -289,8 +292,8 @@ public class MyPersistentService extends Service { @Override public void onMessage(DataChannel.Buffer buffer) { //Relay it to WebSocket - ByteBuffer data = ByteBuffer.wrap("HELLO".getBytes(Charset.defaultCharset())); //Sending some temporary data to test. - mainDataChannel.send(new DataChannel.Buffer(data, false)); + Log.d(TAG, "onMessage:"); + webSocket.send(RelaySerialization.clientToTor(buffer)); } @Override @@ -352,6 +355,10 @@ public class MyPersistentService extends Service { private void fetchOffer() { //Fetch offer only when the connection is not alive/active and only when the service is on. if (isServiceStarted && !isConnectionAlive) { + if (isWebSocketOpen) { + //If the WebSocket is still open while a new offer is getting sent, it's old connection's WebSocket. So we can close it and re-open a new one. + webSocket.close(1000, "Normal Closure"); + } isConnectionAlive = true; //Considering connection is alive from now on, until it is set to false. Log.d(TAG, "fetchOffer: Fetching offer from broker."); ///Retrofit call @@ -467,31 +474,31 @@ public class MyPersistentService extends Service { @Override public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { Log.d(TAG, "WebSocketListener: onClosed: "); + isWebSocketOpen = false; } @Override public void onClosing(@NotNull WebSocket webSocket, int code, @NotNull String reason) { Log.d(TAG, "WebSocketListener: onClosing: "); + isWebSocketOpen = false; } @Override public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @org.jetbrains.annotations.Nullable Response response) { Log.d(TAG, "WebSocketListener: onFailure: "); - } - - @Override - public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { - Log.d(TAG, "WebSocketListener: onMessage: "); + isWebSocketOpen = false; } @Override public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString bytes) { - Log.d(TAG, "WebSocketListener: onMessage: "); + Log.d(TAG, "WebSocketListener: onMessage: Bytes"); + mainDataChannel.send(RelaySerialization.torToClient(bytes)); } @Override public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { Log.d(TAG, "WebSocketListener: onOpen: "); + isWebSocketOpen = true; } }); diff --git a/app/src/main/java/org/torproject/snowflake/serialization/RelaySerialization.java b/app/src/main/java/org/torproject/snowflake/serialization/RelaySerialization.java new file mode 100644 index 0000000000000000000000000000000000000000..8c6277fa6e71617c343587155312cf3671dd7784 --- /dev/null +++ b/app/src/main/java/org/torproject/snowflake/serialization/RelaySerialization.java @@ -0,0 +1,15 @@ +package org.torproject.snowflake.serialization; + +import org.webrtc.DataChannel; + +import okio.ByteString; + +public class RelaySerialization { + public static ByteString clientToTor(DataChannel.Buffer buffer) { + return ByteString.of(buffer.data.asReadOnlyBuffer()); + } + + public static DataChannel.Buffer torToClient(ByteString byteString) { + return new DataChannel.Buffer(byteString.asByteBuffer(), true); + } +} diff --git a/app/src/main/java/org/torproject/snowflake/SDPSerializer.java b/app/src/main/java/org/torproject/snowflake/serialization/SDPSerializer.java similarity index 89% rename from app/src/main/java/org/torproject/snowflake/SDPSerializer.java rename to app/src/main/java/org/torproject/snowflake/serialization/SDPSerializer.java index 60bb846f612655f29dd1debc06dce724592e41de..f2e5623e8705f992761948785d652b359653ed94 100644 --- a/app/src/main/java/org/torproject/snowflake/SDPSerializer.java +++ b/app/src/main/java/org/torproject/snowflake/serialization/SDPSerializer.java @@ -1,4 +1,4 @@ -package org.torproject.snowflake; +package org.torproject.snowflake.serialization; import org.json.JSONException; import org.json.JSONObject; @@ -11,7 +11,7 @@ public class SDPSerializer { new JSONObject(SDP).get("sdp").toString()); } - public static String serializeAnswer(SessionDescription SDP){ + public static String serializeAnswer(SessionDescription SDP) { return SDP.description; } }