Add unbind() binder API.

It will remove the callback from the list and unregister death
notification for the callback.

Bug: 62293007
Test: mma
Change-Id: I527699a160feaad739c50ed1865d557d3cef22e8
diff --git a/binder_service_android.cc b/binder_service_android.cc
index 872f64c..91a2970 100644
--- a/binder_service_android.cc
+++ b/binder_service_android.cc
@@ -66,9 +66,10 @@
   auto binder_wrapper = android::BinderWrapper::Get();
   binder_wrapper->RegisterForDeathNotifications(
       IUpdateEngineCallback::asBinder(callback),
-      base::Bind(&BinderUpdateEngineAndroidService::UnbindCallback,
-                 base::Unretained(this),
-                 base::Unretained(callback.get())));
+      base::Bind(
+          base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
+          base::Unretained(this),
+          base::Unretained(callback.get())));
 
   // Send an status update on connection (except when no update sent so far),
   // since the status update is oneway and we don't need to wait for the
@@ -80,6 +81,16 @@
   return Status::ok();
 }
 
+Status BinderUpdateEngineAndroidService::unbind(
+    const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
+  auto binder_wrapper = android::BinderWrapper::Get();
+  binder_wrapper->UnregisterForDeathNotifications(
+      IUpdateEngineCallback::asBinder(callback));
+
+  *return_value = UnbindCallback(callback.get());
+  return Status::ok();
+}
+
 Status BinderUpdateEngineAndroidService::applyPayload(
     const android::String16& url,
     int64_t payload_offset,
@@ -128,7 +139,7 @@
   return Status::ok();
 }
 
-void BinderUpdateEngineAndroidService::UnbindCallback(
+bool BinderUpdateEngineAndroidService::UnbindCallback(
     IUpdateEngineCallback* callback) {
   auto it =
       std::find_if(callbacks_.begin(),
@@ -137,10 +148,11 @@
                      return elem.get() == callback;
                    });
   if (it == callbacks_.end()) {
-    LOG(ERROR) << "Got death notification for unknown callback.";
-    return;
+    LOG(ERROR) << "Unable to unbind unknown callback.";
+    return false;
   }
   callbacks_.erase(it);
+  return true;
 }
 
 }  // namespace chromeos_update_engine