Merge 995c63a75db6366c28b3a4c1dcb00a77cba090d4 on remote branch

Change-Id: I1c5985c85c6c82791ba4e8b4bdd72b4a2ab06996
diff --git a/Android.bp b/Android.bp
index 3b5b836..782d1b7 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,5 +1,3 @@
-
-
 cc_library_static {
     name: "libhealthd.msm",
     srcs: [
@@ -20,3 +18,38 @@
     ],
 
 }
+
+cc_library_shared {
+    name: "android.hardware.health@2.1-impl-qti",
+    stem: "android.hardware.health@2.0-impl-2.1-qti",
+    vendor: true,
+    recovery_available: true,
+
+    relative_install_path: "hw",
+
+    srcs: [
+        "healthimpl.cpp",
+    ],
+
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+
+    static_libs: [
+        "android.hardware.health@1.0-convert",
+        "libbatterymonitor",
+        "libhealthloop",
+        "libhealth2impl",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+        "android.hardware.health@2.0",
+        "android.hardware.health@2.1",
+    ],
+}
diff --git a/healthimpl.cpp b/healthimpl.cpp
new file mode 100644
index 0000000..2ad0416
--- /dev/null
+++ b/healthimpl.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define LOG_TAG "android.hardware.health@2.1-service.qti"
+
+#include <android-base/logging.h>
+#include <health/utils.h>
+#include <health2impl/Health.h>
+#include <log/log.h>
+
+using ::android::hardware::health::InitHealthdConfig;
+using ::android::hardware::health::V2_1::IHealth;
+using namespace std::literals;
+
+namespace {
+void qti_healthd_board_init(struct healthd_config *)
+{
+    int fd;
+    unsigned char retries = 50;
+
+retry:
+    if (!retries) {
+        ALOGE("Cannot open battery/capacity, fd=%d\n", fd);
+        return;
+    }
+
+    fd = open("/sys/class/power_supply/battery/capacity", 0440);
+    if (fd >= 0) {
+        ALOGI("opened battery/capacity after %d retries\n", 50 - retries);
+        close(fd);
+        return;
+    }
+
+    retries--;
+    usleep(100000);
+    goto retry;
+}
+} //anonymous namespace
+
+namespace android {
+namespace hardware {
+namespace health {
+namespace V2_1 {
+namespace implementation {
+
+class HealthImpl : public Health {
+ public:
+  HealthImpl(std::unique_ptr<healthd_config>&& config)
+    : Health(std::move(config)) {}
+};
+
+}  // namespace implementation
+}  // namespace V2_1
+}  // namespace health
+}  // namespace hardware
+}  // namespace android
+
+
+extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) {
+    using ::android::hardware::health::V2_1::implementation::HealthImpl;
+    if (instance != "default"sv) {
+        return nullptr;
+    }
+    auto config = std::make_unique<healthd_config>();
+    InitHealthdConfig(config.get());
+    qti_healthd_board_init(config.get());
+
+    return new HealthImpl(std::move(config));
+}