diff --git a/services/config/config_defs.h b/services/config/config_defs.h index d9ec9866..7f51c70a 100644 --- a/services/config/config_defs.h +++ b/services/config/config_defs.h @@ -320,6 +320,8 @@ class ConfigInterface { virtual int ControlIdleStatusCallback(bool /* enable */) DEFAULT_RET virtual int IsSupportedConfigSwitch(uint32_t /* disp_id */, uint32_t /* config */, bool* /* supported */) DEFAULT_RET + virtual int GetDisplayType(uint64_t /* physical_disp_id */, + DisplayType* /* disp_type */) DEFAULT_RET // deprecated APIs virtual int GetDebugProperty(const std::string /* prop_name */, diff --git a/services/config/src/client_impl.cpp b/services/config/src/client_impl.cpp index 3b895b1c..3309f52d 100644 --- a/services/config/src/client_impl.cpp +++ b/services/config/src/client_impl.cpp @@ -946,7 +946,6 @@ int ClientImpl::IsSupportedConfigSwitch(uint32_t disp_id, uint32_t config, bool error = err; output_params = params; }; - if (display_config_) { display_config_->perform(client_handle_, kIsSupportedConfigSwitch, input_params, {}, hidl_cb); } @@ -960,6 +959,30 @@ int ClientImpl::IsSupportedConfigSwitch(uint32_t disp_id, uint32_t config, bool return error; } +int ClientImpl::GetDisplayType(uint64_t physical_disp_id, DisplayType *disp_type) { + if (!disp_type) { + return -EINVAL; + } + ByteStream input_params; + input_params.setToExternal(reinterpret_cast(&physical_disp_id), sizeof(uint64_t)); + ByteStream output_params; + int error = 0; + auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) { + error = err; + output_params = params; + }; + if (display_config_) { + display_config_->perform(client_handle_, kGetDisplayType, input_params, {}, hidl_cb); + } + + if (!error) { + const uint8_t *data = output_params.data(); + const DisplayType *output = reinterpret_cast(data); + *disp_type = *output; + } + return error; +} + void ClientCallback::ParseNotifyCWBBufferDone(const ByteStream &input_params, const HandleStream &input_handles) { const int *error; diff --git a/services/config/src/client_impl.h b/services/config/src/client_impl.h index bd5ae0eb..72089007 100644 --- a/services/config/src/client_impl.h +++ b/services/config/src/client_impl.h @@ -125,6 +125,7 @@ class ClientImpl : public ClientInterface { virtual int IsRCSupported(uint32_t disp_id, bool *supported); virtual int ControlIdleStatusCallback(bool enable); virtual int IsSupportedConfigSwitch(uint32_t disp_id, uint32_t config, bool *supported); + virtual int GetDisplayType(uint64_t physical_disp_id, DisplayType *disp_type); private: android::sp display_config_ = nullptr; diff --git a/services/config/src/device_impl.cpp b/services/config/src/device_impl.cpp index 75aafb6e..50b3ecb4 100644 --- a/services/config/src/device_impl.cpp +++ b/services/config/src/device_impl.cpp @@ -839,6 +839,18 @@ void DeviceImpl::DeviceClientContext::ParseIsSupportedConfigSwitch(const ByteStr _hidl_cb(error, output_params, {}); } +void DeviceImpl::DeviceClientContext::ParseGetDisplayType(const ByteStream &input_params, + perform_cb _hidl_cb) { + const uint8_t *data = input_params.data(); + const uint64_t *physical_disp_id = reinterpret_cast(data); + DisplayType disp_type = DisplayConfig::DisplayType::kInvalid; + int32_t error = intf_->GetDisplayType(*physical_disp_id, &disp_type); + ByteStream output_params; + output_params.setToExternal(reinterpret_cast(&disp_type), sizeof(DisplayType)); + + _hidl_cb(error, output_params, {}); +} + Return DeviceImpl::perform(uint64_t client_handle, uint32_t op_code, const ByteStream &input_params, const HandleStream &input_handles, perform_cb _hidl_cb) { @@ -1004,6 +1016,9 @@ Return DeviceImpl::perform(uint64_t client_handle, uint32_t op_code, case kIsSupportedConfigSwitch: client->ParseIsSupportedConfigSwitch(input_params, _hidl_cb); break; + case kGetDisplayType: + client->ParseGetDisplayType(input_params, _hidl_cb); + break; default: _hidl_cb(-EINVAL, {}, {}); break; diff --git a/services/config/src/device_impl.h b/services/config/src/device_impl.h index 0fbd4811..a1d26eb2 100644 --- a/services/config/src/device_impl.h +++ b/services/config/src/device_impl.h @@ -124,6 +124,7 @@ class DeviceImpl : public IDisplayConfig, public android::hardware::hidl_death_r void ParseControlIdleStatusCallback(uint64_t client_handle, const ByteStream &input_params, perform_cb _hidl_cb); void ParseIsSupportedConfigSwitch(const ByteStream &input_params, perform_cb _hidl_cb); + void ParseGetDisplayType(const ByteStream &input_params, perform_cb _hidl_cb); private: ConfigInterface *intf_ = nullptr; diff --git a/services/config/src/opcode_types.h b/services/config/src/opcode_types.h index a31e314c..b1bc4d22 100644 --- a/services/config/src/opcode_types.h +++ b/services/config/src/opcode_types.h @@ -81,6 +81,7 @@ enum OpCode { kIsRCSupported = 45, kControlIdleStatusCallback = 46, kIsSupportedConfigSwitch = 47, + kGetDisplayType = 48, kDestroy = 0xFFFF, // Destroy sequence execution };