Do default action in RUI mode
[platform/core/system/initrd-recovery.git] / src / system-recovery / recovery-rui.c
index 50521b8..4fc5fd5 100644 (file)
 #include "recovery-rui-skin.h"
 #include "process-util.h"
 
+/* if user does not do anything, default action will be taken after this timeout*/
+#define DEFAULT_ACTION_TIMEOUT 4
+
+#define BUFFER_SIZE 512
+
 bool volatile running = true;
+static const char *original_description = NULL;
+static char description_buffer[BUFFER_SIZE];
+static char *rui_default_action = NULL;
+static const char *rui_default_handler = NULL;
+
+static int timer_count = 0;
+static bool user_idle = true;
+
+static void timeout_handler(rui_screen *cs)
+{
+       int ret;
+
+       if (rui_default_action && user_idle) {
+               if (!original_description) {
+                       original_description = cs->description->text;
+                       cs->description->text = description_buffer;
+               }
+
+               snprintf(description_buffer, BUFFER_SIZE,
+                               "%s\nDefault action (%s) will be taken after %d seconds",
+                               original_description, rui_default_action,
+                               DEFAULT_ACTION_TIMEOUT - timer_count/TIMER_INTERVAL);
+
+               if (timer_count/TIMER_INTERVAL == DEFAULT_ACTION_TIMEOUT) {
+                       ret = system(rui_default_handler);
+                       if (ret < 0)
+                               LOGD("Could not run action: %s\n", rui_default_handler);
+               }
+       }
+
+       if (!user_idle) {
+               cs->description->text = original_description;
+       }
+
+       timer_count++;
+}
 
 void recovery_rui_input_callback(user_action action, user_action_type action_type)
 {
@@ -47,10 +88,18 @@ void recovery_rui_input_callback(user_action action, user_action_type action_typ
        /* We interested only in button downs, long presses and idle events */
        if (action_type != ACTION_TYPE_BEGIN &&
            action_type != ACTION_TYPE_LONGPRESS &&
-           action_type != ACTION_TYPE_IDLE)
+           action_type != ACTION_TYPE_IDLE &&
+           action_type != ACTION_TYPE_TIMER)
                return;
 
        cs = get_current_screen();
+       if (action_type != ACTION_TYPE_TIMER &&
+                       action_type != ACTION_TYPE_IDLE &&
+                       user_idle) {
+               user_idle = false;
+               timeout_handler(cs);
+       }
+
        if (action == ACTION_DOWN && cs->menu)
                rui_menu_cursor_down(cs->menu);
        else if (action == ACTION_UP && cs->menu)
@@ -64,6 +113,8 @@ void recovery_rui_input_callback(user_action action, user_action_type action_typ
                rui_menu_action_run(cs->menu);
        else if (action == ACTION_BACK)
                rui_screen_switch(RUI_SCREEN_BACK);
+       else if (action == ACTION_TIMEOUT)
+               timeout_handler(cs);
        else if (action != ACTION_NONE || action_type != ACTION_TYPE_IDLE ||
                 !cs->animations)
                need_repaint = 0;
@@ -729,6 +780,8 @@ void recovery_rui_exit(void)
        free(rui_config_labels.rui_colors);
        free(rui_config_labels.rui_rulers);
        free(rui_config_labels.rui_descriptions);
+
+       free(rui_default_action);
 }
 
 
@@ -753,6 +806,17 @@ int recovery_gui(config_t *cfg)
                return 1;
        }
 
+       rui_default_action = get_action_from_cmdline();
+       if (rui_default_action) {
+               int idx = find_string(rui_config_labels.rui_action_handlers, rui_default_action);
+               if (idx < 0) {
+                       LOGD("Invalid action: %s\n", rui_default_action);
+                       free(rui_default_action);
+                       rui_default_action = NULL;
+               } else
+                       rui_default_handler = rui_action_handlers[idx];
+       }
+
        if (!ev_init()) {
                LOGD("Can't initialize input subsystem.\n");
                recovery_rui_exit();