PRODUCT_PACKAGES += \
android.hardware.light@2.0-service.samsung
+# Livedisplay
+PRODUCT_PACKAGES += \
+ vendor.lineage.livedisplay@2.0-service.universal8895
+
# Media
PRODUCT_COPY_FILES += \
frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
--- /dev/null
+BasedOnStyle: Google
+AccessModifierOffset: -2
+AllowShortFunctionsOnASingleLine: Inline
+ColumnLimit: 100
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+IndentWidth: 4
+PointerAlignment: Left
+TabWidth: 4
+UseTab: Never
+PenaltyExcessCharacter: 32
--- /dev/null
+/*
+ * 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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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 implementation {
+
+static constexpr const char* kBacklightPath = "/sys/class/lcd/panel/power_reduce";
+
+Return<bool> AdaptiveBacklight::isEnabled() {
+ std::string tmp;
+ int32_t contents = 0;
+
+ if (ReadFileToString(kBacklightPath, &tmp)) {
+ contents = std::stoi(Trim(tmp));
+ }
+
+ return contents > 0;
+}
+
+Return<bool> AdaptiveBacklight::setEnabled(bool enabled) {
+ return WriteStringToFile(enabled ? "1" : "0", kBacklightPath, true);
+}
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
--- /dev/null
+/*
+ * 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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IAdaptiveBacklight.h>
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+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:
+ Return<bool> isEnabled() override;
+ Return<bool> setEnabled(bool enabled) override;
+};
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H
--- /dev/null
+// 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.universal8895",
+ init_rc: ["vendor.lineage.livedisplay@2.0-service.universal8895.rc"],
+ defaults: ["hidl_defaults"],
+ relative_install_path: "hw",
+ vendor: true,
+ srcs: [
+ "AdaptiveBacklight.cpp",
+ "DisplayColorCalibration.cpp",
+ "ReadingEnhancement.cpp",
+ "SunlightEnhancement.cpp",
+ "service.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libdl",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "vendor.lineage.livedisplay@2.0",
+ ],
+}
--- /dev/null
+/*
+ * 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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#include "DisplayColorCalibration.h"
+
+using android::base::ReadFileToString;
+using android::base::Split;
+using android::base::Trim;
+using android::base::WriteStringToFile;
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+static constexpr const char* kColorPath = "/sys/class/mdnie/mdnie/sensorRGB";
+
+Return<int32_t> DisplayColorCalibration::getMaxValue() {
+ return 255;
+}
+
+Return<int32_t> DisplayColorCalibration::getMinValue() {
+ return 1;
+}
+
+Return<void> DisplayColorCalibration::getCalibration(getCalibration_cb resultCb) {
+ std::vector<int32_t> rgb;
+ std::string tmp;
+
+ if (ReadFileToString(kColorPath, &tmp)) {
+ std::vector<std::string> colors = Split(Trim(tmp), " ");
+ for (const std::string& color : colors) {
+ rgb.push_back(std::stoi(color));
+ }
+ }
+
+ resultCb(rgb);
+ return Void();
+}
+
+Return<bool> DisplayColorCalibration::setCalibration(const hidl_vec<int32_t>& rgb) {
+ std::string contents;
+ for (const int32_t& color : rgb) {
+ contents += std::to_string(color) + " ";
+ }
+ return WriteStringToFile(Trim(contents), kColorPath, true);
+}
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
--- /dev/null
+/*
+ * 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_DISPLAYCOLORCALIBRATION_H
+#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H
+
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IDisplayColorCalibration.h>
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+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 DisplayColorCalibration : public IDisplayColorCalibration {
+ public:
+ Return<int32_t> getMaxValue() override;
+ Return<int32_t> getMinValue() override;
+ Return<void> getCalibration(getCalibration_cb resultCb) override;
+ Return<bool> setCalibration(const hidl_vec<int32_t>& rgb) override;
+};
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H
--- /dev/null
+/*
+ * 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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#include "ReadingEnhancement.h"
+
+using android::base::ReadFileToString;
+using android::base::Trim;
+using android::base::WriteStringToFile;
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+static constexpr const char* kREPath = "/sys/class/mdnie/mdnie/accessibility";
+
+Return<bool> ReadingEnhancement::isEnabled() {
+ std::string contents;
+
+ if (ReadFileToString(kREPath, &contents)) {
+ contents = Trim(contents);
+ }
+
+ return !contents.compare("Current accessibility : DSI0 : GRAYSCALE") || !contents.compare("4");
+}
+
+Return<bool> ReadingEnhancement::setEnabled(bool enabled) {
+ return WriteStringToFile(enabled ? "4" : "0", kREPath, true);
+}
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
--- /dev/null
+/*
+ * 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_READINGENHANCEMENT_H
+#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H
+
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/IReadingEnhancement.h>
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+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 ReadingEnhancement : public IReadingEnhancement {
+ public:
+ Return<bool> isEnabled() override;
+ Return<bool> setEnabled(bool) override;
+};
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H
--- /dev/null
+/*
+ * 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 <android-base/file.h>
+#include <android-base/strings.h>
+
+#include <fstream>
+
+#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 implementation {
+
+static constexpr const char* kLUXPath = "/sys/class/mdnie/mdnie/lux";
+
+Return<bool> SunlightEnhancement::isEnabled() {
+ std::string tmp;
+ int32_t contents = 0;
+
+ if (ReadFileToString(kLUXPath, &tmp)) {
+ contents = std::stoi(Trim(tmp));
+ }
+
+ return contents > 0;
+}
+
+Return<bool> SunlightEnhancement::setEnabled(bool enabled) {
+ /* see drivers/video/fbdev/exynos/decon_7880/panels/mdnie_lite_table*, get_hbm_index */
+ return WriteStringToFile(enabled ? "40000" : "0", kLUXPath, true);
+}
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
--- /dev/null
+/*
+ * 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 <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <vendor/lineage/livedisplay/2.0/ISunlightEnhancement.h>
+
+namespace vendor {
+namespace lineage {
+namespace livedisplay {
+namespace V2_0 {
+namespace implementation {
+
+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:
+ Return<bool> isEnabled() override;
+ Return<bool> setEnabled(bool enabled) override;
+};
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace livedisplay
+} // namespace lineage
+} // namespace vendor
+
+#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H
--- /dev/null
+/*
+ * 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 "vendor.lineage.livedisplay@2.0-service.universal8895"
+
+#include <android-base/logging.h>
+#include <binder/ProcessState.h>
+#include <hidl/HidlTransportSupport.h>
+
+#include "AdaptiveBacklight.h"
+#include "DisplayColorCalibration.h"
+#include "ReadingEnhancement.h"
+#include "SunlightEnhancement.h"
+
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+using android::OK;
+using android::sp;
+using android::status_t;
+
+using vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight;
+using vendor::lineage::livedisplay::V2_0::IDisplayColorCalibration;
+using vendor::lineage::livedisplay::V2_0::implementation::AdaptiveBacklight;
+using vendor::lineage::livedisplay::V2_0::implementation::DisplayColorCalibration;
+using vendor::lineage::livedisplay::V2_0::implementation::ReadingEnhancement;
+using vendor::lineage::livedisplay::V2_0::implementation::SunlightEnhancement;
+using vendor::lineage::livedisplay::V2_0::IReadingEnhancement;
+using vendor::lineage::livedisplay::V2_0::ISunlightEnhancement;
+
+int main() {
+ sp<IAdaptiveBacklight> adaptiveBacklight;
+ sp<IDisplayColorCalibration> displayColorCalibration;
+ sp<IReadingEnhancement> readingEnhancement;
+ sp<ISunlightEnhancement> 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;
+ }
+
+ displayColorCalibration = new DisplayColorCalibration();
+ if (displayColorCalibration == nullptr) {
+ LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayColorCalibration "
+ "Iface, exiting.";
+ goto shutdown;
+ }
+
+ readingEnhancement = new ReadingEnhancement();
+ if (readingEnhancement == nullptr) {
+ LOG(ERROR)
+ << "Can not create an instance of LiveDisplay HAL ReadingEnhancement 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*/);
+
+ status = adaptiveBacklight->registerAsService();
+ if (status != OK) {
+ LOG(ERROR) << "Could not register service for LiveDisplay HAL AdaptiveBacklight Iface ("
+ << status << ")";
+ goto shutdown;
+ }
+
+ status = displayColorCalibration->registerAsService();
+ if (status != OK) {
+ LOG(ERROR)
+ << "Could not register service for LiveDisplay HAL DisplayColorCalibration Iface ("
+ << status << ")";
+ goto shutdown;
+ }
+
+ status = readingEnhancement->registerAsService();
+ if (status != OK) {
+ LOG(ERROR) << "Could not register service for LiveDisplay HAL ReadingEnhancement Iface ("
+ << status << ")";
+ goto shutdown;
+ }
+
+ 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;
+}
--- /dev/null
+on post-fs-data
+ mkdir /data/vendor/display 0770 system system
+
+service vendor.livedisplay-hal-2-0-universal8895 /vendor/bin/hw/vendor.lineage.livedisplay@2.0-service.universal8895
+ class hal
+ user system
+ group system
\ No newline at end of file