Flesh out PowerManagerMojo::ScreenBrightnessChanged

Type mapping is added for the change cause enum and the
BacklightBrightnessChange struct

Bug: 644348
Change-Id: I8e194790324b2e71b5690c7bf6ebc72ea09a4db8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1570250
Reviewed-by: Ken Rockot <rockot@google.com>
Reviewed-by: Steven Bennetts <stevenjb@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#653685}
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_client.cc b/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
index eb1b9de..05a75fe 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
@@ -133,13 +133,18 @@
 
 void PowerManagerMojoClient::DeferScreenDim() {}
 
-void PowerManagerMojoClient::ScreenBrightnessChanged(double percent) {
-  power_manager::BacklightBrightnessChange change;
-  change.set_percent(percent);
+void PowerManagerMojoClient::ScreenBrightnessChanged(
+    const power_manager::BacklightBrightnessChange& change) {
   for (auto& observer : observers_)
     observer.ScreenBrightnessChanged(change);
 }
 
+void PowerManagerMojoClient::KeyboardBrightnessChanged(
+    const power_manager::BacklightBrightnessChange& change) {
+  for (auto& observer : observers_)
+    observer.KeyboardBrightnessChanged(change);
+}
+
 void PowerManagerMojoClient::InitAfterInterfaceBound() {
   DCHECK(controller_.is_bound());
   power::mojom::PowerManagerObserverAssociatedPtrInfo ptr_info;
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_client.h b/chromeos/services/power/public/cpp/power_manager_mojo_client.h
index 853889a..637c7d4a 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.h
@@ -73,7 +73,10 @@
   void DeferScreenDim() override;
 
   // power::mojom::PowerManagerObserver:
-  void ScreenBrightnessChanged(double percent) override;
+  void ScreenBrightnessChanged(
+      const power_manager::BacklightBrightnessChange& change) override;
+  void KeyboardBrightnessChanged(
+      const power_manager::BacklightBrightnessChange& change) override;
 
   power::mojom::PowerManagerControllerPtr* interface_ptr() {
     return &controller_;
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc b/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
index 148df0c6..8cec9a9 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
@@ -45,8 +45,12 @@
 
 void PowerManagerMojoController::ScreenBrightnessChanged(
     const power_manager::BacklightBrightnessChange& change) {
-  // TODO(estade): serialize and pass all of |change|.
-  client_->ScreenBrightnessChanged(change.percent());
+  client_->ScreenBrightnessChanged(change);
+}
+
+void PowerManagerMojoController::KeyboardBrightnessChanged(
+    const power_manager::BacklightBrightnessChange& change) {
+  client_->KeyboardBrightnessChanged(change);
 }
 
 }  // namespace chromeos
diff --git a/chromeos/services/power/public/cpp/power_manager_mojo_controller.h b/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
index 1a27d49..a45d92f 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
@@ -34,6 +34,8 @@
   // PowerManagerClient::Observer:
   void ScreenBrightnessChanged(
       const power_manager::BacklightBrightnessChange& change) override;
+  void KeyboardBrightnessChanged(
+      const power_manager::BacklightBrightnessChange& change) override;
 
  private:
   mojo::BindingSet<power::mojom::PowerManagerController> binding_set_;
diff --git a/chromeos/services/power/public/mojom/OWNERS b/chromeos/services/power/public/mojom/OWNERS
index 08850f4..2c44a46 100644
--- a/chromeos/services/power/public/mojom/OWNERS
+++ b/chromeos/services/power/public/mojom/OWNERS
@@ -1,2 +1,6 @@
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
+per-file *_struct_traits*.*=set noparent
+per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
+per-file *.typemap=set noparent
+per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/chromeos/services/power/public/mojom/mojom_traits.cc b/chromeos/services/power/public/mojom/mojom_traits.cc
new file mode 100644
index 0000000..7b1c1b8
--- /dev/null
+++ b/chromeos/services/power/public/mojom/mojom_traits.cc
@@ -0,0 +1,125 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/power/public/mojom/mojom_traits.h"
+
+namespace mojo {
+
+// static
+chromeos::power::mojom::BacklightBrightnessChangeCause
+EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+           power_manager::BacklightBrightnessChange_Cause>::
+    ToMojom(power_manager::BacklightBrightnessChange_Cause cause) {
+  switch (cause) {
+    case power_manager::BacklightBrightnessChange_Cause_USER_REQUEST:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kUserRequest;
+    case power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kUserActivity;
+    case power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kUserInactivity;
+    case power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kAmbientLightChanged;
+    case power_manager::
+        BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kExternalPowerConnected;
+    case power_manager::
+        BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kExternalPowerDisconnected;
+    case power_manager::BacklightBrightnessChange_Cause_FORCED_OFF:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff;
+    case power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kNoLongerForcedOff;
+    case power_manager::BacklightBrightnessChange_Cause_OTHER:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::kOther;
+    case power_manager::BacklightBrightnessChange_Cause_MODEL:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::kModel;
+    case power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION:
+      return chromeos::power::mojom::BacklightBrightnessChangeCause::
+          kWakeNotification;
+  }
+  NOTREACHED();
+  return chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest;
+}
+
+// static
+bool EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+                power_manager::BacklightBrightnessChange_Cause>::
+    FromMojom(chromeos::power::mojom::BacklightBrightnessChangeCause cause,
+              power_manager::BacklightBrightnessChange_Cause* out) {
+  switch (cause) {
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest:
+      *out = power_manager::BacklightBrightnessChange_Cause_USER_REQUEST;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserActivity:
+      *out = power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kUserInactivity:
+      *out = power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kAmbientLightChanged:
+      *out =
+          power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kExternalPowerConnected:
+      *out = power_manager::
+          BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kExternalPowerDisconnected:
+      *out = power_manager::
+          BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff:
+      *out = power_manager::BacklightBrightnessChange_Cause_FORCED_OFF;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kNoLongerForcedOff:
+      *out =
+          power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::kOther:
+      *out = power_manager::BacklightBrightnessChange_Cause_OTHER;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::kModel:
+      *out = power_manager::BacklightBrightnessChange_Cause_MODEL;
+      return true;
+    case chromeos::power::mojom::BacklightBrightnessChangeCause::
+        kWakeNotification:
+      *out = power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION;
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
+// static
+bool StructTraits<chromeos::power::mojom::BacklightBrightnessChangeDataView,
+                  power_manager::BacklightBrightnessChange>::
+    Read(chromeos::power::mojom::BacklightBrightnessChangeDataView data,
+         power_manager::BacklightBrightnessChange* out) {
+  if (data.percent() < 0. || data.percent() > 100.)
+    return false;
+
+  out->set_percent(data.percent());
+
+  power_manager::BacklightBrightnessChange_Cause cause;
+  if (!data.ReadCause(&cause))
+    return false;
+
+  out->set_cause(cause);
+  return true;
+}
+
+}  // namespace mojo
diff --git a/chromeos/services/power/public/mojom/mojom_traits.h b/chromeos/services/power/public/mojom/mojom_traits.h
new file mode 100644
index 0000000..f41a567
--- /dev/null
+++ b/chromeos/services/power/public/mojom/mojom_traits.h
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_SERVICES_POWER_PUBLIC_MOJOM_MOJOM_TRAITS_H_
+#define CHROMEOS_SERVICES_POWER_PUBLIC_MOJOM_MOJOM_TRAITS_H_
+
+#include "chromeos/dbus/power_manager/backlight.pb.h"
+#include "chromeos/services/power/public/mojom/power_manager.mojom-shared.h"
+#include "chromeos/services/power/public/mojom/power_manager.mojom.h"
+#include "mojo/public/cpp/bindings/enum_traits.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+                  power_manager::BacklightBrightnessChange_Cause> {
+  static chromeos::power::mojom::BacklightBrightnessChangeCause ToMojom(
+      power_manager::BacklightBrightnessChange_Cause cause);
+
+  static bool FromMojom(
+      chromeos::power::mojom::BacklightBrightnessChangeCause cause,
+      power_manager::BacklightBrightnessChange_Cause* out);
+};
+
+template <>
+struct StructTraits<chromeos::power::mojom::BacklightBrightnessChangeDataView,
+                    power_manager::BacklightBrightnessChange> {
+  static double percent(
+      const power_manager::BacklightBrightnessChange& change) {
+    return change.percent();
+  }
+  static power_manager::BacklightBrightnessChange_Cause cause(
+      const power_manager::BacklightBrightnessChange& change) {
+    return change.cause();
+  }
+  static bool Read(
+      chromeos::power::mojom::BacklightBrightnessChangeDataView data,
+      power_manager::BacklightBrightnessChange* out);
+};
+
+}  // namespace mojo
+
+#endif  // CHROMEOS_SERVICES_POWER_PUBLIC_MOJOM_MOJOM_TRAITS_H_
diff --git a/chromeos/services/power/public/mojom/power_manager.mojom b/chromeos/services/power/public/mojom/power_manager.mojom
index 9fb289c6..f084e2e80 100644
--- a/chromeos/services/power/public/mojom/power_manager.mojom
+++ b/chromeos/services/power/public/mojom/power_manager.mojom
@@ -7,9 +7,32 @@
 // TODO(https://crbug.com/657632): This struct wrapper exists to allow the value
 // to be null.
 struct Brightness {
+  // Brightness percent, in the range [0.0, 100.0].
   double value;
 };
 
+// Correlates to power_manager::BacklightBrightnessChange_Cause
+enum BacklightBrightnessChangeCause {
+  kUserRequest,
+  kUserActivity,
+  kUserInactivity,
+  kAmbientLightChanged,
+  kExternalPowerConnected,
+  kExternalPowerDisconnected,
+  kForcedOff,
+  kNoLongerForcedOff,
+  kOther,
+  kModel,
+  kWakeNotification,
+};
+
+// Correlates to power_manager::BacklightBrightnessChange
+struct BacklightBrightnessChange {
+  // The brightness percent is in the range [0.0, 100.0].
+  double percent;
+  BacklightBrightnessChangeCause cause;
+};
+
 // The interface for handling out-of-process calls that query or adjust power
 // related state. The implementation relays calls to the D-Bus client, which
 // uses D-Bus to communicate with the Power Manager daemon. In Mash, this lives
@@ -25,6 +48,8 @@
 // An interface for observing changes to power state. The changes are dispatched
 // over mojo from PowerManagerController.
 interface PowerManagerObserver {
-  // TODO(estade): the parameter should be a BacklightBrightnessChange.
-  ScreenBrightnessChanged(double percent);
+  // All following methods and their semantics are copied from the
+  // PowerManagerClient::Observer interface. Refer to that for documentation.
+  ScreenBrightnessChanged(BacklightBrightnessChange change);
+  KeyboardBrightnessChanged(BacklightBrightnessChange change);
 };
diff --git a/chromeos/services/power/public/mojom/power_types.typemap b/chromeos/services/power/public/mojom/power_types.typemap
new file mode 100644
index 0000000..9f81e2d
--- /dev/null
+++ b/chromeos/services/power/public/mojom/power_types.typemap
@@ -0,0 +1,18 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//chromeos/services/power/public/mojom/power_manager.mojom"
+public_headers = [ "chromeos/dbus/power_manager/backlight.pb.h" ]
+traits_headers = [ "//chromeos/services/power/public/mojom/mojom_traits.h" ]
+sources = [
+  "//chromeos/services/power/public/mojom/mojom_traits.cc",
+]
+deps = [
+  "//chromeos/dbus/power:power_manager_proto",
+]
+
+type_mappings = [
+  "chromeos.power.mojom.BacklightBrightnessChange=power_manager::BacklightBrightnessChange",
+  "chromeos.power.mojom.BacklightBrightnessChangeCause=power_manager::BacklightBrightnessChange_Cause",
+]
diff --git a/chromeos/services/power/public/mojom/typemaps.gni b/chromeos/services/power/public/mojom/typemaps.gni
new file mode 100644
index 0000000..7296993
--- /dev/null
+++ b/chromeos/services/power/public/mojom/typemaps.gni
@@ -0,0 +1,5 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+typemaps = [ "//chromeos/services/power/public/mojom/power_types.typemap" ]
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
index c2a0f44..5310784 100644
--- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni
+++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -11,6 +11,7 @@
   "//chromecast/typemaps.gni",
   "//chromeos/typemaps.gni",
   "//chromeos/components/multidevice/mojom/typemaps.gni",
+  "//chromeos/services/power/public/mojom/typemaps.gni",
   "//chromeos/services/secure_channel/public/mojom/typemaps.gni",
   "//components/arc/common/typemaps.gni",
   "//components/chromeos_camera/common/typemaps.gni",