diff options
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/flashlight.c | 77 | ||||
-rw-r--r-- | src/flashlight.h | 37 | ||||
-rw-r--r-- | src/service.c | 13 |
4 files changed, 128 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afd0b0d..958c9f8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,6 +14,7 @@ set(SERVICE_MANUAL_SOURCES device-provider-upower.c device-provider.c device.c + flashlight.c notifier.c testing.c service.c diff --git a/src/flashlight.c b/src/flashlight.c new file mode 100644 index 0000000..3c5e8b1 --- /dev/null +++ b/src/flashlight.c @@ -0,0 +1,77 @@ +/* + * Copyright 2017 The UBports project + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Marius Gripsgard <marius@ubports.com> + */ + +#include "flashlight.h" + +#include <gio/gio.h> +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> + +#define QCOM_ENABLE "255" +#define QCOM_DISABLE "0" + +const size_t qcom_sysfs_size = 2; +const char* const qcom_sysfs[] = {"/sys/class/leds/torch-light/brightness", "/sys/class/leds/led:flash_torch/brightness"}; + +char* flash_sysfs_path = NULL; + +int +set_sysfs_path() +{ + for (size_t i = 0; i < qcom_sysfs_size; i++) { + if (access(qcom_sysfs[i], F_OK ) != -1){ + flash_sysfs_path = qcom_sysfs[i]; + return 1; + } + } + return 0; +} + +void +toggle_flashlight_action(GAction *action, + GVariant *parameter G_GNUC_UNUSED, + gpointer data G_GNUC_UNUSED) +{ + GVariant *state; + gboolean b; + FILE* fd; + + if (!set_sysfs_path()) + return; + + state = g_action_get_state(action); + b = g_variant_get_boolean(state); + g_variant_unref(state); + fd = fopen(flash_sysfs_path, "w"); + if (fd != NULL){ + if (b) + fprintf(fd, QCOM_DISABLE); + else + fprintf(fd, QCOM_ENABLE); + fclose(fd); + g_action_change_state(action, g_variant_new_boolean(!b)); + } +} + +int +flashlight_supported() +{ + return set_sysfs_path(); +} diff --git a/src/flashlight.h b/src/flashlight.h new file mode 100644 index 0000000..af2822d --- /dev/null +++ b/src/flashlight.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 The UBports project + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Marius Gripsgard <marius@ubports.com> + */ + +#ifndef INDICATOR_POWER_FLASHLIGHT__H +#define INDICATOR_POWER_FLASHLIGHT__H + +#include <gio/gio.h> + +G_BEGIN_DECLS + +void +toggle_flashlight_action(GAction *action, + GVariant *parameter G_GNUC_UNUSED, + gpointer data G_GNUC_UNUSED); + +int +flashlight_supported(); + +G_END_DECLS + +#endif /* INDICATOR_POWER_FLASHLIGHT__H */ diff --git a/src/service.c b/src/service.c index daafb61..75d4538 100644 --- a/src/service.c +++ b/src/service.c @@ -27,6 +27,7 @@ #include "device-provider.h" #include "notifier.h" #include "service.h" +#include "flashlight.h" #include "utils.h" #define BUS_NAME "org.ayatana.indicator.power" @@ -671,6 +672,13 @@ create_phone_settings_section(IndicatorPowerService * self) g_object_unref(item); } + if (flashlight_supported()) + { + item = g_menu_item_new(_("Flashlight"), "indicator.flashlight"); + g_menu_item_set_attribute(item, "x-canonical-type", "s", "com.canonical.indicator.switch"); + g_menu_append_item(section, item); + g_object_unref(item); + } g_menu_append(section, _("Battery settingsā¦"), "indicator.activate-phone-settings"); return G_MENU_MODEL(section); @@ -909,6 +917,11 @@ init_gactions (IndicatorPowerService * self) NULL, NULL); g_action_map_add_action(G_ACTION_MAP(p->actions), G_ACTION(a)); + /* add the flashlight action */ + a = g_simple_action_new_stateful("flashlight", NULL, g_variant_new_boolean(FALSE)); + g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a)); + g_signal_connect(a, "activate", G_CALLBACK(toggle_flashlight_action), self); + /* add the brightness action */ a = g_simple_action_new_stateful ("brightness", NULL, action_state_for_brightness (self)); g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a)); |