diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java index c1913ba3..2e7f2b36 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java @@ -20,7 +20,6 @@ import android.os.Handler; import android.util.Log; import com.squareup.wire.Message; -import com.squareup.wire.Wire; import org.microg.gms.gcm.mcs.Close; import org.microg.gms.gcm.mcs.DataMessageStanza; @@ -57,7 +56,7 @@ public class McsInputStream extends Thread implements Closeable { private int streamId = 0; private long lastMsgTime = 0; - private boolean closed = false; + private volatile boolean closed = false; public McsInputStream(InputStream is, Handler mainHandler) { this(is, mainHandler, false); @@ -83,7 +82,11 @@ public class McsInputStream extends Thread implements Closeable { } } } catch (IOException e) { - mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_INPUT_ERROR, e)); + if (closed) { + Log.d(TAG, "We were closed already. Ignoring IOException"); + } else { + mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_INPUT_ERROR, e)); + } } try { is.close(); @@ -120,7 +123,7 @@ public class McsInputStream extends Thread implements Closeable { Log.d(TAG, "Reading from MCS version: " + version); initialized = true; } catch (IOException e) { - Log.w(TAG, e); + Log.w(TAG, "Error reading version", e); } } } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java index a4867b6d..5448adef 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java @@ -41,10 +41,10 @@ public class McsOutputStream extends Thread implements Handler.Callback, Closeab private int version = MCS_VERSION_CODE; private int streamId = 0; - private Handler mainHandler; + private final Handler mainHandler; private Handler myHandler; - private boolean closed = false; + private volatile boolean closed = false; public McsOutputStream(OutputStream os, Handler mainHandler) { this(os, mainHandler, false); @@ -78,7 +78,11 @@ public class McsOutputStream extends Thread implements Handler.Callback, Closeab writeInternal((Message) msg.obj, msg.arg1); mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_DONE, msg.arg1, msg.arg2, msg.obj)); } catch (IOException e) { - mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_ERROR, e)); + if (closed) { + Log.d(TAG, "We were closed already. Ignoring IOException"); + } else { + mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_ERROR, e)); + } } return true; case MSG_TEARDOWN: diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java index 600b24ba..5a9eb534 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java @@ -441,7 +441,6 @@ public class McsService extends Service implements Handler.Callback { } private synchronized void connect() { - wasTornDown = false; try { closeAll(); ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); @@ -452,6 +451,7 @@ public class McsService extends Service implements Handler.Callback { scheduleReconnect(this); return; } + wasTornDown = false; logd(this, "Starting MCS connection..."); Socket socket = new Socket(SERVICE_HOST, SERVICE_PORT); @@ -744,6 +744,7 @@ public class McsService extends Service implements Handler.Callback { resetCurrentDelay(); lastIncomingNetworkRealtime = SystemClock.elapsedRealtime(); } catch (Exception e) { + Log.w(TAG, "Exception when handling input: " + message, e); rootHandler.sendMessage(rootHandler.obtainMessage(MSG_TEARDOWN, e)); } } @@ -758,6 +759,7 @@ public class McsService extends Service implements Handler.Callback { } private static void closeAll() { + logd(null, "Closing all sockets..."); tryClose(inputStream); tryClose(outputStream); if (sslSocket != null) {