Fill announcement-related gaps in Broadcast Radio APIs.
- adds TA and TP flags to ProgramInfo struct
- adds a callback to cancel announcement
Bug: b/63702941
Test: Instrumentalization, VTS
Change-Id: I03a0781d37429d4a84aab2dce3e5bb7794a20c57
diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal
index 912786a..a5c569a 100644
--- a/broadcastradio/1.1/ITuner.hal
+++ b/broadcastradio/1.1/ITuner.hal
@@ -42,6 +42,24 @@
tune_1_1(ProgramSelector program) generates (Result result);
/**
+ * Cancels announcement.
+ *
+ * If it was traffic announcement, trafficAnnouncement(false) callback
+ * should be called (just like it was ended in a normal way). Similarly for
+ * emergency announcement. If there was no announcement, then no action
+ * should be taken.
+ *
+ * There is a race condition between calling cancelAnnouncement and the
+ * actual announcement being finished, so trafficAnnouncement /
+ * emergencyAnnouncement callback should be tracked with proper locking.
+ *
+ * @return result OK if successfully cancelled announcement or there was
+ * no announcement.
+ * NOT_INITIALIZED if another error occurs.
+ */
+ cancelAnnouncement() generates (Result result);
+
+ /**
* Retrieve current station information.
* @return result OK if scan successfully started
* NOT_INITIALIZED if another error occurs
diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp
index 0238f14..271f633 100644
--- a/broadcastradio/1.1/default/Tuner.cpp
+++ b/broadcastradio/1.1/default/Tuner.cpp
@@ -269,6 +269,11 @@
return Result::OK;
}
+Return<Result> Tuner::cancelAnnouncement() {
+ ALOGV("%s", __func__);
+ return Result::OK;
+}
+
Return<void> Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) {
ALOGV("%s", __func__);
return getProgramInformation_1_1([&](Result result, const ProgramInfo& info) {
diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h
index 5c8a7e5..2ab4f40 100644
--- a/broadcastradio/1.1/default/Tuner.h
+++ b/broadcastradio/1.1/default/Tuner.h
@@ -34,19 +34,21 @@
void forceClose();
// V1_1::ITuner methods
- Return<Result> setConfiguration(const V1_0::BandConfig& config) override;
- Return<void> getConfiguration(getConfiguration_cb _hidl_cb) override;
- Return<Result> scan(V1_0::Direction direction, bool skipSubChannel) override;
- Return<Result> step(V1_0::Direction direction, bool skipSubChannel) override;
- Return<Result> tune(uint32_t channel, uint32_t subChannel) override;
- Return<Result> tune_1_1(const ProgramSelector& program) override;
- Return<Result> cancel() override;
- Return<void> getProgramInformation(getProgramInformation_cb _hidl_cb) override;
- Return<void> getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override;
- Return<ProgramListResult> startBackgroundScan() override;
- Return<void> getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) override;
- Return<void> isAnalogForced(isAnalogForced_cb _hidl_cb) override;
- Return<Result> setAnalogForced(bool isForced) override;
+ virtual Return<Result> setConfiguration(const V1_0::BandConfig& config) override;
+ virtual Return<void> getConfiguration(getConfiguration_cb _hidl_cb) override;
+ virtual Return<Result> scan(V1_0::Direction direction, bool skipSubChannel) override;
+ virtual Return<Result> step(V1_0::Direction direction, bool skipSubChannel) override;
+ virtual Return<Result> tune(uint32_t channel, uint32_t subChannel) override;
+ virtual Return<Result> tune_1_1(const ProgramSelector& program) override;
+ virtual Return<Result> cancel() override;
+ virtual Return<Result> cancelAnnouncement() override;
+ virtual Return<void> getProgramInformation(getProgramInformation_cb _hidl_cb) override;
+ virtual Return<void> getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override;
+ virtual Return<ProgramListResult> startBackgroundScan() override;
+ virtual Return<void> getProgramList(const hidl_string& filter,
+ getProgramList_cb _hidl_cb) override;
+ virtual Return<void> isAnalogForced(isAnalogForced_cb _hidl_cb) override;
+ virtual Return<Result> setAnalogForced(bool isForced) override;
private:
std::mutex mMut;
diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal
index 44bb507..73e4ba5 100644
--- a/broadcastradio/1.1/types.hal
+++ b/broadcastradio/1.1/types.hal
@@ -43,6 +43,17 @@
* increasing volume too much.
*/
MUTED = 1 << 1,
+
+ /**
+ * Station broadcasts traffic information regularly,
+ * but not necessarily right now.
+ */
+ TRAFFIC_PROGRAM = 1 << 2,
+
+ /**
+ * Station is broadcasting traffic information at the very moment.
+ */
+ TRAFFIC_ANNOUNCEMENT = 1 << 3,
};
struct Properties {
diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
index 3b29c75..6910d95 100644
--- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
+++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
@@ -47,6 +47,7 @@
using testing::AnyNumber;
using testing::ByMove;
using testing::DoAll;
+using testing::Invoke;
using testing::SaveArg;
using broadcastradio::vts::CallBarrier;
@@ -63,8 +64,9 @@
std::cout << "[ SKIPPED ] " << msg << std::endl;
}
-class TunerCallbackMock : public ITunerCallback {
- public:
+struct TunerCallbackMock : public ITunerCallback {
+ TunerCallbackMock() { EXPECT_CALL(*this, hardwareFailure()).Times(0); }
+
MOCK_METHOD0(hardwareFailure, Return<void>());
MOCK_TIMEOUT_METHOD2(configChange, Return<void>(Result, const BandConfig&));
MOCK_METHOD2(tuneComplete, Return<void>(Result, const V1_0::ProgramInfo&));
@@ -106,9 +108,6 @@
void BroadcastRadioHalTest::SetUp() {
radioClass = GetParam();
- // set general expectations for a callback
- EXPECT_CALL(*mCallback, hardwareFailure()).Times(0);
-
// lookup HIDL service
auto factory = getService<IBroadcastRadioFactory>();
ASSERT_NE(nullptr, factory.get());
@@ -287,6 +286,14 @@
EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId);
}
+TEST_P(BroadcastRadioHalTest, CancelAnnouncement) {
+ if (skipped) return;
+ ASSERT_TRUE(openTuner(0));
+
+ auto hidlResult = mTuner->cancelAnnouncement();
+ EXPECT_EQ(Result::OK, hidlResult);
+}
+
INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest,
::testing::Values(Class::AM_FM, Class::SAT, Class::DT));