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