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