diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp index 300c557..51037ba 100644 --- a/power-libperfmgr/Power.cpp +++ b/power-libperfmgr/Power.cpp @@ -30,7 +30,6 @@ #include "Power.h" #include -constexpr char kWakeupEventNode[] = "/dev/input/event2"; constexpr int kWakeupModeOff = 4; constexpr int kWakeupModeOn = 5; @@ -141,10 +140,47 @@ Return Power::powerHint(PowerHint_1_0 hint, int32_t data) { return Void(); } +int open_ts_input() { + int fd = -1; + DIR *dir = opendir("/dev/input"); + + if (dir != NULL) { + struct dirent *ent; + + while ((ent = readdir(dir)) != NULL) { + if (ent->d_type == DT_CHR) { + char absolute_path[PATH_MAX] = {0}; + char name[80] = {0}; + + strcpy(absolute_path, "/dev/input/"); + strcat(absolute_path, ent->d_name); + + fd = open(absolute_path, O_RDWR); + if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) > 0) { + if (strcmp(name, "fts_ts") == 0 || + strcmp(name, "NVTCapacitiveTouchScreen") == 0) + break; + } + + close(fd); + fd = -1; + } + } + + closedir(dir); + } + + return fd; +} + Return Power::setFeature(Feature feature, bool activate) { switch (feature) { case Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE: { - int fd = open(kWakeupEventNode, O_RDWR); + int fd = open_ts_input(); + if (fd == -1) { + ALOGW("DT2W won't work because no supported touchscreen input devices were found"); + return Void(); + } struct input_event ev; ev.type = EV_SYN; ev.code = SYN_CONFIG; diff --git a/sepolicy/vendor/hal_power_default.te b/sepolicy/vendor/hal_power_default.te index da39c42..c2eac2f 100644 --- a/sepolicy/vendor/hal_power_default.te +++ b/sepolicy/vendor/hal_power_default.te @@ -1,3 +1,3 @@ # Allow hal_power_default to write to dt2w nodes -allow hal_power_default input_device:dir search; +allow hal_power_default input_device:dir r_dir_perms; allow hal_power_default input_device:chr_file rw_file_perms;