platform_hardware_interfaces/thermal/aidl/default/Thermal.cpp
Xiang Wang d43e87345f Fix the Thermal AIDL example and VTS test
The AIDL proxy objects can't be compared directly but their internal IBinder

Bug: b/264224315
Test: atest VtsHalThermalTargetTest
Change-Id: Icf6174a0ba79fa5efeaec7778d27c18d957cd88d
2023-02-07 15:57:45 -08:00

145 lines
6 KiB
C++

/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "thermal_service_example"
#include "Thermal.h"
#include <android-base/logging.h>
namespace aidl::android::hardware::thermal::impl::example {
using ndk::ScopedAStatus;
namespace {
bool interfacesEqual(const std::shared_ptr<::ndk::ICInterface>& left,
const std::shared_ptr<::ndk::ICInterface>& right) {
if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
return left == right;
}
return left->asBinder() == right->asBinder();
}
} // namespace
ScopedAStatus Thermal::getCoolingDevices(std::vector<CoolingDevice>* /* out_devices */) {
LOG(VERBOSE) << __func__;
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::getCoolingDevicesWithType(CoolingType in_type,
std::vector<CoolingDevice>* /* out_devices */) {
LOG(VERBOSE) << __func__ << " CoolingType: " << static_cast<int32_t>(in_type);
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::getTemperatures(std::vector<Temperature>* /* out_temperatures */) {
LOG(VERBOSE) << __func__;
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::getTemperaturesWithType(TemperatureType in_type,
std::vector<Temperature>* /* out_temperatures */) {
LOG(VERBOSE) << __func__ << " TemperatureType: " << static_cast<int32_t>(in_type);
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::getTemperatureThresholds(
std::vector<TemperatureThreshold>* /* out_temperatureThresholds */) {
LOG(VERBOSE) << __func__;
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::getTemperatureThresholdsWithType(
TemperatureType in_type,
std::vector<TemperatureThreshold>* /* out_temperatureThresholds */) {
LOG(VERBOSE) << __func__ << " TemperatureType: " << static_cast<int32_t>(in_type);
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::registerThermalChangedCallback(
const std::shared_ptr<IThermalChangedCallback>& in_callback) {
LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback;
if (in_callback == nullptr) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Invalid nullptr callback");
}
{
std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
if (std::any_of(thermal_callbacks_.begin(), thermal_callbacks_.end(),
[&](const std::shared_ptr<IThermalChangedCallback>& c) {
return interfacesEqual(c, in_callback);
})) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Callback already registered");
}
thermal_callbacks_.push_back(in_callback);
}
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::registerThermalChangedCallbackWithType(
const std::shared_ptr<IThermalChangedCallback>& in_callback, TemperatureType in_type) {
LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback
<< ", TemperatureType: " << static_cast<int32_t>(in_type);
if (in_callback == nullptr) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Invalid nullptr callback");
}
{
std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
if (std::any_of(thermal_callbacks_.begin(), thermal_callbacks_.end(),
[&](const std::shared_ptr<IThermalChangedCallback>& c) {
return interfacesEqual(c, in_callback);
})) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Callback already registered");
}
thermal_callbacks_.push_back(in_callback);
}
return ScopedAStatus::ok();
}
ScopedAStatus Thermal::unregisterThermalChangedCallback(
const std::shared_ptr<IThermalChangedCallback>& in_callback) {
LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback;
if (in_callback == nullptr) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Invalid nullptr callback");
}
{
std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
bool removed = false;
thermal_callbacks_.erase(
std::remove_if(thermal_callbacks_.begin(), thermal_callbacks_.end(),
[&](const std::shared_ptr<IThermalChangedCallback>& c) {
if (interfacesEqual(c, in_callback)) {
removed = true;
return true;
}
return false;
}),
thermal_callbacks_.end());
if (!removed) {
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Callback wasn't registered");
}
}
return ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::thermal::impl::example