powerstats: Add GPS state residency

Bug: 181577366
Test: dumpsys android.hardware.power.stats.IPowerStats/default
Change-Id: I0fa4356542a838618e712e9b0abbf02b99db7f3a
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
index cdf992f..f4c2dd1 100644
--- a/conf/init.gs101.rc
+++ b/conf/init.gs101.rc
@@ -169,6 +169,9 @@
     # Charge stats (write 0)
     chown system system /sys/class/power_supply/battery/charge_stats
 
+    # Power Stats HAL
+    chown system system /dev/bbd_pwrstat
+
     # start watchdogd
     start watchdogd
 
diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp
index d9d435b..87dc864 100644
--- a/powerstats/Gs101CommonDataProviders.cpp
+++ b/powerstats/Gs101CommonDataProviders.cpp
@@ -494,6 +494,36 @@
 
 void addGNSS(std::shared_ptr<PowerStats> p)
 {
+    // A constant to represent the number of microseconds in one millisecond.
+    const int US_TO_MS = 1000;
+
+    // gnss power_stats are reported in microseconds. The transform function
+    // converts microseconds to milliseconds.
+    std::function<uint64_t(uint64_t)> gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; };
+
+    const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "duration_usec:",
+        .totalTimeTransform = gnssUsToMs,
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "last_entry_timestamp_usec:",
+        .lastEntryTransform = gnssUsToMs,
+    };
+
+    const std::vector<std::pair<std::string, std::string>> gnssStateHeaders = {
+        std::make_pair("ON", "GPS_ON:"),
+        std::make_pair("OFF", "GPS_OFF:"),
+    };
+
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders),
+            "GPS", "");
+
+    p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+            "/dev/bbd_pwrstat", cfgs));
+
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
             EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
 }