Implement power policy change listener in AudioControl HAL

Bug: 173719953
Test: manual test
Change-Id: Id773bd2bb1c8becc8f3e9e69e23ed8034dd36937
This commit is contained in:
Eric Jeong 2020-12-03 16:39:53 -08:00
parent ab2321ed93
commit 8dae6e7b72
4 changed files with 125 additions and 2 deletions

View file

@ -22,15 +22,18 @@ cc_binary {
generated_sources: ["audio_policy_configuration_V7_0"],
header_libs: ["libxsdc-utils"],
shared_libs: [
"android.frameworks.automotive.powerpolicy-ndk_platform",
"android.hardware.automotive.audiocontrol-ndk_platform",
"libbase",
"libbinder_ndk",
"liblog",
"libcutils",
"liblog",
"libpowerpolicyclient",
"libxml2",
],
srcs: [
"AudioControl.cpp",
"main.cpp",
"PowerPolicyClient.cpp",
],
}

View file

@ -0,0 +1,69 @@
/*
* Copyright (C) 2020 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.
*/
#include "PowerPolicyClient.h"
#include "AudioControl.h"
#include <android-base/logging.h>
namespace aidl {
namespace android {
namespace hardware {
namespace automotive {
namespace audiocontrol {
namespace aafap = aidl::android::frameworks::automotive::powerpolicy;
using aafap::CarPowerPolicy;
using aafap::CarPowerPolicyFilter;
using aafap::PowerComponent;
using ::android::frameworks::automotive::powerpolicy::hasComponent;
using ::ndk::ScopedAStatus;
namespace {
constexpr PowerComponent kAudioComponent = PowerComponent::AUDIO;
} // namespace
PowerPolicyClient::PowerPolicyClient(std::shared_ptr<AudioControl> audioControl)
: mAudioControl(audioControl) {}
void PowerPolicyClient::onInitFailed() {
LOG(ERROR) << "Initializing power policy client failed";
}
std::vector<PowerComponent> PowerPolicyClient::getComponentsOfInterest() {
std::vector<PowerComponent> components{kAudioComponent};
return components;
}
ScopedAStatus PowerPolicyClient::onPolicyChanged(const CarPowerPolicy& powerPolicy) {
if (hasComponent(powerPolicy.enabledComponents, kAudioComponent)) {
LOG(DEBUG) << "Power policy: Audio component is enabled";
// TODO(b/173719953): Do something when AUDIO is enabled.
} else if (hasComponent(powerPolicy.disabledComponents, kAudioComponent)) {
LOG(DEBUG) << "Power policy: Audio component is disabled";
// TODO(b/173719953): Do something when AUDIO is disabled.
}
return ScopedAStatus::ok();
}
} // namespace audiocontrol
} // namespace automotive
} // namespace hardware
} // namespace android
} // namespace aidl

View file

@ -0,0 +1,45 @@
/*
* Copyright (C) 2020 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.
*/
#ifndef AUTOMOTIVE_AUDIOCONTROL_AIDL_DEFAULT_POWERPOLICYCLIENT_H_
#define AUTOMOTIVE_AUDIOCONTROL_AIDL_DEFAULT_POWERPOLICYCLIENT_H_
#include "PowerPolicyClientBase.h"
#include <memory>
namespace aidl::android::hardware::automotive::audiocontrol {
class AudioControl;
class PowerPolicyClient
: public ::android::frameworks::automotive::powerpolicy::PowerPolicyClientBase {
public:
explicit PowerPolicyClient(std::shared_ptr<AudioControl> audioControl);
void onInitFailed();
std::vector<::aidl::android::frameworks::automotive::powerpolicy::PowerComponent>
getComponentsOfInterest() override;
::ndk::ScopedAStatus onPolicyChanged(
const ::aidl::android::frameworks::automotive::powerpolicy::CarPowerPolicy&) override;
private:
std::shared_ptr<AudioControl> mAudioControl;
};
} // namespace aidl::android::hardware::automotive::audiocontrol
#endif // AUTOMOTIVE_AUDIOCONTROL_AIDL_DEFAULT_POWERPOLICYCLIENT_H_

View file

@ -15,22 +15,28 @@
*/
#include "AudioControl.h"
#include "PowerPolicyClient.h"
#include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
using aidl::android::hardware::automotive::audiocontrol::AudioControl;
using aidl::android::hardware::automotive::audiocontrol::PowerPolicyClient;
int main() {
ABinderProcess_setThreadPoolMaxThreadCount(0);
std::shared_ptr<AudioControl> audioControl = ndk::SharedRefBase::make<AudioControl>();
std::shared_ptr<AudioControl> audioControl = ::ndk::SharedRefBase::make<AudioControl>();
const std::string instance = std::string() + AudioControl::descriptor + "/default";
binder_status_t status =
AServiceManager_addService(audioControl->asBinder().get(), instance.c_str());
CHECK(status == STATUS_OK);
std::shared_ptr<PowerPolicyClient> powerPolicyClient =
::ndk::SharedRefBase::make<PowerPolicyClient>(audioControl);
powerPolicyClient->init();
ABinderProcess_joinThreadPool();
return EXIT_FAILURE; // should not reach
}