Use IBinder to uniquely identify binder callbacks.

The callback pointer might be different for the same callback, convert
it to IBinder and use that to identify callbacks instead.

Bug: 62293007
Test: mma

Change-Id: Ibd1c2de1192dd7d4f4bc498b0590f5b7f3de3aff
diff --git a/binder_service_android.cc b/binder_service_android.cc
index 91a2970..e179c62 100644
--- a/binder_service_android.cc
+++ b/binder_service_android.cc
@@ -63,13 +63,15 @@
     const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
   callbacks_.emplace_back(callback);
 
+  const android::sp<IBinder>& callback_binder =
+      IUpdateEngineCallback::asBinder(callback);
   auto binder_wrapper = android::BinderWrapper::Get();
   binder_wrapper->RegisterForDeathNotifications(
-      IUpdateEngineCallback::asBinder(callback),
+      callback_binder,
       base::Bind(
           base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
           base::Unretained(this),
-          base::Unretained(callback.get())));
+          base::Unretained(callback_binder.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
@@ -83,11 +85,12 @@
 
 Status BinderUpdateEngineAndroidService::unbind(
     const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
+  const android::sp<IBinder>& callback_binder =
+      IUpdateEngineCallback::asBinder(callback);
   auto binder_wrapper = android::BinderWrapper::Get();
-  binder_wrapper->UnregisterForDeathNotifications(
-      IUpdateEngineCallback::asBinder(callback));
+  binder_wrapper->UnregisterForDeathNotifications(callback_binder);
 
-  *return_value = UnbindCallback(callback.get());
+  *return_value = UnbindCallback(callback_binder.get());
   return Status::ok();
 }
 
@@ -139,14 +142,13 @@
   return Status::ok();
 }
 
-bool BinderUpdateEngineAndroidService::UnbindCallback(
-    IUpdateEngineCallback* callback) {
-  auto it =
-      std::find_if(callbacks_.begin(),
-                   callbacks_.end(),
-                   [&callback](const android::sp<IUpdateEngineCallback>& elem) {
-                     return elem.get() == callback;
-                   });
+bool BinderUpdateEngineAndroidService::UnbindCallback(const IBinder* callback) {
+  auto it = std::find_if(
+      callbacks_.begin(),
+      callbacks_.end(),
+      [&callback](const android::sp<IUpdateEngineCallback>& elem) {
+        return IUpdateEngineCallback::asBinder(elem).get() == callback;
+      });
   if (it == callbacks_.end()) {
     LOG(ERROR) << "Unable to unbind unknown callback.";
     return false;
diff --git a/binder_service_android.h b/binder_service_android.h
index 375dad4..7d66fcc 100644
--- a/binder_service_android.h
+++ b/binder_service_android.h
@@ -73,7 +73,7 @@
   // Remove the passed |callback| from the list of registered callbacks. Called
   // on unbind() or whenever the callback object is destroyed.
   // Returns true on success.
-  bool UnbindCallback(android::os::IUpdateEngineCallback* callback);
+  bool UnbindCallback(const IBinder* callback);
 
   // List of currently bound callbacks.
   std::vector<android::sp<android::os::IUpdateEngineCallback>> callbacks_;