Commit 4e402944 authored by Felix Ekblom's avatar Felix Ekblom Committed by Commit Bot

Extend cecPrivate with power state query API

BUG=b:78171027

Change-Id: I08a32e347c103f790e399264d8d045b36848d492
Reviewed-on: https://chromium-review.googlesource.com/1042576
Commit-Queue: Felix Ekblom <felixe@chromium.org>
Reviewed-by: default avatarToni Barzic <tbarzic@chromium.org>
Reviewed-by: default avatarJesse Doherty <jwd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#557476}
parent 7106259f
......@@ -16,4 +16,8 @@ source_set("cec_private") {
deps = [
"//extensions/common/api",
]
public_deps = [
"//extensions/browser:browser_sources",
]
}
......@@ -4,19 +4,54 @@
#include "extensions/browser/api/cec_private/cec_private_api.h"
#include <vector>
#include "base/bind.h"
#include "base/logging.h"
#include "chromeos/dbus/cec_service_client.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "extensions/common/api/cec_private.h"
#include "extensions/common/manifest_handlers/kiosk_mode_info.h"
namespace extensions {
namespace {
const char kKioskOnlyError[] =
"Only kiosk enabled extensions are allowed to use this function.";
extensions::api::cec_private::DisplayCecPowerState
ConvertCecServiceClientPowerState(
chromeos::CecServiceClient::PowerState power_state) {
switch (power_state) {
case chromeos::CecServiceClient::PowerState::kError:
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_ERROR;
case chromeos::CecServiceClient::PowerState::kAdapterNotConfigured:
return extensions::api::cec_private::
DISPLAY_CEC_POWER_STATE_ADAPTERNOTCONFIGURED;
case chromeos::CecServiceClient::PowerState::kNoDevice:
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_NODEVICE;
case chromeos::CecServiceClient::PowerState::kOn:
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_ON;
case chromeos::CecServiceClient::PowerState::kStandBy:
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_STANDBY;
case chromeos::CecServiceClient::PowerState::kTransitioningToOn:
return extensions::api::cec_private::
DISPLAY_CEC_POWER_STATE_TRANSITIONINGTOON;
case chromeos::CecServiceClient::PowerState::kTransitioningToStandBy:
return extensions::api::cec_private::
DISPLAY_CEC_POWER_STATE_TRANSITIONINGTOSTANDBY;
case chromeos::CecServiceClient::PowerState::kUnknown:
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_UNKNOWN;
}
NOTREACHED();
return extensions::api::cec_private::DISPLAY_CEC_POWER_STATE_UNKNOWN;
}
} // namespace
namespace extensions {
namespace api {
CecPrivateFunction::CecPrivateFunction() = default;
CecPrivateFunction::~CecPrivateFunction() = default;
......@@ -51,4 +86,33 @@ ExtensionFunction::ResponseAction CecPrivateSendWakeUpFunction::Run() {
return RespondNow(NoArguments());
}
CecPrivateQueryDisplayCecPowerStateFunction::
CecPrivateQueryDisplayCecPowerStateFunction() = default;
CecPrivateQueryDisplayCecPowerStateFunction::
~CecPrivateQueryDisplayCecPowerStateFunction() = default;
ExtensionFunction::ResponseAction
CecPrivateQueryDisplayCecPowerStateFunction::Run() {
chromeos::DBusThreadManager::Get()
->GetCecServiceClient()
->QueryDisplayCecPowerState(base::BindOnce(
&CecPrivateQueryDisplayCecPowerStateFunction::HandlePowerStates,
this));
return RespondLater();
}
void CecPrivateQueryDisplayCecPowerStateFunction::HandlePowerStates(
const std::vector<chromeos::CecServiceClient::PowerState>& power_states) {
std::vector<cec_private::DisplayCecPowerState> result_power_states;
for (const chromeos::CecServiceClient::PowerState& state : power_states) {
result_power_states.push_back(ConvertCecServiceClientPowerState(state));
}
Respond(ArgumentList(cec_private::QueryDisplayCecPowerState::Results::Create(
result_power_states)));
}
} // namespace api
} // namespace extensions
......@@ -5,10 +5,14 @@
#ifndef EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_
#define EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_
#include <vector>
#include "chromeos/dbus/cec_service_client.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.h"
namespace extensions {
namespace api {
class CecPrivateFunction : public UIThreadExtensionFunction {
public:
......@@ -48,6 +52,24 @@ class CecPrivateSendWakeUpFunction : public CecPrivateFunction {
DISALLOW_COPY_AND_ASSIGN(CecPrivateSendWakeUpFunction);
};
class CecPrivateQueryDisplayCecPowerStateFunction : public CecPrivateFunction {
public:
CecPrivateQueryDisplayCecPowerStateFunction();
DECLARE_EXTENSION_FUNCTION("cecPrivate.queryDisplayCecPowerState",
CECPRIVATE_QUERYDISPLAYCECPOWERSTATE)
protected:
~CecPrivateQueryDisplayCecPowerStateFunction() override;
ResponseAction Run() override;
private:
void HandlePowerStates(
const std::vector<chromeos::CecServiceClient::PowerState>& power_states);
DISALLOW_COPY_AND_ASSIGN(CecPrivateQueryDisplayCecPowerStateFunction);
};
} // namespace api
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_
......@@ -1312,6 +1312,7 @@ enum HistogramValue {
INPUTMETHODPRIVATE_GETCOMPOSITIONBOUNDS,
FILEMANAGERPRIVATE_ISCROSTINIENABLED,
FILEMANAGERPRIVATE_MOUNTCROSTINICONTAINER,
CECPRIVATE_QUERYDISPLAYCECPOWERSTATE,
// Last entry: Add new entries above, then run:
// python tools/metrics/histograms/update_extension_histograms.py
ENUM_BOUNDARY
......
......@@ -6,8 +6,38 @@
[platforms=("chromeos")]
namespace cecPrivate {
enum DisplayCecPowerState {
// There was an error querying the power state of the display.
error,
// The kernel adapter for the CEC endpoint isnt configured (no EDID set).
adapterNotConfigured,
// No device ACKed the request on the CEC bus.
noDevice,
// The display is a powered on state.
on,
// The display is in standby mode.
standby,
// The display is currently transitioning to an awake state. It can't be
// relied on to show any output yet.
transitioningToOn,
// The display is currently transitioning to standby.
transitioningToStandby,
// Found a CEC endpoint but unable to determine the power state.
unknown
};
callback DisplayCecPowerStateCallback =
void(DisplayCecPowerState[] powerStates);
interface Functions {
// Attempt to put all HDMI CEC compatible devices in stand-by.
// Attempt to put all HDMI CEC compatible devices in standby.
//
// This is not guaranteed to have any effect on the connected displays.
// Displays that do not support HDMI CEC will not be affected.
......@@ -17,5 +47,9 @@ namespace cecPrivate {
// HDMI CEC enabled displays connected, waking them from standby if
// necessary.
static void sendWakeUp();
// Queries all HDMI CEC capable displays for their current power state.
static void queryDisplayCecPowerState(
DisplayCecPowerStateCallback callback);
};
};
......@@ -15419,6 +15419,7 @@ Called by update_net_error_codes.py.-->
<int value="1249" label="INPUTMETHODPRIVATE_GETCOMPOSITIONBOUNDS"/>
<int value="1250" label="FILEMANAGERPRIVATE_ISCROSTINIENABLED"/>
<int value="1251" label="FILEMANAGERPRIVATE_MOUNTCROSTINICONTAINER"/>
<int value="1252" label="CECPRIVATE_QUERYDISPLAYCECPOWERSTATE"/>
</enum>
<enum name="ExtensionIconState">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment