OSDN Git Service

Broadcast Radio default implementation: analog forced switch.
authorTomasz Wasilczyk <twasilczyk@google.com>
Tue, 25 Jul 2017 17:53:50 +0000 (10:53 -0700)
committerTomasz Wasilczyk <twasilczyk@google.com>
Fri, 28 Jul 2017 15:58:08 +0000 (08:58 -0700)
Bug: b/36864090
Test: VTS
Change-Id: I2b7bcf2bb3ad7075f39280ab72b32bff5bf166a3

broadcastradio/1.1/default/Tuner.cpp
broadcastradio/1.1/default/Tuner.h
broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp

index 133593e..2985d42 100644 (file)
@@ -52,7 +52,8 @@ const struct {
 Tuner::Tuner(const sp<V1_0::ITunerCallback>& callback)
     : mCallback(callback),
       mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)),
-      mVirtualFm(make_fm_radio()) {
+      mVirtualFm(make_fm_radio()),
+      mIsAnalogForced(false) {
     // TODO (b/36864090): inject this data in a more elegant way
     setCompatibilityLevel(mCallback1_1 == nullptr ? 1 : 2);
 }
@@ -320,15 +321,14 @@ Return<void> Tuner::getProgramList(const hidl_string& filter __unused, getProgra
 
 Return<void> Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) {
     ALOGV("%s", __func__);
-    // TODO(b/36864090): implement
-    _hidl_cb(Result::INVALID_STATE, false);
+    _hidl_cb(Result::OK, mIsAnalogForced);
     return Void();
 }
 
-Return<Result> Tuner::setAnalogForced(bool isForced __unused) {
+Return<Result> Tuner::setAnalogForced(bool isForced) {
     ALOGV("%s", __func__);
-    // TODO(b/36864090): implement
-    return Result::INVALID_STATE;
+    mIsAnalogForced = isForced;
+    return Result::OK;
 }
 
 }  // namespace implementation
index 2222e5a..3efbd09 100644 (file)
@@ -65,6 +65,7 @@ struct Tuner : public ITuner {
     bool mIsTuneCompleted = false;
     ProgramSelector mCurrentProgram = {};
     ProgramInfo mCurrentProgramInfo = {};
+    std::atomic<bool> mIsAnalogForced;
 
     void tuneInternalLocked(const ProgramSelector& sel);
     bool isFmLocked();  // TODO(b/36864090): make it generic, not FM only
index c6bc344..bd2e0a7 100644 (file)
@@ -416,6 +416,52 @@ TEST_P(BroadcastRadioHalTest, OobImagesOnly) {
     }
 }
 
+/**
+ * Test AnalogForced switch.
+ *
+ * Verifies that:
+ * - setAnalogForced results either with INVALID_STATE, or isAnalogForced replying the same
+ */
+TEST_P(BroadcastRadioHalTest, AnalogForcedSwitch) {
+    if (skipped) return;
+    ASSERT_TRUE(openTuner());
+
+    bool forced;
+    Result halIsResult;
+    auto isCb = [&](Result result, bool isForced) {
+        halIsResult = result;
+        forced = isForced;
+    };
+
+    // set analog mode
+    auto setResult = mTuner->setAnalogForced(true);
+    ASSERT_TRUE(setResult.isOk());
+    if (Result::INVALID_STATE == setResult) {
+        // if setter fails, getter should fail too - it means the switch is not supported at all
+        auto isResult = mTuner->isAnalogForced(isCb);
+        ASSERT_TRUE(isResult.isOk());
+        EXPECT_EQ(Result::INVALID_STATE, halIsResult);
+        return;
+    }
+    ASSERT_EQ(Result::OK, setResult);
+
+    // check, if it's analog
+    auto isResult = mTuner->isAnalogForced(isCb);
+    ASSERT_TRUE(isResult.isOk());
+    EXPECT_EQ(Result::OK, halIsResult);
+    ASSERT_TRUE(forced);
+
+    // set digital mode
+    setResult = mTuner->setAnalogForced(false);
+    ASSERT_EQ(Result::OK, setResult);
+
+    // check, if it's digital
+    isResult = mTuner->isAnalogForced(isCb);
+    ASSERT_TRUE(isResult.isOk());
+    EXPECT_EQ(Result::OK, halIsResult);
+    ASSERT_FALSE(forced);
+}
+
 INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest,
                         ::testing::Values(Class::AM_FM, Class::SAT, Class::DT));