Pebble 2: fix a few crashes with disconnect/ reconnect
This commit is contained in:
parent
4f3c46f704
commit
e8da301da3
|
@ -157,6 +157,14 @@ class PebbleIoThread extends GBDeviceIoThread {
|
||||||
mEnablePebblekit = prefs.getBoolean("pebble_enable_pebblekit", false);
|
mEnablePebblekit = prefs.getBoolean("pebble_enable_pebblekit", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int readWithException(InputStream inputStream, byte[] buffer, int byteOffset, int byteCount) throws IOException {
|
||||||
|
int ret = inputStream.read(buffer, byteOffset, byteCount);
|
||||||
|
if (ret == -1) {
|
||||||
|
throw new IOException("broken pipe");
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private void sendAppMessageAck(int transactionId) {
|
private void sendAppMessageAck(int transactionId) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
intent.setAction(PEBBLEKIT_ACTION_APP_RECEIVE_ACK);
|
intent.setAction(PEBBLEKIT_ACTION_APP_RECEIVE_ACK);
|
||||||
|
@ -323,10 +331,10 @@ class PebbleIoThread extends GBDeviceIoThread {
|
||||||
if (mIsTCP) {
|
if (mIsTCP) {
|
||||||
mInStream.skip(6);
|
mInStream.skip(6);
|
||||||
}
|
}
|
||||||
int bytes = mInStream.read(buffer, 0, 4);
|
int bytes = readWithException(mInStream, buffer, 0, 4);
|
||||||
|
|
||||||
while (bytes < 4) {
|
while (bytes < 4) {
|
||||||
bytes += mInStream.read(buffer, bytes, 4 - bytes);
|
bytes += readWithException(mInStream, buffer, bytes, 4 - bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer buf = ByteBuffer.wrap(buffer);
|
ByteBuffer buf = ByteBuffer.wrap(buffer);
|
||||||
|
@ -336,14 +344,14 @@ class PebbleIoThread extends GBDeviceIoThread {
|
||||||
if (length < 0 || length > 8192) {
|
if (length < 0 || length > 8192) {
|
||||||
LOG.info("invalid length " + length);
|
LOG.info("invalid length " + length);
|
||||||
while (mInStream.available() > 0) {
|
while (mInStream.available() > 0) {
|
||||||
mInStream.read(buffer); // read all
|
readWithException(mInStream, buffer, 0, buffer.length); // read all
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes = mInStream.read(buffer, 4, length);
|
bytes = readWithException(mInStream, buffer, 4, length);
|
||||||
while (bytes < length) {
|
while (bytes < length) {
|
||||||
bytes += mInStream.read(buffer, bytes + 4, length - bytes);
|
bytes += readWithException(mInStream, buffer, bytes + 4, length - bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIsTCP) {
|
if (mIsTCP) {
|
||||||
|
@ -368,8 +376,8 @@ class PebbleIoThread extends GBDeviceIoThread {
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
} catch (IOException | ArrayIndexOutOfBoundsException e) {
|
} catch (IOException e) {
|
||||||
if (e.getMessage() != null && (e instanceof ArrayIndexOutOfBoundsException || e.getMessage().contains("socket closed"))) { //FIXME: this does not feel right
|
if (e.getMessage() != null && (e.getMessage().equals("broken pipe") || e.getMessage().contains("socket closed"))) { //FIXME: this does not feel right
|
||||||
LOG.info(e.getMessage());
|
LOG.info(e.getMessage());
|
||||||
mIsConnected = false;
|
mIsConnected = false;
|
||||||
int reconnectAttempts = prefs.getInt("pebble_reconnect_attempts", 10);
|
int reconnectAttempts = prefs.getInt("pebble_reconnect_attempts", 10);
|
||||||
|
|
|
@ -60,14 +60,9 @@ public class PebbleLESupport {
|
||||||
mPebbleGATTClient.close();
|
mPebbleGATTClient.close();
|
||||||
mPebbleGATTClient = null;
|
mPebbleGATTClient = null;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
mPipedInputStream.close();
|
|
||||||
mPipedOutputStream.close();
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void createPipedInputReader() {
|
synchronized void createPipedInputReader() {
|
||||||
if (mPipeReader == null) {
|
if (mPipeReader == null) {
|
||||||
mPipeReader = new PipeReader();
|
mPipeReader = new PipeReader();
|
||||||
}
|
}
|
||||||
|
@ -76,7 +71,7 @@ public class PebbleLESupport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void destroyPipedInputReader() {
|
synchronized private void destroyPipedInputReader() {
|
||||||
if (mPipeReader != null) {
|
if (mPipeReader != null) {
|
||||||
mPipeReader.quit();
|
mPipeReader.quit();
|
||||||
mPipeReader.interrupt();
|
mPipeReader.interrupt();
|
||||||
|
@ -137,6 +132,11 @@ public class PebbleLESupport {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
mPipedOutputStream.close();
|
||||||
|
mPipedInputStream.close();
|
||||||
|
} catch (IOException ignore) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void quit() {
|
void quit() {
|
||||||
|
|
Loading…
Reference in New Issue