Convert atracehal into lazy HAL
am: 3acd4afe09

Change-Id: Ice5a352803956433ac566ab9a69f07e552362f5a
diff --git a/health/BatteryMetricsLogger.cpp b/health/BatteryMetricsLogger.cpp
index b5e8991..58c6b58 100644
--- a/health/BatteryMetricsLogger.cpp
+++ b/health/BatteryMetricsLogger.cpp
@@ -28,19 +28,20 @@
 using android::frameworks::stats::V1_0::IStats;
 
 BatteryMetricsLogger::BatteryMetricsLogger(const char *const batt_res, const char *const batt_ocv,
-                                           int sample_period, int upload_period)
+                                           const char *const batt_avg_res, int sample_period,
+                                           int upload_period)
     : kBatteryResistance(batt_res),
       kBatteryOCV(batt_ocv),
+      kBatteryAvgResistance(batt_avg_res),
       kSamplePeriod(sample_period),
       kUploadPeriod(upload_period),
       kMaxSamples(upload_period / sample_period) {
     last_sample_ = 0;
     last_upload_ = 0;
-    num_res_samples_ = 0;
     num_samples_ = 0;
+    num_res_samples_ = 0;
     memset(min_, 0, sizeof(min_));
     memset(max_, 0, sizeof(max_));
-    accum_resistance_ = 0;
 }
 
 int64_t BatteryMetricsLogger::getTime(void) {
@@ -77,9 +78,39 @@
     return true;
 }
 
+bool BatteryMetricsLogger::uploadAverageBatteryResistance(sp<IStats> stats_client) {
+    if (strlen(kBatteryAvgResistance) == 0) {
+        LOG(INFO) << "Sysfs path for average battery resistance not specified";
+        return true;
+    }
+
+    std::string file_content;
+    int32_t batt_avg_res;
+
+    if (!android::base::ReadFileToString(kBatteryAvgResistance, &file_content)) {
+        LOG(ERROR) << "Can't read " << kBatteryAvgResistance;
+        return false;
+    }
+    std::stringstream ss(file_content);
+    if (!(ss >> batt_avg_res)) {
+        LOG(ERROR) << "Can't parse average battery resistance " << file_content;
+        return false;
+    }
+    // Upload average metric
+    BatteryHealthSnapshotArgs avg_res_ss_stats = {
+            .type = BatteryHealthSnapshotArgs::BatterySnapshotType::AVG_RESISTANCE,
+            .temperatureDeciC = 0,
+            .voltageMicroV = 0,
+            .currentMicroA = 0,
+            .openCircuitVoltageMicroV = 0,
+            .resistanceMicroOhm = batt_avg_res,
+            .levelPercent = 0};
+    stats_client->reportBatteryHealthSnapshot(avg_res_ss_stats);
+    return true;
+}
+
 bool BatteryMetricsLogger::uploadMetrics(void) {
     int64_t time = getTime();
-    int32_t avg_resistance = 0;
 
     if (last_sample_ == 0)
         return false;
@@ -87,11 +118,6 @@
     LOG(INFO) << "Uploading metrics at time " << std::to_string(time) << " w/ "
               << std::to_string(num_samples_) << " samples";
 
-    if (num_res_samples_)
-        avg_resistance = accum_resistance_ / num_res_samples_;
-
-    LOG(INFO) << "Logging metrics";
-
     sp<IStats> stats_client = IStats::tryGetService();
     if (!stats_client) {
         LOG(ERROR) << "Unable to connect to Stats service";
@@ -114,26 +140,14 @@
         uploadOutlierMetric(stats_client, static_cast<sampleType>(metric));
     }
 
-    // Upload average metric
-    BatteryHealthSnapshotArgs avg_res_ss_stats = {
-            .type = BatteryHealthSnapshotArgs::BatterySnapshotType::AVG_RESISTANCE,
-            .temperatureDeciC = 0,
-            .voltageMicroV = 0,
-            .currentMicroA = 0,
-            .openCircuitVoltageMicroV = 0,
-            .resistanceMicroOhm = avg_resistance,
-            .levelPercent = 0};
-    if (num_res_samples_) {
-        stats_client->reportBatteryHealthSnapshot(avg_res_ss_stats);
-    }
+    uploadAverageBatteryResistance(stats_client);
 
     // Clear existing data
     memset(min_, 0, sizeof(min_));
     memset(max_, 0, sizeof(max_));
-    num_res_samples_ = 0;
     num_samples_ = 0;
+    num_res_samples_ = 0;
     last_upload_ = time;
-    accum_resistance_ = 0;
     LOG(INFO) << "Finished uploading to tron";
     return true;
 }
