Ensure that binders are unlinked from death recipients
- Add a callback to assist data requester to notify owners that the request
is completed so they can clean up accordingly
Bug: 67864419
Test: com.android.server.am.AssistDataRequesterTest
Change-Id: I775aaf78ac7d9632cd9ca0a4cf05f2a87211d5fe
diff --git a/services/core/java/com/android/server/am/AssistDataReceiverProxy.java b/services/core/java/com/android/server/am/AssistDataReceiverProxy.java
index 8306731..f22fe37 100644
--- a/services/core/java/com/android/server/am/AssistDataReceiverProxy.java
+++ b/services/core/java/com/android/server/am/AssistDataReceiverProxy.java
@@ -37,17 +37,12 @@
private static final String TAG = TAG_WITH_CLASS_NAME ? "AssistDataReceiverProxy" : TAG_AM;
private String mCallerPackage;
- private boolean mBinderDied;
private IAssistDataReceiver mReceiver;
public AssistDataReceiverProxy(IAssistDataReceiver receiver, String callerPackage) {
- try {
- receiver.asBinder().linkToDeath(this, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Could not link to client death", e);
- }
mReceiver = receiver;
mCallerPackage = callerPackage;
+ linkToDeath();
}
@Override
@@ -58,7 +53,7 @@
@Override
public void onAssistDataReceivedLocked(Bundle data, int activityIndex, int activityCount) {
- if (!mBinderDied) {
+ if (mReceiver != null) {
try {
mReceiver.onHandleAssistData(data);
} catch (RemoteException e) {
@@ -70,7 +65,7 @@
@Override
public void onAssistScreenshotReceivedLocked(Bitmap screenshot) {
- if (!mBinderDied) {
+ if (mReceiver != null) {
try {
mReceiver.onHandleAssistScreenshot(screenshot);
} catch (RemoteException e) {
@@ -81,7 +76,27 @@
}
@Override
+ public void onAssistRequestCompleted() {
+ unlinkToDeath();
+ }
+
+ @Override
public void binderDied() {
- mBinderDied = true;
+ unlinkToDeath();
+ }
+
+ private void linkToDeath() {
+ try {
+ mReceiver.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Could not link to client death", e);
+ }
+ }
+
+ private void unlinkToDeath() {
+ if (mReceiver != null) {
+ mReceiver.asBinder().unlinkToDeath(this, 0);
+ }
+ mReceiver = null;
}
}
\ No newline at end of file