Make client use binder interface on brillo

TEST=Verified status and update commands
Bug: 25908638

Change-Id: I7994de41001b4e116bffa539f23f1344ab1deae9
diff --git a/client_library/client_binder.cc b/client_library/client_binder.cc
index b3bd3e7..969c5e9 100644
--- a/client_library/client_binder.cc
+++ b/client_library/client_binder.cc
@@ -19,7 +19,6 @@
 #include <binder/IServiceManager.h>
 
 #include <base/message_loop/message_loop.h>
-#include <utils/String16.h>
 #include <utils/String8.h>
 
 #include "update_engine/parcelable_update_engine_status.h"
@@ -29,6 +28,7 @@
 using android::String16;
 using android::String8;
 using android::brillo::ParcelableUpdateEngineStatus;
+using android::binder::Status;
 using android::getService;
 using chromeos_update_engine::StringToUpdateStatus;
 using std::string;
@@ -37,6 +37,8 @@
 namespace internal {
 
 bool BinderUpdateEngineClient::Init() {
+  if (!binder_watcher_.Init()) return false;
+
   return getService(String16{"android.brillo.UpdateEngineService"},
       &service_) == OK;
 }
@@ -123,8 +125,36 @@
   return service_->ResetStatus().isOk();
 }
 
-void BinderUpdateEngineClient::RegisterStatusUpdateHandler(
+Status BinderUpdateEngineClient::StatusUpdateCallback::HandleStatusUpdate(
+    int64_t last_checked_time,
+    double progress,
+    const String16& current_operation,
+    const String16& new_version,
+    int64_t new_size) {
+  UpdateStatus update_status;
+
+  StringToUpdateStatus(String8{current_operation}.string(), &update_status);
+
+  for (auto& handler : client_->handlers_) {
+    handler->HandleStatusUpdate(last_checked_time, progress, update_status,
+                                String8{new_version}.string(), new_size);
+  }
+
+  return Status::ok();
+}
+
+bool BinderUpdateEngineClient::RegisterStatusUpdateHandler(
     StatusUpdateHandler* handler) {
+  if (!status_callback_.get()) {
+    status_callback_ =
+        new BinderUpdateEngineClient::StatusUpdateCallback(this);
+    if (!service_->RegisterStatusCallback(status_callback_).isOk()) {
+      return false;
+    }
+  }
+
+  handlers_.push_back(handler);
+  return true;
 }
 
 bool BinderUpdateEngineClient::SetTargetChannel(const string& in_target_channel,
diff --git a/client_library/client_binder.h b/client_library/client_binder.h
index 22d1cf0..744b238 100644
--- a/client_library/client_binder.h
+++ b/client_library/client_binder.h
@@ -20,11 +20,17 @@
 #include <cstdint>
 #include <memory>
 #include <string>
+#include <vector>
 
 #include <base/macros.h>
 #include <utils/StrongPointer.h>
+#include <utils/String16.h>
+
+#include <brillo/binder_watcher.h>
 
 #include "android/brillo/IUpdateEngine.h"
+#include "android/brillo/BnUpdateEngineStatusCallback.h"
+
 
 #include "update_engine/client_library/include/update_engine/client.h"
 
@@ -71,10 +77,29 @@
 
   bool GetChannel(std::string* out_channel) const override;
 
-  void RegisterStatusUpdateHandler(StatusUpdateHandler* handler) override;
+  bool RegisterStatusUpdateHandler(StatusUpdateHandler* handler) override;
 
  private:
+  class StatusUpdateCallback :
+      public android::brillo::BnUpdateEngineStatusCallback {
+   public:
+    StatusUpdateCallback(BinderUpdateEngineClient* client) : client_(client) {}
+
+    android::binder::Status HandleStatusUpdate(
+        int64_t last_checked_time,
+        double progress,
+        const android::String16& current_operation,
+        const android::String16& new_version,
+        int64_t new_size) override;
+
+   private:
+    BinderUpdateEngineClient* client_;
+  };
+
   android::sp<android::brillo::IUpdateEngine> service_;
+  android::sp<android::brillo::IUpdateEngineStatusCallback> status_callback_;
+  std::vector<update_engine::StatusUpdateHandler*> handlers_;
+  brillo::BinderWatcher binder_watcher_;
 
   DISALLOW_COPY_AND_ASSIGN(BinderUpdateEngineClient);
 };  // class BinderUpdateEngineClient
diff --git a/client_library/client_dbus.cc b/client_library/client_dbus.cc
index 0d02936..d9b4a05 100644
--- a/client_library/client_dbus.cc
+++ b/client_library/client_dbus.cc
@@ -159,20 +159,20 @@
       last_checked_time, progress, status, new_version, new_size);
 }
 
-void DBusUpdateEngineClient::RegisterStatusUpdateHandler(
+bool DBusUpdateEngineClient::RegisterStatusUpdateHandler(
     StatusUpdateHandler* handler) {
   if (!base::MessageLoopForIO::current()) {
     LOG(FATAL) << "Cannot get UpdateEngineClient outside of message loop.";
-    return;
+    return false;
   }
 
   proxy_->RegisterStatusUpdateSignalHandler(
       base::Bind(&DBusUpdateEngineClient::RunStatusUpdateHandler,
-                 base::Unretained(this),
-                 base::Unretained(handler)),
+                 base::Unretained(this), base::Unretained(handler)),
       base::Bind(&DBusUpdateEngineClient::StatusUpdateHandlerRegistered,
-                 base::Unretained(this),
-                 base::Unretained(handler)));
+                 base::Unretained(this), base::Unretained(handler)));
+
+  return true;
 }
 
 bool DBusUpdateEngineClient::SetTargetChannel(const string& in_target_channel,
diff --git a/client_library/client_dbus.h b/client_library/client_dbus.h
index 3590a21..e6bbe36 100644
--- a/client_library/client_dbus.h
+++ b/client_library/client_dbus.h
@@ -69,7 +69,7 @@
 
   bool GetChannel(std::string* out_channel) const override;
 
-  void RegisterStatusUpdateHandler(StatusUpdateHandler* handler) override;
+  bool RegisterStatusUpdateHandler(StatusUpdateHandler* handler) override;
 
  private:
   std::unique_ptr<org::chromium::UpdateEngineInterfaceProxy> proxy_;
diff --git a/client_library/include/update_engine/client.h b/client_library/include/update_engine/client.h
index 8bfb631..f2af453 100644
--- a/client_library/include/update_engine/client.h
+++ b/client_library/include/update_engine/client.h
@@ -106,7 +106,7 @@
   // not be registered. Otherwise its HandleStatusUpdate method will be called
   // every time update_engine's status changes. Will always report the status
   // on registration to prevent race conditions.
-  virtual void RegisterStatusUpdateHandler(StatusUpdateHandler* handler) = 0;
+  virtual bool RegisterStatusUpdateHandler(StatusUpdateHandler* handler) = 0;
 
  protected:
   // Use CreateInstance().