Fix GSI-CTS test failures on rvc-cuttlefish

Bug: 302772063
Bug: 302323260
Bug: 280967958
Bug: 302775394
Test: atest android.location.cts.gnss.GnssMeasurementWhenNoLocationTest
      atest android.location.cts.gnss.GnssLocationUpdateIntervalTest

Change-Id: Id1698594df52e7367aa8150bbac5ddc2efe83de7
diff --git a/gnss/2.1/default/Gnss.cpp b/gnss/2.1/default/Gnss.cpp
index 2b327a9..de1b4c5 100644
--- a/gnss/2.1/default/Gnss.cpp
+++ b/gnss/2.1/default/Gnss.cpp
@@ -39,8 +39,10 @@
 sp<V2_0::IGnssCallback> Gnss::sGnssCallback_2_0 = nullptr;
 sp<V1_1::IGnssCallback> Gnss::sGnssCallback_1_1 = nullptr;
 sp<V1_0::IGnssCallback> Gnss::sGnssCallback_1_0 = nullptr;
+constexpr int TTFF_MILLIS = 2200;
 
-Gnss::Gnss() : mMinIntervalMs(1000), mGnssConfiguration{new GnssConfiguration()} {}
+Gnss::Gnss()
+    : mMinIntervalMs(1000), mGnssConfiguration{new GnssConfiguration()}, mFirstFixReceived(false) {}
 
 Gnss::~Gnss() {
     stop();
@@ -58,7 +60,10 @@
         while (mIsActive == true) {
             auto svStatus = filterBlacklistedSatellitesV2_1(Utils::getMockSvInfoListV2_1());
             this->reportSvStatus(svStatus);
-
+            if (!mFirstFixReceived) {
+                std::this_thread::sleep_for(std::chrono::milliseconds(TTFF_MILLIS));
+                mFirstFixReceived = true;
+            }
             if (sGnssCallback_2_1 != nullptr || sGnssCallback_2_0 != nullptr) {
                 const auto location = Utils::getMockLocationV2_0();
                 this->reportLocation(location);
@@ -132,8 +137,9 @@
     return true;
 }
 
-Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData) {
-    // TODO implement
+Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) {
+    ALOGD("deleteAidingData. flags:%d", (int)aidingDataFlags);
+    mFirstFixReceived = false;
     return Void();
 }
 
diff --git a/gnss/2.1/default/Gnss.h b/gnss/2.1/default/Gnss.h
index bd5e6e8..7047ae1 100644
--- a/gnss/2.1/default/Gnss.h
+++ b/gnss/2.1/default/Gnss.h
@@ -106,6 +106,7 @@
     std::atomic<long> mMinIntervalMs;
     sp<GnssConfiguration> mGnssConfiguration;
     std::atomic<bool> mIsActive;
+    std::atomic<bool> mFirstFixReceived;
     std::thread mThread;
     mutable std::mutex mMutex;
     hidl_vec<GnssSvInfo> filterBlacklistedSatellitesV2_1(hidl_vec<GnssSvInfo> gnssSvInfoList);
diff --git a/gnss/2.1/default/GnssMeasurement.cpp b/gnss/2.1/default/GnssMeasurement.cpp
index df38bf9..9e13d12 100644
--- a/gnss/2.1/default/GnssMeasurement.cpp
+++ b/gnss/2.1/default/GnssMeasurement.cpp
@@ -65,15 +65,11 @@
 Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
         const sp<V2_0::IGnssMeasurementCallback>& callback, bool) {
     ALOGD("setCallback_2_0");
-    std::unique_lock<std::mutex> lock(mMutex);
-    sCallback_2_0 = callback;
-
-    if (mIsActive) {
-        ALOGW("GnssMeasurement callback already set. Resetting the callback...");
-        stop();
+    {
+        std::unique_lock<std::mutex> lock(mMutex);
+        sCallback_2_0 = callback;
     }
     start();
-
     return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
 }
 
@@ -81,15 +77,11 @@
 Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_1(
         const sp<V2_1::IGnssMeasurementCallback>& callback, bool) {
     ALOGD("setCallback_2_1");
-    std::unique_lock<std::mutex> lock(mMutex);
-    sCallback_2_1 = callback;
-
-    if (mIsActive) {
-        ALOGW("GnssMeasurement callback already set. Resetting the callback...");
-        stop();
+    {
+        std::unique_lock<std::mutex> lock(mMutex);
+        sCallback_2_1 = callback;
     }
     start();
-
     return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
 }
 
diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp
index 386090e..e943013 100644
--- a/gnss/common/utils/default/Utils.cpp
+++ b/gnss/common/utils/default/Utils.cpp
@@ -150,7 +150,8 @@
             .verticalAccuracyMeters = kMockVerticalAccuracyMeters,
             .speedAccuracyMetersPerSecond = kMockSpeedAccuracyMetersPerSecond,
             .bearingAccuracyDegrees = kMockBearingAccuracyDegrees,
-            .timestamp = kMockTimestamp};
+            .timestamp =
+                    static_cast<int64_t>(kMockTimestamp + ::android::elapsedRealtimeNano() / 1e6)};
     return location;
 }