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

Commit 057332b5 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Implement vibration session support" into main

parents d24280c5 e2b376df
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -150,6 +150,23 @@ HalResult<void> ManagerHalController::cancelSynced() {
    return apply(cancelSyncedFn, "cancelSynced");
}

HalResult<std::shared_ptr<Aidl::IVibrationSession>> ManagerHalController::startSession(
        const std::vector<int32_t>& ids, const Aidl::VibrationSessionConfig& config,
        const std::function<void()>& completionCallback) {
    hal_fn<std::shared_ptr<Aidl::IVibrationSession>> startSessionFn =
            [&](std::shared_ptr<ManagerHalWrapper> hal) {
                return hal->startSession(ids, config, completionCallback);
            };
    return apply(startSessionFn, "startSession");
}

HalResult<void> ManagerHalController::clearSessions() {
    hal_fn<void> clearSessionsFn = [](std::shared_ptr<ManagerHalWrapper> hal) {
        return hal->clearSessions();
    };
    return apply(clearSessionsFn, "clearSessions");
}

}; // namespace vibrator

}; // namespace android
+39 −12
Original line number Diff line number Diff line
@@ -29,6 +29,30 @@ namespace vibrator {
constexpr int32_t SINGLE_VIBRATOR_ID = 0;
const constexpr char* MISSING_VIBRATOR_MESSAGE_PREFIX = "No vibrator with id=";

HalResult<void> ManagerHalWrapper::prepareSynced(const std::vector<int32_t>&) {
    return HalResult<void>::unsupported();
}

HalResult<void> ManagerHalWrapper::triggerSynced(const std::function<void()>&) {
    return HalResult<void>::unsupported();
}

HalResult<void> ManagerHalWrapper::cancelSynced() {
    return HalResult<void>::unsupported();
}

HalResult<std::shared_ptr<Aidl::IVibrationSession>> ManagerHalWrapper::startSession(
        const std::vector<int32_t>&, const Aidl::VibrationSessionConfig&,
        const std::function<void()>&) {
    return HalResult<std::shared_ptr<Aidl::IVibrationSession>>::unsupported();
}

HalResult<void> ManagerHalWrapper::clearSessions() {
    return HalResult<void>::unsupported();
}

// -------------------------------------------------------------------------------------------------

HalResult<void> LegacyManagerHalWrapper::ping() {
    auto pingFn = [](HalWrapper* hal) { return hal->ping(); };
    return mController->doWithRetry<void>(pingFn, "ping");
@@ -59,18 +83,6 @@ HalResult<std::shared_ptr<HalController>> LegacyManagerHalWrapper::getVibrator(i
            (MISSING_VIBRATOR_MESSAGE_PREFIX + std::to_string(id)).c_str());
}

HalResult<void> LegacyManagerHalWrapper::prepareSynced(const std::vector<int32_t>&) {
    return HalResult<void>::unsupported();
}

HalResult<void> LegacyManagerHalWrapper::triggerSynced(const std::function<void()>&) {
    return HalResult<void>::unsupported();
}

HalResult<void> LegacyManagerHalWrapper::cancelSynced() {
    return HalResult<void>::unsupported();
}

// -------------------------------------------------------------------------------------------------

std::shared_ptr<HalWrapper> AidlManagerHalWrapper::connectToVibrator(
@@ -186,6 +198,17 @@ HalResult<void> AidlManagerHalWrapper::triggerSynced(
    return HalResultFactory::fromStatus(getHal()->triggerSynced(cb));
}

HalResult<std::shared_ptr<Aidl::IVibrationSession>> AidlManagerHalWrapper::startSession(
        const std::vector<int32_t>& ids, const Aidl::VibrationSessionConfig& config,
        const std::function<void()>& completionCallback) {
    auto cb = ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback);
    std::shared_ptr<Aidl::IVibrationSession> session;
    auto status = getHal()->startSession(ids, config, cb, &session);
    return HalResultFactory::fromStatus<std::shared_ptr<Aidl::IVibrationSession>>(std::move(status),
                                                                                  std::move(
                                                                                          session));
}

HalResult<void> AidlManagerHalWrapper::cancelSynced() {
    auto ret = HalResultFactory::fromStatus(getHal()->cancelSynced());
    if (ret.isOk()) {
@@ -200,6 +223,10 @@ HalResult<void> AidlManagerHalWrapper::cancelSynced() {
    return ret;
}

HalResult<void> AidlManagerHalWrapper::clearSessions() {
    return HalResultFactory::fromStatus(getHal()->clearSessions());
}

std::shared_ptr<Aidl::IVibratorManager> AidlManagerHalWrapper::getHal() {
    std::lock_guard<std::mutex> lock(mHandleMutex);
    return mHandle;
+4 −0
Original line number Diff line number Diff line
@@ -62,6 +62,10 @@ public:
    HalResult<void> prepareSynced(const std::vector<int32_t>& ids) override final;
    HalResult<void> triggerSynced(const std::function<void()>& completionCallback) override final;
    HalResult<void> cancelSynced() override final;
    HalResult<std::shared_ptr<IVibrationSession>> startSession(
            const std::vector<int32_t>& ids, const VibrationSessionConfig& config,
            const std::function<void()>& completionCallback) override final;
    HalResult<void> clearSessions() override final;

private:
    Connector mConnector;
+16 −8
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ enum class ManagerCapabilities : int32_t {
            aidl::android::hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_PERFORM,
    MIXED_TRIGGER_COMPOSE =
            aidl::android::hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_COMPOSE,
    TRIGGER_CALLBACK = aidl::android::hardware::vibrator::IVibratorManager::CAP_TRIGGER_CALLBACK
    TRIGGER_CALLBACK = aidl::android::hardware::vibrator::IVibratorManager::CAP_TRIGGER_CALLBACK,
    START_SESSIONS = aidl::android::hardware::vibrator::IVibratorManager::CAP_START_SESSIONS
};

inline ManagerCapabilities operator|(ManagerCapabilities lhs, ManagerCapabilities rhs) {
@@ -64,6 +65,9 @@ inline ManagerCapabilities& operator&=(ManagerCapabilities& lhs, ManagerCapabili
// Wrapper for VibratorManager HAL handlers.
class ManagerHalWrapper {
public:
    using IVibrationSession = aidl::android::hardware::vibrator::IVibrationSession;
    using VibrationSessionConfig = aidl::android::hardware::vibrator::VibrationSessionConfig;

    ManagerHalWrapper() = default;
    virtual ~ManagerHalWrapper() = default;

@@ -78,9 +82,13 @@ public:
    virtual HalResult<std::vector<int32_t>> getVibratorIds() = 0;
    virtual HalResult<std::shared_ptr<HalController>> getVibrator(int32_t id) = 0;

    virtual HalResult<void> prepareSynced(const std::vector<int32_t>& ids) = 0;
    virtual HalResult<void> triggerSynced(const std::function<void()>& completionCallback) = 0;
    virtual HalResult<void> cancelSynced() = 0;
    virtual HalResult<void> prepareSynced(const std::vector<int32_t>& ids);
    virtual HalResult<void> triggerSynced(const std::function<void()>& completionCallback);
    virtual HalResult<void> cancelSynced();
    virtual HalResult<std::shared_ptr<IVibrationSession>> startSession(
            const std::vector<int32_t>& ids, const VibrationSessionConfig& config,
            const std::function<void()>& completionCallback);
    virtual HalResult<void> clearSessions();
};

// Wrapper for the VibratorManager over single Vibrator HAL.
@@ -98,10 +106,6 @@ public:
    HalResult<std::vector<int32_t>> getVibratorIds() override final;
    HalResult<std::shared_ptr<HalController>> getVibrator(int32_t id) override final;

    HalResult<void> prepareSynced(const std::vector<int32_t>& ids) override final;
    HalResult<void> triggerSynced(const std::function<void()>& completionCallback) override final;
    HalResult<void> cancelSynced() override final;

private:
    const std::shared_ptr<HalController> mController;
};
@@ -126,6 +130,10 @@ public:
    HalResult<void> prepareSynced(const std::vector<int32_t>& ids) override final;
    HalResult<void> triggerSynced(const std::function<void()>& completionCallback) override final;
    HalResult<void> cancelSynced() override final;
    HalResult<std::shared_ptr<IVibrationSession>> startSession(
            const std::vector<int32_t>& ids, const VibrationSessionConfig& config,
            const std::function<void()>& completionCallback) override final;
    HalResult<void> clearSessions() override final;

private:
    std::mutex mHandleMutex;
+34 −6
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@
#include "test_mocks.h"
#include "test_utils.h"

using aidl::android::hardware::vibrator::IVibrationSession;
using aidl::android::hardware::vibrator::VibrationSessionConfig;
using android::vibrator::HalController;

using namespace android;
@@ -34,6 +36,7 @@ using namespace testing;

static constexpr int MAX_ATTEMPTS = 2;
static const std::vector<int32_t> VIBRATOR_IDS = {1, 2};
static const VibrationSessionConfig SESSION_CONFIG;
static constexpr int VIBRATOR_ID = 1;

// -------------------------------------------------------------------------------------------------
@@ -52,6 +55,11 @@ public:
    MOCK_METHOD(vibrator::HalResult<void>, triggerSynced,
                (const std::function<void()>& completionCallback), (override));
    MOCK_METHOD(vibrator::HalResult<void>, cancelSynced, (), (override));
    MOCK_METHOD(vibrator::HalResult<std::shared_ptr<IVibrationSession>>, startSession,
                (const std::vector<int32_t>& ids, const VibrationSessionConfig& s,
                 const std::function<void()>& completionCallback),
                (override));
    MOCK_METHOD(vibrator::HalResult<void>, clearSessions, (), (override));
};

// -------------------------------------------------------------------------------------------------
@@ -79,7 +87,8 @@ protected:
    void setHalExpectations(int32_t cardinality, vibrator::HalResult<void> voidResult,
                            vibrator::HalResult<vibrator::ManagerCapabilities> capabilitiesResult,
                            vibrator::HalResult<std::vector<int32_t>> idsResult,
                            vibrator::HalResult<std::shared_ptr<HalController>> vibratorResult) {
                            vibrator::HalResult<std::shared_ptr<HalController>> vibratorResult,
                            vibrator::HalResult<std::shared_ptr<IVibrationSession>> sessionResult) {
        EXPECT_CALL(*mMockHal.get(), ping())
                .Times(Exactly(cardinality))
                .WillRepeatedly(Return(voidResult));
@@ -101,10 +110,16 @@ protected:
        EXPECT_CALL(*mMockHal.get(), cancelSynced())
                .Times(Exactly(cardinality))
                .WillRepeatedly(Return(voidResult));
        EXPECT_CALL(*mMockHal.get(), startSession(_, _, _))
                .Times(Exactly(cardinality))
                .WillRepeatedly(Return(sessionResult));
        EXPECT_CALL(*mMockHal.get(), clearSessions())
                .Times(Exactly(cardinality))
                .WillRepeatedly(Return(voidResult));

        if (cardinality > 1) {
            // One reconnection for each retry.
            EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(7 * (cardinality - 1)));
            EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(9 * (cardinality - 1)));
        } else {
            EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(0));
        }
@@ -127,7 +142,8 @@ TEST_F(VibratorManagerHalControllerTest, TestApiCallsAreForwardedToHal) {
                       vibrator::HalResult<vibrator::ManagerCapabilities>::ok(
                               vibrator::ManagerCapabilities::SYNC),
                       vibrator::HalResult<std::vector<int32_t>>::ok(VIBRATOR_IDS),
                       vibrator::HalResult<std::shared_ptr<HalController>>::ok(nullptr));
                       vibrator::HalResult<std::shared_ptr<HalController>>::ok(nullptr),
                       vibrator::HalResult<std::shared_ptr<IVibrationSession>>::ok(nullptr));

    ASSERT_TRUE(mController->ping().isOk());

@@ -146,6 +162,8 @@ TEST_F(VibratorManagerHalControllerTest, TestApiCallsAreForwardedToHal) {
    ASSERT_TRUE(mController->prepareSynced(VIBRATOR_IDS).isOk());
    ASSERT_TRUE(mController->triggerSynced([]() {}).isOk());
    ASSERT_TRUE(mController->cancelSynced().isOk());
    ASSERT_TRUE(mController->startSession(VIBRATOR_IDS, SESSION_CONFIG, []() {}).isOk());
    ASSERT_TRUE(mController->clearSessions().isOk());

    ASSERT_EQ(1, mConnectCounter);
}
@@ -154,7 +172,8 @@ TEST_F(VibratorManagerHalControllerTest, TestUnsupportedApiResultDoesNotResetHal
    setHalExpectations(/* cardinality= */ 1, vibrator::HalResult<void>::unsupported(),
                       vibrator::HalResult<vibrator::ManagerCapabilities>::unsupported(),
                       vibrator::HalResult<std::vector<int32_t>>::unsupported(),
                       vibrator::HalResult<std::shared_ptr<HalController>>::unsupported());
                       vibrator::HalResult<std::shared_ptr<HalController>>::unsupported(),
                       vibrator::HalResult<std::shared_ptr<IVibrationSession>>::unsupported());

    ASSERT_TRUE(mController->ping().isUnsupported());
    ASSERT_TRUE(mController->getCapabilities().isUnsupported());
@@ -163,6 +182,8 @@ TEST_F(VibratorManagerHalControllerTest, TestUnsupportedApiResultDoesNotResetHal
    ASSERT_TRUE(mController->prepareSynced(VIBRATOR_IDS).isUnsupported());
    ASSERT_TRUE(mController->triggerSynced([]() {}).isUnsupported());
    ASSERT_TRUE(mController->cancelSynced().isUnsupported());
    ASSERT_TRUE(mController->startSession(VIBRATOR_IDS, SESSION_CONFIG, []() {}).isUnsupported());
    ASSERT_TRUE(mController->clearSessions().isUnsupported());

    ASSERT_EQ(1, mConnectCounter);
}
@@ -171,7 +192,8 @@ TEST_F(VibratorManagerHalControllerTest, TestOperationFailedApiResultDoesNotRese
    setHalExpectations(/* cardinality= */ 1, vibrator::HalResult<void>::failed("msg"),
                       vibrator::HalResult<vibrator::ManagerCapabilities>::failed("msg"),
                       vibrator::HalResult<std::vector<int32_t>>::failed("msg"),
                       vibrator::HalResult<std::shared_ptr<HalController>>::failed("msg"));
                       vibrator::HalResult<std::shared_ptr<HalController>>::failed("msg"),
                       vibrator::HalResult<std::shared_ptr<IVibrationSession>>::failed("msg"));

    ASSERT_TRUE(mController->ping().isFailed());
    ASSERT_TRUE(mController->getCapabilities().isFailed());
@@ -180,6 +202,8 @@ TEST_F(VibratorManagerHalControllerTest, TestOperationFailedApiResultDoesNotRese
    ASSERT_TRUE(mController->prepareSynced(VIBRATOR_IDS).isFailed());
    ASSERT_TRUE(mController->triggerSynced([]() {}).isFailed());
    ASSERT_TRUE(mController->cancelSynced().isFailed());
    ASSERT_TRUE(mController->startSession(VIBRATOR_IDS, SESSION_CONFIG, []() {}).isFailed());
    ASSERT_TRUE(mController->clearSessions().isFailed());

    ASSERT_EQ(1, mConnectCounter);
}
@@ -188,7 +212,9 @@ TEST_F(VibratorManagerHalControllerTest, TestTransactionFailedApiResultResetsHal
    setHalExpectations(MAX_ATTEMPTS, vibrator::HalResult<void>::transactionFailed("m"),
                       vibrator::HalResult<vibrator::ManagerCapabilities>::transactionFailed("m"),
                       vibrator::HalResult<std::vector<int32_t>>::transactionFailed("m"),
                       vibrator::HalResult<std::shared_ptr<HalController>>::transactionFailed("m"));
                       vibrator::HalResult<std::shared_ptr<HalController>>::transactionFailed("m"),
                       vibrator::HalResult<std::shared_ptr<IVibrationSession>>::transactionFailed(
                               "m"));

    ASSERT_TRUE(mController->ping().isFailed());
    ASSERT_TRUE(mController->getCapabilities().isFailed());
@@ -197,6 +223,8 @@ TEST_F(VibratorManagerHalControllerTest, TestTransactionFailedApiResultResetsHal
    ASSERT_TRUE(mController->prepareSynced(VIBRATOR_IDS).isFailed());
    ASSERT_TRUE(mController->triggerSynced([]() {}).isFailed());
    ASSERT_TRUE(mController->cancelSynced().isFailed());
    ASSERT_TRUE(mController->startSession(VIBRATOR_IDS, SESSION_CONFIG, []() {}).isFailed());
    ASSERT_TRUE(mController->clearSessions().isFailed());

    ASSERT_EQ(1, mConnectCounter);
}
Loading