summaryrefslogtreecommitdiffstats
path: root/core/java/com
diff options
context:
space:
mode:
authorIrfan Sheriff <isheriff@android.com>2012-12-06 10:59:10 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2012-12-06 10:59:10 -0800
commit628ba035b3c0636826f3eee3ae78da628cc1a8c8 (patch)
tree58e630e9d130fe00aa2ca5754df7e75c2db04fbb /core/java/com
parent46e380795216c58acbd38af532ac1626e105866a (diff)
parent1612e29826dfe55f8deca27374046c5931ce5335 (diff)
downloadframeworks_base-628ba035b3c0636826f3eee3ae78da628cc1a8c8.zip
frameworks_base-628ba035b3c0636826f3eee3ae78da628cc1a8c8.tar.gz
frameworks_base-628ba035b3c0636826f3eee3ae78da628cc1a8c8.tar.bz2
am 1612e298: Merge "AsyncChannel to support remote death notification and post a disconnect message to the source handler."
* commit '1612e29826dfe55f8deca27374046c5931ce5335': AsyncChannel to support remote death notification and post a disconnect message to the source handler.
Diffstat (limited to 'core/java/com')
-rw-r--r--core/java/com/android/internal/util/AsyncChannel.java37
1 files changed, 37 insertions, 0 deletions
diff --git a/core/java/com/android/internal/util/AsyncChannel.java b/core/java/com/android/internal/util/AsyncChannel.java
index 5093b4d..52281d9 100644
--- a/core/java/com/android/internal/util/AsyncChannel.java
+++ b/core/java/com/android/internal/util/AsyncChannel.java
@@ -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);
+ }
+
+ }
}