TizenRefApp-7362 [Call UI] Implement earset media key press logic 64/90664/4
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Mon, 3 Oct 2016 14:02:29 +0000 (17:02 +0300)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Mon, 3 Oct 2016 14:13:25 +0000 (17:13 +0300)
Change-Id: Ifcb80e9b73048a1479880f53a9b9313c7ba4e430

inc/callui.h
src/callui.c

index bc35ce2..ec8281a 100755 (executable)
@@ -85,6 +85,9 @@ struct appdata {
        Ecore_Timer *app_state_check_timer;
        double powerkey_press_time;
        app_control_h delayed_app_control;
+
+       Ecore_Timer *media_key_longpress_timer;
+       bool is_media_key_longpressed;
 };
 
 #endif// __CALLUI_H__
index e5a7fb5..3977694 100755 (executable)
@@ -35,7 +35,7 @@
 #define CALLUI_KEY_VOLUMEUP            "XF86AudioRaiseVolume"
 #define CALLUI_KEY_VOLUMEDOWN  "XF86AudioLowerVolume"
 
-#define CALLUI_EARSET_KEY_LONG_PRESS_TIMEOUT_SEC       1.0
+#define CALLUI_MEDIA_KEY_LONG_PRESS_TIMEOUT_SEC        1.0
 #define CALLUI_APP_STATE_TIMEOUT_SEC                           0.3
 #define CALLUI_POWERKEY_PRESS_TIME_LIMIT_SEC           0.1
 
@@ -79,6 +79,7 @@ static void __powerkey_mode_changed_cb(keynode_t *node, void *user_data);
 static void __unset_main_win_key_grab(callui_app_data_t *ad);
 static void __process_power_key_up(callui_app_data_t *ad);
 static void __process_home_key_up(callui_app_data_t *ad);
+static void __process_media_key_up(callui_app_data_t *ad);
 static void __init_signals_handling();
 static void __app_signal_handler(int signum, siginfo_t *info, void *context);
 
@@ -478,6 +479,7 @@ static void __app_deinit(callui_app_data_t *ad)
        __unset_main_win_key_grab(ad);
 
        DELETE_ECORE_TIMER(ad->app_state_check_timer);
+       DELETE_ECORE_TIMER(ad->media_key_longpress_timer);
 
        if (ad->delayed_app_control) {
                app_control_destroy(ad->delayed_app_control);
@@ -745,6 +747,44 @@ static void __process_power_key_up(callui_app_data_t *ad)
        debug_leave();
 }
 
+static void __process_media_key_up(callui_app_data_t *ad)
+{
+       debug_enter();
+
+       DELETE_ECORE_TIMER(ad->media_key_longpress_timer);
+
+       const callui_call_data_t *incom = _callui_stp_get_call_data(ad->state_provider, CALLUI_CALL_DATA_INCOMING);
+       const callui_call_data_t *active = _callui_stp_get_call_data(ad->state_provider, CALLUI_CALL_DATA_ACTIVE);
+       const callui_call_data_t *held = _callui_stp_get_call_data(ad->state_provider, CALLUI_CALL_DATA_HELD);
+
+       if (incom) {
+               if (ad->is_media_key_longpressed) {
+                       _callui_manager_reject_call(ad->call_manager);
+               } else {
+                       if (active) {
+                               _callui_manager_answer_call(ad->call_manager, CALLUI_CALL_ANSWER_HOLD_ACTIVE_AND_ACCEPT);
+                       } else {
+                               _callui_manager_answer_call(ad->call_manager, CALLUI_CALL_ANSWER_NORMAL);
+                       }
+               }
+       } else if (held && active) {
+               _callui_manager_end_call(ad->call_manager, 0, CALLUI_CALL_RELEASE_ALL_ACTIVE);
+       } else if (held) {
+               if (ad->is_media_key_longpressed) {
+                       _callui_manager_unhold_call(ad->call_manager);
+               } else {
+                       _callui_manager_end_call(ad->call_manager, 0, CALLUI_CALL_RELEASE_ALL);
+               }
+       } else if (active) {
+               if (ad->is_media_key_longpressed) {
+                       _callui_manager_hold_call(ad->call_manager);
+               } else {
+                       _callui_manager_end_call(ad->call_manager, 0, CALLUI_CALL_RELEASE_ALL);
+               }
+       }
+       ad->is_media_key_longpressed = false;
+}
+
 static void __process_home_key_up(callui_app_data_t *ad)
 {
        debug_enter();
@@ -837,6 +877,9 @@ static Eina_Bool __hard_key_up_cb(void *data, int type, void *event)
        } else if (!strcmp(ev->keyname, CALLUI_KEY_HOME)) {
                dbg("KEY_HOME");
                __process_home_key_up(ad);
+       } else if (!strcmp(ev->keyname, CALLUI_KEY_MEDIA)) {
+               dbg("KEY_MEDIA");
+               __process_media_key_up(ad);
        } else if (!strcmp(ev->keyname, CALLUI_KEY_BACK)) {
                if (_callui_vm_get_cur_view_type(ad->view_manager) == CALLUI_VIEW_ENDCALL) {
                        _callui_common_exit_app();
@@ -846,6 +889,18 @@ static Eina_Bool __hard_key_up_cb(void *data, int type, void *event)
        return ECORE_CALLBACK_DONE;
 }
 
+static Eina_Bool __media_key_longpress_timer_cb(void *data)
+{
+       debug_enter();
+
+       callui_app_data_t *ad = data;
+
+       ad->is_media_key_longpressed = true;
+       ad->media_key_longpress_timer = NULL;
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
 static Eina_Bool __hard_key_down_cb(void *data, int type, void *event)
 {
        debug_enter();
@@ -858,6 +913,10 @@ static Eina_Bool __hard_key_down_cb(void *data, int type, void *event)
 
        if (!strcmp(ev->keyname, CALLUI_KEY_MEDIA)) {
                dbg("KEY MEDIA");
+               ad->is_media_key_longpressed = false;
+               DELETE_ECORE_TIMER(ad->media_key_longpress_timer);
+               ad->media_key_longpress_timer =
+                               ecore_timer_add(CALLUI_MEDIA_KEY_LONG_PRESS_TIMEOUT_SEC, __media_key_longpress_timer_cb, ad);
        } else if (!strcmp(ev->keyname, CALLUI_KEY_HOME)) {
                dbg("KEY HOME");
        } else if (!strcmp(ev->keyname, CALLUI_KEY_POWER)) {