Add button handler for speaker profile 63/218663/2
authorJi-hoon Lee <dalton.lee@samsung.com>
Tue, 26 Nov 2019 10:34:28 +0000 (19:34 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Tue, 26 Nov 2019 11:16:17 +0000 (20:16 +0900)
Change-Id: I1c5ad346382668672909c7ed617def58f777a112

plugins/wakeup-manager/dependency-default/CMakeLists.txt
plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp

index b56b4d5..000597d 100644 (file)
@@ -14,6 +14,7 @@ INCLUDE_DIRECTORIES(
 SET(DDPKG_CHECK_MODULES
        appcore-agent
        ecore
+       ecore-wl2
        dlog
        capi-appfw-app-manager
        capi-network-connection
index 6803bdb..f52886b 100644 (file)
 #include "dependency_default_button.h"
 
+#include <chrono>
+
+using namespace std;
+
+#define EFL_BETA_API_SUPPORT
+
 #include <dlog.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_Wl2.h>
 
 static mas_dependency_plugin_proxy_interface g_proxy_interface;
 
+static Ecore_Event_Handler* g_key_down_handler = NULL;
+static Ecore_Event_Handler* g_key_up_handler = NULL;
+
+static chrono::time_point<chrono::system_clock> g_last_time_point;
+static bool g_voice_key_pressed = false;
+
+#define VOICE_KEY "XF86AudioPlayPause"
+
+static Eina_Bool _key_down_cb(void* data, int type, void* event)
+{
+       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+       if (ev) {
+               LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+               if (ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0 ) {
+                       chrono::time_point<chrono::system_clock> current_time_point;
+                       current_time_point = chrono::system_clock::now();
+                       auto diff = current_time_point - g_last_time_point;
+                       auto milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
+                       /* If double click detected within 500 msec */
+                       LOGD("milliseconds : %lld", milliseconds);
+                       if (milliseconds < 500) {
+                               if (g_proxy_interface.process_event) {
+                                       g_proxy_interface.process_event(MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
+                                       g_voice_key_pressed = true;
+                               }
+                       }
+                       g_last_time_point = current_time_point;
+               }
+       }
+
+       return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool _key_up_cb(void* data, int type, void* event)
+{
+       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+       if (ev) {
+               LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+               if (g_voice_key_pressed &&
+                       ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0) {
+                       mas_plugin_event_e event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH;
+                       if (g_proxy_interface.process_event) {
+                               g_proxy_interface.process_event(event, NULL, 0);
+                       }
+               }
+       }
+       return ECORE_CALLBACK_DONE;
+}
+
+static bool _grab_voice_key(void)
+{
+       Eina_Bool ret = true;
+       ret = ecore_wl2_window_keygrab_set(NULL, VOICE_KEY,  0, 0,  0, ECORE_WL2_WINDOW_KEYGRAB_SHARED);
+       LOGD("ecore_wl2_window_keygrab_set ret[%d] [%s]", ret, VOICE_KEY);
+
+       return ret;
+}
+
+static bool _ungrab_voice_key(void)
+{
+       Eina_Bool ret = true;
+       ret = ecore_wl2_window_keygrab_unset(NULL,  VOICE_KEY,  0, 0);
+       LOGD("ecore_wl2_window_keygrab_unset ret[%d] [%s]", ret, VOICE_KEY);
+
+       return ret;
+}
+
+static bool _add_key_cb()
+{
+       if (g_key_down_handler == NULL) {
+               LOGE("_key_down_handler");
+               g_key_down_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
+               if(g_key_down_handler == NULL) {
+                       LOGE("_key_down_handler == NULL ");
+               }
+       }
+
+       if (g_key_up_handler == NULL) {
+               LOGE("_key_down_handler");
+               g_key_up_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, NULL);
+               if(g_key_up_handler == NULL) {
+                       LOGE("_key_up_handler == NULL ");
+               }
+       }
+       return true;
+}
+
+static bool _delete_key_cb(void)
+{
+       LOGE("start");
+       if (NULL != g_key_down_handler) {
+               ecore_event_handler_del(g_key_down_handler);
+               g_key_down_handler = NULL;
+       }
+
+       if (NULL != g_key_up_handler) {
+               ecore_event_handler_del(g_key_up_handler);
+               g_key_up_handler = NULL;
+       }
+       LOGE("end");
+       return true;
+}
+
 void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface)
 {
        g_proxy_interface = interface;
+
+       Ecore_Wl2_Display *_ecore_wl2_display = NULL;
+
+       Eina_Bool ret = ecore_wl2_init();
+       LOGD("ecore_wl2_init: %d", ret);
+
+       _ecore_wl2_display = ecore_wl2_display_connect(NULL);
+       LOGD("_ecore_wl2_display: %p", _ecore_wl2_display);
+
+       g_last_time_point = chrono::system_clock::now();
+       _grab_voice_key();
+       _add_key_cb();
 }
 
 void dependency_default_button_deinitialize()
 {
-}
+       _delete_key_cb();
+       _ungrab_voice_key();
+}
\ No newline at end of file