diff --git a/device.mk b/device.mk index d815cca..913bf44 100644 --- a/device.mk +++ b/device.mk @@ -98,6 +98,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/sensors/android.hardware.sensors@2.1-service-multihal.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/android.hardware.sensors@2.1-service-multihal.rc \ $(LOCAL_PATH)/sensors/hals.conf:$(TARGET_COPY_OUT_VENDOR)/etc/sensors/hals.conf +# Touch +# PowerShare +PRODUCT_PACKAGES += \ + vendor.lineage.touch@1.0-service.eqs + # Soong namespaces PRODUCT_SOONG_NAMESPACES += $(LOCAL_PATH) 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..36725b8 --- /dev/null +++ b/touch/Android.bp @@ -0,0 +1,35 @@ +// +// Copyright (C) 2020 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.touch@1.0-service.eqs", + vintf_fragments: ["vendor.lineage.touch@1.0-service.eqs.xml"], + init_rc: ["vendor.lineage.touch@1.0-service.eqs.rc"], + defaults: ["hidl_defaults"], + relative_install_path: "hw", + proprietary: true, + srcs: [ + "HighTouchPollingRate.cpp", + "TouchscreenGesture.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder", + "libhidlbase", + "libutils", + "vendor.lineage.touch@1.0", + ], +} diff --git a/touch/HighTouchPollingRate.cpp b/touch/HighTouchPollingRate.cpp new file mode 100644 index 0000000..3450298 --- /dev/null +++ b/touch/HighTouchPollingRate.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define LOG_TAG "HighTouchPollingRateService" + +#include "HighTouchPollingRate.h" + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +const std::string kInterpolationPath = "/sys/class/touchscreen/primary/interpolation"; + +Return HighTouchPollingRate::isEnabled() { + std::string buf; + if (!android::base::ReadFileToString(kInterpolationPath, &buf)) { + LOG(ERROR) << "Failed to read " << kInterpolationPath; + return false; + } + return std::stoi(android::base::Trim(buf)) == 1; +} + +Return HighTouchPollingRate::setEnabled(bool enabled) { + if (!android::base::WriteStringToFile(std::to_string(enabled), kInterpolationPath)) { + LOG(ERROR) << "Failed to write " << kInterpolationPath; + return false; + } + return true; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace touch +} // namespace lineage +} // namespace vendor diff --git a/touch/HighTouchPollingRate.h b/touch/HighTouchPollingRate.h new file mode 100644 index 0000000..1a3a355 --- /dev/null +++ b/touch/HighTouchPollingRate.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::Return; + +class HighTouchPollingRate : public IHighTouchPollingRate { + public: + // Methods from ::vendor::lineage::touch::V1_0::IHighTouchPollingRate follow. + Return isEnabled() override; + Return setEnabled(bool enabled) override; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace touch +} // namespace lineage +} // namespace vendor diff --git a/touch/TouchscreenGesture.cpp b/touch/TouchscreenGesture.cpp new file mode 100644 index 0000000..1e3a6eb --- /dev/null +++ b/touch/TouchscreenGesture.cpp @@ -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. + */ + +#define LOG_TAG "TouchscreenGestureService" + +#include + +#include +#include + +#include "TouchscreenGesture.h" + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +Return TouchscreenGesture::getSupportedGestures(getSupportedGestures_cb resultCb) { + std::vector gestures; + for (int32_t i = 0; i < std::size(kGestureNodes); ++i) { + gestures.push_back({i, kGestureNodes[i].name, kGestureNodes[i].keycode}); + } + resultCb(gestures); + return Void(); +} + +Return TouchscreenGesture::setGestureEnabled( + const ::vendor::lineage::touch::V1_0::Gesture& gesture, bool enable) { + if (gesture.id >= std::size(kGestureNodes)) { + return false; + } + + if (!android::base::WriteStringToFile(enable ? kGestureNodes[gesture.id].enable : kGestureNodes[gesture.id].disable, + kGestureNodes[gesture.id].path)) { + LOG(ERROR) << "Writing to file " << kGestureNodes[gesture.id].path << " failed"; + return false; + } + + return true; +} + +} // 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..37ab24d --- /dev/null +++ b/touch/TouchscreenGesture.h @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#pragma once + +#include + +#include + +namespace { +struct GestureInfo { + int32_t keycode; + const char* name; + const char* path; + const char* enable; + const char* disable; +}; + +constexpr GestureInfo kGestureNodes[] = { + {59, + "Single Tap", + "/sys/class/touchscreen/primary/gesture", + "33", "32"}, +}; +} // anonymous namespace + +namespace vendor { +namespace lineage { +namespace touch { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; + +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 enable) override; + + private: + std::map kGestureInfoMap; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace touch +} // namespace lineage +} // namespace vendor diff --git a/touch/service.cpp b/touch/service.cpp new file mode 100644 index 0000000..dc82adb --- /dev/null +++ b/touch/service.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 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.lge_msmnile" + +#include +#include + +#include "HighTouchPollingRate.h" +#include "TouchscreenGesture.h" + +using ::vendor::lineage::touch::V1_0::IHighTouchPollingRate; +using ::vendor::lineage::touch::V1_0::ITouchscreenGesture; +using ::vendor::lineage::touch::V1_0::implementation::HighTouchPollingRate; +using ::vendor::lineage::touch::V1_0::implementation::TouchscreenGesture; + +int main() { + android::sp highTouchPollingRate = new HighTouchPollingRate(); + android::sp touchscreenGesture = new TouchscreenGesture(); + + android::hardware::configureRpcThreadpool(1, true /*callerWillJoin*/); + + if (highTouchPollingRate->registerAsService() != android::OK) { + LOG(ERROR) << "Cannot register touchscreen glove HAL service."; + return 1; + } + + if (touchscreenGesture->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; +} diff --git a/touch/vendor.lineage.touch@1.0-service.eqs.rc b/touch/vendor.lineage.touch@1.0-service.eqs.rc new file mode 100644 index 0000000..e3d65b3 --- /dev/null +++ b/touch/vendor.lineage.touch@1.0-service.eqs.rc @@ -0,0 +1,6 @@ +service vendor.touch-hal-1-0 /vendor/bin/hw/vendor.lineage.touch@1.0-service.eqs + interface vendor.lineage.touch@1.0::IGloveMode default + interface vendor.lineage.touch@1.0::ITouchscreenGesture default + class hal + user system + group system diff --git a/touch/vendor.lineage.touch@1.0-service.eqs.xml b/touch/vendor.lineage.touch@1.0-service.eqs.xml new file mode 100644 index 0000000..df709cb --- /dev/null +++ b/touch/vendor.lineage.touch@1.0-service.eqs.xml @@ -0,0 +1,15 @@ + + + vendor.lineage.touch + hwbinder + 1.0 + + IHighTouchPollingRate + default + + + ITouchscreenGesture + default + + +