Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8dae6e7b authored by Eric Jeong's avatar Eric Jeong
Browse files

Implement power policy change listener in AudioControl HAL

Bug: 173719953
Test: manual test
Change-Id: Id773bd2bb1c8becc8f3e9e69e23ed8034dd36937
parent ab2321ed
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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",
    ],
}
+69 −0
Original line number Diff line number Diff line
/*
 * 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
+45 −0
Original line number Diff line number Diff line
/*
 * 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_
+7 −1
Original line number Diff line number Diff line
@@ -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
}