diff --git a/android/src/main/java/com/facebook/flipper/android/DelegatingSocketFactory.java b/android/src/main/java/com/facebook/flipper/android/DelegatingSocketFactory.java new file mode 100644 index 000000000..936bf5661 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/android/DelegatingSocketFactory.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.flipper.android; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import javax.net.SocketFactory; + +/** + * A {@link SocketFactory} that delegates calls. Sockets can be configured after creation by + * overriding {@link #configureSocket}. + */ +class DelegatingSocketFactory extends SocketFactory { + private final SocketFactory delegate; + + DelegatingSocketFactory(SocketFactory delegate) { + this.delegate = delegate; + } + + @Override + public Socket createSocket() throws IOException { + Socket socket = delegate.createSocket(); + return configureSocket(socket); + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + Socket socket = delegate.createSocket(host, port); + return configureSocket(socket); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) + throws IOException { + Socket socket = delegate.createSocket(host, port, localAddress, localPort); + return configureSocket(socket); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + Socket socket = delegate.createSocket(host, port); + return configureSocket(socket); + } + + @Override + public Socket createSocket(InetAddress host, int port, InetAddress localAddress, int localPort) + throws IOException { + Socket socket = delegate.createSocket(host, port, localAddress, localPort); + return configureSocket(socket); + } + + protected Socket configureSocket(Socket socket) { + // No-op by default. + return socket; + } +} diff --git a/android/src/main/java/com/facebook/flipper/android/FlipperSocketImpl.java b/android/src/main/java/com/facebook/flipper/android/FlipperSocketImpl.java index 586f0037f..2ff095d73 100644 --- a/android/src/main/java/com/facebook/flipper/android/FlipperSocketImpl.java +++ b/android/src/main/java/com/facebook/flipper/android/FlipperSocketImpl.java @@ -7,6 +7,7 @@ package com.facebook.flipper.android; +import android.net.TrafficStats; import android.util.Log; import com.facebook.flipper.BuildConfig; import com.facebook.flipper.core.FlipperObject; @@ -17,6 +18,7 @@ import com.facebook.soloader.SoLoader; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; +import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; import java.security.InvalidAlgorithmParameterException; @@ -100,7 +102,14 @@ class FlipperSocketImpl extends WebSocketClient implements FlipperSocket { SSLSocketFactory factory = sslContext.getSocketFactory(); - this.setSocketFactory(factory); + this.setSocketFactory( + new DelegatingSocketFactory(factory) { + @Override + protected Socket configureSocket(Socket socket) { + TrafficStats.setThreadStatsTag(SOCKET_TAG); + return socket; + } + }); } this.connect(); diff --git a/android/src/main/java/com/facebook/flipper/core/FlipperSocket.java b/android/src/main/java/com/facebook/flipper/core/FlipperSocket.java index bbad12fa1..10600cfa3 100644 --- a/android/src/main/java/com/facebook/flipper/core/FlipperSocket.java +++ b/android/src/main/java/com/facebook/flipper/core/FlipperSocket.java @@ -9,6 +9,9 @@ package com.facebook.flipper.core; public interface FlipperSocket { + /** The value used by Flipper to tag sockets, visible to {@link android.net.TrafficStats}. */ + int SOCKET_TAG = 0x000090000; + /** Connect to the endpoint. */ void flipperConnect();