Support multiple displays in fingerprint VHAL

Bug: 348076336
Test: atest android.hardware.biometrics.fingerprint.* -c
Test: atest BiometricsE2eTests:BiometricPromptAuthSuccessTest
Change-Id: Ia0e26e41b951cf00d8d098983a05f3916b12af5c
diff --git a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
index 5af84ed..d9a60a5 100644
--- a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
+++ b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
@@ -311,7 +311,7 @@
     void setSensorStrength(in SensorStrength strength);
     void setMaxEnrollmentPerUser(in int max);
     void setSensorLocation(in SensorLocation loc);
-    void setNavigationGuesture(in boolean v);
+    void setNavigationGesture(in boolean v);
     void setDetectInteraction(in boolean v);
     void setDisplayTouch(in boolean v);
     void setControlIllumination(in boolean v);
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
index 7a43d7b..175e310 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
@@ -414,41 +414,60 @@
     return ndk::ScopedAStatus::ok();
 }
 
-bool FakeFingerprintEngine::getSensorLocationConfig(SensorLocation& out) {
-    auto loc = Fingerprint::cfg().get<std::string>("sensor_location");
+bool FakeFingerprintEngine::getSensorLocationConfig(std::vector<SensorLocation>& out) {
+    auto locStr = Fingerprint::cfg().get<std::string>("sensor_location");
     auto isValidStr = false;
-    auto dim = Util::split(loc, ":");
 
-    if (dim.size() < 3 or dim.size() > 4) {
-        if (!loc.empty()) LOG(WARNING) << "Invalid sensor location input (x:y:radius):" + loc;
-        return false;
-    } else {
-        int32_t x, y, r;
-        std::string d = "";
-        if (dim.size() >= 3) {
-            isValidStr = ParseInt(dim[0], &x) && ParseInt(dim[1], &y) && ParseInt(dim[2], &r);
+    // sensor_location format: x:y:r:d,x:y:r:d,...
+    //   x: x location in pixel, y: y location in pixel, r: radus in pixel, d:display in string
+    auto locations = Util::split(locStr, ",");
+    for (int i = 0; i < locations.size(); i++) {
+        auto loc = locations[i];
+
+        // expect loc in the format: x:y:r  or x:y:d:r
+        auto dim = Util::split(loc, ":");
+
+        if (dim.size() < 3) {
+            if (!loc.empty()) LOG(WARNING) << "Invalid sensor location input (x:y:radius):" + loc;
+            out.clear();
+            return false;
+        } else {
+            int32_t x, y, r;
+            std::string d = "";
+            if (dim.size() >= 3) {
+                isValidStr = ParseInt(dim[0], &x) && ParseInt(dim[1], &y) && ParseInt(dim[2], &r);
+            }
+            if (dim.size() >= 4) {
+                for (int i = 3; i < dim.size(); i++) {
+                    if (i > 3) d += ':';
+                    d += dim[i];
+                }
+            }
+            if (isValidStr) {
+                out.push_back(SensorLocation{.sensorLocationX = x,
+                                             .sensorLocationY = y,
+                                             .sensorRadius = r,
+                                             .display = d});
+            }
         }
-        if (dim.size() >= 4) {
-            d = dim[3];
+    }
+
+    LOG(INFO) << "getSensorLocationConfig: isValidStr=" << isValidStr << " locStr=" << locStr;
+    if (isValidStr) {
+        for (auto loc : out) {
+            LOG(INFO) << loc.toString();
         }
-        if (isValidStr)
-            out = {.sensorLocationX = x, .sensorLocationY = y, .sensorRadius = r, .display = d};
-
-        return isValidStr;
-    }
-}
-SensorLocation FakeFingerprintEngine::getSensorLocation() {
-    SensorLocation location;
-
-    if (getSensorLocationConfig(location)) {
-        return location;
     } else {
-        return defaultSensorLocation();
+        out.clear();
     }
+
+    return isValidStr;
 }
 
-SensorLocation FakeFingerprintEngine::defaultSensorLocation() {
-    return SensorLocation();
+void FakeFingerprintEngine::getSensorLocation(std::vector<SensorLocation>& location) {
+    if (!getSensorLocationConfig(location)) {
+        getDefaultSensorLocation(location);
+    }
 }
 
 std::pair<AcquiredInfo, int32_t> FakeFingerprintEngine::convertAcquiredInfo(int32_t code) {
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
index acb792d..e823d75 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
@@ -26,12 +26,17 @@
 using namespace ::android::fingerprint::virt;
 
 namespace aidl::android::hardware::biometrics::fingerprint {
+SensorLocation FakeFingerprintEngineSide::defaultLocation[] = {
+        // default to CF display
+        {.sensorLocationX = 0, 200, 90, "local:4619827353912518656"}};
 
 FakeFingerprintEngineSide::FakeFingerprintEngineSide() : FakeFingerprintEngine() {}
 
-SensorLocation FakeFingerprintEngineSide::defaultSensorLocation() {
-    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
-                          .sensorLocationY = defaultSensorLocationY,
-                          .sensorRadius = defaultSensorRadius};
+void FakeFingerprintEngineSide::getDefaultSensorLocation(
+        std::vector<SensorLocation>& sensorLocation) {
+    for (int i = 0; i < (sizeof(defaultLocation) / sizeof(defaultLocation[0])); i++) {
+        sensorLocation.push_back(defaultLocation[i]);
+    }
 }
+
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
index 496b5e3..f2d5687 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
@@ -34,10 +34,14 @@
 FakeFingerprintEngineUdfps::FakeFingerprintEngineUdfps()
     : FakeFingerprintEngine(), mPointerDownTime(0), mUiReadyTime(0) {}
 
-SensorLocation FakeFingerprintEngineUdfps::defaultSensorLocation() {
-    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
-                          .sensorLocationY = defaultSensorLocationY,
-                          .sensorRadius = defaultSensorRadius};
+void FakeFingerprintEngineUdfps::getDefaultSensorLocation(
+        std::vector<SensorLocation>& sensorLocation) {
+    sensorLocation.clear();
+    sensorLocation.push_back(SensorLocation{
+            .sensorLocationX = defaultSensorLocationX,
+            .sensorLocationY = defaultSensorLocationY,
+            .sensorRadius = defaultSensorRadius,
+    });
 }
 
 ndk::ScopedAStatus FakeFingerprintEngineUdfps::onPointerDownImpl(int32_t /*pointerId*/,
diff --git a/biometrics/fingerprint/aidl/default/Fingerprint.cpp b/biometrics/fingerprint/aidl/default/Fingerprint.cpp
index 143e231..6d39e12 100644
--- a/biometrics/fingerprint/aidl/default/Fingerprint.cpp
+++ b/biometrics/fingerprint/aidl/default/Fingerprint.cpp
@@ -74,7 +74,7 @@
     auto sensorId = Fingerprint::cfg().get<std::int32_t>("sensor_id");
     auto sensorStrength = Fingerprint::cfg().get<std::int32_t>("sensor_strength");
     auto maxEnrollments = Fingerprint::cfg().get<std::int32_t>("max_enrollments");
-    auto navigationGuesture = Fingerprint::cfg().get<bool>("navigation_guesture");
+    auto navigationGesture = Fingerprint::cfg().get<bool>("navigation_gesture");
     auto detectInteraction = Fingerprint::cfg().get<bool>("detect_interaction");
     auto displayTouch = Fingerprint::cfg().get<bool>("display_touch");
     auto controlIllumination = Fingerprint::cfg().get<bool>("control_illumination");
@@ -82,19 +82,15 @@
     common::CommonProps commonProps = {sensorId, (common::SensorStrength)sensorStrength,
                                        maxEnrollments, componentInfo};
 
-    SensorLocation sensorLocation = mEngine->getSensorLocation();
+    std::vector<SensorLocation> sensorLocation;
+    mEngine->getSensorLocation(sensorLocation);
+    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType);
+    for (auto location : sensorLocation) {
+        LOG(INFO) << "sensor location:  " << location.toString();
+    }
 
-    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType)
-              << " location:" << sensorLocation.toString();
-
-    *out = {{commonProps,
-             mSensorType,
-             {sensorLocation},
-             navigationGuesture,
-             detectInteraction,
-             displayTouch,
-             controlIllumination,
-             std::nullopt}};
+    *out = {{commonProps, mSensorType, sensorLocation, navigationGesture, detectInteraction,
+             displayTouch, controlIllumination, std::nullopt}};
     return ndk::ScopedAStatus::ok();
 }
 
@@ -204,7 +200,7 @@
     RESET_CONFIG_O(sensor_id);
     RESET_CONFIG_O(sensor_strength);
     RESET_CONFIG_O(max_enrollments);
-    RESET_CONFIG_O(navigation_guesture);
+    RESET_CONFIG_O(navigation_gesture);
     RESET_CONFIG_O(detect_interaction);
     RESET_CONFIG_O(display_touch);
     RESET_CONFIG_O(control_illumination);
diff --git a/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp b/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
index 82c5403..2a87a55 100644
--- a/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
+++ b/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
@@ -56,7 +56,7 @@
 CREATE_GETTER_SETTER_WRAPPER(operation_detect_interaction_duration, OptInt32)
 CREATE_GETTER_SETTER_WRAPPER(operation_detect_interaction_acquired, OptString)
 CREATE_GETTER_SETTER_WRAPPER(max_enrollments, OptBool)
-CREATE_GETTER_SETTER_WRAPPER(navigation_guesture, OptBool)
+CREATE_GETTER_SETTER_WRAPPER(navigation_gesture, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(detect_interaction, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(display_touch, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(control_illumination, OptBool)
@@ -90,7 +90,7 @@
         {NGS(operation_detect_interaction_duration), &Config::parseInt32, "10"},
         {NGS(operation_detect_interaction_acquired), &Config::parseString, "1"},
         {NGS(max_enrollments), &Config::parseInt32, "5"},
-        {NGS(navigation_guesture), &Config::parseBool, "false"},
+        {NGS(navigation_gesture), &Config::parseBool, "false"},
         {NGS(detect_interaction), &Config::parseBool, "false"},
         {NGS(display_touch), &Config::parseBool, "true"},
         {NGS(control_illumination), &Config::parseBool, "false"},
diff --git a/biometrics/fingerprint/aidl/default/VirtualHal.cpp b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
index d161765..7e0d40b 100644
--- a/biometrics/fingerprint/aidl/default/VirtualHal.cpp
+++ b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
@@ -266,9 +266,9 @@
     return ndk::ScopedAStatus::ok();
 }
 
-::ndk::ScopedAStatus VirtualHal::setNavigationGuesture(bool in_v) {
+::ndk::ScopedAStatus VirtualHal::setNavigationGesture(bool in_v) {
     Fingerprint::cfg().sourcedFromAidl();
-    Fingerprint::cfg().set<bool>("navigation_guesture", in_v);
+    Fingerprint::cfg().set<bool>("navigation_gesture", in_v);
     return ndk::ScopedAStatus::ok();
 }
 
@@ -338,4 +338,13 @@
     *pFp = mFp;
     return ndk::ScopedAStatus::ok();
 }
+
+binder_status_t VirtualHal::dump(int fd, const char** args, uint32_t nargs) {
+    return mFp->dump(fd, args, nargs);
+}
+
+binder_status_t VirtualHal::handleShellCommand(int in, int out, int err, const char** args,
+                                               uint32_t numArgs) {
+    return mFp->handleShellCommand(in, out, err, args, numArgs);
+}
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt b/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
index ad6f9e0..0d31768 100644
--- a/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
+++ b/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
@@ -75,9 +75,9 @@
     prop_name: "persist.vendor.fingerprint.virtual.max_enrollments"
   }
   prop {
-    api_name: "navigation_guesture"
+    api_name: "navigation_gesture"
     access: ReadWrite
-    prop_name: "persist.vendor.fingerprint.virtual.navigation_guesture"
+    prop_name: "persist.vendor.fingerprint.virtual.navigation_gesture"
   }
   prop {
     api_name: "next_enrollment"
diff --git a/biometrics/fingerprint/aidl/default/fingerprint.sysprop b/biometrics/fingerprint/aidl/default/fingerprint.sysprop
index 1d64c48..7582329 100644
--- a/biometrics/fingerprint/aidl/default/fingerprint.sysprop
+++ b/biometrics/fingerprint/aidl/default/fingerprint.sysprop
@@ -149,7 +149,8 @@
 }
 
 # sensor location
-#    <x>:<y>:<radius> in pixel
+#    <display1>[,display2] ...
+#       display format: <x>:<y>:<radius>[:displayString]
 prop {
     prop_name: "persist.vendor.fingerprint.virtual.sensor_location"
     type: String
@@ -218,13 +219,13 @@
     api_name: "max_enrollments"
 }
 
-# whether support navigation guestures (default: false)
+# whether support navigation gestures (default: false)
 prop {
-    prop_name: "persist.vendor.fingerprint.virtual.navigation_guesture"
+    prop_name: "persist.vendor.fingerprint.virtual.navigation_gesture"
     type: Boolean
     scope: Public
     access: ReadWrite
-    api_name: "navigation_guesture"
+    api_name: "navigation_gesture"
 }
 
 # whether support detect interaction (default: false)
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
index 362d0df..bb8fd40 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
@@ -53,7 +53,7 @@
     void getAuthenticatorIdImpl(ISessionCallback* cb);
     void invalidateAuthenticatorIdImpl(ISessionCallback* cb);
     void resetLockoutImpl(ISessionCallback* cb, const keymaster::HardwareAuthToken& /*hat*/);
-    bool getSensorLocationConfig(SensorLocation& out);
+    bool getSensorLocationConfig(std::vector<SensorLocation>& out);
 
     virtual ndk::ScopedAStatus onPointerDownImpl(int32_t pointerId, int32_t x, int32_t y,
                                                  float minor, float major);
@@ -62,9 +62,9 @@
 
     virtual ndk::ScopedAStatus onUiReadyImpl();
 
-    virtual SensorLocation getSensorLocation();
+    virtual void getSensorLocation(std::vector<SensorLocation>& loc);
 
-    virtual SensorLocation defaultSensorLocation();
+    virtual void getDefaultSensorLocation(std::vector<SensorLocation>&) {}
 
     virtual void fingerDownAction();
 
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
index 14d5399..12091ee 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
@@ -23,6 +23,8 @@
 
 // A fake engine that is backed by system properties instead of hardware.
 class FakeFingerprintEngineRear : public FakeFingerprintEngine {
+    static SensorLocation defaultSensorLocation[];
+
   public:
     FakeFingerprintEngineRear() : FakeFingerprintEngine() {}
     ~FakeFingerprintEngineRear() {}
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
index 67a3ebc..aa09327 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
@@ -24,14 +24,12 @@
 // A fake engine that is backed by system properties instead of hardware.
 class FakeFingerprintEngineSide : public FakeFingerprintEngine {
   public:
-    static constexpr int32_t defaultSensorLocationX = 0;
-    static constexpr int32_t defaultSensorLocationY = 600;
-    static constexpr int32_t defaultSensorRadius = 150;
+    static SensorLocation defaultLocation[];
+
+    void getDefaultSensorLocation(std::vector<SensorLocation>& sensorLocation) override;
 
     FakeFingerprintEngineSide();
     ~FakeFingerprintEngineSide() {}
-
-    virtual SensorLocation defaultSensorLocation() override;
 };
 
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
index 2270eca..75f1971 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
@@ -40,7 +40,7 @@
 
     ndk::ScopedAStatus onUiReadyImpl() override;
 
-    SensorLocation defaultSensorLocation() override;
+    void getDefaultSensorLocation(std::vector<SensorLocation>& sensorLocation) override;
 
     void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
                        int64_t operationId, const keymaster::HardwareAuthToken& hat);
diff --git a/biometrics/fingerprint/aidl/default/include/VirtualHal.h b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
index 5488383..dd77888 100644
--- a/biometrics/fingerprint/aidl/default/include/VirtualHal.h
+++ b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
@@ -63,13 +63,16 @@
     ::ndk::ScopedAStatus setSensorLocation(
             const ::aidl::android::hardware::biometrics::fingerprint::SensorLocation& in_loc)
             override;
-    ::ndk::ScopedAStatus setNavigationGuesture(bool in_v) override;
+    ::ndk::ScopedAStatus setNavigationGesture(bool in_v) override;
     ::ndk::ScopedAStatus setDetectInteraction(bool in_v) override;
     ::ndk::ScopedAStatus setDisplayTouch(bool in_v) override;
     ::ndk::ScopedAStatus setControlIllumination(bool in_v) override;
     ::ndk::ScopedAStatus getFingerprintHal(
             std::shared_ptr<::aidl::android::hardware::biometrics::fingerprint::IFingerprint>*
                     _aidl_return);
+    binder_status_t dump(int fd, const char** args, uint32_t nargs);
+    binder_status_t handleShellCommand(int in, int out, int err, const char** args,
+                                       uint32_t numArgs);
 
   private:
     OptIntVec intVec2OptIntVec(const std::vector<int32_t>& intVec);
diff --git a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
index eb45f98..ea0824d 100644
--- a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
@@ -112,30 +112,52 @@
             sc.sensorRadius == FakeFingerprintEngineUdfps::defaultSensorRadius && sc.display == "");
 }
 
-TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOk) {
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkSimple) {
     auto loc = "100:200:30";
     Fingerprint::cfg().set<std::string>("sensor_location", loc);
-    SensorLocation sc = mEngine.getSensorLocation();
-    ASSERT_TRUE(sc.sensorLocationX == 100);
-    ASSERT_TRUE(sc.sensorLocationY == 200);
-    ASSERT_TRUE(sc.sensorRadius == 30);
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+}
 
-    loc = "100:200:30:screen1";
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkWithOneDisplay) {
+    auto loc = "100:200:30:screen1";
     Fingerprint::cfg().set<std::string>("sensor_location", loc);
-    sc = mEngine.getSensorLocation();
-    ASSERT_TRUE(sc.sensorLocationX == 100);
-    ASSERT_TRUE(sc.sensorLocationY == 200);
-    ASSERT_TRUE(sc.sensorRadius == 30);
-    ASSERT_TRUE(sc.display == "screen1");
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+    ASSERT_TRUE(sc[0].display == "screen1");
+}
+
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkWithMultipleDisplays) {
+    auto loc = "100:200:30:screen1,200:400:60:screen2";
+    Fingerprint::cfg().set<std::string>("sensor_location", loc);
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc.size() == 2);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+    ASSERT_TRUE(sc[0].display == "screen1");
+    ASSERT_TRUE(sc[1].sensorLocationX == 200);
+    ASSERT_TRUE(sc[1].sensorLocationY == 400);
+    ASSERT_TRUE(sc[1].sensorRadius == 60);
+    ASSERT_TRUE(sc[1].display == "screen2");
 }
 
 TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationBad) {
-    const std::vector<std::string> badStr{"", "100", "10:20", "10,20,5", "a:b:c"};
-    SensorLocation sc;
+    const std::vector<std::string> badStr{
+            "", "100", "10:20", "10,20,5", "a:b:c", "10:20:30:d1,40", "10:20:30:d1,40:50"};
+    std::vector<SensorLocation> sc;
     for (const auto& s : badStr) {
         Fingerprint::cfg().set<std::string>("sensor_location", s);
-        sc = mEngine.getSensorLocation();
-        ASSERT_TRUE(isDefaultLocation(sc));
+        sc.clear();
+        mEngine.getSensorLocation(sc);
+        ASSERT_TRUE(isDefaultLocation(sc[0]));
     }
 }
 
diff --git a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
index 25abffe..dd6534c 100644
--- a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
@@ -242,7 +242,7 @@
     mVhal->setLockoutEnable(false);
     mVhal->setSensorId(5);
     mVhal->setMaxEnrollmentPerUser(6);
-    mVhal->setNavigationGuesture(false);
+    mVhal->setNavigationGesture(false);
     mVhal->setDetectInteraction(false);
     mVhal->setDisplayTouch(false);
     mVhal->setControlIllumination(false);