diff --git a/configs/framework_compatibility_matrix.xml b/configs/framework_compatibility_matrix.xml
index 4d15ae9..f670a77 100644
--- a/configs/framework_compatibility_matrix.xml
+++ b/configs/framework_compatibility_matrix.xml
@@ -106,6 +106,26 @@
default
+
+ vendor.lineage.livedisplay
+ 2.0
+
+ IAdaptiveBacklight
+ default
+
+
+ ISunlightEnhancement
+ default
+
+
+
+ vendor.lineage.fastcharge
+ 1.0
+
+ IFastCharge
+ default
+
+
android.hardware.wifi.supplicant
1.0-4
diff --git a/configs/manifest.xml b/configs/manifest.xml
index 75bd429..f90cd73 100644
--- a/configs/manifest.xml
+++ b/configs/manifest.xml
@@ -295,6 +295,21 @@
default
+
+ vendor.lineage.livedisplay
+ hwbinder
+ 2.0
+
+ IAdaptiveBacklight
+ default
+
+
+ ISunlightEnhancement
+ default
+
+ @2.0::IAdaptiveBacklight/default
+ @2.0::ISunlightEnhancement/default
+
vendor.qti.hardware.radio.am
hwbinder
diff --git a/livedisplay/AdaptiveBacklight.cpp b/livedisplay/AdaptiveBacklight.cpp
new file mode 100644
index 0000000..42200af
--- /dev/null
+++ b/livedisplay/AdaptiveBacklight.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+
+#include
+
+#include "AdaptiveBacklight.h"
+
+using android::base::ReadFileToString;
+using android::base::Trim;
+using android::base::WriteStringToFile;
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace samsung {
+
+static constexpr const char* kBacklightPath = "/sys/class/lcd/panel/alpm";
+
+bool AdaptiveBacklight::isSupported() {
+ std::fstream backlight(kBacklightPath, backlight.in | backlight.out);
+ return backlight.good();
+}
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow.
+Return AdaptiveBacklight::isEnabled() {
+ std::string tmp;
+ int32_t contents = 0;
+
+ if (ReadFileToString(kBacklightPath, &tmp)) {
+ contents = std::stoi(Trim(tmp));
+ }
+
+ return contents > 0;
+}
+
+Return AdaptiveBacklight::setEnabled(bool enabled) {
+ return WriteStringToFile(enabled ? "2" : "0", kBacklightPath, true);
+}
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
diff --git a/livedisplay/AdaptiveBacklight.h b/livedisplay/AdaptiveBacklight.h
new file mode 100644
index 0000000..793f101
--- /dev/null
+++ b/livedisplay/AdaptiveBacklight.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2019 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H
+#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H
+
+#include
+#include
+#include
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace samsung {
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+class AdaptiveBacklight : public IAdaptiveBacklight {
+ public:
+ bool isSupported();
+
+ // Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow.
+ Return isEnabled() override;
+ Return setEnabled(bool enabled) override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+};
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H
diff --git a/livedisplay/Android.bp b/livedisplay/Android.bp
new file mode 100644
index 0000000..7e2cdbf
--- /dev/null
+++ b/livedisplay/Android.bp
@@ -0,0 +1,33 @@
+// Copyright (C) 2019 The LineageOS Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_binary {
+ name: "vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125",
+ defaults: ["hidl_defaults"],
+ init_rc: ["vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125.rc"],
+ relative_install_path: "hw",
+ srcs: [
+ "AdaptiveBacklight.cpp",
+ "SunlightEnhancement.cpp",
+ "service.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "libutils",
+ "vendor.lineage.livedisplay@2.0",
+ ],
+ vendor: true,
+}
diff --git a/livedisplay/SunlightEnhancement.cpp b/livedisplay/SunlightEnhancement.cpp
new file mode 100644
index 0000000..cf70b92
--- /dev/null
+++ b/livedisplay/SunlightEnhancement.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+
+#include
+
+#include "SunlightEnhancement.h"
+
+using android::base::ReadFileToString;
+using android::base::Trim;
+using android::base::WriteStringToFile;
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace samsung {
+
+static constexpr const char* kBrightnessPath = "/sys/class/backlight/panel0-backlight/brightness";
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow.
+bool SunlightEnhancement::isSupported() {
+ std::fstream brightness(kBrightnessPath, brightness.in | brightness.out);
+ return brightness.good();
+}
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow.
+Return SunlightEnhancement::isEnabled() {
+ std::string brightness;
+ ReadFileToString(kBrightnessPath, &brightness);
+ return brightness == "486";
+}
+
+Return SunlightEnhancement::setEnabled(bool enabled) {
+ if (enabled) {
+ ReadFileToString(kBrightnessPath, &previous_brightness);
+ return WriteStringToFile("486", kBrightnessPath, true);
+ } else if (!previous_brightness.empty()) {
+ return WriteStringToFile(previous_brightness, kBrightnessPath, true);
+ }
+ return true;
+}
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
diff --git a/livedisplay/SunlightEnhancement.h b/livedisplay/SunlightEnhancement.h
new file mode 100644
index 0000000..b49975f
--- /dev/null
+++ b/livedisplay/SunlightEnhancement.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H
+#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H
+
+#include
+#include
+#include
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace samsung {
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+class SunlightEnhancement : public ISunlightEnhancement {
+ public:
+ bool isSupported();
+
+ // Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow.
+ Return isEnabled() override;
+ Return setEnabled(bool enabled) override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+ private:
+ std::string previous_brightness;
+};
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H
diff --git a/livedisplay/service.cpp b/livedisplay/service.cpp
new file mode 100644
index 0000000..78a0241
--- /dev/null
+++ b/livedisplay/service.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef LIVES_IN_SYSTEM
+#define LOG_TAG "lineage.livedisplay@2.0-service.samsung-qcom.sm7125"
+#else
+#define LOG_TAG "vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125"
+#endif
+
+#include
+#include
+#include
+
+#include "AdaptiveBacklight.h"
+#include "SunlightEnhancement.h"
+
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+using android::sp;
+using android::status_t;
+using android::OK;
+
+using vendor::lineage::livedisplay::V2_0::samsung::AdaptiveBacklight;
+using vendor::lineage::livedisplay::V2_0::samsung::SunlightEnhancement;
+
+int main() {
+ sp adaptiveBacklight;
+ sp sunlightEnhancement;
+ status_t status;
+
+ LOG(INFO) << "LiveDisplay HAL service is starting.";
+
+ adaptiveBacklight = new AdaptiveBacklight();
+ if (adaptiveBacklight == nullptr) {
+ LOG(ERROR)
+ << "Can not create an instance of LiveDisplay HAL AdaptiveBacklight Iface, exiting.";
+ goto shutdown;
+ }
+
+
+ sunlightEnhancement = new SunlightEnhancement();
+ if (sunlightEnhancement == nullptr) {
+ LOG(ERROR)
+ << "Can not create an instance of LiveDisplay HAL SunlightEnhancement Iface, exiting.";
+ goto shutdown;
+ }
+
+
+ configureRpcThreadpool(1, true /*callerWillJoin*/);
+
+ if (adaptiveBacklight->isSupported()) {
+ status = adaptiveBacklight->registerAsService();
+ if (status != OK) {
+ LOG(ERROR) << "Could not register service for LiveDisplay HAL AdaptiveBacklight Iface ("
+ << status << ")";
+ goto shutdown;
+ }
+ }
+
+
+ if (sunlightEnhancement->isSupported()) {
+ status = sunlightEnhancement->registerAsService();
+ if (status != OK) {
+ LOG(ERROR)
+ << "Could not register service for LiveDisplay HAL SunlightEnhancement Iface ("
+ << status << ")";
+ goto shutdown;
+ }
+ }
+
+
+ LOG(INFO) << "LiveDisplay HAL service is ready.";
+ joinRpcThreadpool();
+// Should not pass this line
+
+shutdown:
+ // In normal operation, we don't expect the thread pool to shutdown
+ LOG(ERROR) << "LiveDisplay HAL service is shutting down.";
+ return 1;
+}
diff --git a/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125.rc b/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125.rc
new file mode 100644
index 0000000..9d9084b
--- /dev/null
+++ b/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125.rc
@@ -0,0 +1,7 @@
+on post-fs-data
+ mkdir /data/vendor/display 0770 system system
+
+service vendor.livedisplay-hal-2-0-samsung-qcom.sm7125 /vendor/bin/hw/vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125
+ class late_start
+ user system
+ group system
diff --git a/sepolicy/vendor/hal_lineage_livedisplay_sysfs.te b/sepolicy/vendor/hal_lineage_livedisplay_sysfs.te
index 095d5aa..c9e4043 100644
--- a/sepolicy/vendor/hal_lineage_livedisplay_sysfs.te
+++ b/sepolicy/vendor/hal_lineage_livedisplay_sysfs.te
@@ -8,3 +8,4 @@ allow hal_lineage_livedisplay_sysfs vendor_sysfs_graphics:file write;
allow hal_lineage_livedisplay_sysfs vendor_display_vendor_data_file:dir { write add_name search };
allow hal_lineage_livedisplay_sysfs vendor_display_vendor_data_file:file { read write open create getattr };
+