diff --git a/Android.bp b/Android.bp
index f2c082f..8e0fdaf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,6 @@
subdirs = [
"lights",
+ "livedisplay",
+ "touch",
"tri-state-key"
]
diff --git a/BoardConfigCommon.mk b/BoardConfigCommon.mk
index 2604398..f50bdd4 100644
--- a/BoardConfigCommon.mk
+++ b/BoardConfigCommon.mk
@@ -83,9 +83,8 @@ TARGET_USES_HWC2 := true
# DRM
TARGET_ENABLE_MEDIADRM_64 := true
-# Lineage Hardware
-JAVA_SOURCE_OVERLAYS := \
- org.lineageos.hardware|$(COMMON_PATH)/lineagehw|**/*.java
+# HIDL
+DEVICE_FRAMEWORK_MANIFEST_FILE := $(COMMON_PATH)/framework_manifest.xml
# Partitions
BOARD_BOOTIMAGE_PARTITION_SIZE := 67108864
diff --git a/common.mk b/common.mk
index 5301796..1f86d55 100644
--- a/common.mk
+++ b/common.mk
@@ -88,6 +88,10 @@ PRODUCT_COPY_FILES += \
PRODUCT_PACKAGES += \
android.hardware.light@2.0-service.oneplus_sdm845
+# LiveDisplay
+PRODUCT_PACKAGES += \
+ lineage.livedisplay@2.0-service.oneplus_sdm845
+
# Media
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/media_profiles_vendor.xml:system/etc/media_profiles_vendor.xml
@@ -113,6 +117,10 @@ PRODUCT_PACKAGES += \
PRODUCT_BOOT_JARS += \
telephony-ext
+# Touch
+PRODUCT_PACKAGES += \
+ lineage.touch@1.0-service.oneplus_sdm845
+
# tri-state-key
PRODUCT_PACKAGES += \
KeyHandler \
diff --git a/framework_manifest.xml b/framework_manifest.xml
new file mode 100644
index 0000000..5e4d156
--- /dev/null
+++ b/framework_manifest.xml
@@ -0,0 +1,24 @@
+
+
+ vendor.lineage.livedisplay
+ hwbinder
+ 2.0
+
+ IDisplayModes
+ default
+
+
+ ISunlightEnhancement
+ default
+
+
+
+ vendor.lineage.touch
+ hwbinder
+ 1.0
+
+ ITouchscreenGesture
+ default
+
+
+
diff --git a/lineagehw/src/org/lineageos/hardware/DisplayModeControl.java b/lineagehw/src/org/lineageos/hardware/DisplayModeControl.java
deleted file mode 100644
index 8caa452..0000000
--- a/lineagehw/src/org/lineageos/hardware/DisplayModeControl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2015 The CyanogenMod Project
- * Copyright (C) 2018 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.
- */
-
-package org.lineageos.hardware;
-
-import android.util.Log;
-
-import lineageos.hardware.DisplayMode;
-import org.lineageos.internal.util.FileUtils;
-
-import java.util.HashMap;
-
-/*
- * Display Modes API
- *
- * A device may implement a list of preset display modes for different
- * viewing intents, such as movies, photos, or extra vibrance. These
- * modes may have multiple components such as gamma correction, white
- * point adjustment, etc, but are activated by a single control point.
- *
- * This API provides support for enumerating and selecting the
- * modes supported by the hardware.
- */
-
-public class DisplayModeControl {
- private static final String MODE_PATH =
- "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode";
- private static final String DEFAULT_PATH = "/data/system/default_display_mode";
-
- private static final HashMap MODE_MAP = new HashMap<>();
- static {
- MODE_MAP.put("default", new DisplayMode(0, "Standard"));
- MODE_MAP.put("srgb", new DisplayMode(1, "sRGB"));
- MODE_MAP.put("dci-p3", new DisplayMode(2, "DCI P3"));
- MODE_MAP.put("adaption", new DisplayMode(3, "Adaptive"));
-
- String storedDefaultMode = FileUtils.readOneLine(DEFAULT_PATH);
- if (storedDefaultMode != null) {
- FileUtils.writeLine(MODE_PATH, storedDefaultMode);
- }
- }
-
- /*
- * All HAF classes should export this boolean.
- * Real implementations must, of course, return true
- */
- public static boolean isSupported() {
- return FileUtils.isFileWritable(MODE_PATH);
- }
-
- /*
- * Get the list of available modes. A mode has an integer
- * identifier and a string name.
- *
- * It is the responsibility of the upper layers to
- * map the name to a human-readable format or perform translation.
- */
- public static DisplayMode[] getAvailableModes() {
- return MODE_MAP.values().toArray(new DisplayMode[MODE_MAP.size()]);
- }
-
- /*
- * Get the name of the currently selected mode. This can return
- * null if no mode is selected.
- */
- public static DisplayMode getCurrentMode() {
- return MODE_MAP.get(FileUtils.readOneLine(MODE_PATH));
- }
-
- /*
- * Selects a mode from the list of available modes by it's
- * string identifier. Returns true on success, false for
- * failure. It is up to the implementation to determine
- * if this mode is valid.
- */
- public static boolean setMode(DisplayMode mode, boolean makeDefault) {
- for (HashMap.Entry entry : MODE_MAP.entrySet()) {
- if (entry.getValue().id == mode.id) {
- if (FileUtils.writeLine(MODE_PATH, entry.getKey()) && makeDefault) {
- FileUtils.writeLine(DEFAULT_PATH, entry.getKey());
- return true;
- }
- }
- }
- return false;
- }
-
- /*
- * Gets the preferred default mode for this device by it's
- * string identifier. Can return null if there is no default.
- */
- public static DisplayMode getDefaultMode() {
- String storedDefaultMode = FileUtils.readOneLine(DEFAULT_PATH);
- return MODE_MAP.get(storedDefaultMode != null ? storedDefaultMode : "default");
- }
-}
diff --git a/lineagehw/src/org/lineageos/hardware/SunlightEnhancement.java b/lineagehw/src/org/lineageos/hardware/SunlightEnhancement.java
deleted file mode 100644
index 24027aa..0000000
--- a/lineagehw/src/org/lineageos/hardware/SunlightEnhancement.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2014 The CyanogenMod Project
- * Copyright (C) 2018 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.
- */
-
-package org.lineageos.hardware;
-
-import android.util.Log;
-
-import org.lineageos.internal.util.FileUtils;
-
-public class SunlightEnhancement {
- private static final String TAG = "SunlightEnhancement";
-
- private static final String HBM_PATH =
- "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm";
-
- /**
- * Whether device supports sunlight enhancement
- *
- * @return boolean Supported devices must return always true
- */
- public static boolean isSupported() {
- return FileUtils.isFileWritable(HBM_PATH);
- }
-
- /**
- * This method return the current activation status of sunlight enhancement
- *
- * @return boolean Must be false when sunlight enhancement is not supported or not activated,
- * or the operation failed while reading the status; true in any other case.
- */
- public static boolean isEnabled() {
- try {
- return Integer.parseInt(FileUtils.readOneLine(HBM_PATH)) > 0;
- } catch (Exception e) {
- Log.e(TAG, e.getMessage(), e);
- }
- return false;
- }
-
- /**
- * This method allows to setup sunlight enhancement
- *
- * @param status The new sunlight enhancement status
- * @return boolean Must be false if sunlight enhancement is not supported or the operation
- * failed; true in any other case.
- */
- public static boolean setEnabled(boolean status) {
- return FileUtils.writeLine(HBM_PATH, status ? "3" : "0");
- }
-
- /**
- * Whether adaptive backlight (CABL / CABC) is required to be enabled
- *
- * @return boolean False if adaptive backlight is not a dependency
- */
- public static boolean isAdaptiveBacklightRequired() {
- return false;
- }
-
- /**
- * Set this to true if the implementation is self-managed and does
- * it's own ambient sensing. In this case, setEnabled is assumed
- * to toggle the feature on or off, but not activate it. If set
- * to false, LiveDisplay will call setEnabled when the ambient lux
- * threshold is crossed.
- *
- * @return true if this enhancement is self-managed
- */
- public static boolean isSelfManaged() {
- return false;
- }
-}
diff --git a/lineagehw/src/org/lineageos/hardware/TouchscreenGestures.java b/lineagehw/src/org/lineageos/hardware/TouchscreenGestures.java
deleted file mode 100644
index 0113073..0000000
--- a/lineagehw/src/org/lineageos/hardware/TouchscreenGestures.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- * (C) 2017 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.
- */
-
-package org.lineageos.hardware;
-
-import android.util.Log;
-
-import lineageos.hardware.TouchscreenGesture;
-
-import org.lineageos.internal.util.FileUtils;
-
-/**
- * Touchscreen gestures API
- *
- * A device may implement several touchscreen gestures for use while
- * the display is turned off, such as drawing alphabets and shapes.
- * These gestures can be interpreted by userspace to activate certain
- * actions and launch certain apps, such as to skip music tracks,
- * to turn on the flashlight, or to launch the camera app.
- *
- * This *should always* be supported by the hardware directly.
- * A lot of recent touch controllers have a firmware option for this.
- *
- * This API provides support for enumerating the gestures
- * supported by the touchscreen.
- */
-public class TouchscreenGestures {
-
- private static final String LOG_TAG = TouchscreenGestures.class.getSimpleName();
-
- private static final String[] GESTURE_PATHS = {
- "/proc/touchpanel/double_swipe_enable",
- "/proc/touchpanel/up_arrow_enable",
- "/proc/touchpanel/right_arrow_enable",
- "/proc/touchpanel/down_arrow_enable",
- "/proc/touchpanel/left_arrow_enable",
- "/proc/touchpanel/up_swipe_enable",
- "/proc/touchpanel/right_swipe_enable",
- "/proc/touchpanel/down_swipe_enable",
- "/proc/touchpanel/left_swipe_enable",
- "/proc/touchpanel/letter_m_enable",
- "/proc/touchpanel/letter_o_enable",
- "/proc/touchpanel/letter_s_enable",
- "/proc/touchpanel/letter_w_enable",
- };
-
- // Id, name, keycode
- private static final TouchscreenGesture[] TOUCHSCREEN_GESTURES = {
- new TouchscreenGesture(0, "Two fingers down swipe", 251),
- new TouchscreenGesture(1, "Up arrow", 252),
- new TouchscreenGesture(2, "Right arrow", 254),
- new TouchscreenGesture(3, "Down arrow", 255),
- new TouchscreenGesture(4, "Left arrow", 253),
- new TouchscreenGesture(5, "One finger up swipe", 66),
- new TouchscreenGesture(6, "One finger right swipe", 65),
- new TouchscreenGesture(7, "One finger down swipe", 64),
- new TouchscreenGesture(8, "One finger left swipe", 63),
- new TouchscreenGesture(9, "Letter M", 247),
- new TouchscreenGesture(10, "Letter O", 250),
- new TouchscreenGesture(11, "Letter S", 248),
- new TouchscreenGesture(12, "Letter W", 246),
- };
-
- /**
- * Whether device supports touchscreen gestures
- *
- * @return boolean Supported devices must return always true
- */
- public static boolean isSupported() {
- boolean supported = false;
- for (String path : GESTURE_PATHS) {
- if (!FileUtils.isFileWritable(path) ||
- !FileUtils.isFileReadable(path)) {
- Log.e(LOG_TAG, path + " is non-writable or non-readable!");
- continue;
- }
- supported = true;
- }
- return supported;
- }
-
- /*
- * Get the list of available gestures. A mode has an integer
- * identifier and a string name.
- *
- * It is the responsibility of the upper layers to
- * map the name to a human-readable format or perform translation.
- */
- public static TouchscreenGesture[] getAvailableGestures() {
- return TOUCHSCREEN_GESTURES;
- }
-
- /**
- * This method allows to set the activation status of a gesture
- *
- * @param gesture The gesture to be activated
- * state The new activation status of the gesture
- * @return boolean Must be false if gesture is not supported
- * or the operation failed; true in any other case.
- */
- public static boolean setGestureEnabled(
- final TouchscreenGesture gesture, final boolean state) {
- return FileUtils.writeLine(GESTURE_PATHS[gesture.id], state ? "1" : "0");
- }
-}
diff --git a/livedisplay/.clang-format b/livedisplay/.clang-format
new file mode 100644
index 0000000..ae4a451
--- /dev/null
+++ b/livedisplay/.clang-format
@@ -0,0 +1,11 @@
+BasedOnStyle: Google
+AccessModifierOffset: -2
+AllowShortFunctionsOnASingleLine: Inline
+ColumnLimit: 100
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+IndentWidth: 4
+PointerAlignment: Left
+TabWidth: 4
+UseTab: Never
+PenaltyExcessCharacter: 32
diff --git a/livedisplay/Android.bp b/livedisplay/Android.bp
new file mode 100644
index 0000000..0b9df45
--- /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: "lineage.livedisplay@2.0-service.oneplus_sdm845",
+ init_rc: ["lineage.livedisplay@2.0-service.oneplus_sdm845.rc"],
+ defaults: ["hidl_defaults"],
+ relative_install_path: "hw",
+ srcs: [
+ "DisplayModes.cpp",
+ "SunlightEnhancement.cpp",
+ "service.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "vendor.lineage.livedisplay@2.0",
+ ],
+}
diff --git a/livedisplay/DisplayModes.cpp b/livedisplay/DisplayModes.cpp
new file mode 100644
index 0000000..fc758ed
--- /dev/null
+++ b/livedisplay/DisplayModes.cpp
@@ -0,0 +1,117 @@
+/*
+ * 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 implementation {
+
+static constexpr const char* kModePath =
+ "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode";
+static constexpr const char* kDefaultPath = "/data/system/default_display_mode";
+
+const std::map DisplayModes::kModeMap = {
+ {0, {"Standard", "default"}},
+ {1, {"sRGB", "srgb"}},
+ {2, {"DCI P3", "dci-p3"}},
+ {3, {"Adaptive", "adaption"}},
+};
+
+DisplayModes::DisplayModes() : mDefaultModeId(0) {
+ std::ifstream defaultFile(kDefaultPath);
+ std::string 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.second.value) {
+ mDefaultModeId = entry.first;
+ break;
+ }
+ }
+}
+
+// Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow.
+Return DisplayModes::getDisplayModes(getDisplayModes_cb resultCb) {
+ std::vector modes;
+ for (const auto& entry : kModeMap) {
+ modes.push_back({entry.first, entry.second.name});
+ }
+ resultCb(modes);
+ return Void();
+}
+
+Return DisplayModes::getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) {
+ int32_t currentModeId = mDefaultModeId;
+ std::ifstream modeFile(kModePath);
+ std::string value;
+
+ modeFile >> value;
+ if (!modeFile.fail()) {
+ for (const auto& entry : kModeMap) {
+ if (value == entry.second.value) {
+ currentModeId = entry.first;
+ break;
+ }
+ }
+ }
+ resultCb({currentModeId, kModeMap.at(currentModeId).name});
+ return Void();
+}
+
+Return DisplayModes::getDefaultDisplayMode(getDefaultDisplayMode_cb resultCb) {
+ resultCb({mDefaultModeId, kModeMap.at(mDefaultModeId).name});
+ 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->second.value;
+ if (modeFile.fail()) {
+ return false;
+ }
+
+ if (makeDefault) {
+ std::ofstream defaultFile(kDefaultPath);
+ defaultFile << iter->second.value;
+ if (defaultFile.fail()) {
+ return false;
+ }
+ mDefaultModeId = iter->first;
+ }
+ return true;
+}
+
+} // namespace implementation
+} // 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..c313768
--- /dev/null
+++ b/livedisplay/DisplayModes.h
@@ -0,0 +1,60 @@
+/*
+ * 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
+#include