Merge "[HAL] Invalidate chip before shutting down legacy HAL" into oc-dr1-dev
diff --git a/audio/2.0/vts/functional/Android.bp b/audio/2.0/vts/functional/Android.bp
index daae738..b289709 100644
--- a/audio/2.0/vts/functional/Android.bp
+++ b/audio/2.0/vts/functional/Android.bp
@@ -29,9 +29,11 @@
         "libxml2",
         "android.hardware.audio@2.0",
         "android.hardware.audio.common@2.0",
+    ],
+    static_libs: [
+        "VtsHalHidlTargetTestBase",
         "android.hardware.audio.common.test.utility",
     ],
-    static_libs: ["VtsHalHidlTargetTestBase"],
     cflags: [
         "-O0",
         "-g",
diff --git a/audio/common/test/utility/Android.bp b/audio/common/test/utility/Android.bp
index cca56f6..b796acc 100644
--- a/audio/common/test/utility/Android.bp
+++ b/audio/common/test/utility/Android.bp
@@ -14,7 +14,7 @@
 // limitations under the License.
 //
 
-cc_library_shared {
+cc_library_static {
     name: "android.hardware.audio.common.test.utility",
     defaults : ["hidl_defaults"],
     srcs: ["src/ValidateXml.cpp"],
diff --git a/graphics/composer/2.1/default/ComposerClient.cpp b/graphics/composer/2.1/default/ComposerClient.cpp
index 5a96e29..e792034 100644
--- a/graphics/composer/2.1/default/ComposerClient.cpp
+++ b/graphics/composer/2.1/default/ComposerClient.cpp
@@ -1149,6 +1149,13 @@
 
         // input handle is ignored
         *outHandle = entry->getHandle();
+    } else if (cache == BufferCache::LAYER_SIDEBAND_STREAMS) {
+        if (handle) {
+            *outHandle = native_handle_clone(handle);
+            if (*outHandle == nullptr) {
+                return Error::NO_RESOURCES;
+            }
+        }
     } else {
         if (!sHandleImporter.importBuffer(handle)) {
             return Error::NO_RESOURCES;
diff --git a/graphics/composer/2.1/default/ComposerClient.h b/graphics/composer/2.1/default/ComposerClient.h
index ee825fe..fc5c223 100644
--- a/graphics/composer/2.1/default/ComposerClient.h
+++ b/graphics/composer/2.1/default/ComposerClient.h
@@ -110,6 +110,7 @@
 protected:
     struct LayerBuffers {
         std::vector<BufferCacheEntry> Buffers;
+        // the handle is a sideband stream handle, not a buffer handle
         BufferCacheEntry SidebandStream;
     };
 
diff --git a/radio/1.1/vts/functional/radio_hidl_hal_api.cpp b/radio/1.1/vts/functional/radio_hidl_hal_api.cpp
index 666a317..4bf6f87 100644
--- a/radio/1.1/vts/functional/radio_hidl_hal_api.cpp
+++ b/radio/1.1/vts/functional/radio_hidl_hal_api.cpp
@@ -33,4 +33,74 @@
                     radioRsp_v1_1->rspInfo.error == RadioError::INVALID_ARGUMENTS ||
                     radioRsp_v1_1->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE);
     }
+}
+
+/*
+ * Test IRadio.startNetworkScan() for the response returned.
+ */
+TEST_F(RadioHidlTest_v1_1, startNetworkScan) {
+    int serial = GetRandomSerialNumber();
+
+    NetworkScanRequest request;
+    request.type = ScanType::ONE_SHOT;
+    request.interval = 60;
+    RadioAccessSpecifier specifier;
+    specifier.radioAccessNetwork = RadioAccessNetworks::GERAN;
+    specifier.geranBands.resize(2);
+    specifier.geranBands[0] = GeranBands::BAND_450;
+    specifier.geranBands[1] = GeranBands::BAND_480;
+    specifier.channels.resize(2);
+    specifier.channels[0] = 1;
+    specifier.channels[1] = 2;
+    request.specifiers.resize(1);
+    request.specifiers[0] = specifier;
+
+    radio_v1_1->startNetworkScan(serial, request);
+    EXPECT_EQ(std::cv_status::no_timeout, wait());
+    EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_1->rspInfo.type);
+    EXPECT_EQ(serial, radioRsp_v1_1->rspInfo.serial);
+
+    if (cardStatus.cardState == CardState::ABSENT) {
+        ASSERT_TRUE(radioRsp_v1_1->rspInfo.error == RadioError::NONE ||
+                    radioRsp_v1_1->rspInfo.error == RadioError::SIM_ABSENT ||
+                    radioRsp_v1_1->rspInfo.error == RadioError::INVALID_ARGUMENTS);
+    }
+}
+
+/*
+ * Test IRadio.startNetworkScan() for the response returned.
+ */
+TEST_F(RadioHidlTest_v1_1, startNetworkScan_InvalidArgument) {
+    int serial = GetRandomSerialNumber();
+
+    NetworkScanRequest request;
+    request.type = ScanType::ONE_SHOT;
+    request.interval = 60;
+
+    radio_v1_1->startNetworkScan(serial, request);
+    EXPECT_EQ(std::cv_status::no_timeout, wait());
+    EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_1->rspInfo.type);
+    EXPECT_EQ(serial, radioRsp_v1_1->rspInfo.serial);
+
+    if (cardStatus.cardState == CardState::ABSENT) {
+        ASSERT_TRUE(radioRsp_v1_1->rspInfo.error == RadioError::INVALID_ARGUMENTS ||
+                    radioRsp_v1_1->rspInfo.error == RadioError::SIM_ABSENT);
+    }
+}
+
+/*
+ * Test IRadio.stopNetworkScan() for the response returned.
+ */
+TEST_F(RadioHidlTest_v1_1, stopNetworkScan) {
+    int serial = GetRandomSerialNumber();
+
+    radio_v1_1->stopNetworkScan(serial);
+    EXPECT_EQ(std::cv_status::no_timeout, wait());
+    EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_1->rspInfo.type);
+    EXPECT_EQ(serial, radioRsp_v1_1->rspInfo.serial);
+
+    if (cardStatus.cardState == CardState::ABSENT) {
+        ASSERT_TRUE(radioRsp_v1_1->rspInfo.error == RadioError::NONE ||
+                    radioRsp_v1_1->rspInfo.error == RadioError::SIM_ABSENT);
+    }
 }
\ No newline at end of file
diff --git a/radio/1.1/vts/functional/radio_response.cpp b/radio/1.1/vts/functional/radio_response.cpp
index 98cab98..37b80b1 100644
--- a/radio/1.1/vts/functional/radio_response.cpp
+++ b/radio/1.1/vts/functional/radio_response.cpp
@@ -669,11 +669,15 @@
     return Void();
 }
 
-Return<void> RadioResponse_v1_1::startNetworkScanResponse(const RadioResponseInfo& /*info*/) {
+Return<void> RadioResponse_v1_1::startNetworkScanResponse(const RadioResponseInfo& info) {
+    rspInfo = info;
+    parent_v1_1.notify();
     return Void();
 }
 
-Return<void> RadioResponse_v1_1::stopNetworkScanResponse(const RadioResponseInfo& /*info*/) {
+Return<void> RadioResponse_v1_1::stopNetworkScanResponse(const RadioResponseInfo& info) {
+    rspInfo = info;
+    parent_v1_1.notify();
     return Void();
 }