From e3ee15e8af0c9f4ab6de175af79e3c62f1739e9f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Tue, 22 Jan 2019 14:15:40 +0100 Subject: [PATCH] sdm845-common: Replace lineagehw implementation by HIDL services Move DisplayModeControl and SunlightEnhancement into a livedisplay service, and TouchscreenGestures into a touch one. Change-Id: I5f46671633a13ddc6733a47f4ea5a6515d6d6c98 --- Android.bp | 2 + BoardConfigCommon.mk | 5 +- common.mk | 8 ++ framework_manifest.xml | 24 ++++ .../hardware/DisplayModeControl.java | 110 ---------------- .../hardware/SunlightEnhancement.java | 86 ------------- .../hardware/TouchscreenGestures.java | 119 ------------------ livedisplay/.clang-format | 11 ++ livedisplay/Android.bp | 34 +++++ livedisplay/DisplayModes.cpp | 117 +++++++++++++++++ livedisplay/DisplayModes.h | 60 +++++++++ livedisplay/SunlightEnhancement.cpp | 51 ++++++++ livedisplay/SunlightEnhancement.h | 47 +++++++ ....livedisplay@2.0-service.oneplus_sdm845.rc | 10 ++ livedisplay/service.cpp | 52 ++++++++ rootdir/etc/init.qcom.rc | 33 ----- sepolicy/private/file.te | 3 +- sepolicy/private/file_contexts | 9 +- sepolicy/private/genfs_contexts | 1 + sepolicy/private/hal_livedisplay_sdm845.te | 12 ++ sepolicy/private/hal_touch_sdm845.te | 12 ++ sepolicy/private/system_app.te | 1 + sepolicy/private/system_server.te | 2 - touch/.clang-format | 11 ++ touch/Android.bp | 33 +++++ touch/TouchscreenGesture.cpp | 73 +++++++++++ touch/TouchscreenGesture.h | 57 +++++++++ ...ineage.touch@1.0-service.oneplus_sdm845.rc | 32 +++++ touch/service.cpp | 43 +++++++ 29 files changed, 702 insertions(+), 356 deletions(-) create mode 100644 framework_manifest.xml delete mode 100644 lineagehw/src/org/lineageos/hardware/DisplayModeControl.java delete mode 100644 lineagehw/src/org/lineageos/hardware/SunlightEnhancement.java delete mode 100644 lineagehw/src/org/lineageos/hardware/TouchscreenGestures.java create mode 100644 livedisplay/.clang-format create mode 100644 livedisplay/Android.bp create mode 100644 livedisplay/DisplayModes.cpp create mode 100644 livedisplay/DisplayModes.h create mode 100644 livedisplay/SunlightEnhancement.cpp create mode 100644 livedisplay/SunlightEnhancement.h create mode 100644 livedisplay/lineage.livedisplay@2.0-service.oneplus_sdm845.rc create mode 100644 livedisplay/service.cpp create mode 100644 sepolicy/private/hal_livedisplay_sdm845.te create mode 100644 sepolicy/private/hal_touch_sdm845.te delete mode 100644 sepolicy/private/system_server.te create mode 100644 touch/.clang-format create mode 100644 touch/Android.bp create mode 100644 touch/TouchscreenGesture.cpp create mode 100644 touch/TouchscreenGesture.h create mode 100644 touch/lineage.touch@1.0-service.oneplus_sdm845.rc create mode 100644 touch/service.cpp 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 + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class DisplayModes : public IDisplayModes { + public: + DisplayModes(); + + // 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; + + private: + struct ModeInfo { + const char* name; + const char* value; + }; + static const std::map kModeMap; + int32_t mDefaultModeId; +}; + +} // namespace implementation +} // 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..b1da1a4 --- /dev/null +++ b/livedisplay/SunlightEnhancement.cpp @@ -0,0 +1,51 @@ +/* + * 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 "SunlightEnhancementService" + +#include "SunlightEnhancement.h" +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace implementation { + +static constexpr const char* kHbmPath = + "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm"; + +Return SunlightEnhancement::isEnabled() { + std::ifstream file(kHbmPath); + int result = -1; + file >> result; + LOG(DEBUG) << "Got result " << result << " fail " << file.fail(); + return !file.fail() && result > 0; +} + +Return SunlightEnhancement::setEnabled(bool enabled) { + std::ofstream file(kHbmPath); + file << (enabled ? "3" : "0"); + LOG(DEBUG) << "setEnabled fail " << file.fail(); + return !file.fail(); +} + +} // namespace implementation +} // 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..60c64dc --- /dev/null +++ b/livedisplay/SunlightEnhancement.h @@ -0,0 +1,47 @@ +/* + * 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 implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class SunlightEnhancement : public ISunlightEnhancement { + public: + // Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. + Return isEnabled() override; + Return setEnabled(bool enabled) override; +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H diff --git a/livedisplay/lineage.livedisplay@2.0-service.oneplus_sdm845.rc b/livedisplay/lineage.livedisplay@2.0-service.oneplus_sdm845.rc new file mode 100644 index 0000000..7b4eeaf --- /dev/null +++ b/livedisplay/lineage.livedisplay@2.0-service.oneplus_sdm845.rc @@ -0,0 +1,10 @@ +on boot + chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode + chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm + chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode + chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm + +service livedisplay-hal-2-0 /system/bin/hw/lineage.livedisplay@2.0-service.oneplus_sdm845 + class hal + user system + group system diff --git a/livedisplay/service.cpp b/livedisplay/service.cpp new file mode 100644 index 0000000..8893b0e --- /dev/null +++ b/livedisplay/service.cpp @@ -0,0 +1,52 @@ +/* + * 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 "lineage.livedisplay@2.0-service.oneplus_sdm845" + +#include +#include +#include +#include "DisplayModes.h" +#include "SunlightEnhancement.h" + +using ::vendor::lineage::livedisplay::V2_0::IDisplayModes; +using ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement; +using ::vendor::lineage::livedisplay::V2_0::implementation::DisplayModes; +using ::vendor::lineage::livedisplay::V2_0::implementation::SunlightEnhancement; + +int main() { + android::sp modesService = new DisplayModes(); + android::sp sreService = new SunlightEnhancement(); + + android::hardware::configureRpcThreadpool(2, true /*callerWillJoin*/); + + if (modesService->registerAsService() != android::OK) { + LOG(ERROR) << "Cannot register display modes HAL service."; + return 1; + } + + if (sreService->registerAsService() != android::OK) { + LOG(ERROR) << "Cannot register sunlight enhancement HAL service."; + return 1; + } + + LOG(INFO) << "LiveDisplay HAL service ready."; + + android::hardware::joinRpcThreadpool(); + + LOG(ERROR) << "LiveDisplay HAL service failed to join thread pool."; + return 1; +} diff --git a/rootdir/etc/init.qcom.rc b/rootdir/etc/init.qcom.rc index 7ae31aa..8e0b688 100644 --- a/rootdir/etc/init.qcom.rc +++ b/rootdir/etc/init.qcom.rc @@ -8,39 +8,6 @@ on boot # Fingerprint chown system system /sys/devices/platform/soc/soc:goodix_fp/proximity_state - # Touchpanel - chmod 0660 /proc/touchpanel/double_swipe_enable - chmod 0660 /proc/touchpanel/down_arrow_enable - chmod 0660 /proc/touchpanel/down_swipe_enable - chmod 0660 /proc/touchpanel/left_arrow_enable - chmod 0660 /proc/touchpanel/left_swipe_enable - chmod 0660 /proc/touchpanel/letter_m_enable - chmod 0660 /proc/touchpanel/letter_o_enable - chmod 0660 /proc/touchpanel/letter_s_enable - chmod 0660 /proc/touchpanel/letter_w_enable - chmod 0660 /proc/touchpanel/right_arrow_enabl - chmod 0660 /proc/touchpanel/right_swipe_enabl - chmod 0660 /proc/touchpanel/up_arrow_enable - chmod 0660 /proc/touchpanel/up_swipe_enable - chown system system /proc/touchpanel/double_swipe_enable - chown system system /proc/touchpanel/down_arrow_enable - chown system system /proc/touchpanel/down_swipe_enable - chown system system /proc/touchpanel/left_arrow_enable - chown system system /proc/touchpanel/left_swipe_enable - chown system system /proc/touchpanel/letter_m_enable - chown system system /proc/touchpanel/letter_o_enable - chown system system /proc/touchpanel/letter_s_enable - chown system system /proc/touchpanel/letter_w_enable - chown system system /proc/touchpanel/right_arrow_enabl - chown system system /proc/touchpanel/right_swipe_enabl - chown system system /proc/touchpanel/up_arrow_enable - chown system system /proc/touchpanel/up_swipe_enable - - chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode - chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm - chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode - chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm - on charger write /sys/class/backlight/panel0-backlight/brightness 150 diff --git a/sepolicy/private/file.te b/sepolicy/private/file.te index 5d49fae..fed9964 100644 --- a/sepolicy/private/file.te +++ b/sepolicy/private/file.te @@ -1,10 +1,11 @@ type adsprpcd_file, file_type; type bt_firmware_file, file_type; +type display_data_file, file_type, data_file_type, core_data_file_type; type firmware_file, file_type; type op1_file, file_type; type op2_file, file_type; type persist_file, file_type; -type proc_touchpanel, fs_type; +type proc_touchpanel, fs_type, proc_type; type sysfs_fpc_proximity, sysfs_type, fs_type; type sysfs_oem, sysfs_type, fs_type; type sysfs_graphics, sysfs_type, fs_type; diff --git a/sepolicy/private/file_contexts b/sepolicy/private/file_contexts index 0c8d269..e03e5e9 100644 --- a/sepolicy/private/file_contexts +++ b/sepolicy/private/file_contexts @@ -1,3 +1,6 @@ +# Data files +/data/display(/.*)? u:object_r:display_data_file:s0 + # Files in rootfs /bt_firmware(/.*)? u:object_r:bt_firmware_file:s0 /dsp(/.*)? u:object_r:adsprpcd_file:s0 @@ -12,8 +15,10 @@ # Audio /system/etc/audio_policy_configuration.xml u:object_r:vendor_configs_file:s0 -# Lights -/system/bin/hw/android\.hardware\.light@2\.0-service\.oneplus_sdm845 u:object_r:hal_light_sdm845_exec:s0 +# HALs +/system/bin/hw/android\.hardware\.light@2\.0-service\.oneplus_sdm845 u:object_r:hal_light_sdm845_exec:s0 +/system/bin/hw/lineage\.livedisplay@2\.0-service\.oneplus_sdm845 u:object_r:hal_livedisplay_sdm845_exec:s0 +/system/bin/hw/lineage\.touch@1\.0-service\.oneplus_sdm845 u:object_r:hal_touch_sdm845_exec:s0 # Modules /system/lib/modules/wlan\.ko u:object_r:vendor_file:s0 diff --git a/sepolicy/private/genfs_contexts b/sepolicy/private/genfs_contexts index ccce21b..c1ed0ec 100644 --- a/sepolicy/private/genfs_contexts +++ b/sepolicy/private/genfs_contexts @@ -1,3 +1,4 @@ +genfscon proc /touchpanel u:object_r:proc_touchpanel:s0 genfscon sysfs /devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/dc u:object_r:sysfs_battery_supply:s0 genfscon sysfs /devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/main u:object_r:sysfs_battery_supply:s0 genfscon sysfs /devices/platform/soc/soc:qcom,dsi-display@18/hbm u:object_r:sysfs_livedisplay_tuneable:s0 diff --git a/sepolicy/private/hal_livedisplay_sdm845.te b/sepolicy/private/hal_livedisplay_sdm845.te new file mode 100644 index 0000000..f0b1477 --- /dev/null +++ b/sepolicy/private/hal_livedisplay_sdm845.te @@ -0,0 +1,12 @@ +type hal_livedisplay_sdm845, coredomain, domain; +hal_server_domain(hal_livedisplay_sdm845, hal_lineage_livedisplay) + +type hal_livedisplay_sdm845_exec, exec_type, file_type; +init_daemon_domain(hal_livedisplay_sdm845) + +# Talk to the binder device node +allow hal_livedisplay_sdm845 binder_device:chr_file rw_file_perms; + +# Allow LiveDisplay to store files under /data/display and access them +allow hal_livedisplay_sdm845 display_data_file:dir rw_dir_perms; +allow hal_livedisplay_sdm845 display_data_file:file create_file_perms; diff --git a/sepolicy/private/hal_touch_sdm845.te b/sepolicy/private/hal_touch_sdm845.te new file mode 100644 index 0000000..9d39f00 --- /dev/null +++ b/sepolicy/private/hal_touch_sdm845.te @@ -0,0 +1,12 @@ +type hal_touch_sdm845, coredomain, domain; +hal_server_domain(hal_touch_sdm845, hal_lineage_touch) + +type hal_touch_sdm845_exec, exec_type, file_type; +init_daemon_domain(hal_touch_sdm845) + +# Talk to the binder device node +allow hal_touch_sdm845 binder_device:chr_file rw_file_perms; + +# Allow access to gesture enable nodes +allow hal_touch_sdm845 proc_touchpanel:dir search; +allow hal_touch_sdm845 proc_touchpanel:file rw_file_perms; diff --git a/sepolicy/private/system_app.te b/sepolicy/private/system_app.te index 5aa5fb4..cc68de0 100644 --- a/sepolicy/private/system_app.te +++ b/sepolicy/private/system_app.te @@ -1 +1,2 @@ +# Pocketmode allow system_app sysfs_fpc_proximity:file { w_file_perms getattr }; diff --git a/sepolicy/private/system_server.te b/sepolicy/private/system_server.te deleted file mode 100644 index 27db71c..0000000 --- a/sepolicy/private/system_server.te +++ /dev/null @@ -1,2 +0,0 @@ -# Allow access to LiveDisplay tuning nodes -allow system_server sysfs_livedisplay_tuneable:file rw_file_perms; diff --git a/touch/.clang-format b/touch/.clang-format new file mode 100644 index 0000000..ae4a451 --- /dev/null +++ b/touch/.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/touch/Android.bp b/touch/Android.bp new file mode 100644 index 0000000..5c94921 --- /dev/null +++ b/touch/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: "lineage.touch@1.0-service.oneplus_sdm845", + init_rc: ["lineage.touch@1.0-service.oneplus_sdm845.rc"], + defaults: ["hidl_defaults"], + relative_install_path: "hw", + srcs: [ + "TouchscreenGesture.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder", + "libhidlbase", + "libhidltransport", + "libutils", + "vendor.lineage.touch@1.0", + ], +} diff --git a/touch/TouchscreenGesture.cpp b/touch/TouchscreenGesture.cpp new file mode 100644 index 0000000..4c20b05 --- /dev/null +++ b/touch/TouchscreenGesture.cpp @@ -0,0 +1,73 @@ +/* + * 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 "TouchscreenGestureService" + +#include "TouchscreenGesture.h" +#include +#include + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +const std::map TouchscreenGesture::kGestureInfoMap = { + {0, {251, "Two fingers down swipe", "/proc/touchpanel/double_swipe_enable"}}, + {1, {252, "Up arrow", "/proc/touchpanel/up_arrow_enable"}}, + {2, {254, "Right arrow", "/proc/touchpanel/right_arrow_enable"}}, + {3, {255, "Down arrow", "/proc/touchpanel/down_arrow_enable"}}, + {4, {253, "Left arrow", "/proc/touchpanel/left_arrow_enable"}}, + {5, {66, "One finger up swipe", "/proc/touchpanel/up_swipe_enable"}}, + {6, {65, "One finger right swipe", "/proc/touchpanel/right_swipe_enable"}}, + {7, {64, "One finger down swipe", "/proc/touchpanel/down_swipe_enable"}}, + {8, {63, "One finger left swipe", "/proc/touchpanel/left_swipe_enable"}}, + {9, {247, "Letter M", "/proc/touchpanel/letter_m_enable"}}, + {10, {250, "Letter O", "/proc/touchpanel/letter_o_enable"}}, + {11, {248, "Letter S", "/proc/touchpanel/letter_s_enable"}}, + {12, {246, "Letter W", "/proc/touchpanel/letter_w_enable"}}, +}; + +Return TouchscreenGesture::getSupportedGestures(getSupportedGestures_cb resultCb) { + std::vector gestures; + + for (const auto& entry : kGestureInfoMap) { + gestures.push_back({entry.first, entry.second.name, entry.second.keycode}); + } + resultCb(gestures); + + return Void(); +} + +Return TouchscreenGesture::setGestureEnabled( + const ::vendor::lineage::touch::V1_0::Gesture& gesture, bool enabled) { + const auto entry = kGestureInfoMap.find(gesture.id); + if (entry == kGestureInfoMap.end()) { + return false; + } + + std::ofstream file(entry->second.path); + file << (enabled ? "1" : "0"); + LOG(DEBUG) << "Wrote file " << entry->second.path << " fail " << file.fail(); + return !file.fail(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace touch +} // namespace lineage +} // namespace vendor diff --git a/touch/TouchscreenGesture.h b/touch/TouchscreenGesture.h new file mode 100644 index 0000000..47980da --- /dev/null +++ b/touch/TouchscreenGesture.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_TOUCH_V1_0_TOUCHSCREENGESTURE_H +#define VENDOR_LINEAGE_TOUCH_V1_0_TOUCHSCREENGESTURE_H + +#include +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class TouchscreenGesture : public ITouchscreenGesture { + public: + // Methods from ::vendor::lineage::touch::V1_0::ITouchscreenGesture follow. + Return getSupportedGestures(getSupportedGestures_cb resultCb) override; + Return setGestureEnabled(const ::vendor::lineage::touch::V1_0::Gesture& gesture, + bool enabled) override; + + private: + typedef struct { + int32_t keycode; + const char* name; + const char* path; + } GestureInfo; + static const std::map kGestureInfoMap; // id -> info +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace touch +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_TOUCH_V1_0_TOUCHSCREENGESTURE_H diff --git a/touch/lineage.touch@1.0-service.oneplus_sdm845.rc b/touch/lineage.touch@1.0-service.oneplus_sdm845.rc new file mode 100644 index 0000000..51eec72 --- /dev/null +++ b/touch/lineage.touch@1.0-service.oneplus_sdm845.rc @@ -0,0 +1,32 @@ +on boot + chmod 0660 /proc/touchpanel/double_swipe_enable + chmod 0660 /proc/touchpanel/down_arrow_enable + chmod 0660 /proc/touchpanel/down_swipe_enable + chmod 0660 /proc/touchpanel/left_arrow_enable + chmod 0660 /proc/touchpanel/left_swipe_enable + chmod 0660 /proc/touchpanel/letter_m_enable + chmod 0660 /proc/touchpanel/letter_o_enable + chmod 0660 /proc/touchpanel/letter_s_enable + chmod 0660 /proc/touchpanel/letter_w_enable + chmod 0660 /proc/touchpanel/right_arrow_enable + chmod 0660 /proc/touchpanel/right_swipe_enable + chmod 0660 /proc/touchpanel/up_arrow_enable + chmod 0660 /proc/touchpanel/up_swipe_enable + chown system system /proc/touchpanel/double_swipe_enable + chown system system /proc/touchpanel/down_arrow_enable + chown system system /proc/touchpanel/down_swipe_enable + chown system system /proc/touchpanel/left_arrow_enable + chown system system /proc/touchpanel/left_swipe_enable + chown system system /proc/touchpanel/letter_m_enable + chown system system /proc/touchpanel/letter_o_enable + chown system system /proc/touchpanel/letter_s_enable + chown system system /proc/touchpanel/letter_w_enable + chown system system /proc/touchpanel/right_arrow_enable + chown system system /proc/touchpanel/right_swipe_enable + chown system system /proc/touchpanel/up_arrow_enable + chown system system /proc/touchpanel/up_swipe_enable + +service touch-hal-1-0 /system/bin/hw/lineage.touch@1.0-service.oneplus_sdm845 + class hal + user system + group system diff --git a/touch/service.cpp b/touch/service.cpp new file mode 100644 index 0000000..a3e2986 --- /dev/null +++ b/touch/service.cpp @@ -0,0 +1,43 @@ +/* + * 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 "lineage.touch@1.0-service.oneplus_sdm845" + +#include +#include +#include +#include "TouchscreenGesture.h" + +using ::vendor::lineage::touch::V1_0::ITouchscreenGesture; +using ::vendor::lineage::touch::V1_0::implementation::TouchscreenGesture; + +int main() { + android::sp gestureService = new TouchscreenGesture(); + + android::hardware::configureRpcThreadpool(1, true /*callerWillJoin*/); + + if (gestureService->registerAsService() != android::OK) { + LOG(ERROR) << "Cannot register touchscreen gesture HAL service."; + return 1; + } + + LOG(INFO) << "Touchscreen HAL service ready."; + + android::hardware::joinRpcThreadpool(); + + LOG(ERROR) << "Touchscreen HAL service failed to join thread pool."; + return 1; +}