mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-31 22:25:08 +00:00
Code cleanup
This commit is contained in:
@@ -30,6 +30,7 @@ import org.kde.kdeconnect.Backends.BasePairingHandler;
|
|||||||
import org.kde.kdeconnect.Device;
|
import org.kde.kdeconnect.Device;
|
||||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
|
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
|
||||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
||||||
|
import org.kde.kdeconnect.Helpers.StringsHelper;
|
||||||
import org.kde.kdeconnect.NetworkPackage;
|
import org.kde.kdeconnect.NetworkPackage;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@@ -45,6 +46,7 @@ import java.nio.channels.NotYetConnectedException;
|
|||||||
import java.security.PublicKey;
|
import java.security.PublicKey;
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.net.ssl.SSLException;
|
||||||
import javax.net.ssl.SSLServerSocketFactory;
|
import javax.net.ssl.SSLServerSocketFactory;
|
||||||
import javax.net.ssl.SSLSocket;
|
import javax.net.ssl.SSLSocket;
|
||||||
|
|
||||||
@@ -59,62 +61,53 @@ public class LanLink extends BaseLink {
|
|||||||
// because it's probably trying to find me and
|
// because it's probably trying to find me and
|
||||||
// potentially ask for pairing.
|
// potentially ask for pairing.
|
||||||
|
|
||||||
private Socket channel = null;
|
private Socket socket = null;
|
||||||
|
|
||||||
Cancellable readThread;
|
|
||||||
|
|
||||||
public abstract class Cancellable implements Runnable {
|
|
||||||
protected volatile boolean cancelled;
|
|
||||||
public void cancel()
|
|
||||||
{
|
|
||||||
cancelled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
if (readThread != null) {
|
|
||||||
readThread.cancel();
|
Log.e("Disconnect","socket:"+ socket.hashCode());
|
||||||
}
|
|
||||||
if (channel == null) {
|
if (socket == null) {
|
||||||
Log.e("KDE/LanLink", "Not yet connected");
|
Log.w("KDE/LanLink", "Not yet connected");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
channel.close();
|
socket.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Returns the old channel
|
//Returns the old socket
|
||||||
public Socket reset(final Socket channel, ConnectionStarted connectionSource, final LanLinkProvider linkProvider) throws IOException {
|
public Socket reset(final Socket newSocket, ConnectionStarted connectionSource, final LanLinkProvider linkProvider) throws IOException {
|
||||||
|
|
||||||
|
Socket oldSocket = socket;
|
||||||
|
socket = newSocket;
|
||||||
|
|
||||||
Socket oldChannel = this.channel;
|
|
||||||
this.channel = channel;
|
|
||||||
this.connectionSource = connectionSource;
|
this.connectionSource = connectionSource;
|
||||||
|
|
||||||
if (oldChannel != null) {
|
if (oldSocket != null) {
|
||||||
readThread.cancel();
|
oldSocket.close(); //This should cancel the readThread
|
||||||
oldChannel.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.e("LanLink", "Start listening");
|
Log.e("LanLink", "Start listening");
|
||||||
//Start listening
|
//Start listening
|
||||||
readThread = new Cancellable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(channel.getInputStream(), LanLinkProvider.UTF8));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(newSocket.getInputStream(), StringsHelper.UTF8));
|
||||||
while (!cancelled) {
|
while (true) {
|
||||||
if (channel.isClosed()) {
|
if (socket.isClosed()) {
|
||||||
Log.e("BufferReader", "Channel closed");
|
Log.e("BufferReader", "Channel closed");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
String packet;
|
String packet;
|
||||||
try {
|
try {
|
||||||
packet = reader.readLine();
|
packet = reader.readLine();
|
||||||
Log.e("packet", "A" + packet);
|
|
||||||
} catch (SocketTimeoutException e) {
|
} catch (SocketTimeoutException e) {
|
||||||
Log.w("BufferReader", "timeout");
|
Log.w("BufferReader", "timeout");
|
||||||
continue;
|
continue;
|
||||||
@@ -134,19 +127,18 @@ public class LanLink extends BaseLink {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.e("LanLink", "Socket closed");
|
Log.e("LanLink", "Socket closed"+newSocket.hashCode());
|
||||||
linkProvider.socketClosed(channel);
|
boolean thereIsaANewSocket = (newSocket != socket);
|
||||||
|
linkProvider.socketClosed(newSocket, thereIsaANewSocket);
|
||||||
}
|
}
|
||||||
};
|
}).start();
|
||||||
new Thread(readThread).start();
|
|
||||||
|
|
||||||
|
return oldSocket;
|
||||||
return oldChannel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LanLink(Context context, String deviceId, LanLinkProvider linkProvider, Socket channel, ConnectionStarted connectionSource) throws IOException {
|
public LanLink(Context context, String deviceId, LanLinkProvider linkProvider, Socket socket, ConnectionStarted connectionSource) throws IOException {
|
||||||
super(context, deviceId, linkProvider);
|
super(context, deviceId, linkProvider);
|
||||||
reset(channel, connectionSource, linkProvider);
|
reset(socket, connectionSource, linkProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -162,7 +154,7 @@ public class LanLink extends BaseLink {
|
|||||||
|
|
||||||
//Blocking, do not call from main thread
|
//Blocking, do not call from main thread
|
||||||
private void sendPackageInternal(NetworkPackage np, final Device.SendPackageStatusCallback callback, PublicKey key) {
|
private void sendPackageInternal(NetworkPackage np, final Device.SendPackageStatusCallback callback, PublicKey key) {
|
||||||
if (channel == null) {
|
if (socket == null) {
|
||||||
Log.e("KDE/sendPackage", "Not yet connected");
|
Log.e("KDE/sendPackage", "Not yet connected");
|
||||||
callback.sendFailure(new NotYetConnectedException());
|
callback.sendFailure(new NotYetConnectedException());
|
||||||
return;
|
return;
|
||||||
@@ -190,12 +182,13 @@ public class LanLink extends BaseLink {
|
|||||||
|
|
||||||
//Send body of the network package
|
//Send body of the network package
|
||||||
try {
|
try {
|
||||||
OutputStream writter = channel.getOutputStream();
|
OutputStream writter = socket.getOutputStream();
|
||||||
writter.write(np.serialize().getBytes(LanLinkProvider.UTF8));
|
writter.write(np.serialize().getBytes(StringsHelper.UTF8));
|
||||||
writter.flush();
|
writter.flush();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
callback.sendFailure(e);
|
callback.sendFailure(e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,8 +258,6 @@ public class LanLink extends BaseLink {
|
|||||||
|
|
||||||
public void injectNetworkPackage(NetworkPackage np) {
|
public void injectNetworkPackage(NetworkPackage np) {
|
||||||
|
|
||||||
Log.e("receivedNetworkPackage",np.getType());
|
|
||||||
|
|
||||||
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_ENCRYPTED)) {
|
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_ENCRYPTED)) {
|
||||||
try {
|
try {
|
||||||
np = RsaHelper.decrypt(np, privateKey);
|
np = RsaHelper.decrypt(np, privateKey);
|
||||||
@@ -274,7 +265,6 @@ public class LanLink extends BaseLink {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Log.e("KDE/onPackageReceived","Exception decrypting the package");
|
Log.e("KDE/onPackageReceived","Exception decrypting the package");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (np.hasPayloadTransferInfo()) {
|
if (np.hasPayloadTransferInfo()) {
|
||||||
@@ -282,7 +272,7 @@ public class LanLink extends BaseLink {
|
|||||||
Socket payloadSocket = null;
|
Socket payloadSocket = null;
|
||||||
try {
|
try {
|
||||||
// Use ssl if existing link is on ssl
|
// Use ssl if existing link is on ssl
|
||||||
if (channel instanceof SSLSocket) {
|
if (socket instanceof SSLSocket) {
|
||||||
SSLContext sslContext = SslHelper.getSslContext(context, getDeviceId(), true);
|
SSLContext sslContext = SslHelper.getSslContext(context, getDeviceId(), true);
|
||||||
payloadSocket = sslContext.getSocketFactory().createSocket();
|
payloadSocket = sslContext.getSocketFactory().createSocket();
|
||||||
} else {
|
} else {
|
||||||
@@ -290,7 +280,7 @@ public class LanLink extends BaseLink {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int tcpPort = np.getPayloadTransferInfo().getInt("port");
|
int tcpPort = np.getPayloadTransferInfo().getInt("port");
|
||||||
InetSocketAddress address = (InetSocketAddress)channel.getRemoteSocketAddress();
|
InetSocketAddress address = (InetSocketAddress) socket.getRemoteSocketAddress();
|
||||||
payloadSocket.connect(new InetSocketAddress(address.getAddress(), tcpPort));
|
payloadSocket.connect(new InetSocketAddress(address.getAddress(), tcpPort));
|
||||||
np.setPayload(payloadSocket.getInputStream(), np.getPayloadSize());
|
np.setPayload(payloadSocket.getInputStream(), np.getPayloadSize());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -305,7 +295,7 @@ public class LanLink extends BaseLink {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServerSocket openTcpSocketOnFreePort(Context context, String deviceId) throws IOException {
|
ServerSocket openTcpSocketOnFreePort(Context context, String deviceId) throws IOException {
|
||||||
if (channel instanceof SSLSocket) {
|
if (socket instanceof SSLSocket) {
|
||||||
return openSecureServerSocket(context, deviceId);
|
return openSecureServerSocket(context, deviceId);
|
||||||
} else {
|
} else {
|
||||||
return openUnsecureSocketOnFreePort(1739);
|
return openUnsecureSocketOnFreePort(1739);
|
||||||
|
@@ -24,7 +24,6 @@ import android.content.Context;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.support.v4.util.LongSparseArray;
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
@@ -34,6 +33,7 @@ import org.kde.kdeconnect.BackgroundService;
|
|||||||
import org.kde.kdeconnect.Device;
|
import org.kde.kdeconnect.Device;
|
||||||
import org.kde.kdeconnect.Helpers.DeviceHelper;
|
import org.kde.kdeconnect.Helpers.DeviceHelper;
|
||||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
||||||
|
import org.kde.kdeconnect.Helpers.StringsHelper;
|
||||||
import org.kde.kdeconnect.NetworkPackage;
|
import org.kde.kdeconnect.NetworkPackage;
|
||||||
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
|
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ import java.net.InetAddress;
|
|||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.security.cert.Certificate;
|
import java.security.cert.Certificate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -67,15 +66,13 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
public static final String KEY_CUSTOM_DEVLIST_PREFERENCE = "device_list_preference";
|
public static final String KEY_CUSTOM_DEVLIST_PREFERENCE = "device_list_preference";
|
||||||
|
|
||||||
static final Charset UTF8 = Charset.forName("UTF-8");
|
|
||||||
|
|
||||||
private final static int oldPort = 1714;
|
private final static int oldPort = 1714;
|
||||||
private final static int port = 1716;
|
private final static int port = 1716;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
private final HashMap<String, LanLink> visibleComputers = new HashMap<>(); //Links by device id
|
private final HashMap<String, LanLink> visibleComputers = new HashMap<>(); //Links by device id
|
||||||
private final LongSparseArray<LanLink> nioLinks = new LongSparseArray<>(); //Links by channel id
|
private final HashMap<Socket, LanLink> nioLinks = new HashMap<>(); //Links by socket
|
||||||
|
|
||||||
private ServerSocket tcpServer;
|
private ServerSocket tcpServer;
|
||||||
private DatagramSocket udpServer;
|
private DatagramSocket udpServer;
|
||||||
@@ -86,23 +83,13 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
// To prevent infinte loop between Android < IceCream because both device can only broadcast identity package but cannot connect via TCP
|
// To prevent infinte loop between Android < IceCream because both device can only broadcast identity package but cannot connect via TCP
|
||||||
private ArrayList<InetAddress> reverseConnectionBlackList = new ArrayList<>();
|
private ArrayList<InetAddress> reverseConnectionBlackList = new ArrayList<>();
|
||||||
|
|
||||||
public void socketClosed(Socket socket) {
|
public void socketClosed(Socket socket, boolean linkHasAnotherSocket) {
|
||||||
try {
|
final LanLink brokenLink = nioLinks.remove(socket);
|
||||||
final LanLink brokenLink = nioLinks.get(socket.hashCode());
|
|
||||||
if (brokenLink != null) {
|
if (brokenLink != null) {
|
||||||
nioLinks.remove(socket.hashCode());
|
|
||||||
//Log.i("KDE/LanLinkProvider", "nioLinks.size(): " + nioLinks.size() + " (-)");
|
if (!linkHasAnotherSocket) {
|
||||||
try {
|
|
||||||
brokenLink.disconnect();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
Log.e("KDE/LanLinkProvider", "Exception. Already disconnected?");
|
|
||||||
}
|
|
||||||
//Log.i("KDE/LanLinkProvider", "Disconnected!");
|
|
||||||
String deviceId = brokenLink.getDeviceId();
|
String deviceId = brokenLink.getDeviceId();
|
||||||
if (visibleComputers.get(deviceId) == brokenLink) {
|
|
||||||
visibleComputers.remove(deviceId);
|
visibleComputers.remove(deviceId);
|
||||||
}
|
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -115,17 +102,12 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
Log.e("KDE/LanLinkProvider", "channelInactive exception");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//They received my UDP broadcast and are connecting to me. The first thing they sned should be their identity.
|
//They received my UDP broadcast and are connecting to me. The first thing they sned should be their identity.
|
||||||
public void tcpPackageReceived(Socket socket) throws Exception {
|
public void tcpPackageReceived(Socket socket) throws Exception {
|
||||||
//Log.e("KDE/LanLinkProvider", "Received a TCP packet from " + ctx.channel().remoteAddress() + ":" + message);
|
|
||||||
|
|
||||||
NetworkPackage networkPackage;
|
NetworkPackage networkPackage;
|
||||||
try {
|
try {
|
||||||
@@ -146,7 +128,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
LanLink link = nioLinks.get(socket.hashCode());
|
LanLink link = nioLinks.get(socket);
|
||||||
if (link== null) {
|
if (link== null) {
|
||||||
Log.e("KDE/LanLinkProvider","Expecting an identity package instead of " + networkPackage.getType());
|
Log.e("KDE/LanLinkProvider","Expecting an identity package instead of " + networkPackage.getType());
|
||||||
} else {
|
} else {
|
||||||
@@ -163,8 +145,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
String message = new String(packet.getData(), UTF8);
|
String message = new String(packet.getData(), StringsHelper.UTF8);
|
||||||
|
|
||||||
final NetworkPackage identityPackage = NetworkPackage.unserialize(message);
|
final NetworkPackage identityPackage = NetworkPackage.unserialize(message);
|
||||||
final String deviceId = identityPackage.getString("deviceId");
|
final String deviceId = identityPackage.getString("deviceId");
|
||||||
if (!identityPackage.getType().equals(NetworkPackage.PACKAGE_TYPE_IDENTITY)) {
|
if (!identityPackage.getType().equals(NetworkPackage.PACKAGE_TYPE_IDENTITY)) {
|
||||||
@@ -173,12 +154,11 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
} else {
|
} else {
|
||||||
String myId = DeviceHelper.getDeviceId(context);
|
String myId = DeviceHelper.getDeviceId(context);
|
||||||
if (deviceId.equals(myId)) {
|
if (deviceId.equals(myId)) {
|
||||||
//Log.i("KDE/LanLinkProvider", "Ignoring my own broadcast");
|
//Ignore my own broadcast
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.e("AAAAAAAAAAAAAAAAAAAAA","OOOOOOOOOOOOOOOOOOOOOOOOO");
|
|
||||||
if (identityPackage.getInt("protocolVersion") >= MIN_VERSION_WITH_NEW_PORT_SUPPORT && identityPackage.getInt("tcpPort") < port) {
|
if (identityPackage.getInt("protocolVersion") >= MIN_VERSION_WITH_NEW_PORT_SUPPORT && identityPackage.getInt("tcpPort") < port) {
|
||||||
Log.w("KDE/LanLinkProvider", "Ignoring a udp broadcast from an old port because it comes from a device which knows about the new port.");
|
Log.w("KDE/LanLinkProvider", "Ignoring a udp broadcast from an old port because it comes from a device which knows about the new port.");
|
||||||
return;
|
return;
|
||||||
@@ -189,7 +169,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
int tcpPort = identityPackage.getInt("tcpPort", port);
|
int tcpPort = identityPackage.getInt("tcpPort", port);
|
||||||
|
|
||||||
SocketFactory socketFactory = SocketFactory.getDefault();
|
SocketFactory socketFactory = SocketFactory.getDefault();
|
||||||
Socket socket = socketFactory.createSocket(packet.getAddress(), tcpPort);
|
Socket socket = socketFactory.createSocket(address, tcpPort);
|
||||||
configureSocket(socket);
|
configureSocket(socket);
|
||||||
|
|
||||||
OutputStream out = socket.getOutputStream();
|
OutputStream out = socket.getOutputStream();
|
||||||
@@ -226,14 +206,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void identityPackageReceived(final NetworkPackage identityPackage, final Socket channel, final LanLink.ConnectionStarted connectionStarted) {
|
private void identityPackageReceived(final NetworkPackage identityPackage, final Socket socket, final LanLink.ConnectionStarted connectionStarted) {
|
||||||
|
|
||||||
try {
|
|
||||||
Log.e("IDENTITITYYYYY", identityPackage.serialize());
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String myId = DeviceHelper.getDeviceId(context);
|
String myId = DeviceHelper.getDeviceId(context);
|
||||||
final String deviceId = identityPackage.getString("deviceId");
|
final String deviceId = identityPackage.getString("deviceId");
|
||||||
@@ -255,7 +228,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
Log.i("KDE/LanLinkProvider","Starting SSL handshake with " + identityPackage.getString("deviceName"));
|
Log.i("KDE/LanLinkProvider","Starting SSL handshake with " + identityPackage.getString("deviceName"));
|
||||||
|
|
||||||
SSLSocketFactory sslsocketFactory = SslHelper.getSslContext(context, deviceId, isDeviceTrusted).getSocketFactory();
|
SSLSocketFactory sslsocketFactory = SslHelper.getSslContext(context, deviceId, isDeviceTrusted).getSocketFactory();
|
||||||
final SSLSocket sslsocket = (SSLSocket)sslsocketFactory.createSocket(channel, channel.getInetAddress().getHostAddress(), channel.getPort(), true);
|
final SSLSocket sslsocket = (SSLSocket)sslsocketFactory.createSocket(socket, socket.getInetAddress().getHostAddress(), socket.getPort(), true);
|
||||||
SslHelper.configureSslSocket(sslsocket, isDeviceTrusted, clientMode);
|
SslHelper.configureSslSocket(sslsocket, isDeviceTrusted, clientMode);
|
||||||
configureSocket(sslsocket);
|
configureSocket(sslsocket);
|
||||||
sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() {
|
sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() {
|
||||||
@@ -281,6 +254,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
//Handshake is blocking, so do it on another thread and free this thread to keep receiving new connection
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -289,11 +263,10 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
} else {
|
} else {
|
||||||
addLink(identityPackage, channel, connectionStarted);
|
addLink(identityPackage, socket, connectionStarted);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -301,7 +274,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addLink(final NetworkPackage identityPackage, Socket channel, LanLink.ConnectionStarted connectionOrigin) throws IOException {
|
private void addLink(final NetworkPackage identityPackage, Socket socket, LanLink.ConnectionStarted connectionOrigin) throws IOException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Log.e("addLink", identityPackage.serialize());
|
Log.e("addLink", identityPackage.serialize());
|
||||||
@@ -314,49 +287,31 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
if (currentLink != null) {
|
if (currentLink != null) {
|
||||||
//Update old link
|
//Update old link
|
||||||
Log.i("KDE/LanLinkProvider", "Reusing same link for device " + deviceId);
|
Log.i("KDE/LanLinkProvider", "Reusing same link for device " + deviceId);
|
||||||
final Socket oldChannel = currentLink.reset(channel, connectionOrigin, this);
|
final Socket oldSocket = currentLink.reset(socket, connectionOrigin, this);
|
||||||
new Timer().schedule(new TimerTask() {
|
new Timer().schedule(new TimerTask() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
nioLinks.remove(oldChannel.hashCode());
|
nioLinks.remove(oldSocket);
|
||||||
//Log.e("KDE/LanLinkProvider", "Forgetting about channel " + channel.hashCode());
|
//Log.e("KDE/LanLinkProvider", "Forgetting about socket " + socket.hashCode());
|
||||||
}
|
}
|
||||||
}, 500); //Stop accepting messages from the old channel after 500ms
|
}, 500); //Stop accepting messages from the old socket after 500ms
|
||||||
nioLinks.put(channel.hashCode(), currentLink);
|
nioLinks.put(socket, currentLink);
|
||||||
//Log.e("KDE/LanLinkProvider", "Replacing channel. old: "+ oldChannel.hashCode() + " - new: "+ channel.hashCode());
|
//Log.e("KDE/LanLinkProvider", "Replacing socket. old: "+ oldSocket.hashCode() + " - new: "+ socket.hashCode());
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Log.e("addLink", "create link");
|
Log.e("addLink", "create link");
|
||||||
//Let's create the link
|
//Let's create the link
|
||||||
LanLink link = new LanLink(context, deviceId, this, channel, connectionOrigin);
|
LanLink link = new LanLink(context, deviceId, this, socket, connectionOrigin);
|
||||||
nioLinks.put(channel.hashCode(), link);
|
nioLinks.put(socket, link);
|
||||||
visibleComputers.put(deviceId, link);
|
visibleComputers.put(deviceId, link);
|
||||||
connectionAccepted(identityPackage, link);
|
connectionAccepted(identityPackage, link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public LanLinkProvider(Context context) {
|
public LanLinkProvider(Context context) {
|
||||||
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
||||||
|
|
||||||
// Due to certificate request from SSL server to client, the certificate request message from device with latest android version to device with
|
|
||||||
// old android version causes a FATAL ALERT message stating that incorrect certificate request
|
|
||||||
// Server is disabled on these devices and using a reverse connection strategy. This works well for connection of these devices with kde
|
|
||||||
// and newer android versions. Although devices with android version less than ICS cannot connect to other devices who also have android version less
|
|
||||||
// than ICS because server is disabled on both
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
|
||||||
Log.w("KDE/LanLinkProvider","Not starting a TCP server because it's not supported on Android < 14. Operating only as client.");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void setupUdpListener() {
|
private void setupUdpListener() {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
udpServer = new DatagramSocket(port);
|
udpServer = new DatagramSocket(port);
|
||||||
udpServer.setReuseAddress(true);
|
udpServer.setReuseAddress(true);
|
||||||
@@ -380,7 +335,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
Log.e("LanLinkProvider", "UdpReceive exception");
|
Log.e("LanLinkProvider", "UdpReceive exception");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.e("UdpListener","Stopping UDP listener");
|
Log.w("UdpListener","Stopping UDP listener");
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
@@ -404,7 +359,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
Log.e("LanLinkProvider", "TcpReceive exception");
|
Log.e("LanLinkProvider", "TcpReceive exception");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.e("TcpListener", "Stopping TCP listener");
|
Log.w("TcpListener", "Stopping TCP listener");
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
@@ -434,7 +389,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
socket = new DatagramSocket();
|
socket = new DatagramSocket();
|
||||||
socket.setReuseAddress(true);
|
socket.setReuseAddress(true);
|
||||||
socket.setBroadcast(true);
|
socket.setBroadcast(true);
|
||||||
bytes = identity.serialize().getBytes(UTF8);
|
bytes = identity.serialize().getBytes(StringsHelper.UTF8);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Log.e("KDE/LanLinkProvider","Failed to create DatagramSocket");
|
Log.e("KDE/LanLinkProvider","Failed to create DatagramSocket");
|
||||||
@@ -464,16 +419,26 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
|
//Log.i("KDE/LanLinkProvider", "onStart");
|
||||||
Log.i("KDE/LanLinkProvider", "onStart");
|
|
||||||
|
|
||||||
if (!running) {
|
if (!running) {
|
||||||
|
|
||||||
running = true;
|
running = true;
|
||||||
|
|
||||||
setupUdpListener();
|
setupUdpListener();
|
||||||
|
|
||||||
|
// Due to certificate request from SSL server to client, the certificate request message from device with latest android version to device with
|
||||||
|
// old android version causes a FATAL ALERT message stating that incorrect certificate request
|
||||||
|
// Server is disabled on these devices and using a reverse connection strategy. This works well for connection of these devices with kde
|
||||||
|
// and newer android versions. Although devices with android version less than ICS cannot connect to other devices who also have android version less
|
||||||
|
// than ICS because server is disabled on both
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||||
|
Log.w("KDE/LanLinkProvider","Not starting a TCP server because it's not supported on Android < 14. Operating only as client.");
|
||||||
|
} else {
|
||||||
setupTcpListener();
|
setupTcpListener();
|
||||||
broadcastUdpPackage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
broadcastUdpPackage();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -483,21 +448,18 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
Log.i("KDE/LanLinkProvider", "onStop");
|
//Log.i("KDE/LanLinkProvider", "onStop");
|
||||||
|
|
||||||
running = false;
|
running = false;
|
||||||
try {
|
try {
|
||||||
tcpServer.close();
|
tcpServer.close();
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
udpServer.close();
|
udpServer.close();
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -505,7 +467,4 @@ public class LanLinkProvider extends BaseLinkProvider {
|
|||||||
return "LanLinkProvider";
|
return "LanLinkProvider";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +0,0 @@
|
|||||||
package org.kde.kdeconnect.Helpers;
|
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
public class NotificationsHelper {
|
|
||||||
|
|
||||||
private final static AtomicInteger c = new AtomicInteger((int)System.currentTimeMillis());
|
|
||||||
public static int getUniqueId() {
|
|
||||||
return c.incrementAndGet();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
9
src/org/kde/kdeconnect/Helpers/StringsHelper.java
Normal file
9
src/org/kde/kdeconnect/Helpers/StringsHelper.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package org.kde.kdeconnect.Helpers;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
|
public class StringsHelper {
|
||||||
|
|
||||||
|
public static final Charset UTF8 = Charset.forName("UTF-8");
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user