Add handling of base.reboot to weaved

Now that weaved can use binder on Brillo, add a command handler for
base.reboot command and delegate rebooting to native power manager
daemon.

BUG: 23759426
Change-Id: I88f18d953ae3072b154d6cc822d5064207316189
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 27610ec..1323850 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -60,6 +60,8 @@
 
 const char kErrorDomain[] = "buffet";
 const char kFileReadError[] = "file_read_error";
+const char kBaseComponent[] = "base";
+const char kRebootCommand[] = "base.reboot";
 
 bool LoadFile(const base::FilePath& file_path,
               std::string* data,
@@ -188,6 +190,7 @@
 }
 
 void Manager::Start(AsyncEventSequencer* sequencer) {
+  power_manager_client_.Init();
   RestartWeave(sequencer);
 }
 
@@ -260,6 +263,10 @@
       base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()),
       base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr()));
 
+  device_->AddCommandHandler(kBaseComponent, kRebootCommand,
+                             base::Bind(&Manager::OnRebootDevice,
+                                        weak_ptr_factory_.GetWeakPtr()));
+
   CreateServicesForClients();
 }
 
@@ -339,6 +346,21 @@
   NotifyServiceManagerChange(ids);
 }
 
+void Manager::OnRebootDevice(const std::weak_ptr<weave::Command>& cmd) {
+  auto command = cmd.lock();
+  if (!command || !command->Complete({}, nullptr))
+    return;
+
+  task_runner_->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(&Manager::RebootDeviceNow, weak_ptr_factory_.GetWeakPtr()),
+      base::TimeDelta::FromSeconds(2));
+}
+
+void Manager::RebootDeviceNow() {
+  power_manager_client_.Reboot(android::RebootReason::DEFAULT);
+}
+
 android::binder::Status Manager::connect(
     const android::sp<android::weave::IWeaveClient>& client) {
   pending_clients_.push_back(client);