@@ -146,17 +160,19 @@
     LOG(INFO) << "Recording a sample at time " << std::to_string(time);
 
     if (!android::base::ReadFileToString(kBatteryResistance, &resistance_str)) {
-        LOG(ERROR) << "Can't read the battery resistance";
-        resistance = 0;
-    } else if (!(resistance = stoi(resistance_str))) {
+        LOG(ERROR) << "Can't read the battery resistance from " << kBatteryResistance;
+        resistance = -INT_MAX;
+    } else if (!(std::stringstream(resistance_str) >> resistance)) {
         LOG(ERROR) << "Can't parse battery resistance value " << resistance_str;
+        resistance = -INT_MAX;
     }
 
     if (!android::base::ReadFileToString(kBatteryOCV, &ocv_str)) {
-        LOG(ERROR) << "Can't read the open-circuit voltage (ocv) value";
-        ocv = 0;
-    } else if (!(ocv = stoi(ocv_str))) {
+        LOG(ERROR) << "Can't read open-circuit voltage (ocv) value from " << kBatteryOCV;
+        ocv = -INT_MAX;
+    } else if (!(std::stringstream(ocv_str) >> ocv)) {
         LOG(ERROR) << "Can't parse open-circuit voltage (ocv) value " << ocv_str;
+        ocv = -INT_MAX;
     }
 
     int32_t sample[NUM_FIELDS] = {[TIME] = time,
@@ -167,7 +183,6 @@
                                   [SOC] = props->batteryLevel,
                                   [OCV] = ocv};
     if (props->batteryStatus != android::BATTERY_STATUS_CHARGING) {
-        accum_resistance_ += resistance;
         num_res_samples_++;
     }
 
diff --git a/health/include/pixelhealth/BatteryMetricsLogger.h b/health/include/pixelhealth/BatteryMetricsLogger.h
index bf1d840..790a6ed 100644
--- a/health/include/pixelhealth/BatteryMetricsLogger.h
+++ b/health/include/pixelhealth/BatteryMetricsLogger.h
@@ -20,13 +20,13 @@
 #include <android-base/file.h>
 #include <android-base/logging.h>
 #include <android-base/strings.h>
+#include <android/frameworks/stats/1.0/IStats.h>
 #include <batteryservice/BatteryService.h>
 #include <math.h>
 #include <time.h>
 #include <utils/Timers.h>
-#include <string>
 
-#include <android/frameworks/stats/1.0/IStats.h>
+#include <string>
 
 namespace hardware {
 namespace google {
@@ -40,7 +40,8 @@
 class BatteryMetricsLogger {
   public:
     BatteryMetricsLogger(const char *const batt_res, const char *const batt_ocv,
-                         int sample_period = TEN_MINUTES_SEC, int upload_period = ONE_DAY_SEC);
+                         const char *const batt_avg_res = "", int sample_period = TEN_MINUTES_SEC,
+                         int upload_period = ONE_DAY_SEC);
     void logBatteryProperties(struct android::BatteryProperties *props);
 
   private:
@@ -67,6 +68,7 @@
 
     const char *const kBatteryResistance;
     const char *const kBatteryOCV;
+    const char *const kBatteryAvgResistance;
     const int kSamplePeriod;
     const int kUploadPeriod;
     const int kMaxSamples;
@@ -78,16 +80,16 @@
     // min[TYPE][TYPE] is the reading of that type at that minimum event
     int32_t min_[NUM_FIELDS][NUM_FIELDS];
     int32_t max_[NUM_FIELDS][NUM_FIELDS];
-    int32_t num_res_samples_;   // number of res samples since last upload
-    int32_t num_samples_;       // number of min/max samples since last upload
-    int64_t accum_resistance_;  // accumulative resistance
-    int64_t last_sample_;       // time in seconds since boot of last sample
-    int64_t last_upload_;       // time in seconds since boot of last upload
+    int32_t num_res_samples_;  // number of res samples since last upload
+    int32_t num_samples_;      // number of min/max samples since last upload
+    int64_t last_sample_;      // time in seconds since boot of last sample
+    int64_t last_upload_;      // time in seconds since boot of last upload
 
     int64_t getTime();
     bool recordSample(struct android::BatteryProperties *props);
     bool uploadMetrics();
     bool uploadOutlierMetric(sp<IStats> stats_client, sampleType type);
+    bool uploadAverageBatteryResistance(sp<IStats> stats_client);
 };
 
 }  // namespace health
diff --git a/pixelstats/UeventListener.cpp b/pixelstats/UeventListener.cpp
index 312a8e5..4614293 100644
--- a/pixelstats/UeventListener.cpp
+++ b/pixelstats/UeventListener.cpp
@@ -32,6 +32,7 @@
 
 using android::sp;
 using android::base::ReadFileToString;
