Merge "AsyncChannel to support remote death notification and post a disconnect message to the source handler."

This commit is contained in:
Irfan Sheriff
2012-12-05 20:33:37 -08:00
committed by Gerrit Code Review

View File

@@ -180,6 +180,9 @@ public class AsyncChannel {
/** CMD_FULLY_CONNECTED refused because a connection already exists*/
public static final int STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED = 3;
/** Error indicating abnormal termination of destination messenger */
public static final int STATUS_REMOTE_DISCONNECTION = 4;
/** Service connection */
private AsyncChannelConnection mConnection;
@@ -195,6 +198,9 @@ public class AsyncChannel {
/** Messenger for destination */
private Messenger mDstMessenger;
/** Death Monitor for destination messenger */
private DeathMonitor mDeathMonitor;
/**
* AsyncChannel constructor
*/
@@ -434,6 +440,7 @@ public class AsyncChannel {
mSrcHandler = null;
mSrcMessenger = null;
mDstMessenger = null;
mDeathMonitor = null;
mConnection = null;
}
@@ -457,6 +464,10 @@ public class AsyncChannel {
if (mSrcHandler != null) {
replyDisconnected(STATUS_SUCCESSFUL);
}
// Unlink only when bindService isn't used
if (mConnection == null && mDstMessenger != null && mDeathMonitor!= null) {
mDstMessenger.getBinder().unlinkToDeath(mDeathMonitor, 0);
}
}
/**
@@ -832,6 +843,21 @@ public class AsyncChannel {
msg.arg1 = status;
msg.obj = this;
msg.replyTo = mDstMessenger;
/*
* Link to death only when bindService isn't used.
*/
if (mConnection == null) {
mDeathMonitor = new DeathMonitor();
try {
mDstMessenger.getBinder().linkToDeath(mDeathMonitor, 0);
} catch (RemoteException e) {
mDeathMonitor = null;
// Override status to indicate failure
msg.arg1 = STATUS_BINDING_UNSUCCESSFUL;
}
}
mSrcHandler.sendMessage(msg);
}
@@ -877,4 +903,15 @@ public class AsyncChannel {
private static void log(String s) {
Slog.d(TAG, s);
}
private final class DeathMonitor implements IBinder.DeathRecipient {
DeathMonitor() {
}
public void binderDied() {
replyDisconnected(STATUS_REMOTE_DISCONNECTION);
}
}
}