diff --git a/common.mk b/common.mk
index 155277e..5d81db9 100644
--- a/common.mk
+++ b/common.mk
@@ -193,6 +193,10 @@ PRODUCT_PACKAGES += \
android.hardware.keymaster@4.0-service.samsung \
libkeymaster4_1support.vendor
+# LiveDisplay
+PRODUCT_PACKAGES += \
+ vendor.lineage.livedisplay@2.0-service.samsung-qcom.sm7125
+
# Media
PRODUCT_COPY_FILES += \
frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
diff --git a/configs/framework_compatibility_matrix.xml b/configs/framework_compatibility_matrix.xml
index d7df634..16e5057 100644
--- a/configs/framework_compatibility_matrix.xml
+++ b/configs/framework_compatibility_matrix.xml
@@ -167,6 +167,22 @@
default
+
+ vendor.lineage.livedisplay
+ 2.0
+
+ IAdaptiveBacklight
+ default
+
+
+ IDisplayModes
+ default
+
+
+ ISunlightEnhancement
+ default
+
+
vendor.lineage.fastcharge
1.0
diff --git a/configs/manifest.xml b/configs/manifest.xml
index 717898a..df2c601 100644
--- a/configs/manifest.xml
+++ b/configs/manifest.xml
@@ -313,6 +313,26 @@
@1.0::IQSEECom/default
+
+ vendor.lineage.livedisplay
+ hwbinder
+ 2.0
+
+ IAdaptiveBacklight
+ default
+
+
+ IDisplayModes
+ default
+
+
+ ISunlightEnhancement
+ default
+
+ @2.0::IAdaptiveBacklight/default
+ @2.0::IDisplayModes/default
+ @2.0::ISunlightEnhancement/default
+
vendor.lineage.touch
hwbinder
diff --git a/livedisplay/AdaptiveBacklight.cpp b/livedisplay/AdaptiveBacklight.cpp
new file mode 100644
index 0000000..986ab12
--- /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/power_reduce";
+
+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 ? "1" : "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..93ec875
--- /dev/null
+++ b/livedisplay/Android.bp
@@ -0,0 +1,34 @@
+// 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",
+ "DisplayModes.cpp",
+ "SunlightEnhancement.cpp",
+ "service.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "libutils",
+ "vendor.lineage.livedisplay@2.0",
+ ],
+ vendor: true,
+}
diff --git a/livedisplay/DisplayModes.cpp b/livedisplay/DisplayModes.cpp
new file mode 100644
index 0000000..f14e93d
--- /dev/null
+++ b/livedisplay/DisplayModes.cpp
@@ -0,0 +1,140 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "DisplayModesService"
+
+#include "DisplayModes.h"
+#include
+#include
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace samsung {
+
+static constexpr const char* kModePath = "/sys/class/mdnie/mdnie/mode";
+static constexpr const char* kModeMaxPath = "/sys/class/mdnie/mdnie/mode_max";
+#ifdef LIVES_IN_SYSTEM
+static constexpr const char* kDefaultPath = "/data/misc/display/.displaymodedefault";
+#else
+static constexpr const char* kDefaultPath = "/data/vendor/display/.displaymodedefault";
+#endif
+
+const std::map DisplayModes::kModeMap = {
+ // clang-format off
+ {0, "Dynamic"},
+ {1, "Standard"},
+ {2, "Natural"},
+ {3, "Cinema"},
+ {4, "Adaptive"},
+ {5, "Reading"},
+ // clang-format on
+};
+
+DisplayModes::DisplayModes() : mDefaultModeId(0) {
+ std::ifstream defaultFile(kDefaultPath);
+ int value;
+
+ defaultFile >> value;
+ LOG(DEBUG) << "Default file read result " << value << " fail " << defaultFile.fail();
+ if (defaultFile.fail()) {
+ return;
+ }
+
+ for (const auto& entry : kModeMap) {
+ if (value == entry.first) {
+ mDefaultModeId = entry.first;
+ break;
+ }
+ }
+
+ setDisplayMode(mDefaultModeId, false);
+}
+
+bool DisplayModes::isSupported() {
+ std::ofstream modeFile(kModePath);
+ return modeFile.good();
+}
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow.
+Return DisplayModes::getDisplayModes(getDisplayModes_cb resultCb) {
+ std::ifstream maxModeFile(kModeMaxPath);
+ int value;
+ std::vector modes;
+ if (!maxModeFile.fail()) {
+ maxModeFile >> value;
+ } else {
+ value = kModeMap.size();
+ }
+ for (const auto& entry : kModeMap) {
+ if (entry.first < value) modes.push_back({entry.first, entry.second});
+ }
+ resultCb(modes);
+ return Void();
+}
+
+Return DisplayModes::getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) {
+ int32_t currentModeId = mDefaultModeId;
+ std::ifstream modeFile(kModePath);
+ int value;
+ modeFile >> value;
+ if (!modeFile.fail()) {
+ for (const auto& entry : kModeMap) {
+ if (value == entry.first) {
+ currentModeId = entry.first;
+ break;
+ }
+ }
+ }
+ resultCb({currentModeId, kModeMap.at(currentModeId)});
+ return Void();
+}
+
+Return DisplayModes::getDefaultDisplayMode(getDefaultDisplayMode_cb resultCb) {
+ resultCb({mDefaultModeId, kModeMap.at(mDefaultModeId)});
+ return Void();
+}
+
+Return DisplayModes::setDisplayMode(int32_t modeID, bool makeDefault) {
+ const auto iter = kModeMap.find(modeID);
+ if (iter == kModeMap.end()) {
+ return false;
+ }
+ std::ofstream modeFile(kModePath);
+ modeFile << iter->first;
+ if (modeFile.fail()) {
+ return false;
+ }
+
+ if (makeDefault) {
+ std::ofstream defaultFile(kDefaultPath);
+ defaultFile << iter->first;
+ if (defaultFile.fail()) {
+ return false;
+ }
+ mDefaultModeId = iter->first;
+ }
+ return true;
+}
+
+// Methods from ::android::hidl::base::V1_0::IBase follow.
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
diff --git a/livedisplay/DisplayModes.h b/livedisplay/DisplayModes.h
new file mode 100644
index 0000000..149edf3
--- /dev/null
+++ b/livedisplay/DisplayModes.h
@@ -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.
+ */
+
+#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_H
+#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_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 DisplayModes : public IDisplayModes {
+ public:
+ DisplayModes();
+ bool isSupported();
+
+ // Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow.
+ Return getDisplayModes(getDisplayModes_cb resultCb) override;
+ Return getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) override;
+ Return getDefaultDisplayMode(getDefaultDisplayMode_cb resultCb) override;
+ Return setDisplayMode(int32_t modeID, bool makeDefault) override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+ private:
+ static const std::map kModeMap;
+ int32_t mDefaultModeId;
+};
+
+} // namespace samsung
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_H
diff --git a/livedisplay/SunlightEnhancement.cpp b/livedisplay/SunlightEnhancement.cpp
new file mode 100644
index 0000000..077672e
--- /dev/null
+++ b/livedisplay/SunlightEnhancement.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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* kHBMPath = "/sys/class/lcd/panel/panel/auto_brightness";
+static constexpr const char* kSREPath = "/sys/class/mdnie/mdnie/outdoor";
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow.
+bool SunlightEnhancement::isSupported() {
+ std::fstream sre(kSREPath, sre.in | sre.out);
+ std::fstream hbm(kHBMPath, hbm.in | hbm.out);
+
+ if (hbm.good()) {
+ mHasHBM = true;
+ }
+
+ return sre.good();
+}
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow.
+Return SunlightEnhancement::isEnabled() {
+ std::string tmp;
+ int32_t statusSRE = 0;
+ int32_t statusHBM = 0;
+ if (ReadFileToString(kSREPath, &tmp)) {
+ statusSRE = std::stoi(Trim(tmp));
+ }
+
+ if (mHasHBM && ReadFileToString(kHBMPath, &tmp)) {
+ statusHBM = std::stoi(Trim(tmp));
+ }
+
+ return ((statusSRE == 1 && statusHBM == 6) || statusSRE == 1);
+}
+
+Return SunlightEnhancement::setEnabled(bool enabled) {
+ if (mHasHBM) {
+ WriteStringToFile(enabled ? "6" : "0", kHBMPath, true);
+ }
+
+ return WriteStringToFile(enabled ? "1" : "0", kSREPath, 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..44b34b9
--- /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:
+ bool mHasHBM = false;
+};
+
+} // 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..e13c7f6
--- /dev/null
+++ b/livedisplay/service.cpp
@@ -0,0 +1,107 @@
+/*
+ * 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 "DisplayModes.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::DisplayModes;
+using vendor::lineage::livedisplay::V2_0::samsung::SunlightEnhancement;
+
+int main() {
+ sp adaptiveBacklight;
+ sp displayModes;
+ 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;
+ }
+
+ displayModes = new DisplayModes();
+ if (displayModes == nullptr) {
+ LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayModes 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 (displayModes->isSupported()) {
+ status = displayModes->registerAsService();
+ if (status != OK) {
+ LOG(ERROR) << "Could not register service for LiveDisplay HAL DisplayModes 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/file.te b/sepolicy/vendor/file.te
index 6727844..af69b96 100644
--- a/sepolicy/vendor/file.te
+++ b/sepolicy/vendor/file.te
@@ -11,3 +11,5 @@ type spu_file, fs_type;
allow spu_file labeledfs:filesystem associate;
type sysfs_sec_switch, fs_type, sysfs_type;
+type sysfs_mdnie_writable, fs_type, sysfs_type;
+type sysfs_lcd_writable, fs_type, sysfs_type;
diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts
index 9d4e024..755418d 100644
--- a/sepolicy/vendor/file_contexts
+++ b/sepolicy/vendor/file_contexts
@@ -5,6 +5,9 @@
# sysfs
/sys/devices/virtual/sec/switch(/.*)? u:object_r:sysfs_sec_switch:s0
+/sys/class/lcd(/.*)? -- u:object_r:sysfs_lcd_writable:s0
+/sys/devices/virtual/lcd/panel(/.*)? u:object_r:sysfs_lcd_writable:s0
+/sys/devices/virtual/mdnie(/.*)? -- u:object_r:sysfs_mdnie_writable:s0
/(vendor|system/vendor)/bin/hw/android\.hardware\.drm@1\.3-service\.widevine u:object_r:vendor_hal_drm_widevine_exec:s0
/(vendor|system/vendor)/bin/hw/android\.hardware\.sensors@2\.1-service.samsung-multihal u:object_r:hal_sensors_default_exec:s0
@@ -14,3 +17,4 @@
/(vendor|system/vendor)/bin/hw/vendor.samsung.hardware.camera.provider@4.0-service u:object_r:hal_camera_default_exec:s0
/(vendor|system/vendor)/bin/hw/vendor\.lineage\.fastcharge@1\.0-service\.samsung u:object_r:hal_lineage_fastcharge_default_exec:s0
/(vendor|system/vendor)/bin/hw/vendor\.lineage\.touch@1\.0-service\.samsung u:object_r:hal_lineage_touch_default_exec:s0
+/(vendor|system/vendor)/bin/hw/vendor\.lineage\.livedisplay@2\.0-service.samsung-qcom\.sm7125 u:object_r:hal_lineage_livedisplay_sysfs_exec:s0