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().