+using android::base::WriteStringToFile;
 using android::frameworks::stats::V1_0::HardwareFailed;
 using android::frameworks::stats::V1_0::IStats;
 using android::frameworks::stats::V1_0::UsbPortOverheatEvent;
@@ -231,6 +232,10 @@
         return;
     }
 
+    if (!WriteStringToFile(kChargeMetricsPath.c_str(), std::to_string(0))) {
+	ALOGE("Couldn't clear %s", kChargeMetricsPath.c_str());
+    }
+
     sp<IStats> stats_client = IStats::tryGetService();
     if (!stats_client) {
         ALOGE("Couldn't connect to IStats service");
diff --git a/power-libperfmgr/CameraMode.h b/power-libperfmgr/CameraMode.h
index 6558ce8..ce8f0c9 100644
--- a/power-libperfmgr/CameraMode.h
+++ b/power-libperfmgr/CameraMode.h
@@ -22,6 +22,7 @@
     CAMERA_STREAMING,
     CAMERA_STREAMING_1080P,
     CAMERA_STREAMING_4K,
+    CAMERA_STREAMING_SECURE,
     CAMERA_STREAMING_MAX
 };
 
diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp
index aca64ca..4a7cc8e 100644
--- a/power-libperfmgr/Power.cpp
+++ b/power-libperfmgr/Power.cpp
@@ -51,10 +51,11 @@
 constexpr char kPowerHalConfigPath[] = "/vendor/etc/powerhint.json";
 
 static const std::map<enum CameraStreamingMode, std::string> kCamStreamingHint = {
-    {CAMERA_STREAMING_OFF, "CAMERA_STREAMING_OFF"},
-    {CAMERA_STREAMING, "CAMERA_STREAMING"},
-    {CAMERA_STREAMING_1080P, "CAMERA_STREAMING_1080P"},
-    {CAMERA_STREAMING_4K, "CAMERA_STREAMING_4K"}};
+        {CAMERA_STREAMING_OFF, "CAMERA_STREAMING_OFF"},
+        {CAMERA_STREAMING, "CAMERA_STREAMING"},
+        {CAMERA_STREAMING_1080P, "CAMERA_STREAMING_1080P"},
+        {CAMERA_STREAMING_4K, "CAMERA_STREAMING_4K"},
+        {CAMERA_STREAMING_SECURE, "CAMERA_STREAMING_SECURE"}};
 
 Power::Power()
     : mHintManager(nullptr),
@@ -84,6 +85,10 @@
             ALOGI("Initialize with CAMERA_STREAMING_4K on");
             mHintManager->DoHint("CAMERA_STREAMING_4K");
             mCameraStreamingMode = CAMERA_STREAMING_4K;
+        } else if (state == "CAMERA_STREAMING_SECURE") {
+            ALOGI("Initialize with CAMERA_STREAMING_SECURE on");
+            mHintManager->DoHint("CAMERA_STREAMING_SECURE");
+            mCameraStreamingMode = CAMERA_STREAMING_SECURE;
         } else if (state == "SUSTAINED_PERFORMANCE") {
             ALOGI("Initialize with SUSTAINED_PERFORMANCE on");
             mHintManager->DoHint("SUSTAINED_PERFORMANCE");
@@ -289,8 +294,10 @@
             if ((mCameraStreamingMode != CAMERA_STREAMING_OFF)) {
                 const auto modeValue = kCamStreamingHint.at(mCameraStreamingMode);
                 mHintManager->EndHint(modeValue);
-                // Boost 1s for tear down
-                mHintManager->DoHint("CAMERA_LAUNCH", std::chrono::seconds(1));
+                if ((mCameraStreamingMode != CAMERA_STREAMING_SECURE)) {
+                    // Boost 1s for tear down if not secure streaming use case
+                    mHintManager->DoHint("CAMERA_LAUNCH", std::chrono::seconds(1));
+                }
             }
 
             if (mode != CAMERA_STREAMING_OFF) {
diff --git a/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc b/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
index fa00587..6179f6e 100644
--- a/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
+++ b/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
@@ -2,6 +2,7 @@
     class hal
     user root
     group system
+    priority -20
     interface android.hardware.power@1.0::IPower default
     interface android.hardware.power@1.1::IPower default
     interface android.hardware.power@1.2::IPower default
diff --git a/power-libperfmgr/service.cpp b/power-libperfmgr/service.cpp
index a64761c..7bcc907 100644
--- a/power-libperfmgr/service.cpp
+++ b/power-libperfmgr/service.cpp
@@ -41,7 +41,7 @@
         ALOGE("Can not create an instance of Power HAL Iface, exiting.");
         return 1;
     }
-
+    android::hardware::setMinSchedulerPolicy(service, SCHED_NORMAL, -20);
     configureRpcThreadpool(1, true /*callerWillJoin*/);
 
     status_t status = service->registerAsService();