Convert auto_screen_brightness::Adapter to use Mojo power manager client

PowerManagerMojoClient/Controller implement PowerManagerBecameAvailable
and SetScreenBrightness.

Bug: 644348
Change-Id: I997942403a9ba06c9bbb866007ff0e408b604e1e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1583059
Reviewed-by: Dan Erat <derat@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#654073}
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
index 9d4644e8..4b048cf 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/dbus/power_manager/backlight.pb.h"
+#include "chromeos/services/power/public/cpp/power_manager_mojo_client.h"
 #include "components/prefs/pref_service.h"
 
 namespace chromeos {
@@ -98,7 +99,7 @@
 
 void Adapter::Init() {
   // Deferred to Init() because it can result in a virtual method being called.
-  power_manager_client_observer_.Add(PowerManagerClient::Get());
+  power_manager_client_observer_.Add(PowerManagerMojoClient::Get());
 }
 
 void Adapter::OnAmbientLightUpdated(int lux) {
@@ -593,7 +594,7 @@
   request.set_transition(
       power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL);
   request.set_cause(power_manager::SetBacklightBrightnessRequest_Cause_MODEL);
-  PowerManagerClient::Get()->SetScreenBrightness(request);
+  PowerManagerMojoClient::Get()->SetScreenBrightness(request);
 
   const base::TimeTicks brightness_change_time = tick_clock_->NowTicks();
   if (!latest_model_brightness_change_time_.is_null()) {
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 05a75fe..cd88ec6 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.cc
@@ -27,7 +27,8 @@
 
 void PowerManagerMojoClient::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
-  // TODO(estade): Call PowerManagerBecameAvailable as appropriate.
+  if (service_available_)
+    observer->PowerManagerBecameAvailable(*service_available_);
 }
 
 void PowerManagerMojoClient::RemoveObserver(Observer* observer) {
@@ -133,6 +134,12 @@
 
 void PowerManagerMojoClient::DeferScreenDim() {}
 
+void PowerManagerMojoClient::PowerManagerBecameAvailable(bool available) {
+  service_available_ = available;
+  for (auto& observer : observers_)
+    observer.PowerManagerBecameAvailable(available);
+}
+
 void PowerManagerMojoClient::ScreenBrightnessChanged(
     const power_manager::BacklightBrightnessChange& change) {
   for (auto& observer : observers_)
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 637c7d4a..bfffe88 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_client.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_client.h
@@ -73,6 +73,7 @@
   void DeferScreenDim() override;
 
   // power::mojom::PowerManagerObserver:
+  void PowerManagerBecameAvailable(bool available) override;
   void ScreenBrightnessChanged(
       const power_manager::BacklightBrightnessChange& change) override;
   void KeyboardBrightnessChanged(
@@ -101,6 +102,8 @@
   // The last proto received via mojo; initially empty.
   base::Optional<power_manager::PowerSupplyProperties> proto_;
 
+  base::Optional<bool> service_available_;
+
   DISALLOW_COPY_AND_ASSIGN(PowerManagerMojoClient);
 };
 
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 8cec9a9..9954591 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.cc
@@ -28,6 +28,11 @@
   PowerManagerClient::Get()->AddObserver(this);
 }
 
+void PowerManagerMojoController::SetScreenBrightness(
+    const power_manager::SetBacklightBrightnessRequest& request) {
+  PowerManagerClient::Get()->SetScreenBrightness(request);
+}
+
 void PowerManagerMojoController::GetScreenBrightnessPercent(
     GetScreenBrightnessPercentCallback callback) {
   // This extra thunk is only necessary to convert between
@@ -43,6 +48,10 @@
       std::move(callback)));
 }
 
+void PowerManagerMojoController::PowerManagerBecameAvailable(bool available) {
+  client_->PowerManagerBecameAvailable(available);
+}
+
 void PowerManagerMojoController::ScreenBrightnessChanged(
     const power_manager::BacklightBrightnessChange& change) {
   client_->ScreenBrightnessChanged(change);
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 a45d92f..5e54934 100644
--- a/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
+++ b/chromeos/services/power/public/cpp/power_manager_mojo_controller.h
@@ -28,10 +28,13 @@
   // mojom::PowerManagerMojoController:
   void SetObserver(
       power::mojom::PowerManagerObserverAssociatedPtrInfo client) override;
+  void SetScreenBrightness(
+      const power_manager::SetBacklightBrightnessRequest& request) override;
   void GetScreenBrightnessPercent(
       GetScreenBrightnessPercentCallback callback) override;
 
   // PowerManagerClient::Observer:
+  void PowerManagerBecameAvailable(bool available) override;
   void ScreenBrightnessChanged(
       const power_manager::BacklightBrightnessChange& change) override;
   void KeyboardBrightnessChanged(
diff --git a/chromeos/services/power/public/mojom/OWNERS b/chromeos/services/power/public/mojom/OWNERS
index 2c44a46..b15e65d 100644
--- a/chromeos/services/power/public/mojom/OWNERS
+++ b/chromeos/services/power/public/mojom/OWNERS
@@ -1,6 +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 mojom_traits.*=set noparent
+per-file mojom_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
index 7b1c1b8..7533904 100644
--- a/chromeos/services/power/public/mojom/mojom_traits.cc
+++ b/chromeos/services/power/public/mojom/mojom_traits.cc
@@ -6,96 +6,173 @@
 
 namespace mojo {
 
+using chromeos::power::mojom::BacklightBrightnessChangeCause;
+using chromeos::power::mojom::SetBacklightBrightnessRequestCause;
+using chromeos::power::mojom::SetBacklightBrightnessRequestTransition;
+
 // static
-chromeos::power::mojom::BacklightBrightnessChangeCause
-EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+SetBacklightBrightnessRequestTransition
+EnumTraits<SetBacklightBrightnessRequestTransition,
+           power_manager::SetBacklightBrightnessRequest_Transition>::
+    ToMojom(
+        power_manager::SetBacklightBrightnessRequest_Transition transition) {
+  switch (transition) {
+    case power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL:
+      return SetBacklightBrightnessRequestTransition::kGradual;
+    case power_manager::SetBacklightBrightnessRequest_Transition_INSTANT:
+      return SetBacklightBrightnessRequestTransition::kInstant;
+  }
+  NOTREACHED();
+  return SetBacklightBrightnessRequestTransition::kGradual;
+}
+
+// static
+bool EnumTraits<SetBacklightBrightnessRequestTransition,
+                power_manager::SetBacklightBrightnessRequest_Transition>::
+    FromMojom(SetBacklightBrightnessRequestTransition transition,
+              power_manager::SetBacklightBrightnessRequest_Transition* out) {
+  switch (transition) {
+    case SetBacklightBrightnessRequestTransition::kGradual:
+      *out = power_manager::SetBacklightBrightnessRequest_Transition_GRADUAL;
+      return true;
+    case SetBacklightBrightnessRequestTransition::kInstant:
+      *out = power_manager::SetBacklightBrightnessRequest_Transition_INSTANT;
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
+// static
+SetBacklightBrightnessRequestCause
+EnumTraits<SetBacklightBrightnessRequestCause,
+           power_manager::SetBacklightBrightnessRequest_Cause>::
+    ToMojom(power_manager::SetBacklightBrightnessRequest_Cause cause) {
+  switch (cause) {
+    case power_manager::SetBacklightBrightnessRequest_Cause_USER_REQUEST:
+      return SetBacklightBrightnessRequestCause::kUserRequest;
+    case power_manager::SetBacklightBrightnessRequest_Cause_MODEL:
+      return SetBacklightBrightnessRequestCause::kModel;
+  }
+  NOTREACHED();
+  return SetBacklightBrightnessRequestCause::kUserRequest;
+}
+
+// static
+bool EnumTraits<SetBacklightBrightnessRequestCause,
+                power_manager::SetBacklightBrightnessRequest_Cause>::
+    FromMojom(SetBacklightBrightnessRequestCause cause,
+              power_manager::SetBacklightBrightnessRequest_Cause* out) {
+  switch (cause) {
+    case SetBacklightBrightnessRequestCause::kUserRequest:
+      *out = power_manager::SetBacklightBrightnessRequest_Cause_USER_REQUEST;
+      return true;
+    case SetBacklightBrightnessRequestCause::kModel:
+      *out = power_manager::SetBacklightBrightnessRequest_Cause_MODEL;
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
+// static
+bool StructTraits<chromeos::power::mojom::SetBacklightBrightnessRequestDataView,
+                  power_manager::SetBacklightBrightnessRequest>::
+    Read(chromeos::power::mojom::SetBacklightBrightnessRequestDataView data,
+         power_manager::SetBacklightBrightnessRequest* out) {
+  if (data.percent() < 0. || data.percent() > 100.)
+    return false;
+
+  out->set_percent(data.percent());
+
+  power_manager::SetBacklightBrightnessRequest_Transition transition;
+  power_manager::SetBacklightBrightnessRequest_Cause cause;
+  if (!data.ReadTransition(&transition) || !data.ReadCause(&cause))
+    return false;
+
+  out->set_transition(transition);
+  out->set_cause(cause);
+  return true;
+}
+
+// static
+BacklightBrightnessChangeCause
+EnumTraits<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;
+      return BacklightBrightnessChangeCause::kUserRequest;
     case power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kUserActivity;
+      return BacklightBrightnessChangeCause::kUserActivity;
     case power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kUserInactivity;
+      return BacklightBrightnessChangeCause::kUserInactivity;
     case power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kAmbientLightChanged;
+      return BacklightBrightnessChangeCause::kAmbientLightChanged;
     case power_manager::
         BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kExternalPowerConnected;
+      return BacklightBrightnessChangeCause::kExternalPowerConnected;
     case power_manager::
         BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kExternalPowerDisconnected;
+      return BacklightBrightnessChangeCause::kExternalPowerDisconnected;
     case power_manager::BacklightBrightnessChange_Cause_FORCED_OFF:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff;
+      return BacklightBrightnessChangeCause::kForcedOff;
     case power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kNoLongerForcedOff;
+      return BacklightBrightnessChangeCause::kNoLongerForcedOff;
     case power_manager::BacklightBrightnessChange_Cause_OTHER:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kOther;
+      return BacklightBrightnessChangeCause::kOther;
     case power_manager::BacklightBrightnessChange_Cause_MODEL:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::kModel;
+      return BacklightBrightnessChangeCause::kModel;
     case power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION:
-      return chromeos::power::mojom::BacklightBrightnessChangeCause::
-          kWakeNotification;
+      return BacklightBrightnessChangeCause::kWakeNotification;
   }
   NOTREACHED();
-  return chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest;
+  return BacklightBrightnessChangeCause::kUserRequest;
 }
 
 // static
-bool EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
+bool EnumTraits<BacklightBrightnessChangeCause,
                 power_manager::BacklightBrightnessChange_Cause>::
-    FromMojom(chromeos::power::mojom::BacklightBrightnessChangeCause cause,
+    FromMojom(BacklightBrightnessChangeCause cause,
               power_manager::BacklightBrightnessChange_Cause* out) {
   switch (cause) {
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserRequest:
+    case BacklightBrightnessChangeCause::kUserRequest:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_REQUEST;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kUserActivity:
+    case BacklightBrightnessChangeCause::kUserActivity:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_ACTIVITY;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kUserInactivity:
+    case BacklightBrightnessChangeCause::kUserInactivity:
       *out = power_manager::BacklightBrightnessChange_Cause_USER_INACTIVITY;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kAmbientLightChanged:
+    case BacklightBrightnessChangeCause::kAmbientLightChanged:
       *out =
           power_manager::BacklightBrightnessChange_Cause_AMBIENT_LIGHT_CHANGED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kExternalPowerConnected:
+    case BacklightBrightnessChangeCause::kExternalPowerConnected:
       *out = power_manager::
           BacklightBrightnessChange_Cause_EXTERNAL_POWER_CONNECTED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kExternalPowerDisconnected:
+    case BacklightBrightnessChangeCause::kExternalPowerDisconnected:
       *out = power_manager::
           BacklightBrightnessChange_Cause_EXTERNAL_POWER_DISCONNECTED;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kForcedOff:
+    case BacklightBrightnessChangeCause::kForcedOff:
       *out = power_manager::BacklightBrightnessChange_Cause_FORCED_OFF;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kNoLongerForcedOff:
+    case BacklightBrightnessChangeCause::kNoLongerForcedOff:
       *out =
           power_manager::BacklightBrightnessChange_Cause_NO_LONGER_FORCED_OFF;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kOther:
+    case BacklightBrightnessChangeCause::kOther:
       *out = power_manager::BacklightBrightnessChange_Cause_OTHER;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::kModel:
+    case BacklightBrightnessChangeCause::kModel:
       *out = power_manager::BacklightBrightnessChange_Cause_MODEL;
       return true;
-    case chromeos::power::mojom::BacklightBrightnessChangeCause::
-        kWakeNotification:
+    case BacklightBrightnessChangeCause::kWakeNotification:
       *out = power_manager::BacklightBrightnessChange_Cause_WAKE_NOTIFICATION;
       return true;
   }
diff --git a/chromeos/services/power/public/mojom/mojom_traits.h b/chromeos/services/power/public/mojom/mojom_traits.h
index f41a567..3c0f3c5 100644
--- a/chromeos/services/power/public/mojom/mojom_traits.h
+++ b/chromeos/services/power/public/mojom/mojom_traits.h
@@ -13,6 +13,50 @@
 namespace mojo {
 
 template <>
+struct EnumTraits<
+    chromeos::power::mojom::SetBacklightBrightnessRequestTransition,
+    power_manager::SetBacklightBrightnessRequest_Transition> {
+  static chromeos::power::mojom::SetBacklightBrightnessRequestTransition
+  ToMojom(power_manager::SetBacklightBrightnessRequest_Transition cause);
+
+  static bool FromMojom(
+      chromeos::power::mojom::SetBacklightBrightnessRequestTransition cause,
+      power_manager::SetBacklightBrightnessRequest_Transition* out);
+};
+
+template <>
+struct EnumTraits<chromeos::power::mojom::SetBacklightBrightnessRequestCause,
+                  power_manager::SetBacklightBrightnessRequest_Cause> {
+  static chromeos::power::mojom::SetBacklightBrightnessRequestCause ToMojom(
+      power_manager::SetBacklightBrightnessRequest_Cause cause);
+
+  static bool FromMojom(
+      chromeos::power::mojom::SetBacklightBrightnessRequestCause cause,
+      power_manager::SetBacklightBrightnessRequest_Cause* out);
+};
+
+template <>
+struct StructTraits<
+    chromeos::power::mojom::SetBacklightBrightnessRequestDataView,
+    power_manager::SetBacklightBrightnessRequest> {
+  static double percent(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.percent();
+  }
+  static power_manager::SetBacklightBrightnessRequest_Transition transition(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.transition();
+  }
+  static power_manager::SetBacklightBrightnessRequest_Cause cause(
+      const power_manager::SetBacklightBrightnessRequest& request) {
+    return request.cause();
+  }
+  static bool Read(
+      chromeos::power::mojom::SetBacklightBrightnessRequestDataView data,
+      power_manager::SetBacklightBrightnessRequest* out);
+};
+
+template <>
 struct EnumTraits<chromeos::power::mojom::BacklightBrightnessChangeCause,
                   power_manager::BacklightBrightnessChange_Cause> {
   static chromeos::power::mojom::BacklightBrightnessChangeCause ToMojom(
diff --git a/chromeos/services/power/public/mojom/power_manager.mojom b/chromeos/services/power/public/mojom/power_manager.mojom
index f084e2e80..6f6e18a 100644
--- a/chromeos/services/power/public/mojom/power_manager.mojom
+++ b/chromeos/services/power/public/mojom/power_manager.mojom
@@ -4,6 +4,23 @@
 
 module chromeos.power.mojom;
 
+enum SetBacklightBrightnessRequestTransition {
+  kGradual,
+  kInstant,
+};
+
+enum SetBacklightBrightnessRequestCause {
+  kUserRequest,
+  kModel,
+};
+
+struct SetBacklightBrightnessRequest {
+  // The brightness percent is in the range [0.0, 100.0].
+  double percent;
+  SetBacklightBrightnessRequestTransition transition;
+  SetBacklightBrightnessRequestCause cause;
+};
+
 // TODO(https://crbug.com/657632): This struct wrapper exists to allow the value
 // to be null.
 struct Brightness {
@@ -42,6 +59,7 @@
 
   // All following methods and their semantics are copied from the
   // PowerManagerClient interface. Refer to that for documentation.
+  SetScreenBrightness(SetBacklightBrightnessRequest request);
   GetScreenBrightnessPercent() => (Brightness? brightness);
 };
 
@@ -50,6 +68,7 @@
 interface PowerManagerObserver {
   // All following methods and their semantics are copied from the
   // PowerManagerClient::Observer interface. Refer to that for documentation.
+  PowerManagerBecameAvailable(bool available);
   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
index 9f81e2d..bc7ae7bc9 100644
--- a/chromeos/services/power/public/mojom/power_types.typemap
+++ b/chromeos/services/power/public/mojom/power_types.typemap
@@ -15,4 +15,7 @@
 type_mappings = [
   "chromeos.power.mojom.BacklightBrightnessChange=power_manager::BacklightBrightnessChange",
   "chromeos.power.mojom.BacklightBrightnessChangeCause=power_manager::BacklightBrightnessChange_Cause",
+  "chromeos.power.mojom.SetBacklightBrightnessRequest=power_manager::SetBacklightBrightnessRequest",
+  "chromeos.power.mojom.SetBacklightBrightnessRequestCause=power_manager::SetBacklightBrightnessRequest_Cause",
+  "chromeos.power.mojom.SetBacklightBrightnessRequestTransition=power_manager::SetBacklightBrightnessRequest_Transition",
 ]