xref: /aosp_15_r20/hardware/interfaces/thermal/aidl/default/Thermal.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "thermal_service_example"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "Thermal.h"
20*4d7e907cSAndroid Build Coastguard Worker 
21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::thermal::impl::example {
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker using ndk::ScopedAStatus;
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker namespace {
28*4d7e907cSAndroid Build Coastguard Worker 
interfacesEqual(const std::shared_ptr<::ndk::ICInterface> & left,const std::shared_ptr<::ndk::ICInterface> & right)29*4d7e907cSAndroid Build Coastguard Worker bool interfacesEqual(const std::shared_ptr<::ndk::ICInterface>& left,
30*4d7e907cSAndroid Build Coastguard Worker                      const std::shared_ptr<::ndk::ICInterface>& right) {
31*4d7e907cSAndroid Build Coastguard Worker     if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
32*4d7e907cSAndroid Build Coastguard Worker         return left == right;
33*4d7e907cSAndroid Build Coastguard Worker     }
34*4d7e907cSAndroid Build Coastguard Worker     return left->asBinder() == right->asBinder();
35*4d7e907cSAndroid Build Coastguard Worker }
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker }  // namespace
38*4d7e907cSAndroid Build Coastguard Worker 
getCoolingDevices(std::vector<CoolingDevice> *)39*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getCoolingDevices(std::vector<CoolingDevice>* /* out_devices */) {
40*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__;
41*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
42*4d7e907cSAndroid Build Coastguard Worker }
43*4d7e907cSAndroid Build Coastguard Worker 
getCoolingDevicesWithType(CoolingType in_type,std::vector<CoolingDevice> *)44*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getCoolingDevicesWithType(CoolingType in_type,
45*4d7e907cSAndroid Build Coastguard Worker                                                  std::vector<CoolingDevice>* /* out_devices */) {
46*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " CoolingType: " << static_cast<int32_t>(in_type);
47*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
48*4d7e907cSAndroid Build Coastguard Worker }
49*4d7e907cSAndroid Build Coastguard Worker 
getTemperatures(std::vector<Temperature> * out_temperatures)50*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getTemperatures(std::vector<Temperature>* out_temperatures) {
51*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__;
52*4d7e907cSAndroid Build Coastguard Worker     std::vector<Temperature> temperatures;
53*4d7e907cSAndroid Build Coastguard Worker     temperatures.push_back(Temperature{
54*4d7e907cSAndroid Build Coastguard Worker             .name = "skin",
55*4d7e907cSAndroid Build Coastguard Worker             .type = TemperatureType::SKIN,
56*4d7e907cSAndroid Build Coastguard Worker             .value = 30.1f,
57*4d7e907cSAndroid Build Coastguard Worker     });
58*4d7e907cSAndroid Build Coastguard Worker     temperatures.push_back(Temperature{
59*4d7e907cSAndroid Build Coastguard Worker             .name = "battery",
60*4d7e907cSAndroid Build Coastguard Worker             .type = TemperatureType::BATTERY,
61*4d7e907cSAndroid Build Coastguard Worker             .value = 30.2f,
62*4d7e907cSAndroid Build Coastguard Worker     });
63*4d7e907cSAndroid Build Coastguard Worker     *out_temperatures = temperatures;
64*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
65*4d7e907cSAndroid Build Coastguard Worker }
66*4d7e907cSAndroid Build Coastguard Worker 
getTemperaturesWithType(TemperatureType in_type,std::vector<Temperature> * out_temperatures)67*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getTemperaturesWithType(TemperatureType in_type,
68*4d7e907cSAndroid Build Coastguard Worker                                                std::vector<Temperature>* out_temperatures) {
69*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " TemperatureType: " << static_cast<int32_t>(in_type);
70*4d7e907cSAndroid Build Coastguard Worker     if (in_type == TemperatureType::SKIN) {
71*4d7e907cSAndroid Build Coastguard Worker         std::vector<Temperature> temperatures;
72*4d7e907cSAndroid Build Coastguard Worker         temperatures.push_back(Temperature{
73*4d7e907cSAndroid Build Coastguard Worker                 .name = "skin",
74*4d7e907cSAndroid Build Coastguard Worker                 .type = TemperatureType::SKIN,
75*4d7e907cSAndroid Build Coastguard Worker                 .value = 30.1f,
76*4d7e907cSAndroid Build Coastguard Worker         });
77*4d7e907cSAndroid Build Coastguard Worker         *out_temperatures = temperatures;
78*4d7e907cSAndroid Build Coastguard Worker     } else if (in_type == TemperatureType::BATTERY) {
79*4d7e907cSAndroid Build Coastguard Worker         std::vector<Temperature> temperatures;
80*4d7e907cSAndroid Build Coastguard Worker         temperatures.push_back(Temperature{
81*4d7e907cSAndroid Build Coastguard Worker                 .name = "battery",
82*4d7e907cSAndroid Build Coastguard Worker                 .type = TemperatureType::BATTERY,
83*4d7e907cSAndroid Build Coastguard Worker                 .value = 30.2f,
84*4d7e907cSAndroid Build Coastguard Worker         });
85*4d7e907cSAndroid Build Coastguard Worker         *out_temperatures = temperatures;
86*4d7e907cSAndroid Build Coastguard Worker     }
87*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
88*4d7e907cSAndroid Build Coastguard Worker }
89*4d7e907cSAndroid Build Coastguard Worker 
getTemperatureThresholds(std::vector<TemperatureThreshold> * out_temperatureThresholds)90*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getTemperatureThresholds(
91*4d7e907cSAndroid Build Coastguard Worker         std::vector<TemperatureThreshold>* out_temperatureThresholds) {
92*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__;
93*4d7e907cSAndroid Build Coastguard Worker     std::vector<TemperatureThreshold> temperatureThresholds;
94*4d7e907cSAndroid Build Coastguard Worker     temperatureThresholds.push_back(TemperatureThreshold{
95*4d7e907cSAndroid Build Coastguard Worker             .name = "skin",
96*4d7e907cSAndroid Build Coastguard Worker             .type = TemperatureType::SKIN,
97*4d7e907cSAndroid Build Coastguard Worker             .hotThrottlingThresholds = {30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f},
98*4d7e907cSAndroid Build Coastguard Worker     });
99*4d7e907cSAndroid Build Coastguard Worker     temperatureThresholds.push_back(TemperatureThreshold{
100*4d7e907cSAndroid Build Coastguard Worker             .name = "battery",
101*4d7e907cSAndroid Build Coastguard Worker             .type = TemperatureType::BATTERY,
102*4d7e907cSAndroid Build Coastguard Worker             .hotThrottlingThresholds = {30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f},
103*4d7e907cSAndroid Build Coastguard Worker     });
104*4d7e907cSAndroid Build Coastguard Worker     *out_temperatureThresholds = temperatureThresholds;
105*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
106*4d7e907cSAndroid Build Coastguard Worker }
107*4d7e907cSAndroid Build Coastguard Worker 
getTemperatureThresholdsWithType(TemperatureType in_type,std::vector<TemperatureThreshold> * out_temperatureThresholds)108*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::getTemperatureThresholdsWithType(
109*4d7e907cSAndroid Build Coastguard Worker         TemperatureType in_type,
110*4d7e907cSAndroid Build Coastguard Worker         std::vector<TemperatureThreshold>* out_temperatureThresholds) {
111*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " TemperatureType: " << static_cast<int32_t>(in_type);
112*4d7e907cSAndroid Build Coastguard Worker     if (in_type == TemperatureType::SKIN) {
113*4d7e907cSAndroid Build Coastguard Worker         std::vector<TemperatureThreshold> temperatureThresholds;
114*4d7e907cSAndroid Build Coastguard Worker         temperatureThresholds.push_back(TemperatureThreshold{
115*4d7e907cSAndroid Build Coastguard Worker                 .name = "skin",
116*4d7e907cSAndroid Build Coastguard Worker                 .type = TemperatureType::SKIN,
117*4d7e907cSAndroid Build Coastguard Worker                 .hotThrottlingThresholds = {30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f},
118*4d7e907cSAndroid Build Coastguard Worker         });
119*4d7e907cSAndroid Build Coastguard Worker         *out_temperatureThresholds = temperatureThresholds;
120*4d7e907cSAndroid Build Coastguard Worker     } else if (in_type == TemperatureType::BATTERY) {
121*4d7e907cSAndroid Build Coastguard Worker         std::vector<TemperatureThreshold> temperatureThresholds;
122*4d7e907cSAndroid Build Coastguard Worker         temperatureThresholds.push_back(TemperatureThreshold{
123*4d7e907cSAndroid Build Coastguard Worker                 .name = "battery",
124*4d7e907cSAndroid Build Coastguard Worker                 .type = TemperatureType::BATTERY,
125*4d7e907cSAndroid Build Coastguard Worker                 .hotThrottlingThresholds = {30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f},
126*4d7e907cSAndroid Build Coastguard Worker         });
127*4d7e907cSAndroid Build Coastguard Worker         *out_temperatureThresholds = temperatureThresholds;
128*4d7e907cSAndroid Build Coastguard Worker     }
129*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
130*4d7e907cSAndroid Build Coastguard Worker }
131*4d7e907cSAndroid Build Coastguard Worker 
registerThermalChangedCallback(const std::shared_ptr<IThermalChangedCallback> & in_callback)132*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::registerThermalChangedCallback(
133*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<IThermalChangedCallback>& in_callback) {
134*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback;
135*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
136*4d7e907cSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
137*4d7e907cSAndroid Build Coastguard Worker                                                                 "Invalid nullptr callback");
138*4d7e907cSAndroid Build Coastguard Worker     }
139*4d7e907cSAndroid Build Coastguard Worker     {
140*4d7e907cSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
141*4d7e907cSAndroid Build Coastguard Worker         if (std::any_of(thermal_callbacks_.begin(), thermal_callbacks_.end(),
142*4d7e907cSAndroid Build Coastguard Worker                         [&](const std::shared_ptr<IThermalChangedCallback>& c) {
143*4d7e907cSAndroid Build Coastguard Worker                             return interfacesEqual(c, in_callback);
144*4d7e907cSAndroid Build Coastguard Worker                         })) {
145*4d7e907cSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
146*4d7e907cSAndroid Build Coastguard Worker                                                                     "Callback already registered");
147*4d7e907cSAndroid Build Coastguard Worker         }
148*4d7e907cSAndroid Build Coastguard Worker         thermal_callbacks_.push_back(in_callback);
149*4d7e907cSAndroid Build Coastguard Worker     }
150*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
151*4d7e907cSAndroid Build Coastguard Worker }
152*4d7e907cSAndroid Build Coastguard Worker 
registerThermalChangedCallbackWithType(const std::shared_ptr<IThermalChangedCallback> & in_callback,TemperatureType in_type)153*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::registerThermalChangedCallbackWithType(
154*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<IThermalChangedCallback>& in_callback, TemperatureType in_type) {
155*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback
156*4d7e907cSAndroid Build Coastguard Worker                  << ", TemperatureType: " << static_cast<int32_t>(in_type);
157*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
158*4d7e907cSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
159*4d7e907cSAndroid Build Coastguard Worker                                                                 "Invalid nullptr callback");
160*4d7e907cSAndroid Build Coastguard Worker     }
161*4d7e907cSAndroid Build Coastguard Worker     {
162*4d7e907cSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
163*4d7e907cSAndroid Build Coastguard Worker         if (std::any_of(thermal_callbacks_.begin(), thermal_callbacks_.end(),
164*4d7e907cSAndroid Build Coastguard Worker                         [&](const std::shared_ptr<IThermalChangedCallback>& c) {
165*4d7e907cSAndroid Build Coastguard Worker                             return interfacesEqual(c, in_callback);
166*4d7e907cSAndroid Build Coastguard Worker                         })) {
167*4d7e907cSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
168*4d7e907cSAndroid Build Coastguard Worker                                                                     "Callback already registered");
169*4d7e907cSAndroid Build Coastguard Worker         }
170*4d7e907cSAndroid Build Coastguard Worker         thermal_callbacks_.push_back(in_callback);
171*4d7e907cSAndroid Build Coastguard Worker     }
172*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
173*4d7e907cSAndroid Build Coastguard Worker }
174*4d7e907cSAndroid Build Coastguard Worker 
unregisterThermalChangedCallback(const std::shared_ptr<IThermalChangedCallback> & in_callback)175*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::unregisterThermalChangedCallback(
176*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<IThermalChangedCallback>& in_callback) {
177*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " IThermalChangedCallback: " << in_callback;
178*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
179*4d7e907cSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
180*4d7e907cSAndroid Build Coastguard Worker                                                                 "Invalid nullptr callback");
181*4d7e907cSAndroid Build Coastguard Worker     }
182*4d7e907cSAndroid Build Coastguard Worker     {
183*4d7e907cSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> _lock(thermal_callback_mutex_);
184*4d7e907cSAndroid Build Coastguard Worker         bool removed = false;
185*4d7e907cSAndroid Build Coastguard Worker         thermal_callbacks_.erase(
186*4d7e907cSAndroid Build Coastguard Worker                 std::remove_if(thermal_callbacks_.begin(), thermal_callbacks_.end(),
187*4d7e907cSAndroid Build Coastguard Worker                                [&](const std::shared_ptr<IThermalChangedCallback>& c) {
188*4d7e907cSAndroid Build Coastguard Worker                                    if (interfacesEqual(c, in_callback)) {
189*4d7e907cSAndroid Build Coastguard Worker                                        removed = true;
190*4d7e907cSAndroid Build Coastguard Worker                                        return true;
191*4d7e907cSAndroid Build Coastguard Worker                                    }
192*4d7e907cSAndroid Build Coastguard Worker                                    return false;
193*4d7e907cSAndroid Build Coastguard Worker                                }),
194*4d7e907cSAndroid Build Coastguard Worker                 thermal_callbacks_.end());
195*4d7e907cSAndroid Build Coastguard Worker         if (!removed) {
196*4d7e907cSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
197*4d7e907cSAndroid Build Coastguard Worker                                                                     "Callback wasn't registered");
198*4d7e907cSAndroid Build Coastguard Worker         }
199*4d7e907cSAndroid Build Coastguard Worker     }
200*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
201*4d7e907cSAndroid Build Coastguard Worker }
202*4d7e907cSAndroid Build Coastguard Worker 
registerCoolingDeviceChangedCallbackWithType(const std::shared_ptr<ICoolingDeviceChangedCallback> & in_callback,CoolingType in_type)203*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::registerCoolingDeviceChangedCallbackWithType(
204*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback, CoolingType in_type) {
205*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " ICoolingDeviceChangedCallback: " << in_callback
206*4d7e907cSAndroid Build Coastguard Worker                  << ", CoolingType: " << static_cast<int32_t>(in_type);
207*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
208*4d7e907cSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
209*4d7e907cSAndroid Build Coastguard Worker                                                                 "Invalid nullptr callback");
210*4d7e907cSAndroid Build Coastguard Worker     }
211*4d7e907cSAndroid Build Coastguard Worker     {
212*4d7e907cSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> _lock(cdev_callback_mutex_);
213*4d7e907cSAndroid Build Coastguard Worker         if (std::any_of(cdev_callbacks_.begin(), cdev_callbacks_.end(),
214*4d7e907cSAndroid Build Coastguard Worker                         [&](const std::shared_ptr<ICoolingDeviceChangedCallback>& c) {
215*4d7e907cSAndroid Build Coastguard Worker                             return interfacesEqual(c, in_callback);
216*4d7e907cSAndroid Build Coastguard Worker                         })) {
217*4d7e907cSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
218*4d7e907cSAndroid Build Coastguard Worker                                                                     "Callback already registered");
219*4d7e907cSAndroid Build Coastguard Worker         }
220*4d7e907cSAndroid Build Coastguard Worker         cdev_callbacks_.push_back(in_callback);
221*4d7e907cSAndroid Build Coastguard Worker     }
222*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
223*4d7e907cSAndroid Build Coastguard Worker }
224*4d7e907cSAndroid Build Coastguard Worker 
unregisterCoolingDeviceChangedCallback(const std::shared_ptr<ICoolingDeviceChangedCallback> & in_callback)225*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Thermal::unregisterCoolingDeviceChangedCallback(
226*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback) {
227*4d7e907cSAndroid Build Coastguard Worker     LOG(VERBOSE) << __func__ << " ICoolingDeviceChangedCallback: " << in_callback;
228*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
229*4d7e907cSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
230*4d7e907cSAndroid Build Coastguard Worker                                                                 "Invalid nullptr callback");
231*4d7e907cSAndroid Build Coastguard Worker     }
232*4d7e907cSAndroid Build Coastguard Worker     {
233*4d7e907cSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> _lock(cdev_callback_mutex_);
234*4d7e907cSAndroid Build Coastguard Worker         bool removed = false;
235*4d7e907cSAndroid Build Coastguard Worker         cdev_callbacks_.erase(
236*4d7e907cSAndroid Build Coastguard Worker                 std::remove_if(cdev_callbacks_.begin(), cdev_callbacks_.end(),
237*4d7e907cSAndroid Build Coastguard Worker                                [&](const std::shared_ptr<ICoolingDeviceChangedCallback>& c) {
238*4d7e907cSAndroid Build Coastguard Worker                                    if (interfacesEqual(c, in_callback)) {
239*4d7e907cSAndroid Build Coastguard Worker                                        removed = true;
240*4d7e907cSAndroid Build Coastguard Worker                                        return true;
241*4d7e907cSAndroid Build Coastguard Worker                                    }
242*4d7e907cSAndroid Build Coastguard Worker                                    return false;
243*4d7e907cSAndroid Build Coastguard Worker                                }),
244*4d7e907cSAndroid Build Coastguard Worker                 cdev_callbacks_.end());
245*4d7e907cSAndroid Build Coastguard Worker         if (!removed) {
246*4d7e907cSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
247*4d7e907cSAndroid Build Coastguard Worker                                                                     "Callback wasn't registered");
248*4d7e907cSAndroid Build Coastguard Worker         }
249*4d7e907cSAndroid Build Coastguard Worker     }
250*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
251*4d7e907cSAndroid Build Coastguard Worker }
252*4d7e907cSAndroid Build Coastguard Worker 
forecastSkinTemperature(int32_t,float *)253*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Thermal::forecastSkinTemperature(int32_t, float*) {
254*4d7e907cSAndroid Build Coastguard Worker     return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
255*4d7e907cSAndroid Build Coastguard Worker }
256*4d7e907cSAndroid Build Coastguard Worker 
257*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::thermal::impl::example
258